Commit Graph
100 Commits
Author SHA1 Message Date
Lizandro GuarnizoandClaude Sonnet 4.6 368c4c8a5a feat(bandeja): vistos/por-revisar, filtro nombre+examen, marcar como visto
- Reemplaza activos/cerrados por pendientes (por revisar) / vistos
- Columna bandeja_visto_at en turnero_turnos; API marcar_visto.php
- Botón "Marcar como visto" → mueve paciente a sección inferior
- Filtro en tiempo real por nombre y por código de examen (GROUP_CONCAT)
- URL de consentimientos: relativa (consent.php?token=...)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-27 21:29:52 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 6c54674795 fix(bandeja): corregir res.data → top-level keys (jsonOk no anida en data)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-27 21:21:01 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 0c6e522106 feat(turnero): Bandeja del día — lista de pacientes con detalle y cierre
Vista split: lista ordenada por numero_orden (activos arriba, cerrados abajo),
stats bar con totales, panel de detalle con exámenes por categoría, muestras,
consentimientos, comentarios, PDF via window.print() y acción de cerrar turno.
Auto-refresh cada 30s. Visible para bacteriólogos y admins.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-27 21:17:48 -05:00
Lizandro Guarnizo 3c3e531e48 feat(lugar): botón quitar consentimiento con motivo obligatorio y auditoría 2026-07-27 20:56:44 -05:00
Lizandro Guarnizo deb74a1f9e fix(login): bacteriologo redirige a v=dashboard para que App.php lo intercepte correctamente 2026-07-27 07:40:12 -05:00
Lizandro Guarnizo 75c7cb2762 feat(audit): registrar en lab_actividad_admin quien edita formularios de lugar 2026-07-27 07:27:56 -05:00
Lizandro Guarnizo 8dadf0ba7a fix(login): bacteriologo redirige a lugar en vez de recepcion al iniciar sesion 2026-07-27 07:08:15 -05:00
Lizandro Guarnizo 6192ef89a1 fix(kiosko): height calc(100vh/0.80) compensa zoom para llenar viewport 2026-07-27 06:54:52 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 1660a5a426 fix(kiosko): zoom en html en vez de .kiosko-wrap para llenar viewport
zoom en el elemento hijo encogía 100vh dejando espacio vacío abajo.
En html el browser recalcula vh correctamente y el layout llena la pantalla.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-27 06:50:28 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 ea956f2c6c fix(display_global): convertir nombre a Title Case antes del TTS
Los nombres en MAYÚSCULAS son deletreados por el motor de voz.
Convertir a Title Case para que se lean como palabras normales.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-27 06:44:36 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 40b8b54aee fix(display_global): no cortar TTS cuando llaman desde lugar simultáneo
Elimina speechSynthesis.cancel() para que los anuncios no se interrumpan.
El overlay espera a que el TTS termine (onend) antes de pasar al siguiente,
con un mínimo visual de 5 segundos.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-27 06:41:26 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 b4e45c1c22 feat(lugar): formularios en modal 10% más grandes en tablet
Pasa zoom=1.1 al iframe; ver_formulario_enviado.php aplica zoom al body.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-24 10:58:46 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 e93bb1ad41 fix: evitar que <?xml rompa PHP con short_open_tag
El parser de PHP interpreta <? en HTML mode cuando short_open_tag=On.
Se rompe la cadena para que no aparezca el literal <? en el archivo.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-24 10:14:04 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 5400fd9b32 fix: exportar Excel como SpreadsheetML (.xls) en vez de CSV
Abre directamente en Excel con columnas formateadas, sin asistente
de importación ni apertura en VS Code.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-24 10:02:12 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 dc5fd6e272 feat(chat): separadores de fecha estilo WhatsApp
Muestra "Hoy", "Ayer" o la fecha entre grupos de mensajes de días distintos.
El timestamp del bubble ahora solo muestra la hora.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-24 09:58:08 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 42662c2ade fix(kiosko): reducir interfaz al 80% con zoom
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-23 13:22:07 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 4cd307ba4f feat(lugar): alarma persistente para tomas progresivas
Sonido más fuerte (gain 1.0, 3 pulsos grave-agudo), se repite cada
30 s mientras el banner no se cierre con click.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-23 12:45:22 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 2ed9eff653 form_cliente: leer inputs de texto en evaluador de condiciones
Permite usar campos linked (texto) como controladores de secciones
condicionales; necesario para ocultar datos obstétricos según género.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-23 12:33:16 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 4f58d6bf16 fix(kiosko): quitar ceros iniciales del barcode de cédula
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-23 11:57:19 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 acac557f90 fix(kiosko): botón Volver visible arriba en pantalla de cédula
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-23 11:47:26 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 1291d0368a fix(kiosko): reducir numpad otro 15%
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-23 11:25:02 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 960867d785 fix(kiosko): bloquear campo al primer Tab del escáner + numpad más pequeño
El Tab es la señal de fin de cédula en el barcode. Al recibirlo se
activa _scannerLocked y se ignoran todos los caracteres siguientes
(apellidos, fecha, sangre) hasta que llegue Enter o se limpie el campo.
También se redujo el numpad ~10% para que entre en pantalla.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-23 11:22:18 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 5c02a8ea99 fix(kiosko): numpad debajo del WhatsApp, escribe al campo activo
Restaura campo WhatsApp (inputmode=none), mueve el numpad debajo.
El numpad detecta cuál input tiene foco y escribe en ese campo.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-23 11:19:23 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 4e945e6437 fix(kiosko): eliminar campo WhatsApp del flujo, botón OK en numpad
El campo WhatsApp generaba fricción innecesaria. Ahora el numpad
tiene un botón "Obtener mi turno" de ancho completo como última fila.
WhatsApp queda como hidden vacío para no romper la API.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-23 11:18:25 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 104ba07af7 feat(kiosko): numpad táctil para campo cédula
- inputmode=none en inp-cedula suprime el teclado Windows
- Grid 3×4 con dígitos 0-9, C (borrar todo) y ⌫ (borrar uno)
- pointerdown + preventDefault mantiene el foco en el input
- El escáner sigue funcionando (escribe por keydown, no por IME)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-23 11:12:31 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 43f14c2571 fix(kiosko): salida admin cierra Chrome con window.close()
Navegar al ERP dentro del kiosk no sirve porque --kiosk es un flag
del proceso. window.close() cierra Chrome y devuelve el escritorio
Windows táctil, desde donde pueden abrir el ERP normalmente.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-23 11:03:21 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 e84c16f875 feat(kiosko): salida admin con 7 toques en el logo
Toca el logo o el nombre del laboratorio 7 veces en 4 s para abrir
el overlay de salida: ir al ERP, recargar kiosko o cancelar.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-23 10:59:30 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 aaeb3567c2 fix(kiosko): teclado táctil Windows reaparece al tocar el campo
- blur() en mostrarTicket, seleccionarOtraPrioridad y volverPrioridades
  para que ningún campo quede enfocado al cambiar de pantalla
