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:
co-authored by
Claude Sonnet 4.6
parent
8aa2f35585
commit
7b4827f70f
@@ -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);
|
||||
|
||||
@@ -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');
|
||||
|
||||
Reference in New Issue
Block a user