Novedades

Qué cambió en Halia. Cada release agrupa las nuevas funcionalidades, mejoras y correcciones publicadas en el producto.

Generado automáticamente desde CHANGELOG.md al publicar cada release.

v0.5.0

Nuevas funcionalidades

  • scheduling: CancellationEmailComposer + ES-AR template (9399e15)
  • scheduling: migration ReminderDispatchAddCancellationKind + OnAppointmentClosedAsync filter (2bd41e6)
  • scheduling: ReminderDispatchJob branches on Kind — Cancellation routes to composer; WhatsApp cancellation skipped (7031744)
  • scheduling: ReminderKinds.Cancellation + AbsenceCancelled/WhatsAppCancellationNotImplemented skipped-reasons + SourceAbsenceId back-link (aa7d513)
  • scheduling: specialist-absence slice A — preview + list read paths (587e110)
  • scheduling: specialist-absence slice B — CreateAsync transactional write path (ed8bea4)
  • scheduling: SpecialistAbsence DeleteAsync + EmitAbsenceCancelledAsync (fcd7fa1)
  • spa: absence hub events + Doctor ausente badge + Recepción/Doctor subscriptions + demo fixtures (6a6b3dd)
  • spa: absence-sheet steps 3-4 + SlotPicker + create/delete mutations (6a75293)
  • spa: admin Ausencias tab + DoctorAgendaWeekGrid stripes + Recepción entry (f01d50d)

v0.4.0

Nuevas funcionalidades

  • api: enforce service-layer rbac across all write surfaces (b2c7f0e)
  • api: reminder reclaim job for crashed dispatches (d49baad)
  • api: two-phase reminder dispatch with dispatching state (04d30a3)
  • api: whatsapp send metrics and pii log fixes (5fe2f5d)
  • audit: register visit.reason as clinical and add end-to-end redaction tests (374e8d2)
  • scheduling: audit appointment.searched on filtered list (a2bc921)
  • web: per-route titles, noscript fallback, 404 page (956e374)
  • web: pnpm build:demo + demo creds prefill + main.tsx gate widen (9d5575a)

Correcciones

  • landing: move mobile drawer out of header backdrop-filter trap (4695290)

v0.3.0

Nuevas funcionalidades

  • api: add opentelemetry hooks with application insights exporter (ace79a2)
  • api: propagate correlation id into activity tags and baggage (88ba005)
  • api: read cors allowed origins from config with prod fail-fast (964371c)
  • api: run api container as non-root user (4aa7c01)
  • api: run migrations and seed on prod startup gated by bootstrap flag (e24a6bb)
  • api: validate startup options with data annotations and validate-on-start (df67904)
  • bootstrap release-please automation + publish landing /novedades (a6d0de6)
  • bootstrap release-please automation + publish landing /novedades (ff9cf24)
  • landing: clickable feature screenshots open a lightbox (af5e808)
  • landing: embed youtube demo video in dedicated section (9502b5f)
  • landing: embed youtube demo video in dedicated section (b90891c)
  • web: add security response headers and report-only csp (a8f0bf6)
  • web: switch nginx to unprivileged image and update compose port (c89de71)

v0.2.0

Nuevas funcionalidades

  • Landing comercial pública en https://www.halia.com.ar con formulario "Agendar demo" funcional (Vercel + Resend + Upstash rate-limit) y política de privacidad bajo Ley 25.326 en /privacidad.
  • Sistema de diseño warm-medical (Phase 2.5) end-to-end en la SPA: paleta sage / coral / cream + dark mode con persistencia + sidebar role-aware (Operación / Clínica / Administración) + chassis primitives (PageHeader, Section, FilterBar, Sidebar) + animaciones motion-safe + ThemeToggle light / dark / system.
  • Recetas (Phase 3 A1): emisión + descarga del PDF de receta médica (QuestPDF Community) con almacenamiento contract-first; anulación con motivo (POST /consultation/prescriptions/{id}/anular) y bloqueo del PDF (410 Gone) en farmacia; UI Doctor con badge "Anulada" + diálogo de anulación.
  • CIE-10 / ICD-10 autocomplete (Phase 3 A2) en el campo Diagnóstico de Consulta: combobox cmdk con 1114 códigos del subset AR OPS, ranking exact → code-prefix → description-substring, cap de 20 códigos, descripciones inline en chips e historia clínica.
  • WhatsApp (Phase 3 B1): gateway real Meta Cloud API por tenant con token cifrado at-rest, pruebas de conexión desde Ajustes → Clínica, webhook inbound HMAC-firmado (POST /webhooks/whatsapp) que confirma o cancela turnos por intent (1 / si / confirmo, 2 / no / cancelo), máquina de estados completa con SignalR + UI persistida en Recepción y Mi Agenda (columna "Confirmación" + Badge en panel detalle).
  • Recordatorios email (Phase 3 B2) con dispatcher Hangfire idempotente, template appointment_reminder_24h_es_AR, opt-out por paciente y reintentos con backoff exponencial.
  • Antecedentes médicos en ficha de paciente: campo libre Doctor-only (PATCH /patients/{id}/antecedents), incluido en export Habeas Data y scrub de anonimización.
  • Doctor unificado en Admin: nuevo wizard de 3 pasos (Datos profesionales → Cuenta → Confirmar) que crea Specialist + User en una sola transacción.
  • Reset password page pública en /auth/reset-password (cierra el flujo de welcome-email post-creación de usuario).
  • 2FA login challenge en /auth/login/mfa con lockout de 5 fallos en 5 minutos (Phase 0.5).

Correcciones

  • Doctor Consulta begin race: doble click sobre "Iniciar consulta" no vuelve a crear la visita (idempotencia en BEGIN).
  • DataProtection key persistence: las claves para el cifrado de users.two_fa_secret y tenant_settings.whatsapp_api_token_encrypted ahora persisten en Postgres vía Microsoft.AspNetCore.DataProtection.EntityFrameworkCore y sobreviven a restarts del proceso (ADR-0016).
  • Recepción demo: ocultos los banners de reconexión SignalR cuando el flag demo está activo.
  • Contraste WCAG AA: recalibrados --color-primary, --color-info y --color-warning-foreground (light + dark) tras la primera pasada de axe-core sobre superficies autenticadas.

Seguridad

  • TOTP 2FA obligatorio para roles Admin y Doctor (Phase 0.5).
  • Audit redaction (ADR-0015): todos los nuevos audits (recetas, antecedentes, CIE-10, WhatsApp inbound) redactan PHI por nombre de campo con length_delta marker; los textos clínicos nunca aparecen en audit_log.diff_json.
  • Habeas Data scrub extendido para WhatsApp: PatientService.AnonymizeAsync flippea WhatsAppOptIn = false y desvincula whatsapp_inbound_log del paciente anonimizado.
  • HMAC SHA256 sobre el raw body del webhook WhatsApp + tabla anti-replay whatsapp_inbound_log (PK wamid por tenant).

Rendimiento

  • Catálogos en frontend: staleTime de 5 min en queries de catálogos (obras sociales, especialidades) para reducir round-trips.
  • useHubEvent 200 ms leading-edge throttle sobre actualizaciones SignalR en Recepción para evitar re-renders en cascada bajo carga.