- pointerup en cada input: si ya estaba enfocado, blur+focus(30ms)
  fuerza a Windows a reinvocar el teclado táctil
- El focus programático de seleccionarPrioridad se conserva (escáner)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-23 10:57:22 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 4d75f82b30 fix(kiosko): cortar en primer no-dígito, no solo en espacio/tab
El Tab se bloquea pero las letras seguían escribiéndose en el campo.
Ahora cualquier carácter no numérico trunca el valor inmediatamente.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-23 10:54:04 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 f8903a4982 fix(kiosko): bloquear Tab del escáner para que no salte al campo WhatsApp
El lector de cédula envía los campos con Tab entre ellos. Se previene
el cambio de foco en keydown. Si algo llega igualmente a inp-cel
(letras) se limpia y regresa el foco a la cédula.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-23 10:50:00 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 24211de0e9 fix(kiosko): truncar código de barras al primer campo (solo cédula)
El escáner envía cedula+nombre+apellidos+… en una sola ráfaga.
Se corta en el primer espacio/tab para quedarse solo con los dígitos.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-23 10:37:36 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 5f9e7032a0 fix(chat): mostrar fecha en timestamp de mensajes de días anteriores
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-22 22:36:02 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 a15dceae2a feat(turnero): devolver paciente a recepción desde toma de muestras
- cambiar_estado: permite en_espera_lugar→en_recepcion y en_servicio→en_recepcion
- Al volver de un lugar limpia lugar_destino_id, llamado_lugar_at, inicio_lugar_at,
  fin_recepcion_at y atendido_lugar_por para que quede reasignable
