This commit is contained in:
Lizandro Guarnizo
2026-06-09 16:44:39 -05:00
parent 4e6913c41e
commit ab8b5ae620
9 changed files with 1590 additions and 323 deletions
+19
View File
@@ -171,6 +171,25 @@ function siguienteNumero(int $sesionId): int
return (int) $stmt->fetchColumn();
}
/**
* Genera el siguiente número correlativo de turno POR PRIORIDAD para una sesión.
* Cada prioridad (A, B, C, D, E, F) tiene su propia secuencia independiente.
* Usa bloqueo a nivel de fila para evitar duplicados en concurrencia.
*/
function siguienteNumeroPorPrioridad(int $sesionId, int $prioridadId): int
{
$pdo = db();
$stmt = $pdo->prepare(
'SELECT COALESCE(MAX(numero), 0) + 1 AS siguiente
FROM turnero_turnos
WHERE sesion_id = ?
AND prioridad_id = ?
FOR UPDATE'
);
$stmt->execute([$sesionId, $prioridadId]);
return (int) $stmt->fetchColumn();
}
/**
* Selecciona el siguiente turno a llamar según el motor de prioridades.
*
+4 -2
View File
@@ -34,7 +34,6 @@ $pdo->beginTransaction();
try {
$sesionId = obtenerOCrearSesionHoy();
$numero = siguienteNumero($sesionId);
// Buscar prioridad_id
$stmt = $pdo->prepare(
@@ -50,7 +49,10 @@ try {
$prioridadId = (int) $prioridad['id'];
// Código visual: "A001", "E042", etc.
// Correlativo independiente por prioridad (A-001, A-002... B-001, B-002... etc.)
$numero = siguienteNumeroPorPrioridad($sesionId, $prioridadId);
// Código visual: "A001", "B001", "E001", etc.
$codigo = $prioCodigo . str_pad($numero, 3, '0', STR_PAD_LEFT);
$stmt = $pdo->prepare(
+12 -4
View File
@@ -30,12 +30,20 @@ $sesion = $stmtSesion->fetch(PDO::FETCH_ASSOC);
if (!$sesion) {
jsonOk([
'fecha' => $fecha,
'sesion' => null,
'resumen' => ['total' => 0, 'atendidos' => 0, 'en_espera' => 0,
'ausentes' => 0, 'cancelados' => 0, 'tiempo_promedio_min' => null],
'fecha' => $fecha,
'sesion' => null,
'resumen' => [
'total' => 0,
'atendidos' => 0,
'en_espera' => 0,
'ausentes' => 0,
'cancelados' => 0,
'tiempo_espera_promedio_min' => null,
'tiempo_servicio_promedio_min' => null,
],
'por_prioridad' => [],
'por_lugar' => [],
'consent_stats' => [],
'turnos' => [],
]);
}