From 7b4827f70fbee1f724fc4b73877d38de3543a070 Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Wed, 8 Jul 2026 09:14:48 -0500 Subject: [PATCH] =?UTF-8?q?fix:=20filtrar=20por=20sesi=C3=B3n=20del=20d?= =?UTF-8?q?=C3=ADa=20al=20llamar=20siguiente=20turno?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit siguienteTurnoEnCola ahora acepta sesion_id opcional. llamar_turno.php pasa la sesión de hoy para que nunca agarre turnos viejos de días anteriores que quedaron en estado 'espera'. Sin el filtro, el primer llamado del día podía agarrar un turno de ayer, la ficha abría en recepción pero la pantalla TV (get_display_recepcion.php) filtra por sesion_id=hoy y no lo encontraba → el número no salía en display. Co-Authored-By: Claude Sonnet 4.6 --- modules/turnero/api/_helpers.php | 20 +++++++++++++------- modules/turnero/api/llamar_turno.php | 9 ++++++--- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/modules/turnero/api/_helpers.php b/modules/turnero/api/_helpers.php index fbc39a2..c41c0e8 100644 --- a/modules/turnero/api/_helpers.php +++ b/modules/turnero/api/_helpers.php @@ -198,7 +198,7 @@ function siguienteNumeroPorPrioridad(int $sesionId, int $prioridadId): int * @param array|null $lugarIds Lista explícita de lugar_ids (grupo completo) * @return array|null Fila de turnero_turnos o null si cola vacía */ -function siguienteTurnoEnCola(string $estado, ?int $lugarId = null, ?array $lugarIds = null): ?array +function siguienteTurnoEnCola(string $estado, ?int $lugarId = null, ?array $lugarIds = null, ?int $sesionId = null): ?array { $pdo = db(); @@ -207,6 +207,8 @@ function siguienteTurnoEnCola(string $estado, ?int $lugarId = null, ?array $luga $lugarIds = lugarIdsDeGrupo($lugarId); } + $sesionCond = $sesionId !== null ? 'AND t.sesion_id = ?' : ''; + if (!empty($lugarIds)) { $in = implode(',', array_map('intval', $lugarIds)); $sql = " @@ -214,25 +216,29 @@ function siguienteTurnoEnCola(string $estado, ?int $lugarId = null, ?array $luga FROM turnero_turnos t JOIN turnero_prioridades p ON p.id = t.prioridad_id WHERE t.estado = ? + $sesionCond AND t.lugar_destino_id IN ($in) ORDER BY p.orden_peso ASC, t.creado_at ASC LIMIT 1 FOR UPDATE "; - $stmt = $pdo->prepare($sql); - $stmt->execute([$estado]); + $binds = $sesionId !== null ? [$estado, $sesionId] : [$estado]; + $stmt = $pdo->prepare($sql); + $stmt->execute($binds); } else { - $sql = ' + $sql = " SELECT t.*, p.orden_peso, p.codigo AS prioridad_codigo, p.color AS prioridad_color FROM turnero_turnos t JOIN turnero_prioridades p ON p.id = t.prioridad_id WHERE t.estado = ? + $sesionCond ORDER BY p.orden_peso ASC, t.creado_at ASC LIMIT 1 FOR UPDATE - '; - $stmt = $pdo->prepare($sql); - $stmt->execute([$estado]); + "; + $binds = $sesionId !== null ? [$estado, $sesionId] : [$estado]; + $stmt = $pdo->prepare($sql); + $stmt->execute($binds); } $row = $stmt->fetch(PDO::FETCH_ASSOC); diff --git a/modules/turnero/api/llamar_turno.php b/modules/turnero/api/llamar_turno.php index f2cbab5..c95a04e 100644 --- a/modules/turnero/api/llamar_turno.php +++ b/modules/turnero/api/llamar_turno.php @@ -28,12 +28,15 @@ if ($area === 'lugar' && !$lugarId) { } $pdo = db(); +// Obtener sesión del día ANTES de abrir la transacción para que un posible +// INSERT de sesión nueva no quede dentro del rollback. +$sesionHoy = obtenerOCrearSesionHoy(); $pdo->beginTransaction(); try { if ($area === 'recepcion') { - // Cola recepción: turnos en estado 'espera' sin filtro de lugar - $turno = siguienteTurnoEnCola('espera'); + // Cola recepción: solo turnos de la sesión activa de hoy + $turno = siguienteTurnoEnCola('espera', null, null, $sesionHoy); if (!$turno) { $pdo->rollBack(); @@ -78,7 +81,7 @@ try { jsonError('El turno no está en espera o no existe.', 404); } } else { - $turno = siguienteTurnoEnCola('en_espera_lugar', $lugarId); + $turno = siguienteTurnoEnCola('en_espera_lugar', $lugarId, null, $sesionHoy); if (!$turno) { $pdo->rollBack(); jsonOk(['turno' => null], 'Cola del lugar vacía');