- lugar.php: botón "A recepción" visible en en_espera_lugar y en_servicio
- resetFicha oculta el botón nuevo al limpiar la ficha

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-22 22:22:05 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 728d78f606 fix(kiosko): corregir touch en Edge kiosk mode
- touch-action: manipulation directo en cada botón e input (no solo en body)
- -ms-touch-action para compatibilidad Edge legacy
- position: relative en .kiosko-wrap para contener screens absolutas
- inset: 0 en .screen.hidden para que no se salga del contenedor

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-22 22:12:19 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 868263fe6f fix: no usar firma_svg global como fallback cuando hay datos por-campo
Formularios con 2 campos firma (consentimiento + disentimiento)
mostraban la firma del campo 2 también en el campo 1 porque
firma_svg se usaba como fallback del primer campo. Ahora si
datos_respuestas ya tiene algún _svg, se confía solo en los datos
por-campo y se ignora el fallback global.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-22 21:57:34 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 136b123cc0 fix: preview en tiempo real de firma Topaz en modal
Usar GetSigImageB64 en el poll para actualizar el canvas del overlay
cada vez que cambia el número de puntos. SigImage/0 (SigWebRefresh)
solo devuelve el trazo actual; SigImage/1 acumula toda la firma.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-22 21:45:25 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 719f27d863 fix: captura de trazos Topaz — canvas context + funciones correctas
- Agregar <canvas id="topaz-canvas"> al overlay de ambos archivos
- SetTabletState(1, canvasCtx, 50) con contexto 2D (sin esto los trazos no se dibujan)
- Guardar timer retornado y pasarlo a SetTabletState(0, tmr) al cerrar
- NumberOfTabletPoints() en vez de GetSigTotalPoints() (función inexistente en v1.0.4)
- GetSigImageB64(callback) async en vez de llamada síncrona sin valor de retorno

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-22 21:38:56 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 78b01033c5 fix: cargar SigWebTablet.js desde /assets/js/ en form_cliente
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-22 21:26:27 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 41e6c536c0 fix: cargar SigWebTablet.js desde servidor en ver_formulario_enviado
Mismo fix que recepcion.php: servir el JS desde assets/js/ en vez
de localhost:47289 que no sirve archivos estáticos.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-22 21:25:20 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 c6d2caef55 add: SigWebTablet.js de Topaz en assets/js
Copiado de C:\Users\ZAIDA\AppData\Local\TopazSigWeb\SigWebTablet.js
en SOPORTE-3 (39 KB, versión instalada localmente).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-22 21:21:03 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 8ac5224425 fix: cargar SigWebTablet.js desde servidor ERP en vez de localhost
El JS no es servido por SigREST sino instalado en AppData del usuario.
Se agrega /assets/js/SigWebTablet.js como primera URL; los puertos
localhost quedan como fallback.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-22 21:16:08 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 f9619db8ef fix(sigweb): intentar HTTPS :47290 antes de HTTP :47289 para páginas HTTPS
Chrome bloquea scripts HTTP desde páginas HTTPS; SigWeb >=1.6.4 expone
el SDK en https://localhost:47290 para este caso. Fallback a http://47289
para instalaciones antiguas.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-22 20:20:05 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 49a622e05f fix(turnero): corregir 6 hallazgos de auditoría en tomas previas
- cancelar_toma_pendiente: añade JOIN por paciente_id para prevenir IDOR
- cancelar_toma_pendiente: requiere turno_id para validar propiedad
- get_tomas_pendientes: porta filtros condicionales y _tomas_config de
  guardar_toma.php para mostrar conteo de firmas correcto
