Historial y bandeja: mostrar qué pasó con cada turno

Para saber quién retiró un formulario de un turno había que consultar la base
a mano. La información existía, pero repartida en cinco tablas y sin ninguna
pantalla que la juntara.

get_traza_turno.php arma una sola línea de tiempo con el recorrido del turno
(con quién atendió en cada punto), los documentos enviados y firmados, los
comentarios del personal —donde caen las ausencias con su motivo—, las
muestras recibidas y rechazadas, y las acciones administrativas auditadas.
Se muestra en el detalle desplegable de Historial y en el panel de Bandeja.

Del chat de WhatsApp solo se indica cuántos mensajes hubo ese día, con enlace
a la conversación. Volcar los mensajes sería esparcir datos personales del
paciente por una pantalla de consulta.

Y la parte que faltaba: cinco acciones no dejaban ningún rastro. Ahora se
auditan cambiar_estado, resetear_consentimiento, resetear_toma,
vincular_paciente y cancelar_toma_pendiente — las que borran una firma,
descartan datos de un protocolo o mandan la atención a otra historia clínica.
La auditoría va en try/catch: si falla, no tumba la operación.

La respuesta declara en `sinRastro` lo que el sistema todavía no registra,
para que la ausencia de un evento no se lea como prueba de que no ocurrió.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-08-19 12:33:55 -05:00
co-authored by Claude Opus 5
parent d4674f087d
commit 487673dc0f
8 changed files with 456 additions and 5 deletions
+25 -2
View File
@@ -5,6 +5,7 @@
* Body JSON: { token: string, campos: string[] }
*/
require_once __DIR__ . '/_helpers.php';
require_once __DIR__ . '/../../../classes/lab/ActividadAdmin.php';
requireMethod('POST');
requireTurnero();
@@ -17,9 +18,11 @@ if (!is_array($campos) || empty($campos)) jsonError('campos requerido.');
$pdo = db();
$stmt = $pdo->prepare(
"SELECT tc.id, tc.datos_respuestas, tc.estado, t.sesion_id
"SELECT tc.id, tc.turno_id, tc.datos_respuestas, tc.estado, t.sesion_id, t.codigo,
f.nombre AS formulario
FROM turnero_consentimientos tc
JOIN turnero_turnos t ON t.id = tc.turno_id
JOIN turnero_turnos t ON t.id = tc.turno_id
JOIN lab_formularios f ON f.id = tc.formulario_id
WHERE tc.token = ? LIMIT 1"
);
$stmt->execute([$token]);
@@ -40,4 +43,24 @@ $pdo->prepare(
)->execute([json_encode($dr, JSON_UNESCAPED_UNICODE), $token]);
notificarSSE((int)$tc['sesion_id']);
// Olvidar una toma borra datos de un protocolo prolongado en curso: se registra
// qué campos se descartaron, porque después no hay forma de saberlo.
try {
(new ActividadAdmin())->registrar(
adminId(),
'turnero',
'resetear_toma',
(int)$tc['id'],
[
'turno_id' => (int)$tc['turno_id'],
'turno_codigo' => $tc['codigo'],
'formulario_nombre' => $tc['formulario'],
'campos_olvidados' => $campos,
]
);
} catch (\Throwable $e) {
error_log('[resetear_toma] auditoría: ' . $e->getMessage());
}
jsonOk([], 'Toma olvidada.');