From 4b8b66877479dd0e9aefe8f1e2089120b973c520 Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Tue, 21 Apr 2026 21:36:24 -0500 Subject: [PATCH] uo --- modules/turnero/api/_helpers.php | 12 + modules/turnero/api/get_cola.php | 22 +- modules/turnero/api/get_display_global.php | 9 +- modules/turnero/api/get_display_recepcion.php | 15 +- modules/turnero/views/kiosko.php | 437 +++++++++++------- modules/turnero/views/lugar.php | 81 ++-- modules/turnero/views/recepcion.php | 188 ++++++-- 7 files changed, 541 insertions(+), 223 deletions(-) diff --git a/modules/turnero/api/_helpers.php b/modules/turnero/api/_helpers.php index 54448cf..4d341df 100644 --- a/modules/turnero/api/_helpers.php +++ b/modules/turnero/api/_helpers.php @@ -142,6 +142,18 @@ function obtenerOCrearSesionHoy(): int return (int) $pdo->lastInsertId(); } +/** + * Devuelve ['id', 'fin_at'] de la sesión de hoy si existe, o null. + * Para uso en pantallas: NO crea sesión nueva. + */ +function sesionHoy(): ?array +{ + $pdo = db(); + $stmt = $pdo->prepare('SELECT id, fin_at FROM turnero_sesiones WHERE fecha = CURDATE() LIMIT 1'); + $stmt->execute(); + return $stmt->fetch(PDO::FETCH_ASSOC) ?: null; +} + /** * Genera el siguiente número correlativo de turno para una sesión. * Usa bloqueo a nivel de fila para evitar duplicados en concurrencia. diff --git a/modules/turnero/api/get_cola.php b/modules/turnero/api/get_cola.php index 6b5c500..a41030d 100644 --- a/modules/turnero/api/get_cola.php +++ b/modules/turnero/api/get_cola.php @@ -25,7 +25,27 @@ if ($area === 'lugar' && !$lugarId) { $pdo = db(); // ── Sesión de hoy ───────────────────────────────────────────── -$sesionId = obtenerOCrearSesionHoy(); +// Si no existe sesión hoy o está cerrada (fin_at set), pantalla limpia. +$_ses = sesionHoy(); +$sesionCerrada = (!$_ses || $_ses['fin_at'] !== null); +// Usar sesion_id real solo si está abierta; 0 hace que las queries devuelvan vacío. +$sesionId = ($sesionCerrada) ? 0 : (int)$_ses['id']; + +if ($sesionCerrada) { + jsonOk([ + 'sesion_cerrada' => true, + 'activo' => null, + 'cola' => [], + 'stats' => [ + 'total' => 0, 'en_espera' => 0, 'en_recepcion' => 0, + 'en_espera_lugar' => 0, 'en_servicio' => 0, + 'finalizados' => 0, 'no_atendidos' => 0, + 'tiempo_promedio_atencion' => null, + ], + 'timestamp' => date('c'), + ]); + exit; +} // ── Cola según área ─────────────────────────────────────────── if ($area === 'recepcion') { diff --git a/modules/turnero/api/get_display_global.php b/modules/turnero/api/get_display_global.php index ecc0daf..2c225d5 100644 --- a/modules/turnero/api/get_display_global.php +++ b/modules/turnero/api/get_display_global.php @@ -9,8 +9,12 @@ require_once __DIR__ . '/_helpers.php'; requireMethod('GET'); -$pdo = db(); -$sesionId = obtenerOCrearSesionHoy(); +$pdo = db(); + +// Si no hay sesión hoy o está cerrada → $sesionId = 0 (queries devuelven vacío). +$_ses = sesionHoy(); +$sesionCerrada = (!$_ses || $_ses['fin_at'] !== null); +$sesionId = ($sesionCerrada) ? 0 : (int)$_ses['id']; // ── 1. Escritorios de Recepción activos + su turno en_recepcion ─ // Cada escritorio puede tener un turno distinto (varios recepcionistas). @@ -175,6 +179,7 @@ $stats = $stmtStats->fetch(PDO::FETCH_ASSOC); jsonOk([ 'sesion_id' => $sesionId, + 'sesion_cerrada' => $sesionCerrada, 'activos_recepcion'=> $activosRecepcion, // array de desks con su turno 'lugares' => $lugaresActivos, // array de estaciones de muestras 'cola' => $cola, diff --git a/modules/turnero/api/get_display_recepcion.php b/modules/turnero/api/get_display_recepcion.php index 19a52a2..db3c453 100644 --- a/modules/turnero/api/get_display_recepcion.php +++ b/modules/turnero/api/get_display_recepcion.php @@ -22,7 +22,20 @@ $desk = $stmtDesk->fetch(PDO::FETCH_ASSOC); if (!$desk) jsonError('Escritorio no encontrado.', 404); -$sesionId = obtenerOCrearSesionHoy(); +$_ses = sesionHoy(); +$sesionCerrada = (!$_ses || $_ses['fin_at'] !== null); +if ($sesionCerrada) { + jsonOk([ + 'sesion_cerrada' => true, + 'desk_id' => (int)$desk['id'], + 'desk_nombre'=> $desk['nombre'], + 'turno' => null, + 'stats' => ['en_espera' => 0, 'en_atencion' => 0, 'finalizados' => 0], + 'timestamp' => date('c'), + ]); + exit; +} +$sesionId = (int)$_ses['id']; // Turno activo en este escritorio (el más reciente llamado_recepcion_at) $stmtT = $pdo->prepare( diff --git a/modules/turnero/views/kiosko.php b/modules/turnero/views/kiosko.php index 25ea320..b6e9038 100644 --- a/modules/turnero/views/kiosko.php +++ b/modules/turnero/views/kiosko.php @@ -6,11 +6,27 @@ */ require_once __DIR__ . '/../../../config/config.php'; -// Cargar prioridades activas desde BD +// ── Configuración visual del laboratorio ────────────────────── +$_kioskoCfg = []; +try { + $_kpdo = Database::getInstance()->getConnection(); + $_krows = $_kpdo->query( + "SELECT clave, valor FROM lab_config + WHERE clave IN ('empresa_nombre','doc_logo_base64','doc_color')" + )->fetchAll(PDO::FETCH_KEY_PAIR); + $_kioskoCfg = $_krows ?: []; +} catch (\Throwable $_) {} + +$_kNombre = htmlspecialchars($_kioskoCfg['empresa_nombre'] ?? 'Laboratorio Clínico'); +$_kLogo = $_kioskoCfg['doc_logo_base64'] ?? ''; +$_kColor = preg_match('/^#[0-9a-fA-F]{3,8}$/', $_kioskoCfg['doc_color'] ?? '') + ? $_kioskoCfg['doc_color'] : '#1565c0'; + +// ── Cargar prioridades activas desde BD ─────────────────────── $prioridades = []; try { - $pdo = Database::getInstance()->getConnection(); - $stmt = $pdo->query( + $_pdo = Database::getInstance()->getConnection(); + $stmt = $_pdo->query( "SELECT id, codigo, nombre, color, icono, descripcion, orden_peso FROM turnero_prioridades WHERE activo = 1 @@ -21,11 +37,11 @@ try { // Fallback con prioridades por defecto si la BD no está disponible $prioridades = [ ['codigo'=>'A','nombre'=>'Niños', 'color'=>'#ef4444','icono'=>'fas fa-child', 'descripcion'=>'Pacientes menores de edad'], - ['codigo'=>'B','nombre'=>'Embarazadas', 'color'=>'#f97316','icono'=>'fas fa-heart', 'descripcion'=>'Mujeres en estado de embarazo'], - ['codigo'=>'C','nombre'=>'Adulto mayor', 'color'=>'#eab308','icono'=>'fas fa-person-cane', 'descripcion'=>'Mayores de 60 años'], - ['codigo'=>'D','nombre'=>'Discapacidad', 'color'=>'#8b5cf6','icono'=>'fas fa-wheelchair', 'descripcion'=>'Personas con discapacidad'], - ['codigo'=>'E','nombre'=>'Paciente general', 'color'=>'#3b82f6','icono'=>'fas fa-user', 'descripcion'=>'Atención general'], - ['codigo'=>'F','nombre'=>'Muestra pendiente', 'color'=>'#6b7280','icono'=>'fas fa-vial', 'descripcion'=>'Entrega de muestra tomada'], + ['codigo'=>'B','nombre'=>'Embarazadas', 'color'=>'#f97316','icono'=>'fas fa-heart', 'descripcion'=>'Mujeres en estado de embarazo'], + ['codigo'=>'C','nombre'=>'Adulto mayor', 'color'=>'#eab308','icono'=>'fas fa-person-cane', 'descripcion'=>'Mayores de 60 años'], + ['codigo'=>'D','nombre'=>'Discapacidad', 'color'=>'#8b5cf6','icono'=>'fas fa-wheelchair', 'descripcion'=>'Personas con discapacidad'], + ['codigo'=>'E','nombre'=>'Paciente general', 'color'=>'#3b82f6','icono'=>'fas fa-user', 'descripcion'=>'Atención general'], + ['codigo'=>'F','nombre'=>'Muestra pendiente','color'=>'#6b7280','icono'=>'fas fa-vial', 'descripcion'=>'Entrega de muestra tomada'], ]; } @@ -50,176 +66,312 @@ unset($p);
-Seleccione su tipo de atención
-