From 3062cd7e95293c7b5eccc73efbc5894f59f49cce Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Wed, 8 Jul 2026 09:23:54 -0500 Subject: [PATCH] =?UTF-8?q?fix:=20no=20mostrar=20consentimientos=20de=20to?= =?UTF-8?q?ma=20de=20muestras=20al=20guardar=20en=20recepci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit create_solicitud.php: cambia de crear consents por lugar (toma de muestras) a crear consents por examen (exam_tipo_consentimientos). Los de lugar se crean cuando el paciente llega a la estación vía get_consentimientos.php. get_consentimientos.php: cuando lugar_destino_id es NULL (turno en recepción), busca TODOS los formularios de turnero_lugar_consentimientos y los marca con origen_lugar_id = -1 (truthy), para que el filtro !c.origen_lugar_id de recepcion.php los excluya correctamente aunque no haya destino asignado aún. Co-Authored-By: Claude Sonnet 4.6 --- modules/turnero/api/create_solicitud.php | 58 +++++++++++---------- modules/turnero/api/get_consentimientos.php | 14 ++++- 2 files changed, 43 insertions(+), 29 deletions(-) diff --git a/modules/turnero/api/create_solicitud.php b/modules/turnero/api/create_solicitud.php index 0817db9..758f4b6 100644 --- a/modules/turnero/api/create_solicitud.php +++ b/modules/turnero/api/create_solicitud.php @@ -143,37 +143,41 @@ try { $stmtItem->execute([$solicitudId, $examId]); } - // ── Consentimientos: solo los configurados para este lugar ── - $stmt = $pdo->prepare( - "SELECT f.id AS formulario_id, f.nombre AS formulario_nombre - FROM lab_formularios f - INNER JOIN turnero_lugar_consentimientos tlc ON tlc.formulario_id = f.id - WHERE tlc.lugar_id = ? - AND f.is_active = 1 - ORDER BY f.nombre ASC" - ); - $stmt->execute([$lugarId]); - $consentimientosRequeridos = $stmt->fetchAll(PDO::FETCH_ASSOC); + // ── Consentimientos: solo los de examen (los de lugar se crean al llegar a toma de muestras) ── + $consentimientosRequeridos = []; + if (!empty($examIds)) { + $ph = implode(',', array_fill(0, count($examIds), '?')); + $stmt = $pdo->prepare( + "SELECT DISTINCT f.id AS formulario_id, f.nombre AS formulario_nombre + FROM lab_formularios f + INNER JOIN exam_tipo_consentimientos etc ON etc.formulario_id = f.id + WHERE etc.exam_tipo_id IN ($ph) + AND f.is_active = 1 + ORDER BY f.nombre ASC" + ); + $stmt->execute($examIds); + $consentimientosRequeridos = $stmt->fetchAll(PDO::FETCH_ASSOC); - // Crear o recuperar estado de cada consentimiento requerido - $stmtCreateConsent = $pdo->prepare( - "INSERT IGNORE INTO turnero_consentimientos (turno_id, formulario_id, token, estado) - VALUES (?, ?, UUID(), 'pendiente')" - ); - foreach ($consentimientosRequeridos as &$c) { - $stmtCreateConsent->execute([$turnoId, $c['formulario_id']]); - $stC = $pdo->prepare( - "SELECT id, token, estado, enviado_at, firmado_at FROM turnero_consentimientos + $stmtCreateConsent = $pdo->prepare( + "INSERT IGNORE INTO turnero_consentimientos (turno_id, formulario_id, token, estado) + VALUES (?, ?, UUID(), 'pendiente')" + ); + $stmtRead = $pdo->prepare( + "SELECT id, token, estado FROM turnero_consentimientos WHERE turno_id = ? AND formulario_id = ?" ); - $stC->execute([$turnoId, $c['formulario_id']]); - $row = $stC->fetch(PDO::FETCH_ASSOC); - $c['id'] = $row['id'] ?? null; - $c['token'] = $row['token'] ?? null; - $c['estado'] = $row['estado'] ?? 'pendiente'; - $c['turno_id'] = $turnoId; + foreach ($consentimientosRequeridos as &$c) { + $stmtCreateConsent->execute([$turnoId, $c['formulario_id']]); + $stmtRead->execute([$turnoId, $c['formulario_id']]); + $row = $stmtRead->fetch(PDO::FETCH_ASSOC); + $c['id'] = $row['id'] ?? null; + $c['token'] = $row['token'] ?? null; + $c['estado'] = $row['estado'] ?? 'pendiente'; + $c['turno_id'] = $turnoId; + $c['origen_lugar_id'] = null; // es de examen, no de lugar + } + unset($c); } - unset($c); // ── Auto-crear muestras por tipo_muestra de los exámenes ── try { diff --git a/modules/turnero/api/get_consentimientos.php b/modules/turnero/api/get_consentimientos.php index 477a123..16d3ed2 100644 --- a/modules/turnero/api/get_consentimientos.php +++ b/modules/turnero/api/get_consentimientos.php @@ -26,7 +26,11 @@ $stmt->execute([$turnoId]); $turno = $stmt->fetch(PDO::FETCH_ASSOC); if (!$turno) jsonError('Turno no encontrado.', 404); -// ── Formularios asignados al lugar destino (calculado al vuelo, sin depender de origen_lugar_id) ── +// ── Formularios de lugar ────────────────────────────────────────────────────── +// Si el turno ya tiene lugar destino asignado, usar solo ese lugar. +// Si aún está en recepción (lugar_destino_id NULL), marcar como "de lugar" todos +// los formularios configurados en cualquier lugar para que recepcion.php los filtre +// con !c.origen_lugar_id aunque todavía no exista destino. $lugarDestinoId = (int)($turno['lugar_destino_id'] ?? 0); $fidsDeLugar = []; if ($lugarDestinoId) { @@ -35,6 +39,12 @@ if ($lugarDestinoId) { ); $stmtL->execute([$lugarDestinoId]); $fidsDeLugar = array_map('intval', $stmtL->fetchAll(PDO::FETCH_COLUMN)); +} else { + $stmtL = $pdo->prepare( + "SELECT DISTINCT formulario_id FROM turnero_lugar_consentimientos" + ); + $stmtL->execute(); + $fidsDeLugar = array_map('intval', $stmtL->fetchAll(PDO::FETCH_COLUMN)); } // ── Consentimientos ─────────────────────────────────────────── @@ -87,7 +97,7 @@ foreach ($consentimientos as &$c) { $c['requiere_firma_profesional'] = $tieneFirmaPro; $c['requiere_firma_paciente'] = !($tieneFirmaPro && !$tieneFirmaPac); $c['origen_lugar_id'] = in_array((int)$c['formulario_id'], $fidsDeLugar, true) - ? $lugarDestinoId : null; + ? ($lugarDestinoId ?: -1) : null; $c['es_toma_progresiva'] = $esTomaProg; $c['tomas_total'] = $tomasTotal; $c['tomas_firmadas'] = $tomasFirm;