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.
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)
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)
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)
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.