- lugar.php: refresca sección tomas previas al completar via turneroFirmado
- lugar.php: muestra error en catch de cargarTomasPrevias en vez de silenciar
- lugar.php: limpia _tomaAlertados al cancelar toma previa
- lugar.php: pasa turno_id en POST de cancelar para ownership check

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 20:58:21 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 814bd2ce5c feat(turnero): mostrar tomas prolongadas pendientes de visita anterior
Cuando el paciente regresa con un turno nuevo, toma de muestras muestra
las tomas en_progreso de visitas anteriores con botón Continuar o Cancelar.
Cancelar marca estado='rechazado' (campo ya existía en el enum).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 20:37:17 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 8bc9cbdd35 feat(turnero): 4 campos antecedentes en un solo renglón (F-LAB-08)
Gesta/Partos/Cesáreas/Abortos ahora caben en una fila usando CSS :has(.campo-cuarto)
que activa grid de 4 columnas solo cuando el campo tiene clase campo-cuarto.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 20:25:55 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 b1264da979 create_turno: priority F skips recepcion, goes direct to toma de muestras
When a patient selects 'Muestra pendiente' (prioridad F) at the kiosk,
the turn is immediately set to en_espera_lugar pointing to the first
active muestras location. Recepcion never sees it; toma de muestras
picks it up from its queue with no consent forms required.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 17:53:48 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 17c9e1a1f2 ver_formulario_enviado: auto-fill hora on Minuto 0 (fresh form)
_mpAutoFillHora was gated behind hayFirmaIniciada, so it never ran
on a fresh form where no signatures exist yet. Now always fills the
hora field of the first visible firma widget; scroll only when at
least one signature has already been saved.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 17:36:01 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 7a08e63e44 send_consentimiento: read wa template from lab_config instead of hardcoding
Was sending 'consentimiento_turno' (plain text fallback) while the
configured template is 'consentimiento_turno_v2'. Now reads
turnero_wa_template and turnero_wa_lang from lab_config, matching
the same logic used in create_turno.php (kiosk).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 17:18:24 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 26bb9e1844 rips: prevent reuse of already-consumed exam records
- Add turno_id column to rips_examenes_pendientes (already migrated)
- Filter turno_id IS NULL in get_examenes_rips.php query
- New marcar_rips_usado.php marks record as consumed when loaded
- cargarExamenesRips() calls marker after loading exams into the turn

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 16:39:22 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 d46c983776 recepcion: auto-check RIPS when turn has a cedula as patient name
If the kiosk captured a numeric document number as paciente_nombre,
fire consultarExamenesRips immediately on turn open without waiting
for the receptionist to manually search the patient.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 16:35:29 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 44e9b86b27 recepcion: revert patient history to collapsed on load
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 16:30:50 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 89b407f5cc recepcion: auto-expand patient history with exams on patient select
Previously the history section required a manual click to expand and load.
Now it opens and fetches automatically when a patient is selected.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 16:30:05 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 7842de0d21 kiosk: remove --disable-print-preview to unblock silent printing
--disable-print-preview conflicted with --kiosk-printing, routing to
the OS print dialog instead of printing silently. Also added AHK
fallback script for edge cases.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 15:30:07 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 065928e8c1 turnero: bat kiosko usa Microsoft Edge con --edge-kiosk-type=fullscreen
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 15:22:56 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 4a523204a1 turnero: simplificar bat kiosko — una sola línea sin detección de ruta
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 15:22:45 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 28fe662f40 turnero: bat kiosko busca Chrome en ambas rutas y fuerza pantalla completa
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 15:21:52 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 4a92425238 turnero: agregar ?autoprint=1 al bat del kiosko
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 15:18:05 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 5dd6ee5040 turnero: integración QZ Tray para impresión silenciosa en kiosko
- Genera par de llaves RSA (cert en config/qz/)
- api/qz_sign.php firma los print jobs con SHA512
- assets/js/qz-print.js conecta QZ Tray y envía trabajo HTML
- ver_formulario_enviado.php carga QZ cuando ?autoprint=1
- Fallback a window.print() si QZ no está instalado

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 14:52:19 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 2cfb77b1a6 turnero: bat kiosko mata Chrome antes de lanzar para que apliquen los flags
taskkill + timeout 2s antes de abrir; agrega --disable-print-preview.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 14:39:04 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 b8763f9e15 turnero: bat para lanzar Chrome en modo kiosko con impresión automática
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 14:36:27 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 a70f49f42b turnero: parámetro ?autoprint=1 para imprimir automáticamente al cargar
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 14:33:31 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 538bc0f35a turnero: diagnóstico detallado en consola para T-LBK460 / SigWeb
Detecta si el pad físico responde (GetTabletState), si falla instanciar
SigWebTablet (posible conflicto con SigPlus), y guía paso a paso.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 12:01:50 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 3c3f3f1ee9 turnero: logging de consola para debug de conexión SigWeb en recepción
Muestra URL, hora de intento, tiempo de respuesta y estado de SigWebTablet.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 11:39:36 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 c0a2389a77 turnero: mostrar Topaz desconectado en rojo cuando SigWeb no responde
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 11:34:45 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 e2f663c6ed turnero: indicador "Topaz en línea" en header de recepción
Detecta SigWeb al cargar; muestra badge verde solo si localhost:47289
responde. Si no hay pad, no aparece nada.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 11:33:56 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 90a940c379 turnero: mostrar punto verde y "Tableta en línea" cuando SigWeb está conectado
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 11:24:47 -05:00
Lizandro Guarnizo 243003ab31 Revert "turnero: fallback a puerto 8080 si SigWeb no responde en 47289"
This reverts commit 3d035d3699.
2026-07-21 11:24:21 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 3d035d3699 turnero: fallback a puerto 8080 si SigWeb no responde en 47289
Intenta localhost:47289 primero; si falla prueba localhost:8080.
Funciona para instalaciones con puerto no estándar sin cambiar Oracle.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 11:21:18 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 dd1e377df7 turnero: ocultar botón Tableta si SigWeb no está disponible en el equipo
Detecta al cargar la página si localhost:47289 responde; si no,
oculta todos los .btn-topaz para evitar el error al usuario.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 10:52:32 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 4a5e5fd9c9 turnero: reemplazar alert() de Topaz SigWeb por toast no bloqueante
El alert() bloqueaba la UI. Ahora muestra un banner flotante de 5s
que no interrumpe el flujo y sugiere usar firma manual como alternativa.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 10:49:01 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 992ce9d663 turnero: botón Ver abre el formulario en la misma modal en lugar de nueva pestaña
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 09:40:25 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 2cd7525bb4 turnero: countdown en padre para que alerta sobreviva al cerrar el modal
El iframe pasa targetMs al padre via postMessage. El padre corre su propio
intervalo (5s) que dispara la notificación si el modal está cerrado.
Si el iframe alcanza el 0 primero, cancela el del padre para no duplicar.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 09:38:25 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 019d2f4fb0 turnero: notificación del sistema cuando vence el countdown de toma progresiva
Usa Web Notifications API via postMessage iframe→parent para alertar
incluso cuando el tab está en segundo plano o la pantalla ocupada.
Pide permiso al iniciar el protocolo (primer gesto del usuario).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 09:36:23 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 6ce2fc340b turnero: aplicar _mpEffectiveLabel en countdown y alerta de siguiente toma
La alerta y el countdown mostraban "Toma · Otro" sin el minuto.
Ahora usan _mpEffectiveLabel para mostrar ej: "Toma · Otro - 2".

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 09:34:47 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 e0041c8d24 turnero: ordenar firmasCampos por minuto antes de calcular siguiente_toma_at
Sin el sort, Otro (2 min) aparecía después de Minuto 15 en schema order,
haciendo que el countdown arrancara con 15 min en vez de 2.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 09:20:17 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 ba2728a25f turnero: mostrar minuto de Otro en label de card de toma progresiva
Agrega _mpEffectiveLabel() que añade " - N" al label cuando la sección
es Otro y _mpOtroHora tiene valor, mostrando ej: "Toma · Otro - 2".

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 09:16:08 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 815f136dca fix: secciones de toma se renderizan en orden cronológico
El render iteraba $esquema en orden original del JSON — Otro siempre
quedaba de último. Ahora se re-ordena $esquema agrupando las secciones
de toma por su minuto (usando $_mpSepOrder construido del usort ya
existente) antes de entrar al foreach de render.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 09:11:21 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 2d125f9533 ux: consentimientos antes de recepción de muestras en lugar.php
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 08:37:42 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 53bc184894 ux: lugar destino al final, refresh en consentimientos, fix pasarALugar
- sel-lugar movido a última sección (antes de acciones) para que el
  usuario lo seleccione justo antes de guardar/pasar
