Commit Graph
361 Commits
Author SHA1 Message Date
Lizandro GuarnizoandClaude Sonnet 4.6 449b492eea fix: turno aparecía 3 veces en lista de llamados en display_global
El llamados.unshift no estaba protegido por callKey, así que el mismo
turno se agregaba una vez por cada escritorio de recepción. Ahora tanto
el anuncio como la entrada en la lista usan el mismo guard callKey.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 01:00:26 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 92adee6285 fix: display global sonaba 3 veces con 3 escritorios de recepción
Cuando recepcion_desk_id es NULL, el mismo turno aparecía en los 3
escritorios de recepción con claves distintas (incluían el nombre del
escritorio). Eso generaba 3 entradas nuevas en lastSeenKeys → 3 anuncios.

Fix: añadir announcedCalls Set con clave id|llamado_at (sin destino).
El sonido/anuncio solo se encola una vez por evento de llamada,
independientemente de cuántos escritorios devuelvan el mismo turno.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 00:54:56 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 4058cfe929 fix: sonido del turno se disparaba 3 veces en la pantalla TV
Dos causas:
1. sse_turno.php inicializaba \$lastPing = null, haciendo que la primera
   iteración del loop (2s después del emit inicial) siempre emitiera
   un snapshot extra aunque no hubiera cambios reales.
   Fix: inicializar \$lastPing con el sse_ping_at actual de la BD.

2. display.php comparaba activo.codigo para detectar nueva llamada.
   Si el poll y el SSE llegaban casi simultáneamente antes de que
   lastCodigoActivo se actualizara, ambos disparaban el sonido.
   Fix: comparar llamado_at en vez del código — el timestamp es
   único por llamada, por lo que sonidos duplicados son imposibles.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 00:48:33 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 1c921fc7fa fix: tags de consentimiento en examenes ya no desbordan horizontalmente
- item-row con flex-wrap para que los tags pasen a la siguiente línea
- consent-tag con word-break y max-width para textos largos
- Botones de acción agrupados en .item-actions con margin-left:auto

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 00:33:35 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 cd3d3bb9c0 feat: IA configurable — probar conexión, activar/inactivar
- Toggle activo/inactivo en configuración → guarda ia_activa en lab_config
- Botón "Probar" llama api/lab/test_gemini.php con la clave actual
- test_gemini.php envía pregunta mínima a Gemini y confirma respuesta
- Dashboard oculta botón y panel IA cuando ia_activa != '1'

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 23:16:06 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 a6f6449707 feat: número de orden consecutivo en recepción
- Campo N.° Orden editable en la ficha, antes de seleccionar paciente
- Se carga automáticamente al abrir un turno (YYYYMMDD-001, 002…)
- Botón para regenerar el siguiente consecutivo
- Columna numero_orden en turnero_solicitudes (VARCHAR 20)
- Nuevo endpoint get_consecutivo.php calcula el siguiente del día
- create_solicitud.php guarda el numero_orden junto con la solicitud

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 23:12:23 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 9c9acbed70 feat: dashboard turnero muestra recepción, bacteriólogo y exámenes en tabla
- Columnas añadidas: Recepción (desk + recepcionista), Lugar/Bacteriólogo, Exámenes
- Elimina columnas Lugar y Entrada que eran menos informativas
- colspan actualizado a 10

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 23:06:40 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 406d542042 fix: restaurar recepcion.php original (eliminé contenido por error)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 20:54:38 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 453fb4219e fix: botón Volver en configuración turnero apunta al dashboard
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 20:44:31 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 e8abffb607 fix: recepcion.php sin desk_id muestra selector de puestos
- Si llega con desk_id redirige a la URL canónica erp.php?m=turnero&v=recepcion&desk_id=N
- Si llega sin desk_id muestra lista de turnero_lugares activos para elegir
- Elimina acceso directo sin contexto de desk

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 20:29:18 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 d0152e37ce feat: asistente IA Gemini Flash en dashboard turnero + config token
- ai_chat.php: contexto completo (tiempos, facturación, franjas, turnos detallados)
- Preguntas soportadas: demoras por recepcionista, total facturado, horas pico,
  tiempo total por paciente, exámenes, búsqueda por cédula
