Corregir secciones condicionales que dejaron de aparecer, y habilitar la obstétrica

Regresión introducida hoy en 8948ea6: al ocultar con display:none los campos de
secciones cuya condición no se cumple, dejaron de aparecer al marcar la opción
que las activa. El evaluador de condiciones anima con max-height y opacity pero
nunca tocaba display, así que el campo quedaba invisible pese a "mostrarse".
Afectaba a Tipo de dolor, Tipo de cáncer, Grupo sanguíneo y Otro antecedente
familiar de F-LAB-08.

Al revisarlo apareció un problema anterior en DATOS OBSTÉTRICOS, que depende del
sexo del paciente: `genero` nunca se entregó como clave vinculable, así que la
condición no podía evaluarse ni en PHP ni en el navegador. Antes esos campos
salían siempre visibles —también para hombres— porque los campos de secciones
ocultas se renderizaban igual; al corregir eso quedaban inaccesibles.

Se expone `genero`, y tanto el evaluador de PHP como el del navegador resuelven
condiciones que dependen de un campo vinculado: en PHP leyendo la ficha del
paciente, en el navegador leyendo el valor mostrado.

Validado con node reproduciendo la falla y las siete combinaciones de las cinco
secciones condicionales, incluidas paciente mujer y hombre.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-08-11 09:10:20 -05:00
co-authored by Claude Opus 5
parent 57818b180a
commit a6bf35cb58
+30 -4
View File
@@ -37,7 +37,7 @@ if ($modoTurnero) {
p.id AS paciente_id,
p.nombre_completo AS paciente_nombre,
p.numero_documento, p.tipo_documento,
p.fecha_nacimiento, p.telefono AS paciente_telefono, p.eps, p.direccion,
p.fecha_nacimiento, p.telefono AS paciente_telefono, p.eps, p.direccion, p.genero,
t.sesion_id,
ts.numero_orden,
med.nombres AS medico_nombres, med.apellidos AS medico_apellidos,
@@ -156,6 +156,7 @@ if ($modoTurnero) {
'telefono' => $tcRow['paciente_telefono'] ?? '',
'eps' => $tcRow['eps'] ?? '',
'direccion' => $tcRow['direccion'] ?? '',
'genero' => $tcRow['genero'] ?? '',
'medico_nombre' => trim(($tcRow['medico_nombres'] ?? '') . ' ' . ($tcRow['medico_apellidos'] ?? '')),
'medico_especialidad'=> $tcRow['medico_especialidad'] ?? '',
'medico_codigo' => $tcRow['medico_codigo'] ?? '',
@@ -178,7 +179,7 @@ if ($modoTurnero) {
f.esquema, f.permite_firma, f.requiere_firma,
f.doc_encabezado, f.doc_subtitulo, f.doc_logo_base64, f.doc_color, f.doc_pie_pagina,
p.nombre_completo AS paciente_nombre, p.numero_documento, p.tipo_documento,
p.fecha_nacimiento, p.telefono AS paciente_telefono, p.eps, p.direccion,
p.fecha_nacimiento, p.telefono AS paciente_telefono, p.eps, p.direccion, p.genero,
u.full_name AS enviado_por_nombre, u.email AS enviado_por_email,
ld.numero_orden
FROM lab_form_envios e
@@ -202,7 +203,7 @@ if ($modoTurnero) {
f.esquema, f.permite_firma, f.requiere_firma,
f.doc_encabezado, f.doc_subtitulo, f.doc_logo_base64, f.doc_color, f.doc_pie_pagina,
p.nombre_completo AS paciente_nombre, p.numero_documento, p.tipo_documento,
p.fecha_nacimiento, p.telefono AS paciente_telefono, p.eps, p.direccion,
p.fecha_nacimiento, p.telefono AS paciente_telefono, p.eps, p.direccion, p.genero,
u.full_name AS enviado_por_nombre, u.email AS enviado_por_email,
ld.numero_orden
FROM lab_form_envios e
@@ -1010,6 +1011,7 @@ function _addExamWizardHtml(string $cid): string {
'telefono' => $envio['paciente_telefono'] ?? null,
'eps' => $envio['eps'] ?? null,
'direccion' => $envio['direccion'] ?? null,
'genero' => $envio['genero'] ?? null,
], fn($v) => $v !== null && $v !== '');
// Firma global del profesional (un solo valor para todos los campos firma_profesional)
@@ -1061,6 +1063,18 @@ function _addExamWizardHtml(string $cid): string {
$cond = $campo['condicion'] ?? null;
if ($cond) {
$vCtrl = $todos[$cond['campo_id']] ?? null;
// La condición puede depender de un campo vinculado (p. ej. el
// sexo del paciente, que gobierna la sección obstétrica). Esos
// no están en las respuestas: su valor sale de la ficha.
if ($vCtrl === null) {
foreach ($esquema as $__c) {
if (($__c['id'] ?? '') === $cond['campo_id']
&& ($__c['tipo'] ?? '') === 'linked') {
$vCtrl = $paciente[$__c['linked_key'] ?? ''] ?? null;
break;
}
}
}
$vCond = $cond['valores'] ?? ($cond['valor'] ? [$cond['valor']] : []);
$_saltarSeccion = is_array($vCtrl)
? empty(array_intersect($vCond, $vCtrl))
@@ -3206,13 +3220,25 @@ const topaz = (() => {
} else {
var radio = ctrl.querySelector('input[type="radio"]:checked');
var sel = ctrl.querySelector('select');
var v = radio ? radio.value : (sel ? sel.value : '');
var txt = ctrl.querySelector('input[type="text"], textarea');
// Un campo vinculado se muestra como texto, no como control:
// es el caso del sexo, que gobierna la sección obstétrica.
var lnk = ctrl.classList.contains('campo-linked')
? ctrl.querySelector('.campo-linked-valor') : null;
var v = radio ? radio.value
: sel ? sel.value
: lnk ? lnk.textContent.trim()
: txt ? txt.value : '';
activo = valoresCond.includes(v);
}
var ids = [sec.sepId].concat(sec.elemIds);
ids.forEach(function(id) {
var el = document.querySelector('[data-campo-id="' + id + '"]');
if (!el) return;
// El PHP marca con display:none los campos de secciones cuya
// condición no se cumple. Esta función anima con max-height y
// opacity, así que sin quitar el display el campo nunca aparece.
if (activo) el.style.removeProperty('display');
el.style.transition = 'opacity .2s, max-height .3s';
el.style.maxHeight = activo ? '2000px' : '0';
el.style.opacity = activo ? '1' : '0';