up
This commit is contained in:
@@ -193,27 +193,34 @@ function siguienteNumeroPorPrioridad(int $sesionId, int $prioridadId): int
|
||||
/**
|
||||
* Selecciona el siguiente turno a llamar según el motor de prioridades.
|
||||
*
|
||||
* @param string $estado Estado que deben tener los turnos en cola
|
||||
* @param int|null $lugarId Si no es null, filtra por lugar_destino_id
|
||||
* @return array|null Fila de turnero_turnos o null si cola vacía
|
||||
* @param string $estado Estado que deben tener los turnos en cola
|
||||
* @param int|null $lugarId Si no es null, filtra por lugar_destino_id (o su grupo)
|
||||
* @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
|
||||
function siguienteTurnoEnCola(string $estado, ?int $lugarId = null, ?array $lugarIds = null): ?array
|
||||
{
|
||||
$pdo = db();
|
||||
|
||||
if ($lugarId !== null) {
|
||||
$sql = '
|
||||
// Resolver grupo si se pasó un lugarId sin lista explícita
|
||||
if ($lugarId !== null && $lugarIds === null) {
|
||||
$lugarIds = lugarIdsDeGrupo($lugarId);
|
||||
}
|
||||
|
||||
if (!empty($lugarIds)) {
|
||||
$in = implode(',', array_map('intval', $lugarIds));
|
||||
$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 = ?
|
||||
AND t.lugar_destino_id = ?
|
||||
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, $lugarId]);
|
||||
$stmt->execute([$estado]);
|
||||
} else {
|
||||
$sql = '
|
||||
SELECT t.*, p.orden_peso, p.codigo AS prioridad_codigo, p.color AS prioridad_color
|
||||
@@ -232,6 +239,28 @@ function siguienteTurnoEnCola(string $estado, ?int $lugarId = null): ?array
|
||||
return $row ?: null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Devuelve todos los lugar_ids que comparten grupo con $lugarId.
|
||||
* Si no tiene grupo, devuelve [$lugarId].
|
||||
*/
|
||||
function lugarIdsDeGrupo(int $lugarId): array
|
||||
{
|
||||
$pdo = db();
|
||||
$stmt = $pdo->prepare("SELECT grupo_id FROM turnero_lugares WHERE id = ?");
|
||||
$stmt->execute([$lugarId]);
|
||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if (!$row || $row['grupo_id'] === null) {
|
||||
return [$lugarId];
|
||||
}
|
||||
|
||||
$grupoId = (int)$row['grupo_id'];
|
||||
$stmt2 = $pdo->prepare("SELECT id FROM turnero_lugares WHERE grupo_id = ? AND activo = 1");
|
||||
$stmt2->execute([$grupoId]);
|
||||
$ids = $stmt2->fetchAll(PDO::FETCH_COLUMN);
|
||||
return $ids ?: [$lugarId];
|
||||
}
|
||||
|
||||
/**
|
||||
* Emite un evento SSE a todos los clientes suscritos escribiendo
|
||||
* un flag en la tabla turnero_sesiones (campo sse_ping_at).
|
||||
|
||||
Reference in New Issue
Block a user