This commit is contained in:
Lizandro Guarnizo
2026-04-21 19:48:30 -05:00
parent 63da89c31a
commit c934125f2f
7 changed files with 878 additions and 212 deletions
@@ -0,0 +1,65 @@
<?php
/**
* GET /modules/turnero/api/get_display_recepcion.php?desk_id=X
* Devuelve el turno activo en_recepcion para un escritorio específico.
* Acceso público (pantalla TV).
*/
require_once __DIR__ . '/_helpers.php';
requireMethod('GET');
$deskId = (int)($_GET['desk_id'] ?? 0);
if (!$deskId) jsonError('desk_id requerido.', 400);
$pdo = db();
// Verificar que el escritorio existe y es de tipo recepcion
$stmtDesk = $pdo->prepare(
"SELECT id, nombre FROM turnero_lugares WHERE id = ? AND tipo = 'recepcion' AND activo = 1"
);
$stmtDesk->execute([$deskId]);
$desk = $stmtDesk->fetch(PDO::FETCH_ASSOC);
if (!$desk) jsonError('Escritorio no encontrado.', 404);
$sesionId = obtenerOCrearSesionHoy();
// Turno activo en este escritorio (el más reciente llamado_recepcion_at)
$stmtT = $pdo->prepare(
"SELECT t.id,
t.codigo,
t.numero,
t.estado,
t.paciente_nombre,
t.llamado_recepcion_at AS llamado_at,
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.sesion_id = ?
AND t.estado = 'en_recepcion'
AND t.recepcion_desk_id = ?
ORDER BY t.llamado_recepcion_at DESC
LIMIT 1"
);
$stmtT->execute([$sesionId, $deskId]);
$turno = $stmtT->fetch(PDO::FETCH_ASSOC) ?: null;
// Stats básicos para el footer
$stmtStats = $pdo->prepare(
"SELECT SUM(estado = 'espera') AS en_espera,
SUM(estado IN ('en_recepcion','en_espera_lugar','en_servicio')) AS en_atencion,
SUM(estado = 'finalizado') AS finalizados
FROM turnero_turnos WHERE sesion_id = ?"
);
$stmtStats->execute([$sesionId]);
$stats = $stmtStats->fetch(PDO::FETCH_ASSOC);
jsonOk([
'desk_id' => (int)$desk['id'],
'desk_nombre'=> $desk['nombre'],
'turno' => $turno,
'stats' => $stats,
'timestamp' => date('c'),
]);
+6 -4
View File
@@ -16,6 +16,7 @@ requireTurnero();
$datos = inputJson();
$area = $datos['area'] ?? '';
$lugarId = isset($datos['lugar_id']) ? (int) $datos['lugar_id'] : null;
$deskId = isset($datos['desk_id']) ? (int) $datos['desk_id'] : null;
// ── Validación ────────────────────────────────────────────────
if (!in_array($area, ['recepcion', 'lugar'], true)) {
@@ -42,12 +43,13 @@ try {
$stmt = $pdo->prepare(
'UPDATE turnero_turnos
SET estado = "en_recepcion",
llamado_recepcion_at = NOW(),
inicio_recepcion_at = NOW(),
atendido_recepcion_por = ?
llamado_recepcion_at = NOW(),
inicio_recepcion_at = NOW(),
atendido_recepcion_por = ?,
recepcion_desk_id = COALESCE(?, recepcion_desk_id)
WHERE id = ? AND estado = "espera"'
);
$stmt->execute([adminId(), $turno['id']]);
$stmt->execute([adminId(), $deskId, $turno['id']]);
if ($stmt->rowCount() === 0) {
// Otro proceso lo tomó primero (race condition)
+47
View File
@@ -0,0 +1,47 @@
<?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';
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);
}
// 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);
jsonOk(['turno' => $turno]);