Commit Graph
1196 Commits
Author SHA1 Message Date
Lizandro GuarnizoandClaude Sonnet 4.6 1715af4506 F-LAB-28: siempre mostrar panel de config, sin auto-aplicar config guardada
- 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>
2026-07-16 21:42:16 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 c0f45dd47a F-LAB-28: panel config muestra solo tomas del examen seleccionado
_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>
2026-07-16 21:39:26 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 d5e6f9a794 F-LAB-28: simplificar panel configurar tomas
- 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>
2026-07-16 21:34:45 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 1622bc3050 F-LAB-28: panel configurar tomas abre con todas desmarcadas
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>
2026-07-16 21:30:21 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 3a865d5c9f recepcion: ocultar checkbox embarazada si el paciente es masculino
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>
2026-07-16 21:25:33 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 0a09b07ea1 formulario consent embed: 3 columnas para inputs cortos + checkboxes más grandes
- 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>
2026-07-16 21:16:41 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 50446a3914 fix: forzar HTTPS en link de consentimiento + botón abrir en navegador
- 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>
2026-07-16 21:08:19 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 8b0bdc6b30 turnero/recepcion: botón para generar nuevo turno desde recepción
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>
2026-07-16 20:54:02 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 8917daf9be turnero: orden estricto de llegada + color de prioridad en cola recepción
- 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>
2026-07-16 20:48:50 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 0f6c837d35 feat: campo número de recibo al pagar con tarjeta
- 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>
2026-07-16 20:42:39 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 7506f63627 chore: migración lab_eps y lab_ciudades en run_pendientes
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-16 20:40:00 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 1237552cb2 fix: selects de EPS/ciudad no pierden valor si el paciente tiene texto fuera del catálogo
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>
2026-07-16 20:38:21 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 4cb1a135b3 feat: CRUD de ciudades + select en modal de paciente
- 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>
2026-07-16 20:36:59 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 da2bfde38f feat: CRUD de EPS + select en modal de paciente
- 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>
2026-07-16 20:33:57 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 fb8fb9bc7a feat: pre-llenar cédula del kiosko al crear paciente desde recepción
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>
2026-07-16 20:30:15 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 35cba08004 feat: precios particulares automáticos al seleccionar exámenes
- 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>
2026-07-16 20:27:18 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 fa338e9e11 feat: overlay de turno llamado visible 5 s (antes 2.3 s)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-16 20:21:19 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 bf3b128a14 feat: pantalla display — quitar turno-activo con video, left-area toma el espacio
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>
2026-07-16 20:17:21 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 9df5f19c08 feat: búsqueda de paciente en tiempo real + Enter selecciona el primero
- 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>
2026-07-16 20:09:58 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 123ab0e034 fix: selección de empresa/convenio rota por JSON en atributo HTML
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>
2026-07-16 19:44:44 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 c22c38a58f feat: exámenes en recepción — lista vertical + búsqueda por CUPS
- 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>
2026-07-16 19:15:24 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 7a4413e173 fix: banner toma no se cierra al abrir directamente por 'Siguiente toma'
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>
2026-07-16 13:05:26 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 d1ac82886d fix: campos condicionales no aparecen en modo editar
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>
2026-07-16 12:30:06 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 a2b46c464a feat: tarjetas por toma con estados y barra de progreso
- 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>
2026-07-16 11:51:08 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 86ec692028 refactor: mejorar flujo de tomas prolongadas (A+B+C+D)
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>
2026-07-16 11:20:15 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 3b61ee6f35 fix: auto-select examen nuevo usa checkbox no radio; añade Observaciones
- 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>
2026-07-16 10:57:41 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 51c4973796 feat: botón × para cerrar panel de configuración de tomas
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>
2026-07-16 10:46:08 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 65b18facdb fix: checkbox _c8j2g16 usa name[] en HTML, no name exacto
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>
2026-07-16 10:36:41 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 182dc01a77 fix: restaurar selección de examen tras reload del panel de config de tomas
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>
2026-07-16 10:25:12 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 34a0ae2c35 fix: 5 bugs en modal de tomas progresivas F-LAB-28
- 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>
2026-07-16 09:45:55 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 388f6ff7c9 Fix: _mpApplyExamVisibility no debe depender de _mpModoTurnero
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>
2026-07-10 12:09:28 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 8ec121e4e0 Fix: usar .campos-grid como contenedor real de campos para visibilidad de tomas
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>
2026-07-10 12:06:38 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 ee1cd684a8 Debug: detectar contenedor anidado cuando doc-body no tiene esquema-sep como hijo directo
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 12:03:58 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 f22553391c Debug: log docBody children count y fix listener para checkbox/radio en _c8j2g16
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 12:02:16 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 d12b605afd Fix: iterar hijos directos de doc-body para ocultar section-title sin data-campo-id
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>
2026-07-10 11:57:37 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 393c226b7c Fix: ocultar todas las secciones de tomas excepto las del examen seleccionado
Lógica anterior usaba sepToExam (vacío cuando labels son genéricos "Toma · X").
Nueva lógica: reúne TODOS los sep_ids de _mpAllGroups como allTomaSeps,
luego muestra solo los del grupo que coincide con el examen seleccionado
(vía _mpGetGroupsForExam). Si el examen no tiene grupos o no hay selección,
todas las secciones de toma quedan ocultas.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 11:41:46 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 25ff224e5e Fix: ocultar todas las secciones de tomas si no hay examen seleccionado
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 11:34:54 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 bf0fc39fee Fix: visibilidad de secciones de tomas por examen seleccionado
- _mpApplyExamVisibility(): oculta/muestra secciones en el DOM usando
  sep_id de _mpAllGroups, sin depender de condicion en el esquema