- resetCheckboxes() ahora también limpia sel-lugar entre turnos
- pasarALugar() lee sel-lugar directamente como primera opción,
  evitando que un solicitudActiva.lugar_id desactualizado cause errores
- Botón refresh (fa-sync-alt) en cabecera de consentimientos llama
  refrescarConsentimientosLugar() para ver estado sin recargar

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 08:33:57 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 3ae57a78e4 feat: chip Otro se posiciona por minuto en modal de tomas prolongadas
- Cada chip envuelto en .mp-chip-grp con CSS order = minuto
- Otro arranca en order:9999 (último); al digitar el valor se mueve
  en tiempo real al lugar cronológico correcto
- Si ya tiene valor guardado (_mpOtroHora), abre posicionado
- Click handler usa .mp-chip-grp para encontrar input/unit

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 08:13:59 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 ecc9b74247 fix: mostrar consentimientos del turnero en lab_formularios.php
- fecha usa COALESCE(firmado_at, enviado_at, t.creado_at) porque
  turnero siempre deja enviado_at en NULL
- filtro por fecha también usa ese COALESCE para no excluir registros
- total_envios y total_completados suman turnero_consentimientos

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 07:44:16 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 1d8e461b3e fix+polish: restaurar filtro DATE en DELETE rips, fallback PHP_INT_MAX en guardar_toma, pulir chip Otro (number/min/pre-carga), limpiar interval resumen
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-18 14:29:12 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 18c683ed9b feat(toma-progresiva): resumen visible 10s con barra y cuenta regresiva antes de cerrar
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-17 21:43:49 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 5a5e4b17ba fix(guardar_toma): usar _otro_hora para calcular countdown de la toma Otro
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-17 18:41:58 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 65c3cc8c20 feat(toma-progresiva): alarma más fuerte 3 ciclos con sawtooth+compressor y vibración 5x900ms
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-17 18:36:33 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 7f522a683e fix(toma-progresiva): ordenar toma Otro por su hora real en lugar de ponerla al final
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-17 18:34:13 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 ecc582177c fix(toma-progresiva): no hacer scroll al abrir si no hay ninguna firma iniciada
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-17 18:28:59 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 1a08d9dba7 fix(pagos): agregar bono al ENUM, guardar refs en lab_pagos_det, consumir cache rips al crear solicitud
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-17 18:18:11 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 057439e140 feat(recepcion): pedir N.º referencia en transferencia y tarjeta (simple y combinado)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-17 18:15:06 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 3dcb4fcb42 fix(display_global): eliminar de llamados los turnos ya finalizados
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-17 18:09:29 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 76d915a391 feat: toma 0 pre-seleccionada y validación de hora en chip Otro
- Chip "0 min" queda marcado por defecto al abrir configurar tiempos
- Si se selecciona "Otro", bloquea guardar hasta que se ingrese la hora
- La hora de "Otro" se guarda en datos_respuestas._otro_hora

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-17 18:02:18 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 2f6efa7498 fix: ordenar tomas por tiempo cronológico antes de construir grupos
Garantiza que la cadena de tomas siempre sea 0→15→30→... sin importar
el orden en que se guardaron en _tomas_config.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-17 17:55:13 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 71440a8bbb fix: guardar en recepción pasa al lugar directamente sin mostrar consentimientos
Los consentimientos se gestionan en toma de muestras, no en recepción.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-17 17:41:54 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 c1cb5906a9 fix: autocomplete CIE-10 no seleccionaba por comillas rotas en onmousedown
Reemplaza JSON.stringify en atributo HTML por data-atributos + event
delegation, evitando que las comillas dobles rompan el handler.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-17 17:23:11 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 67f6e23ffd fix: clearCache en TomSelect para aplicar filtro de género correctamente
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-17 16:51:29 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 3eaade80ff feat: restricción de exámenes por género del paciente
- DB: columna genero_permitido en exam_tipos (M/F/NULL)
  GX,FV → solo femenino | PSA,FPSA → solo masculino
