- feat(turnero): Botón "Olvidar" en lugar.php y recepcion.php para descartar firma de consentimiento completo (nuevo endpoint resetear_consentimiento.php)
- feat(turnero): Botón "Olvidar" por toma individual en prolongadas para borrar firma+hora de una toma específica (nuevo endpoint resetear_toma.php)
- feat(turnero): Editar tiempos en tomas en_progreso: hora_campo signed muestra readonly con botón olvidar, permite re-editar tras olvidar
- feat(turnero): Guardar tiempos (draft save) también en estado en_progreso
- feat(turnero): Observaciones de tomas prolongadas se muestran en header de tarjeta firmada (campo obs_campo en _mpMap)
- fix(turnero): Token del equipo se sobreescribía en tabla — ip permitía solo un registro con ip='' (UNIQUE); ahora ip es nullable
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bootstrap d-none usa display:none !important que gana sobre
modal.style.display = 'flex' del JS. Se quita la clase d-none;
el display:none del style inline es suficiente.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- JS evaluar(): añade margin:0; padding:0 al ocultar elementos con maxHeight:0
para que .campo-edit no deje margen residual
- PHP render: baked-in separator oculto incluye margin:0;padding:0
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- DB: añade estado 'cerrado_anticipado' al enum de turnero_consentimientos
- ver_formulario_enviado.php: POST handler mp_cerrar_anticipado guarda motivo
en _cierre_anticipado y cambia estado; botón "Cerrar anticipadamente" con modal
textarea; bloque display para estado cerrado_anticipado mostrando el motivo;
modoEditar y check de estado actualizados para excluir cerrado_anticipado
- get_consentimientos.php: expone cierre_anticipado en respuesta; mueve parse
de datos_respuestas fuera del if(esTomaProg) para ambos loops
- lugar.php: CONSENT_IC/LBL incluye cerrado_anticipado; ya[] lo incluye;
hayPendientes lo excluye; fila muestra motivo en banner amarillo
- recepcion.php: CONSENT_META incluye cerrado_anticipado; ya[] lo incluye;
motivo visible en la tarjeta del consentimiento
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- configurar_tomas.php: almacena _tomas_config como { examName: { groupKey: [fids] } }
en vez de flat, detecta y resetea formato antiguo, valida exam_type requerido
- ver_formulario_enviado.php: rendering aplana nested→flat para filtrar secciones;
JS lee _mpTomasConfig[examName][gk] en inSaved y _mpRenderBadges; auto-open
verifica per-examen; _mpActiveConfigExam evita race entre exámenes simultáneos
- get_consentimientos.php: flatten de nested o flat para calcular allowedFids
en ambos loops de tomas progresivas
- F-LAB-08 (id=16): añade 'Grupo sanguíneo' a opciones de _m5n865g;
agrega campos condicionales '¿Qué tipo de cáncer?' y 'Especifique grupo sanguíneo'
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Al guardar config de un examen se sobreescribía _c8j2g16 con solo ese examen,
perdiendo los demás en el reload. Ahora se envía exam_types (array completo),
se guarda como array en datos_respuestas y sessionStorage restaura todos los
checkboxes marcados al recargar.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- every en lugar de some: examen configurado solo cuando TODOS sus grupos
tienen config (no solo alguno compartido)
- inSaved sin requisito isModify: grupos compartidos muestran selección
previa al abrir panel de otro examen, evitando sobreescribir config
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
El fallback que abría el primer examen en modo editar cuando todos estaban
configurados causaba un loop infinito — el panel nunca se cerraba y el
usuario no podía llegar a firmar. Ahora solo se auto-abre si hay un examen
pendiente de configuración.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- configurar_tomas.php: merge config por examen en lugar de overwrite
- ver_formulario_enviado.php: auto-abrir panel de tiempos al cargar; soporte formularios solo_profesional con botón Guardar y completar
- get_consentimientos.php: leer campo solo_profesional de lab_formularios
- recepcion.php: formularios sin firma paciente muestran badge "Completa en laboratorio"
- lugar.php: botón "Completar" para formularios solo_profesional
DB: ALTER TABLE lab_formularios ADD solo_profesional; UPDATE Rubeola id=8; UPDATE descripcion Niños kiosko
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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>
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>
- 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>
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>
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>
_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>
- 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>
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>
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>
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>
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>
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>
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>
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>
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>
- 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>
- 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>
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>
- 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>
Añade flag $_mpSkipSec para secciones excluidas por _tomas_config; la
condición anterior dependía de !$modoEditar y nunca ocultaba nada
cuando el consentimiento está en_progreso.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- PHP: restaura auto-apply de _tomas_config para mostrar tomas correctas en recarga
- Badge: agrega botón 'Modificar' cuando el examen ya está configurado
- Panel: en modo modificar pre-marca las tomas guardadas y deshabilita
las ya firmadas (con ícono ✓ y opacity reducida)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- PHP: elimina auto-aplicación de _tomas_config guardada; las tomas
siempre parten limpias hasta que el profesional configure manualmente
- JS: elimina auto-guardado cuando hay 1 sola toma por grupo
- JS: restaura _mpGetGroupsForExam a mostrar todos los grupos disponibles
(condicionados del examen + genéricos sin condición)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
_mpGetGroupsForExam ahora solo incluye los grupos genéricos ('Toma')
cuando el examen no tiene secciones propias condicionadas.
Para Taukit/Heliprobe/etc. aparecen únicamente sus tomas.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>