- Funciona aunque la BD no tenga condiciones restauradas aún
- _restore_tomas_conditions.php: migración para restaurar condiciones
  en separadores usando prefijo del label vs opciones de _c8j2g16

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 11:30:07 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 da2b67589e Tomas: panel de ciclos dinámico activado al seleccionar tipo de examen
- Panel ya no se renderiza server-side, sino que JS lo muestra al instante
  cuando el usuario selecciona un tipo de examen del selector _c8j2g16
- _mpGetGroupsForExam() filtra los grupos correspondientes al examen elegido
- Si solo hay 1 toma por grupo, auto-guarda sin mostrar panel
- Si al cargar ya hay examen seleccionado y sin _tomas_config, muestra panel
- configurar_tomas.php: guarda también _c8j2g16 (exam_type) en datos_respuestas

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 11:19:55 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 f0fb0c7492 Tomas: wizard inline para crear tipo de examen con tomas configurables
- Botón "Añadir tipo de examen…" abre wizard directo en el formulario
- Paso 1: nombre del examen + cantidad de tomas (1-12) con +/-
- Cada toma: label, tipo (minutos / hora fija), valor
- Al guardar llama api/lab/save_tomas_config.php y recarga la página
- Auto-selecciona el nuevo examen tras recargar (sessionStorage)
- Restaura filtrado de $_gruposConfig por examen seleccionado

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 11:10:51 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 be55a087aa Tomas: añadir tipo de examen inline sin página separada
- Botón "Añadir tipo de examen…" debajo del selector _c8j2g16
- Al escribir y guardar, añade la opción vía API y la selecciona al instante
- api/lab/add_exam_option.php: guarda la nueva opción en el esquema del formulario
- Migración actualizada: solo elimina condiciones de separadores (no toca el selector)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 11:05:45 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 4e6da5d7eb Simplificar tomas prolongadas: campo texto libre + sin condiciones
- _c8j2g16 pasa a texto libre ("Tipo de examen"), sin opciones predefinidas
- Separadores de tomas sin condición → siempre visibles
- Eliminar lab_tomas_config.php (ya no necesario)
- $_gruposConfig incluye todos los grupos directamente
- Script _migrate_tomas_simplify.php para actualizar esquema en BD

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 11:01:53 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 645c9b2c46 Fix: reemplazar Layout::open/close por estructura HTML estándar en lab_tomas_config
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 10:58:16 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 b80b81fe84 Temp: script migración para registrar lab_tomas_config en sidebar (auto-elimina al ejecutar)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 10:55:25 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 e58ebf57e1 Migración: registrar lab_tomas_config en system_modules
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 10:49:48 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 a39be5b31e Fix: quitar <?php duplicado dentro de bloque PHP (error de sintaxis)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 10:40:26 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 578873a10f Tomas prolongadas: panel configurable + link acceso directo
- Panel de protocolo ahora tiene botón "Usar todas" para cerrar sin configurar
- Si todos los grupos ya tienen una sola toma, se guarda config silenciosamente y se recarga sin mostrar panel
- Lógica de guardado extraída a _mpGuardarConfig() compartida entre ambos botones
- Botón de acceso a lab_tomas_config.php en tarjeta del formulario es_toma_progresiva

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 10:36:10 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 2eefe3f5c8 feat: ciclos configurables + gestión de exámenes en Tomas Prolongadas
Feature 1 — Ciclos configurables por paciente:
- ver_formulario_enviado.php: pantalla de configuración aparece la primera
  vez que el profesional abre el formulario (antes de firmar); permite
  seleccionar qué tomas realizar para cada protocolo. $_mpSkippedSepIds
  oculta las secciones no seleccionadas en render. $_mpMap se reconstruye
  desde los grupos filtrados para que next_firma_id salte tomas omitidas.
- configurar_tomas.php (nuevo): guarda _tomas_config en datos_respuestas
  del consentimiento; valida que cada grupo tenga al menos una toma.
- guardar_toma.php: aplica el filtro _tomas_config al array firmasCampos
  para que el conteo de tomas firmadas/pendientes sea correcto.

Feature 2 — Gestión de tipos de examen (admin):
- lab_tomas_config.php (nuevo): página admin que muestra los exámenes
  actuales con sus tomas y permite añadir nuevos tipos con su esquema
  completo (separador + hora + resultado + firma_profesional por toma).
- api/lab/save_tomas_config.php (nuevo): modifica el esquema JSON del
  formulario id=15; add_exam agrega opción al selector y los campos de
  cada toma; delete_exam elimina la opción y los separadores exclusivos.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 10:19:11 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 3e110324a8 feat: auto-fill hora de toma con hora actual en F-LAB-28
Al activarse cada sección de toma (carga inicial, toma inmediata,
fin de countdown), se rellena automáticamente el campo hora con la
hora actual del dispositivo. Solo actúa si el campo está vacío, por
lo que no sobreescribe valores ya ingresados manualmente.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 09:44:11 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 55bccae0ad fix: dark mode completamente reescrito con Bootstrap 5.3 data-bs-theme
- Agrega script inline en <head> de Layout.php, lugar.php y recepcion.php
  que detecta prefers-color-scheme y activa data-bs-theme="dark" en <html>
  antes del primer paint (evita flash de contenido blanco)
- sidebar.php: script de fallback para páginas con head propio no actualizado
- Layout.php: corrige background hardcodeado #f8f9fa en .main-content y
  reemplaza bg-white por bg-body-tertiary en barra de título
- styles.css: elimina bloque @media duplicado y contradictorio; nuevo bloque
  unificado cubre @media (fallback sin JS) + [data-bs-theme="dark"] para
  elementos custom (sidebar, chat); Bootstrap maneja el resto automáticamente
- Bump styles.css a v=15 en los tres templates

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-09 20:42:39 -05:00