Tres correcciones sobre lo reportado en E042. 1. La bitácora daba por hecho que firmado_at era del paciente, y lo anunciaba así en documentos que el paciente nunca firma: el F-LAB-08 solo lo firma el profesional y el F-LAB-28 lleva una firma por toma. Ahora mira qué firma hay realmente guardada; si no hay ninguna dice «completado» o «protocolo cerrado», según el caso. 2. Los protocolos prolongados desglosan cada toma con su hora y su firmante, que es el dato que interesa: en E042 se ve que el minuto 0 lo firmó Yesica y el minuto 150 Omaira. La firma general no distinguía eso. 3. firmar_profesional_consentimiento.php aceptaba el nombre del firmante que mandaba el navegador, y ese valor se carga al abrir la página: si el personal cambiaba de turno sin recargar, la firma final quedaba a nombre de quien abrió el formulario. Ahora se resuelve desde la sesión en el servidor, igual que ya hacía guardar_toma.php para cada toma. Además, llamar y rellamar no dejaban rastro —el turno solo guarda la hora del último llamado, que el rellamado sobrescribe—, así que la bitácora mostraba «Llamado a X» sin autor. Ahora se auditan ambos. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
64 lines
2.0 KiB
PHP
64 lines
2.0 KiB
PHP
<?php
|
|
/**
|
|
* POST /modules/turnero/api/rellamar.php
|
|
* Re-llama un turno que ya está en_recepcion: actualiza llamado_recepcion_at = NOW()
|
|
* para que la pantalla TV detecte el cambio y vuelva a anunciar/animar.
|
|
*
|
|
* Body JSON:
|
|
* turno_id int requerido
|
|
*/
|
|
|
|
require_once __DIR__ . '/_helpers.php';
|
|
require_once __DIR__ . '/../../../classes/lab/ActividadAdmin.php';
|
|
requireMethod('POST');
|
|
requireTurnero();
|
|
|
|
$datos = inputJson();
|
|
$turnoId = (int)($datos['turno_id'] ?? 0);
|
|
$deskId = isset($datos['desk_id']) ? (int)$datos['desk_id'] : null;
|
|
|
|
if (!$turnoId) jsonError('turno_id es obligatorio.', 400);
|
|
|
|
$pdo = db();
|
|
$stmt = $pdo->prepare(
|
|
"UPDATE turnero_turnos
|
|
SET llamado_recepcion_at = NOW(),
|
|
recepcion_desk_id = COALESCE(?, recepcion_desk_id)
|
|
WHERE id = ? AND estado = 'en_recepcion'"
|
|
);
|
|
$stmt->execute([$deskId, $turnoId]);
|
|
|
|
if ($stmt->rowCount() === 0) {
|
|
jsonError('El turno no está en estado en_recepcion o no existe.', 404);
|
|
}
|
|
|
|
// Notificar SSE para que las pantallas se actualicen inmediatamente
|
|
$stmtS = $pdo->prepare('UPDATE turnero_sesiones SET sse_ping_at = NOW() WHERE id = (SELECT sesion_id FROM turnero_turnos WHERE id = ?)');
|
|
$stmtS->execute([$turnoId]);
|
|
|
|
// Devolver el turno actualizado para que recepcion.php abra la ficha
|
|
$stmtT = $pdo->prepare(
|
|
"SELECT t.*,
|
|
p.codigo AS prioridad_codigo,
|
|
p.nombre AS prioridad_nombre,
|
|
p.color AS prioridad_color
|
|
FROM turnero_turnos t
|
|
JOIN turnero_prioridades p ON p.id = t.prioridad_id
|
|
WHERE t.id = ?"
|
|
);
|
|
$stmtT->execute([$turnoId]);
|
|
$turno = $stmtT->fetch(PDO::FETCH_ASSOC);
|
|
|
|
// El rellamado pisa llamado_recepcion_at, así que sin esto no queda rastro de
|
|
// cuántas veces se llamó al paciente ni quién lo hizo.
|
|
try {
|
|
(new ActividadAdmin())->registrar(
|
|
adminId(), 'turnero', 'rellamar', $turnoId,
|
|
['turno_id' => $turnoId, 'turno_codigo' => $turno['codigo'] ?? null]
|
|
);
|
|
} catch (\Throwable $e) {
|
|
error_log('[rellamar] auditoría: ' . $e->getMessage());
|
|
}
|
|
|
|
jsonOk(['turno' => $turno]);
|