- Panel flotante de chat en dashboard (botón robot azul)
- Búsqueda de tabla ahora filtra por cédula/documento
- Ícono de fila gira al expandir detalle (flecha → rotada)
- lab_configuracion.php: nueva sección IA con campo token Gemini
- save_config.php: permite guardar gemini_api_key

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 20:28:43 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 f738607738 feat: historial turnos — mostrar recepcionista, desk, bacteriólogo y exámenes
Columnas nuevas en tabla principal:
- Recepción: módulo de desk + nombre del recepcionista
- Lugar / Bacteriólogo: lugar destino + quien atendió toma de muestras
- Exámenes: badges con código de cada examen solicitado

Los datos ya venían del API (get_historial.php), solo se exponen en la tabla.
Se elimina columna Teléfono y Entrada de la vista principal (siguen en detalle).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 20:22:07 -05:00
Lizandro Guarnizo 5f4cf63924 Revert "fix: revertir anunciarTurno al codigo exacto de jun9 que funcionaba"
This reverts commit 266cd8301b.
2026-06-23 19:58:33 -05:00
Lizandro Guarnizo 266cd8301b fix: revertir anunciarTurno al codigo exacto de jun9 que funcionaba 2026-06-23 19:57:49 -05:00
Lizandro Guarnizo ee50a47933 fix: seleccionar voz española explícita en TTS del display_global 2026-06-23 19:55:40 -05:00
Lizandro Guarnizo 3810c898fd fix: restaurar playBeep original en display_global (revertir playBell) 2026-06-23 19:50:30 -05:00
Lizandro GuarnizoandClaude Opus 4.8 dfe3a01fee Recepción: vincular paciente atómicamente al crear token de firma
create_consent_token.php ahora acepta paciente_id y lo vincula al turno
si aún no lo tiene, eliminando la carrera con vincular_paciente.php
(fire-and-forget). Ya no hace falta refrescar para firmar el consentimiento.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 09:54:41 -05:00
Lizandro GuarnizoandClaude Opus 4.8 506f3469b4 Kiosko: auto-turno solo por escáner (ráfaga <35ms o Enter), nunca a mano
Escribir manualmente ya no dispara el turno: la persona oprime el botón.
El lector de cédula sí lo dispara porque mete los dígitos en ráfaga
(<35ms entre cada uno) o termina con Enter. Guard contra doble envío.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 09:51:58 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 a908d623e1 Kiosko: fix listener acumulado, añadir reset por inactividad 90s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 09:01:06 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 6510054416 Historial: añadir notas/observaciones al detalle del registro
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-22 22:53:39 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 f363631b32 Turnero: mejoras UI, historial detallado, kiosko scanner, firma por turno
- Kiosko: detector scanner (gap < 80ms), iconos 90px, fa-person-pregnant, ticket Arial
- Recepción: vincular_paciente.php para persistir paciente_id antes de firmar consentimiento
- Historial y dashboard: recepción desk, empleado recepción/muestras, exámenes y comentarios
- display_global: turno más pequeño, lugar-nombre más grande
- lab_pacientes: modal compacta con form-sm
- Configuración: icono embarazada fa-person-pregnant en prioridades
- ver_formulario_enviado: firma por campo (fix doble firma)
- docker-compose.local.yml: override BD producción para dev local

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-22 22:07:09 -05:00
Lizandro Guarnizo 8d577947a6 up 2026-06-18 09:35:17 -05:00
Lizandro Guarnizo c58998599b up 2026-06-16 19:54:04 -05:00
Lizandro Guarnizo 8128616b63 up 2026-06-16 19:09:59 -05:00
Lizandro Guarnizo 7f2f998aa7 Update lugar.php 2026-06-16 17:58:05 -05:00
Lizandro Guarnizo 663884685d up 2026-06-16 17:52:27 -05:00
Lizandro Guarnizo 1c67dbdadc up 2026-06-16 17:41:27 -05:00
Lizandro Guarnizo f1673a2d39 Update lugar.php 2026-06-16 17:06:47 -05:00
Lizandro Guarnizo ff8454fa5a up 2026-06-16 16:55:22 -05:00
Lizandro Guarnizo 62c4e7a18c up 2026-06-16 16:05:04 -05:00
Lizandro Guarnizo 9e79b8ff56 Update display_global.php 2026-06-16 15:59:38 -05:00
Lizandro Guarnizo f13a06b63a Update display_global.php 2026-06-16 15:53:49 -05:00
Lizandro Guarnizo acbc1d0714 up 2026-06-16 15:37:34 -05:00
Lizandro Guarnizo 7f84c7f3ae Update display_global.php 2026-06-16 15:16:23 -05:00
Lizandro Guarnizo 6be28ae5af up 2026-06-16 15:03:40 -05:00
Lizandro Guarnizo eaa8a23af6 UP 2026-06-16 14:51:46 -05:00
Lizandro Guarnizo 56489a1557 Update lugar.php 2026-06-16 14:12:22 -05:00
Lizandro Guarnizo f51cc2029c Update lugar.php 2026-06-16 14:03:47 -05:00
Lizandro Guarnizo 8b64b77c0e Update lugar.php 2026-06-16 13:55:20 -05:00
Lizandro Guarnizo fc14360e2e up 2026-06-16 13:35:03 -05:00
Lizandro Guarnizo 1b9c8efaad Update lugar.php 2026-06-16 13:28:14 -05:00
Lizandro Guarnizo b11a7f5f98 up 2026-06-16 13:20:13 -05:00
Lizandro Guarnizo e7a068243c up 2026-06-16 12:55:39 -05:00
Lizandro Guarnizo b66f52864d Update recepcion.php 2026-06-16 12:47:39 -05:00
Lizandro Guarnizo 047583604d Update recepcion.php 2026-06-16 12:14:26 -05:00
Lizandro Guarnizo 415ea3ef56 up 2026-06-16 12:06:26 -05:00
Lizandro GuarnizoandClaude Haiku 4.5 8a5b4eef1e fix: ensure turnoActivo.estado is en_recepcion after guardarSolicitud
Guarantees that the turno state is correct in memory before pasarALugar()
attempts the transition to en_espera_lugar, preventing 'espera' → 'en_espera_lugar'
errors.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-06-16 11:30:44 -05:00
Lizandro GuarnizoandClaude Haiku 4.5 9872f50104 fix: onLugarChange no longer hides desk consents
The sel-lugar dropdown is only for selecting the patient's next destination.
Desk consents are loaded by cargarConsentimientosDesk() on turno open
and must not be affected by destination lugar changes.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-06-16 11:24:02 -05:00
Lizandro GuarnizoandClaude Haiku 4.5 d8a6581fe5 fix: load desk consents automatically when a turno is opened
- cargarConsentimientosDesk() called from abrirFicha using DESK_ID
- First checks existing DB records (get_consentimientos), falls back to desk config
- abrirFormularioLugar shows proper errors if no patient or no turno
- Starts polling on open to detect patient signature in real time
- Fix creado_at column error in create_consent_token INSERT

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-06-16 11:20:22 -05:00
Lizandro GuarnizoandClaude Haiku 4.5 5b02be6686 fix: correct API response path for lugar formularios in recepcion
- API returns json.formularios, not json.data.formularios
- Now consents will properly display when selecting a lugar
- Fixes issue where configured consents were not appearing in recepcion

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-06-16 11:15:15 -05:00