This commit is contained in:
Lizandro Guarnizo
2026-06-16 13:04:59 -05:00
parent e7a068243c
commit 5af94e50e5
5 changed files with 113 additions and 23 deletions
+38 -9
View File
@@ -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).
+16 -9
View File
@@ -49,13 +49,16 @@ if ($sesionCerrada) {
// ── Cola según área ───────────────────────────────────────────
if ($area === 'recepcion') {
$estadosCola = ["'espera'", "'en_recepcion'"];
$filtroLugar = '';
$bindsCola = [];
$estadosCola = ["'espera'", "'en_recepcion'"];
$filtroLugar = '';
$bindsCola = [$sesionId];
} else {
$estadosCola = ["'en_espera_lugar'", "'en_servicio'"];
$filtroLugar = 'AND t.lugar_destino_id = ?';
$bindsCola = [$lugarId];
$estadosCola = ["'en_espera_lugar'", "'en_servicio'"];
// Expandir grupo de lugares
$grupoIds = lugarIdsDeGrupo($lugarId);
$inLugares = implode(',', array_map('intval', $grupoIds));
$filtroLugar = "AND t.lugar_destino_id IN ($inLugares)";
$bindsCola = [$sesionId];
}
$inEstados = implode(', ', $estadosCola);
@@ -81,15 +84,19 @@ $stmt = $pdo->prepare(
{$filtroLugar}
ORDER BY p.orden_peso ASC, t.creado_at ASC"
);
array_unshift($bindsCola, $sesionId);
$stmt->execute($bindsCola);
$cola = $stmt->fetchAll(PDO::FETCH_ASSOC);
// ── Turno actualmente en pantalla (último llamado) ────────────
$campoLlamado = $area === 'recepcion' ? 'llamado_recepcion_at' : 'llamado_lugar_at';
$estadoActivo = $area === 'recepcion' ? "'en_recepcion'" : "'en_servicio'";
$bindActivo = $area === 'lugar' ? [$sesionId, $lugarId] : [$sesionId];
$filtroActivo = $area === 'lugar' ? 'AND t.lugar_destino_id = ?' : '';
if ($area === 'lugar') {
$filtroActivo = "AND t.lugar_destino_id IN ($inLugares)";
$bindActivo = [$sesionId];
} else {
$filtroActivo = '';
$bindActivo = [$sesionId];
}
$stmt = $pdo->prepare(
"SELECT t.id,