From a6bf35cb5814dd5418a8cf0d23553f8597d6de18 Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Tue, 11 Aug 2026 09:10:20 -0500 Subject: [PATCH] =?UTF-8?q?Corregir=20secciones=20condicionales=20que=20de?= =?UTF-8?q?jaron=20de=20aparecer,=20y=20habilitar=20la=20obst=C3=A9trica?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- ver_formulario_enviado.php | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/ver_formulario_enviado.php b/ver_formulario_enviado.php index eeefaa0..96a588f 100644 --- a/ver_formulario_enviado.php +++ b/ver_formulario_enviado.php @@ -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';