diff --git a/modules/turnero/api/get_bandeja.php b/modules/turnero/api/get_bandeja.php index a017d53..00c5a9f 100644 --- a/modules/turnero/api/get_bandeja.php +++ b/modules/turnero/api/get_bandeja.php @@ -81,12 +81,39 @@ if (isset($_GET['turno_id'])) { $stmtCom->execute([$tid]); $comentarios = $stmtCom->fetchAll(PDO::FETCH_ASSOC); + // Turnos vinculados por muestras pendientes completadas en otra visita (ambos sentidos) + $relacionados = []; + $stmtRelFwd = $pdo->prepare(" + SELECT t2.id AS rel_id, t2.codigo AS rel_codigo, s2.fecha AS rel_fecha + FROM turnero_muestras tm + JOIN turnero_turnos t2 ON t2.id = tm.recibida_en_turno_id + JOIN turnero_sesiones s2 ON s2.id = t2.sesion_id + WHERE tm.solicitud_id = ? AND tm.recibida_en_turno_id IS NOT NULL + "); + $stmtRelFwd->execute([$solId]); + foreach ($stmtRelFwd->fetchAll(PDO::FETCH_ASSOC) as $r) { + $relacionados[] = ['turno_id' => (int)$r['rel_id'], 'codigo' => $r['rel_codigo'], 'fecha' => $r['rel_fecha'], 'direccion' => 'seguimiento']; + } + $stmtRelBack = $pdo->prepare(" + SELECT t1.id AS rel_id, t1.codigo AS rel_codigo, s1.fecha AS rel_fecha + FROM turnero_muestras tm + JOIN turnero_solicitudes ts1 ON ts1.id = tm.solicitud_id + JOIN turnero_turnos t1 ON t1.id = ts1.turno_id + JOIN turnero_sesiones s1 ON s1.id = t1.sesion_id + WHERE tm.recibida_en_turno_id = ? + "); + $stmtRelBack->execute([$tid]); + foreach ($stmtRelBack->fetchAll(PDO::FETCH_ASSOC) as $r) { + $relacionados[] = ['turno_id' => (int)$r['rel_id'], 'codigo' => $r['rel_codigo'], 'fecha' => $r['rel_fecha'], 'direccion' => 'origen']; + } + jsonOk([ 'turno' => $data, 'examenes_por_cat'=> $examenesPorCat, 'muestras' => $muestras, 'consentimientos' => $consentimientos, 'comentarios' => $comentarios, + 'relacionados' => $relacionados, ]); } diff --git a/modules/turnero/api/get_formulario_anterior.php b/modules/turnero/api/get_formulario_anterior.php new file mode 100644 index 0000000..89e7d96 --- /dev/null +++ b/modules/turnero/api/get_formulario_anterior.php @@ -0,0 +1,53 @@ +prepare( + "SELECT tc.datos_respuestas, tc.firmado_at, t.codigo AS turno_codigo + FROM turnero_consentimientos tc + JOIN turnero_turnos t ON t.id = tc.turno_id + LEFT JOIN turnero_solicitudes ts ON ts.turno_id = t.id + WHERE tc.formulario_id = ? + AND tc.estado = 'firmado' + AND COALESCE(ts.paciente_id, t.paciente_id) = ? + AND t.id != ? + ORDER BY tc.firmado_at DESC + LIMIT 1" +); +$stmt->execute([$formularioId, $pacienteId, $excludeTurno]); +$row = $stmt->fetch(PDO::FETCH_ASSOC); + +if (!$row) { + jsonOk(['encontrado' => false]); +} + +$datos = json_decode($row['datos_respuestas'] ?? '{}', true) ?: []; +// No traer firmas ni identidad del profesional anterior: cada visita se firma de nuevo +foreach (array_keys($datos) as $k) { + if (str_contains($k, 'firma') || $k === '_pro_nombre' || $k === '_pro_cedula') { + unset($datos[$k]); + } +} + +jsonOk([ + 'encontrado' => true, + 'datos_respuestas'=> $datos, + 'firmado_at' => $row['firmado_at'], + 'turno_codigo' => $row['turno_codigo'], +]); diff --git a/modules/turnero/api/get_historial.php b/modules/turnero/api/get_historial.php index 0d224b0..8e08e90 100644 --- a/modules/turnero/api/get_historial.php +++ b/modules/turnero/api/get_historial.php @@ -144,6 +144,7 @@ $turnoIds = array_column($turnos, 'id'); $examenes = []; $consentimientos = []; $comentarios = []; +$relacionados = []; if ($turnoIds) { $ph = implode(',', array_fill(0, count($turnoIds), '?')); @@ -194,6 +195,41 @@ if ($turnoIds) { } } + // Turnos vinculados por muestras pendientes completadas en otra visita — batch (ambos sentidos) + // Sentido "seguimiento": este turno tenía una muestra pendiente que se completó en OTRO turno + $stmtRelFwd = $pdo->prepare( + "SELECT DISTINCT ts.turno_id AS turno_id, t2.id AS rel_id, t2.codigo AS rel_codigo, s2.fecha AS rel_fecha + FROM turnero_muestras tm + JOIN turnero_solicitudes ts ON ts.id = tm.solicitud_id + JOIN turnero_turnos t2 ON t2.id = tm.recibida_en_turno_id + JOIN turnero_sesiones s2 ON s2.id = t2.sesion_id + WHERE ts.turno_id IN ($ph) AND tm.recibida_en_turno_id IS NOT NULL" + ); + $stmtRelFwd->execute($turnoIds); + foreach ($stmtRelFwd->fetchAll(PDO::FETCH_ASSOC) as $row) { + $tid = (int)$row['turno_id']; + $relacionados[$tid][] = [ + 'turno_id' => (int)$row['rel_id'], 'codigo' => $row['rel_codigo'], + 'fecha' => $row['rel_fecha'], 'direccion' => 'seguimiento', + ]; + } + // Sentido "origen": este turno completó una muestra pendiente de OTRO turno anterior + $stmtRelBack = $pdo->prepare( + "SELECT DISTINCT tm.recibida_en_turno_id AS turno_id, t1.id AS rel_id, t1.codigo AS rel_codigo, s1.fecha AS rel_fecha + FROM turnero_muestras tm + JOIN turnero_solicitudes ts ON ts.id = tm.solicitud_id + JOIN turnero_turnos t1 ON t1.id = ts.turno_id + JOIN turnero_sesiones s1 ON s1.id = t1.sesion_id + WHERE tm.recibida_en_turno_id IN ($ph)" + ); + $stmtRelBack->execute($turnoIds); + foreach ($stmtRelBack->fetchAll(PDO::FETCH_ASSOC) as $row) { + $tid = (int)$row['turno_id']; + $relacionados[$tid][] = [ + 'turno_id' => (int)$row['rel_id'], 'codigo' => $row['rel_codigo'], + 'fecha' => $row['rel_fecha'], 'direccion' => 'origen', + ]; + } } foreach ($turnos as &$turno) { @@ -201,6 +237,7 @@ foreach ($turnos as &$turno) { $turno['examenes'] = $examenes[$tid] ?? []; $turno['consentimientos'] = $consentimientos[$tid] ?? []; $turno['comentarios'] = $comentarios[$tid] ?? []; + $turno['relacionados'] = $relacionados[$tid] ?? []; } // ── Resumen por estado (del rango filtrado) ─────────────────── diff --git a/modules/turnero/api/update_muestra_estado.php b/modules/turnero/api/update_muestra_estado.php index 6d4509d..bd972f1 100644 --- a/modules/turnero/api/update_muestra_estado.php +++ b/modules/turnero/api/update_muestra_estado.php @@ -8,6 +8,8 @@ * muestra_id int requerido * estado string requerido 'recibida' | 'rechazada' | 'pendiente' * motivo_rechazo string opcional requerido si estado = 'rechazada' + * turno_id int opcional turno activo desde el que se recibe (para trazabilidad + * cuando la muestra es de una visita anterior) */ require_once __DIR__ . '/_helpers.php'; @@ -18,6 +20,7 @@ $datos = inputJson(); $muestraId = isset($datos['muestra_id']) ? (int)$datos['muestra_id'] : 0; $estado = trim($datos['estado'] ?? ''); $motivo = isset($datos['motivo_rechazo']) ? trim($datos['motivo_rechazo']) : null; +$turnoId = isset($datos['turno_id']) ? (int)$datos['turno_id'] : 0; if ($muestraId <= 0) jsonError('muestra_id inválido.'); if (!in_array($estado, ['recibida', 'rechazada', 'pendiente'], true)) { @@ -29,8 +32,9 @@ $pdo = db(); // Verificar que la muestra existe $stmt = $pdo->prepare( - "SELECT tm.id, tm.solicitud_id, tm.estado + "SELECT tm.id, tm.solicitud_id, tm.estado, ts.turno_id AS turno_origen_id FROM turnero_muestras tm + JOIN turnero_solicitudes ts ON ts.id = tm.solicitud_id WHERE tm.id = ?" ); $stmt->execute([$muestraId]); @@ -38,6 +42,10 @@ $muestra = $stmt->fetch(PDO::FETCH_ASSOC); if (!$muestra) jsonError('Muestra no encontrada.', 404); +// Solo registrar "recibida en otro turno" cuando de verdad es una visita distinta +// a la que generó la muestra (no tocar la solicitud/turno original). +$recibidaEnTurno = ($turnoId && $turnoId !== (int)$muestra['turno_origen_id']) ? $turnoId : null; + // Construir campos a actualizar $ahora = date('Y-m-d H:i:s'); $adminI = adminId(); @@ -46,9 +54,9 @@ if ($estado === 'recibida') { $pdo->prepare( "UPDATE turnero_muestras SET estado = 'recibida', recibida_por = ?, recibida_at = ?, - motivo_rechazo = NULL + recibida_en_turno_id = ?, motivo_rechazo = NULL WHERE id = ?" - )->execute([$adminI, $ahora, $muestraId]); + )->execute([$adminI, $ahora, $recibidaEnTurno, $muestraId]); } elseif ($estado === 'rechazada') { $pdo->prepare( "UPDATE turnero_muestras @@ -61,7 +69,7 @@ if ($estado === 'recibida') { $pdo->prepare( "UPDATE turnero_muestras SET estado = 'pendiente', recibida_por = NULL, - recibida_at = NULL, motivo_rechazo = NULL + recibida_at = NULL, recibida_en_turno_id = NULL, motivo_rechazo = NULL WHERE id = ?" )->execute([$muestraId]); } diff --git a/modules/turnero/views/bandeja.php b/modules/turnero/views/bandeja.php index 55caccf..c879631 100644 --- a/modules/turnero/views/bandeja.php +++ b/modules/turnero/views/bandeja.php @@ -642,6 +642,21 @@ function _renderDetalle(d) { } secM += ``; + // Turno vinculado (muestra pendiente completada en otra visita, o viceversa) + let secRel = ''; + if (d.relacionados?.length) { + secRel = `