up
This commit is contained in:
@@ -0,0 +1,130 @@
|
||||
<?php
|
||||
/**
|
||||
* GET /modules/turnero/api/get_display_global.php
|
||||
* Devuelve el estado GLOBAL del sistema para la pantalla TV unificada.
|
||||
* Retorna: turno activo en Recepción + turno activo en cada Lugar + cola.
|
||||
* No requiere autenticación (acceso público).
|
||||
*/
|
||||
|
||||
require_once __DIR__ . '/_helpers.php';
|
||||
requireMethod('GET');
|
||||
|
||||
$pdo = db();
|
||||
$sesionId = obtenerOCrearSesionHoy();
|
||||
|
||||
// ── 1. TODOS los turnos activos en Recepción ─────────────────
|
||||
// Puede haber varios simultáneos (un escritorio por operador).
|
||||
$stmtRec = $pdo->prepare(
|
||||
"SELECT t.id,
|
||||
t.codigo,
|
||||
t.numero,
|
||||
t.estado,
|
||||
t.paciente_nombre,
|
||||
t.llamado_recepcion_at AS llamado_at,
|
||||
t.atendido_recepcion_por,
|
||||
p.codigo AS prioridad_codigo,
|
||||
p.nombre AS prioridad_nombre,
|
||||
p.color AS prioridad_color
|
||||
FROM turnero_turnos t
|
||||
JOIN turnero_prioridades p ON p.id = t.prioridad_id
|
||||
WHERE t.sesion_id = ?
|
||||
AND t.estado = 'en_recepcion'
|
||||
ORDER BY t.llamado_recepcion_at DESC"
|
||||
);
|
||||
$stmtRec->execute([$sesionId]);
|
||||
$activosRecepcion = $stmtRec->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
// ── 2. Lugares activos con su turno en servicio ───────────────
|
||||
$stmtLugares = $pdo->query(
|
||||
"SELECT id, nombre, sort_order
|
||||
FROM turnero_lugares
|
||||
WHERE activo = 1
|
||||
ORDER BY sort_order ASC"
|
||||
);
|
||||
$lugares = $stmtLugares->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
$lugaresActivos = [];
|
||||
foreach ($lugares as $lugar) {
|
||||
$stmtActivo = $pdo->prepare(
|
||||
"SELECT t.id,
|
||||
t.codigo,
|
||||
t.numero,
|
||||
t.estado,
|
||||
t.paciente_nombre,
|
||||
t.llamado_lugar_at AS llamado_at,
|
||||
p.codigo AS prioridad_codigo,
|
||||
p.nombre AS prioridad_nombre,
|
||||
p.color AS prioridad_color
|
||||
FROM turnero_turnos t
|
||||
JOIN turnero_prioridades p ON p.id = t.prioridad_id
|
||||
WHERE t.sesion_id = ?
|
||||
AND t.estado IN ('en_espera_lugar', 'en_servicio')
|
||||
AND t.lugar_destino_id = ?
|
||||
ORDER BY t.llamado_lugar_at DESC
|
||||
LIMIT 1"
|
||||
);
|
||||
$stmtActivo->execute([$sesionId, (int)$lugar['id']]);
|
||||
$turnoActivo = $stmtActivo->fetch(PDO::FETCH_ASSOC) ?: null;
|
||||
|
||||
$lugaresActivos[] = [
|
||||
'lugar_id' => (int)$lugar['id'],
|
||||
'lugar_nombre'=> $lugar['nombre'],
|
||||
'sort_order' => (int)$lugar['sort_order'],
|
||||
'turno' => $turnoActivo,
|
||||
];
|
||||
}
|
||||
|
||||
// ── 3. Cola en espera (pendientes por llamar) ─────────────────
|
||||
$stmtCola = $pdo->prepare(
|
||||
"SELECT t.id,
|
||||
t.codigo,
|
||||
t.numero,
|
||||
t.estado,
|
||||
t.paciente_nombre,
|
||||
t.creado_at,
|
||||
p.codigo AS prioridad_codigo,
|
||||
p.nombre AS prioridad_nombre,
|
||||
p.color AS prioridad_color,
|
||||
p.orden_peso
|
||||
FROM turnero_turnos t
|
||||
JOIN turnero_prioridades p ON p.id = t.prioridad_id
|
||||
WHERE t.sesion_id = ?
|
||||
AND t.estado = 'espera'
|
||||
ORDER BY p.orden_peso ASC, t.creado_at ASC"
|
||||
);
|
||||
$stmtCola->execute([$sesionId]);
|
||||
$cola = $stmtCola->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
// ── 4. Estadísticas ───────────────────────────────────────────
|
||||
$stmtStats = $pdo->prepare(
|
||||
"SELECT
|
||||
COUNT(*) AS total,
|
||||
SUM(estado = 'espera') AS en_espera,
|
||||
SUM(estado = 'en_recepcion') AS en_recepcion,
|
||||
SUM(estado = 'en_espera_lugar') AS en_espera_lugar,
|
||||
SUM(estado = 'en_servicio') AS en_servicio,
|
||||
SUM(estado IN ('en_recepcion','en_espera_lugar',
|
||||
'en_servicio')) AS en_atencion,
|
||||
SUM(estado = 'finalizado') AS finalizados,
|
||||
SUM(estado IN ('ausente','cancelado')) AS no_atendidos,
|
||||
SEC_TO_TIME(
|
||||
AVG(
|
||||
CASE WHEN fin_lugar_at IS NOT NULL AND creado_at IS NOT NULL
|
||||
THEN TIMESTAMPDIFF(SECOND, creado_at, fin_lugar_at)
|
||||
ELSE NULL END
|
||||
)
|
||||
) AS tiempo_promedio_atencion
|
||||
FROM turnero_turnos
|
||||
WHERE sesion_id = ?"
|
||||
);
|
||||
$stmtStats->execute([$sesionId]);
|
||||
$stats = $stmtStats->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
jsonOk([
|
||||
'sesion_id' => $sesionId,
|
||||
'activos_recepcion'=> $activosRecepcion, // array — todos los en_recepcion
|
||||
'lugares' => $lugaresActivos,
|
||||
'cola' => $cola,
|
||||
'stats' => $stats,
|
||||
'timestamp' => date('c'),
|
||||
]);
|
||||
Reference in New Issue
Block a user