This commit is contained in:
Lizandro Guarnizo
2026-04-21 21:36:24 -05:00
parent 3a19f08bf8
commit 4b8b668774
7 changed files with 541 additions and 223 deletions
+12
View File
@@ -142,6 +142,18 @@ function obtenerOCrearSesionHoy(): int
return (int) $pdo->lastInsertId();
}
/**
* Devuelve ['id', 'fin_at'] de la sesión de hoy si existe, o null.
* Para uso en pantallas: NO crea sesión nueva.
*/
function sesionHoy(): ?array
{
$pdo = db();
$stmt = $pdo->prepare('SELECT id, fin_at FROM turnero_sesiones WHERE fecha = CURDATE() LIMIT 1');
$stmt->execute();
return $stmt->fetch(PDO::FETCH_ASSOC) ?: null;
}
/**
* Genera el siguiente número correlativo de turno para una sesión.
* Usa bloqueo a nivel de fila para evitar duplicados en concurrencia.
+21 -1
View File
@@ -25,7 +25,27 @@ if ($area === 'lugar' && !$lugarId) {
$pdo = db();
// ── Sesión de hoy ─────────────────────────────────────────────
$sesionId = obtenerOCrearSesionHoy();
// Si no existe sesión hoy o está cerrada (fin_at set), pantalla limpia.
$_ses = sesionHoy();
$sesionCerrada = (!$_ses || $_ses['fin_at'] !== null);
// Usar sesion_id real solo si está abierta; 0 hace que las queries devuelvan vacío.
$sesionId = ($sesionCerrada) ? 0 : (int)$_ses['id'];
if ($sesionCerrada) {
jsonOk([
'sesion_cerrada' => true,
'activo' => null,
'cola' => [],
'stats' => [
'total' => 0, 'en_espera' => 0, 'en_recepcion' => 0,
'en_espera_lugar' => 0, 'en_servicio' => 0,
'finalizados' => 0, 'no_atendidos' => 0,
'tiempo_promedio_atencion' => null,
],
'timestamp' => date('c'),
]);
exit;
}
// ── Cola según área ───────────────────────────────────────────
if ($area === 'recepcion') {
+7 -2
View File
@@ -9,8 +9,12 @@
require_once __DIR__ . '/_helpers.php';
requireMethod('GET');
$pdo = db();
$sesionId = obtenerOCrearSesionHoy();
$pdo = db();
// Si no hay sesión hoy o está cerrada → $sesionId = 0 (queries devuelven vacío).
$_ses = sesionHoy();
$sesionCerrada = (!$_ses || $_ses['fin_at'] !== null);
$sesionId = ($sesionCerrada) ? 0 : (int)$_ses['id'];
// ── 1. Escritorios de Recepción activos + su turno en_recepcion ─
// Cada escritorio puede tener un turno distinto (varios recepcionistas).
@@ -175,6 +179,7 @@ $stats = $stmtStats->fetch(PDO::FETCH_ASSOC);
jsonOk([
'sesion_id' => $sesionId,
'sesion_cerrada' => $sesionCerrada,
'activos_recepcion'=> $activosRecepcion, // array de desks con su turno
'lugares' => $lugaresActivos, // array de estaciones de muestras
'cola' => $cola,
+14 -1
View File
@@ -22,7 +22,20 @@ $desk = $stmtDesk->fetch(PDO::FETCH_ASSOC);
if (!$desk) jsonError('Escritorio no encontrado.', 404);
$sesionId = obtenerOCrearSesionHoy();
$_ses = sesionHoy();
$sesionCerrada = (!$_ses || $_ses['fin_at'] !== null);
if ($sesionCerrada) {
jsonOk([
'sesion_cerrada' => true,
'desk_id' => (int)$desk['id'],
'desk_nombre'=> $desk['nombre'],
'turno' => null,
'stats' => ['en_espera' => 0, 'en_atencion' => 0, 'finalizados' => 0],
'timestamp' => date('c'),
]);
exit;
}
$sesionId = (int)$_ses['id'];
// Turno activo en este escritorio (el más reciente llamado_recepcion_at)
$stmtT = $pdo->prepare(