- recepcion.php: TomSelect muestra badge rojo y deshabilita opciones
  incompatibles al seleccionar paciente; elimina los ya agregados
- create_solicitud.php: validación backend 422 si hay conflicto género/examen

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-17 16:45:39 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 b280dfcb7a feat: panel configurar tiempos con chips en F-LAB-28
- Schema F-LAB-28: reemplaza 9 secciones hardcodeadas por 17 puntos de
  tiempo (0,15,30,...,195 min, 3pm, 4pm, Otro)
- PHP: detecta sección "Otro" como toma válida (sentinel PHP_INT_MAX)
- JS/CSS: reemplaza checkboxes por chips clicables en el panel de
  configuración; chip "Otro" muestra input de hora libre

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-17 16:33:19 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 95acc0a09c revert: ventana de exámenes recientes a 30 minutos
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-17 16:00:24 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 37364b0628 fix: reducir ventana de exámenes recientes a 5 minutos
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-17 16:00:08 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 e950e2c146 feat: write to rips_examenes_pendientes on solicitud creation
Al guardar una solicitud en recepción, escribe los exámenes en la bandeja
temporal WhatsApp (rips_examenes_pendientes) con DELETE+INSERT del día.
Al volver a seleccionar el mismo paciente, get_examenes_rips los detecta
como fuente=cache y los auto-carga sin confirmación.

También fix en get_examenes_rips: exámenes con codigo_legacy=NULL ahora
se buscan por codigo como fallback (COALESCE).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-17 15:56:24 -05:00