getConnection(); $_trDesks = $_trPdo->query( "SELECT id, nombre FROM turnero_lugares WHERE activo=1 AND tipo='recepcion' ORDER BY sort_order" )->fetchAll(PDO::FETCH_ASSOC); $_trMuestras = $_trPdo->query( "SELECT id, nombre FROM turnero_lugares WHERE activo=1 AND tipo='muestras' ORDER BY sort_order" )->fetchAll(PDO::FETCH_ASSOC); } catch (\Throwable $_) { $_trDesks = []; $_trMuestras = []; } $_trLinks = []; // ── Recepcionista: pantallas comunes + desks según IP ───────── if ($_trIsRecep) { $_trLinks[] = ['name' => 'Chat Turnero', 'icon' => 'fab fa-whatsapp', 'route' => '/erp.php?m=turnero&v=chat']; $_trLinks[] = ['name' => 'Verificar Paciente', 'icon' => 'fas fa-id-card', 'route' => '/erp.php?m=turnero&v=verificar_paciente']; $_trLinks[] = ['name' => 'Pantalla TV', 'icon' => 'fas fa-tv', 'route' => '/erp.php?m=turnero&v=display_global']; // Detectar escritorio de recepción: primero por token, luego por IP $_trRecepIpDesk = null; try { $_trDevToken = trim($_COOKIE['turnero_token'] ?? ''); if ($_trDevToken) { $_trTokRow = $_trPdo->prepare( "SELECT d.lugar_id FROM turnero_dispositivos d JOIN turnero_lugares l ON l.id = d.lugar_id WHERE d.token = ? AND d.activo = 1 AND l.tipo = 'recepcion' LIMIT 1" ); $_trTokRow->execute([$_trDevToken]); $_trRecepIpDesk = $_trTokRow->fetchColumn() ?: null; } if (!$_trRecepIpDesk) { $_trRecepIpRow = $_trPdo->prepare( "SELECT d.lugar_id FROM turnero_dispositivos d JOIN turnero_lugares l ON l.id = d.lugar_id WHERE d.ip = ? AND d.token IS NULL AND d.activo = 1 AND l.tipo = 'recepcion' LIMIT 1" ); $_trRecepIpRow->execute([$_trClientIp]); $_trRecepIpDesk = $_trRecepIpRow->fetchColumn() ?: null; } } catch (\Throwable $_) {} if ($_trRecepIpDesk) { // IP registrada: solo su desk foreach ($_trDesks as $_d) { if ((int)$_d['id'] === (int)$_trRecepIpDesk) { $_trLinks[] = [ 'name' => $_d['nombre'], 'icon' => 'fas fa-concierge-bell', 'route' => '/erp.php?m=turnero&v=recepcion&desk_id=' . (int)$_d['id'], ]; break; } } } elseif (!empty($_trDesks)) { // IP libre: todos los desks foreach ($_trDesks as $_d) { $_trLinks[] = [ 'name' => $_d['nombre'], 'icon' => 'fas fa-concierge-bell', 'route' => '/erp.php?m=turnero&v=recepcion&desk_id=' . (int)$_d['id'], ]; } } else { $_trLinks[] = ['name' => 'Recepción', 'icon' => 'fas fa-concierge-bell', 'route' => '/erp.php?m=turnero&v=recepcion']; } // ── Bacteriólogo: sin dashboard ni historial; vista según IP ── } elseif ($_trIsBacte) { // Detectar lugar de muestras: primero por token, luego por IP $_trIpLugar = null; try { $_trDevToken = trim($_COOKIE['turnero_token'] ?? ''); if ($_trDevToken) { $_trTokRow2 = $_trPdo->prepare( "SELECT lugar_id FROM turnero_dispositivos WHERE token = ? AND activo = 1 LIMIT 1" ); $_trTokRow2->execute([$_trDevToken]); $_trIpLugar = $_trTokRow2->fetchColumn() ?: null; } if (!$_trIpLugar) { $_trIpRow = $_trPdo->prepare( "SELECT lugar_id FROM turnero_dispositivos WHERE ip = ? AND token IS NULL AND activo = 1 LIMIT 1" ); $_trIpRow->execute([$_trClientIp]); $_trIpLugar = $_trIpRow->fetchColumn() ?: null; } } catch (\Throwable $_) {} $_trLinks[] = ['name' => 'Bandeja del día', 'icon' => 'fas fa-layer-group', 'route' => '/erp.php?m=turnero&v=bandeja']; if ($_trIpLugar) { // IP registrada: solo ese lugar en el sidebar foreach ($_trMuestras as $_m) { if ((int)$_m['id'] === (int)$_trIpLugar) { $_trLinks[] = [ 'name' => $_m['nombre'], 'icon' => 'fas fa-flask', 'route' => '/erp.php?m=turnero&v=lugar&lugar_id=' . (int)$_m['id'], ]; break; } } } else { // IP no registrada: TV + todos los lugares muestras $_trLinks[] = ['name' => 'Pantalla TV', 'icon' => 'fas fa-tv', 'route' => '/erp.php?m=turnero&v=display_global']; foreach ($_trMuestras as $_m) { $_trLinks[] = [ 'name' => $_m['nombre'], 'icon' => 'fas fa-flask', 'route' => '/erp.php?m=turnero&v=lugar&lugar_id=' . (int)$_m['id'], ]; } } // ── Admin / Supervisor / otros: acceso completo ─────────────── } else { $_trLinks[] = ['name' => 'Dashboard', 'icon' => 'fas fa-tachometer-alt', 'route' => '/erp.php?m=turnero&v=dashboard']; $_trLinks[] = ['name' => 'Historial', 'icon' => 'fas fa-history', 'route' => '/erp.php?m=turnero&v=historial']; $_trLinks[] = ['name' => 'Bandeja del día', 'icon' => 'fas fa-layer-group', 'route' => '/erp.php?m=turnero&v=bandeja']; $_trLinks[] = ['name' => 'Chat Turnero', 'icon' => 'fab fa-whatsapp', 'route' => '/erp.php?m=turnero&v=chat']; $_trLinks[] = ['name' => 'Verificar Paciente', 'icon' => 'fas fa-id-card', 'route' => '/erp.php?m=turnero&v=verificar_paciente']; $_trLinks[] = ['name' => 'Configuración', 'icon' => 'fas fa-sliders-h', 'route' => '/erp.php?m=turnero&v=configuracion']; $_trLinks[] = ['name' => 'Kiosko', 'icon' => 'fas fa-desktop', 'route' => '/erp.php?m=turnero&v=kiosko']; $_trLinks[] = ['name' => 'Pantalla TV Global', 'icon' => 'fas fa-th-large', 'route' => '/erp.php?m=turnero&v=display_global']; if (!empty($_trDesks)) { foreach ($_trDesks as $_d) { $_trLinks[] = [ 'name' => $_d['nombre'], 'icon' => 'fas fa-concierge-bell', 'route' => '/erp.php?m=turnero&v=recepcion&desk_id=' . (int)$_d['id'], ]; } } else { $_trLinks[] = ['name' => 'Recepción', 'icon' => 'fas fa-concierge-bell', 'route' => '/erp.php?m=turnero&v=recepcion']; } foreach ($_trMuestras as $_m) { $_trLinks[] = [ 'name' => $_m['nombre'], 'icon' => 'fas fa-flask', 'route' => '/erp.php?m=turnero&v=lugar&lugar_id=' . (int)$_m['id'], ]; } } return [ 'slug' => 'turnero', 'name' => 'Turnero', 'icon' => 'fas fa-ticket-alt', 'category' => 'turnero', 'route' => '/erp.php?m=turnero&v=dashboard', 'is_active' => true, 'sort_order' => 40, 'oleada' => 1, 'description' => 'Sistema de turnos presenciales en recepción con prioridades, consentimientos y pantallas TV', 'links' => $_trLinks, ];