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');