El turno original no se modifica (queda finalizado igual que antes) — solo se agrega trazabilidad: turnero_muestras.recibida_en_turno_id registra en qué turno se completó una muestra que había quedado pendiente en otra visita. Historial, bandeja y lugar.php ahora muestran un chip/botón "Turno vinculado" en ambos sentidos (origen ⇄ seguimiento) con acceso directo. Además, al abrir un formulario "Datos Toma de Muestras" pendiente para una visita de seguimiento, aparece un botón para cargar las respuestas del último formulario firmado de ese mismo paciente (sin firma ni identidad del profesional anterior) — evita reescribir la historia clínica; la firma y fecha siguen siendo las de hoy. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
78 lines
2.8 KiB
PHP
78 lines
2.8 KiB
PHP
<?php
|
|
/**
|
|
* POST /modules/turnero/api/update_muestra_estado.php
|
|
* Marca una muestra como recibida o rechazada.
|
|
* Solo accesible desde estaciones tipo "muestras".
|
|
*
|
|
* Body JSON:
|
|
* 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';
|
|
requireMethod('POST');
|
|
requireTurnero();
|
|
|
|
$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)) {
|
|
jsonError('estado debe ser recibida, rechazada o pendiente.');
|
|
}
|
|
if ($motivo === '') $motivo = null;
|
|
|
|
$pdo = db();
|
|
|
|
// Verificar que la muestra existe
|
|
$stmt = $pdo->prepare(
|
|
"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]);
|
|
$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();
|
|
|
|
if ($estado === 'recibida') {
|
|
$pdo->prepare(
|
|
"UPDATE turnero_muestras
|
|
SET estado = 'recibida', recibida_por = ?, recibida_at = ?,
|
|
recibida_en_turno_id = ?, motivo_rechazo = NULL
|
|
WHERE id = ?"
|
|
)->execute([$adminI, $ahora, $recibidaEnTurno, $muestraId]);
|
|
} elseif ($estado === 'rechazada') {
|
|
$pdo->prepare(
|
|
"UPDATE turnero_muestras
|
|
SET estado = 'rechazada', recibida_por = ?, recibida_at = ?,
|
|
motivo_rechazo = ?
|
|
WHERE id = ?"
|
|
)->execute([$adminI, $ahora, $motivo, $muestraId]);
|
|
} else {
|
|
// Revertir a pendiente
|
|
$pdo->prepare(
|
|
"UPDATE turnero_muestras
|
|
SET estado = 'pendiente', recibida_por = NULL,
|
|
recibida_at = NULL, recibida_en_turno_id = NULL, motivo_rechazo = NULL
|
|
WHERE id = ?"
|
|
)->execute([$muestraId]);
|
|
}
|
|
|
|
jsonOk(['muestra_id' => $muestraId, 'estado' => $estado], 'Muestra actualizada');
|