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>
Si _llamar no actualiza turnoActivo a en_servicio (fallo silencioso del
cliente), recuperarTurnoActivo() vuelve a consultar el servidor y carga
el turno correctamente, mostrando el botón rellamar.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- buscar_cie10.php: busca por código o descripción, límite 12 resultados
- inp-diag: dropdown estilo empresa, Enter selecciona primero
- selectOnTab:false en TomSelect de exámenes
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's PDO in silent mode returns false on prepare() when table doesn't
exist; calling ->execute() on false throws TypeError (Error, not
Exception). Changed catch to \Throwable and added explicit checks so
the real error message is returned as JSON instead of HTTP 500 empty.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
El badge 1/9 ignoraba la configuración guardada e incluía todas las tomas
sin condición. Ahora filtra relevantIds por los firma-ids en _tomas_config,
igual que lo hace guardar_toma.php y el render PHP del formulario.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- migrations/20260717_cie10_diagnosticos.sql: CREATE TABLE cie10_diagnosticos
- api/lab/ingest_diagnosticos.php: POST endpoint that receives batches of
{cod, concepto} rows and upserts into cie10_diagnosticos (ON DUPLICATE KEY)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Al crear un paciente nuevo desde el modal, el objeto no incluía genero
por lo que el bloque embarazada no se ocultaba para masculinos. Al editar
también se actualiza genero y se re-evalúa la visibilidad del bloque.
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>
- Texto: "Marque las tomas que va a realizar."
- Título de grupo solo aparece cuando hay más de un grupo;
con un solo grupo (caso habitual) los checkboxes salen directamente
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
El profesional elige manualmente cuáles tomas aplicar antes
de iniciar el protocolo, en vez de tener que desmarcar las que no usa.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Al vincular un paciente con genero='M' se oculta el bloque y
se desmarca el check. Al desvincular/resetear vuelve a mostrarse.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Grid pasa de 2 a 3 columnas en modo compact; campo-full abarca las 3
- texto/textarea siguen en fila completa (campo-full)
- numero, edad, fecha, hora ocupan 1/3 → caben 3 por fila
- form-check-input 1.35em, min-height 2.2rem para área táctil cómoda en tablet
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- create_turno.php: reemplaza http:// por https:// en el link enviado
por WhatsApp, evitando que Android CCT bloquee páginas HTTP
- ver_formulario_enviado.php: agrega botón "Abrir en navegador" en la
barra de acción cuando el modo es turnero, como fallback para Android
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Modal con select de prioridad (cargado desde BD) y campo opcional
de cédula/nombre. Llama a create_turno.php que ya maneja sesión,
duplicados, SSE y notificación WhatsApp.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- get_cola.php: quita orden por orden_peso, deja solo creado_at ASC
- recepcion.php: cards con prioridad distinta a E (general) muestran
borde izquierdo y fondo tintado con el color de la prioridad
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Campo inp-recibo aparece/desaparece al seleccionar 'Tarjeta' en forma de pago
- Se incluye en el payload como numero_recibo y se guarda en turnero_solicitudes
- Migración: ADD COLUMN numero_recibo VARCHAR(40) en turnero_solicitudes
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Si eps o ciudad del paciente no existe en el select, se agrega como opción
temporal para no sobrescribir con vacío al guardar.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Tabla lab_ciudades creada y poblada con 86 ciudades existentes
- Módulo lab_ciudades: listado, crear, editar, activar/desactivar, eliminar
- API /api/lab/ciudades.php: GET list, POST save/toggle/delete
- Modal paciente: campo ciudad cambiado a select, cargado junto con EPS
en un solo Promise.all al iniciar; Cúcuta preseleccionada por defecto
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Tabla lab_eps creada y poblada con valores existentes de lab_pacientes
- Módulo lab_eps: listado, crear, editar, activar/desactivar, eliminar
- API /api/lab/eps.php: GET list, POST save/toggle/delete
- Modal paciente en recepción: campo EPS cambiado de texto libre a select
cargado desde lab_eps al iniciar la página
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
El kiosko guarda la cédula en paciente_nombre del turno. Al abrir el
modal de nuevo paciente, si el valor es numérico se pone en el campo
documento (no en nombre). El foco cae en nombre para que el recepcionista
complete los datos restantes. Campo editable normalmente.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Sin empresa: usa precio_base de exam_tipos (tarifa particular)
- Panel de precios se muestra con solo seleccionar exámenes (no requiere convenio)
- Total se aplica automáticamente al campo de cobro sin clic manual
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Con video activo: layout pasa de 3 columnas (37/39/24%) a 2 (1fr/29%).
El panel central (turno-activo) se oculta via CSS; left-area (listado)
absorbe el espacio liberado y el video sube de 24% a 29%.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Búsqueda automática con debounce 300ms al escribir (sin necesidad de lupa)
- Enter: si ya hay resultados selecciona el primero, si no dispara la búsqueda
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
JSON.stringify(e) dentro de onmousedown="..." producía comillas dobles
que el parser HTML interpretaba como cierre del atributo, dejando la
función con un objeto incompleto. Ahora los resultados se guardan en
_empresaResultados[] y el handler pasa solo el índice numérico.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Items seleccionados se muestran en filas verticales con chip de CUPS/código
- Búsqueda por CUPS funciona (código CUPS incluido en texto de <option>)
- Dropdown muestra chip de CUPS junto al nombre del examen
- PHP SELECT incluye columna cups de exam_tipos
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
El banner de alerta solo se cerraba vía 'Ver paciente'. Si el profesional
hacía clic en 'Siguiente toma' directamente, el banner seguía parpadeando
y sonando aunque el formulario ya estuviera abierto.
- abrirTomaProgresiva() ahora llama cerrarBannerToma() + _tomaAlertados.delete()
- renderConsentimientos() preserva alertado:true si la siguiente_toma_at no
cambió, evitando beep doble al re-sincronizar después de firmar
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
PHP saltaba el render de separadores y campos hijos cuando _saltarSeccion=true,
incluso en modoEditar, así que el JS evaluar() nunca encontraba los elementos.
En modoEditar ahora se renderizan con estilo oculto inicial; JS gestiona la
visibilidad cuando el usuario marca/desmarca la condición.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Cada bloque separador+hora+observaciones+firma se envuelve en una
toma-card con 3 estados visuales: signed (verde colapsable), active
(color primario pulsante) y locked (gris opaco).
- Barra de progreso con puntos y porcentaje encima de las tarjetas.
- Al firmar: tarjeta activa pasa a signed (muestra hora anotada y
miniatura colapsable), siguiente pasa a active con scroll automático.
- Countdown de espera aparece en el header de la tarjeta bloqueada
además del banner global.
- Fix: variable 'minutos' indefinida en pct del countdown → 0.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
A) Fix bug: grupos fuera de _tomas_config contaminaban $_mpMap y bloqueaban
firmas configuradas. Ahora se vacían y sus secciones se agregan a
$_mpSkippedSepIds para que PHP no las renderice.
B) Quitar campo Resultado del esquema (14 campos eliminados del form 15 en
BD). save_tomas_config.php ya no genera campo Resultado en exámenes nuevos.
Patrón queda: separador → hora → observaciones → firma_profesional.
C) Condicionamiento implícito: con el fix de A, solo aparecen las secciones
del grupo configurado en _tomas_config, sin cambios en el esquema DB.
D) UX: reemplaza popup automático por badges bajo el campo _c8j2g16.
Cada examen seleccionado muestra badge con estado (pendiente/configurado)
y botón "Configurar tiempos" que abre el panel solo al hacer clic.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Auto-select tras crear examen: buscaba input[type=radio] pero el campo
_c8j2g16 es checkbox → nunca encontraba el elemento. Usa _mpSetExamChecked.
- save_tomas_config.php: añade campo Observaciones (texto) entre Resultado
y firma_profesional, igual que las secciones Toma existentes.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
El panel mp-cfg-overlay no tenía forma de cerrarse. Añade botón × en
el encabezado que oculta el panel, desmarca el tipo de examen y resetea
la visibilidad de secciones.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
El campo tipo examen es checkbox → HTML renderiza name="_c8j2g16[]".
Todos los querySelector y el listener comparaban name="_c8j2g16" exacto
→ nunca matcheaban → visibilidad de secciones y panel de config nunca
se activaban. Añade _mpGetExamName()/_mpSetExamChecked() que aceptan
ambas variantes y los usa en todos los puntos de uso.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Tras guardar la config de tomas (_mpGuardarConfig), location.reload() borraba
el checkbox seleccionado → _mpApplyExamVisibility(null) ocultaba toda la UI.
Ahora se guarda el examen en sessionStorage antes del reload y se restaura en
DOMContentLoaded, reactivando la visibilidad de firmas y tiempos.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fix 1: countdown se recupera al reabrir el modal (lee siguiente_toma_at de BD)
- Fix 2: _mpIniciarCountdown recibe timestamp exacto en vez de minutos redondeados
- Fix 3: window._fpwPreFirma se emite una sola vez (no N veces por campo firma)
- Fix 4: postMessage('turneroFirmado') unificado a 2000ms en todos los paths
- Fix 5: resumen de tomas usa hora cacheada al guardar; elimina traversal DOM frágil
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
El listener bloqueaba todo con el guard de _mpModoTurnero antes de llamar
a _mpApplyExamVisibility. Ahora la visibilidad siempre aplica al seleccionar
examen; el panel de config sigue siendo solo para modo turnero.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Los campos están en div.campos-grid (hijo de .doc-body), no directamente en .doc-body.
Elimina todos los console.log de debug y simplifica _mpApplyExamVisibility.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Los div.section-title ("Firma del profesional") no tienen data-campo-id y eran
ignorados por querySelectorAll. Ahora se itera docBody.children en orden para
que inHidden aplique a todos los hijos incluyendo los que no tienen atributo.
Agrega console.log [tomas] para diagnóstico del estado de _mpAllGroups.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>