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>
67 lines
2.1 KiB
PHP
67 lines
2.1 KiB
PHP
<?php
|
|
/**
|
|
* POST /modules/turnero/api/resetear_toma.php
|
|
* Borra campos específicos de datos_respuestas (firma + hora de una toma).
|
|
* Body JSON: { token: string, campos: string[] }
|
|
*/
|
|
require_once __DIR__ . '/_helpers.php';
|
|
require_once __DIR__ . '/../../../classes/lab/ActividadAdmin.php';
|
|
requireMethod('POST');
|
|
requireTurnero();
|
|
|
|
$body = inputJson();
|
|
$token = trim($body['token'] ?? '');
|
|
$campos = $body['campos'] ?? [];
|
|
|
|
if (!$token) jsonError('token requerido.');
|
|
if (!is_array($campos) || empty($campos)) jsonError('campos requerido.');
|
|
|
|
$pdo = db();
|
|
$stmt = $pdo->prepare(
|
|
"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 lab_formularios f ON f.id = tc.formulario_id
|
|
WHERE tc.token = ? LIMIT 1"
|
|
);
|
|
$stmt->execute([$token]);
|
|
$tc = $stmt->fetch(PDO::FETCH_ASSOC);
|
|
if (!$tc) jsonError('Consentimiento no encontrado.', 404);
|
|
if ($tc['estado'] !== 'en_progreso') jsonError('Solo se pueden olvidar tomas en estado en_progreso.');
|
|
|
|
$dr = json_decode($tc['datos_respuestas'] ?? '{}', true) ?? [];
|
|
foreach ($campos as $campo) {
|
|
unset($dr[$campo]);
|
|
}
|
|
$pdo->prepare(
|
|
"UPDATE turnero_consentimientos
|
|
SET datos_respuestas = ?,
|
|
siguiente_toma_at = NULL,
|
|
toma_inicio_at = NULL
|
|
WHERE token = ?"
|
|
)->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.');
|