fix: filtrar por sesión del día al llamar siguiente turno

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 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-07-08 09:14:48 -05:00
co-authored by Claude Sonnet 4.6
parent 8aa2f35585
commit 7b4827f70f
2 changed files with 19 additions and 10 deletions
+13 -7
View File
@@ -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);
+6 -3
View File
@@ -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');