@php // Definición del Menú mapeado a tus rutas de Laravel (web.php) $menu = [ // --- OPERATIVOS --- ['name' => 'Bar', 'route' => 'op.bar', 'icon' => 'beer', 'accent' => 'amber'], ['name' => 'Cocina', 'route' => 'op.kitchen', 'icon' => 'chef-hat', 'accent' => 'red'], // --- MESERO --- ['name' => 'Mesero', 'route' => 'waiter.dashboard', 'icon' => 'utensils', 'accent' => 'blue'], // --- CAJA Y ALMACEN --- ['name' => 'Caja', 'route' => 'op.cashier', 'icon' => 'store', 'accent' => 'emerald'], ['name' => 'Almacén', 'route' => 'op.warehouse', 'icon' => 'package', 'accent' => 'orange'], // --- GERENCIA --- [ 'name' => 'Gerencia', 'icon' => 'pie-chart', 'accent' => 'purple', 'submenu' => [ ['name' => 'Panel', 'route' => 'manager.dashboard', 'icon' => 'bar-chart-2'], ['name' => 'Auditoría', 'route' => 'manager.audit', 'icon' => 'file-search'], ['name' => 'Menu y Catalogo', 'route' => 'manager.reports', 'icon' => 'layout-grid'], ['name' => 'Personal', 'route' => 'manager.staff', 'icon' => 'users'], ] ], // --- ADMIN --- [ 'name' => 'Admin', 'icon' => 'shield-check', 'accent' => 'slate', 'submenu' => [ ['name' => 'Panel', 'route' => 'admin.dashboard', 'icon' => 'layout-dashboard'], ['name' => 'Sucursales', 'route' => 'admin.branches', 'icon' => 'store'], ['name' => 'Analíticas', 'route' => 'admin.analytics', 'icon' => 'bar-chart-2'], ['name' => 'RRHH', 'route' => 'admin.hr', 'icon' => 'user-cog'], ['name' => 'CRM', 'route' => 'admin.crm', 'icon' => 'heart-handshake'], ['name' => 'Precios', 'route' => 'admin.prices', 'icon' => 'tag'], ['name' => 'Promos', 'route' => 'admin.promotions', 'icon' => 'zap'], ['name' => 'Config', 'route' => 'admin.settings', 'icon' => 'settings'], ] ], ]; // Lógica de Avatar $user = Auth::guard('admin')->user() ?? Auth::user(); $avatarUrl = 'https://ui-avatars.com/api/?name=' . urlencode($user->nombre_completo ?? 'User') . '&background=0ea5e9&color=fff'; if ($user && !empty($user->foto_url) && $user->foto_url !== 'null') { $cleanPath = str_replace(['uploads / ', 'uploads/', 'uploads\ ', 'uploads\\'], '', $user->foto_url); $cleanPath = trim(str_replace('\\', '/', $cleanPath)); if (str_starts_with($cleanPath, '/')) $cleanPath = substr($cleanPath, 1); if (!str_starts_with($cleanPath, 'http')) { // Si foto_url trae "uploads/...", cleanPath tal vez se lo quitó en el reemplazo de arriba // Asegurémonos de que apunte al middleware proxy de Node $avatarUrl = url('/middleware/uploads/' . $cleanPath); } else { $avatarUrl = $cleanPath; } } // --- CONSUMO DE ROL DESDE BACKEND (SISTEMA_PITER) --- $userRole = 'STAFF'; // Default inicial try { if (!empty($user->perfil_id)) { // Consultamos la tabla maestra de perfiles (Columna correcta: 'nombre') $fetchedRole = \Illuminate\Support\Facades\DB::table('dbo.Seguridad_Perfiles') ->where('id_perfil', $user->perfil_id) ->value('nombre'); if ($fetchedRole) { $userRole = $fetchedRole; } } } catch (\Exception $e) { // Fallback silencioso: intentar usar propiedad 'rol' del modelo si existe if (!empty($user->rol)) $userRole = $user->rol; } // --- ENRUTAMIENTO DINÁMICO DE PERFIL --- // Determinar la ruta del perfil según el rol obtenido $profileRoute = 'admin.profile'; // Default para Dueño/Admin $roleUpper = mb_strtoupper($userRole, 'UTF-8'); if (str_contains($roleUpper, 'GERENTE') || str_contains($roleUpper, 'MANAGER')) { $profileRoute = 'manager.profile'; } elseif (str_contains($roleUpper, 'CLIENTE')) { $profileRoute = 'client.profile'; } else { // Para Dueño, Admin, Superadmin, o Staff genérico $profileRoute = 'admin.profile'; } // --- RESTRICCIÓN RÍGIDA DEL DOCK DE NAVEGACIÓN PARA CAJEROS (Sincronización Premium) --- $isCajero = str_contains($roleUpper, 'CAJA') || str_contains($roleUpper, 'CAJERO'); if ($isCajero) { $menu = array_filter($menu, function($item) { return $item['name'] === 'Caja'; }); \Illuminate\Support\Facades\Log::info("CHISMOSO: Dock filtrado para el cajero {$user->email}. Solo se muestra la opción Caja."); } // --- RESTRICCIÓN RÍGIDA DEL DOCK DE NAVEGACIÓN PARA MESEROS --- $isMesero = str_contains($roleUpper, 'MESERO') || str_contains($roleUpper, 'WAITER'); if ($isMesero) { $menu = array_filter($menu, function($item) { return $item['name'] === 'Mesero'; }); \Illuminate\Support\Facades\Log::info("CHISMOSO: Dock filtrado para el mesero {$user->email}. Solo se muestra la opción Mesero."); } // --- RESTRICCIÓN RÍGIDA DEL DOCK DE NAVEGACIÓN PARA COCINA --- $isCocina = str_contains($roleUpper, 'COCINA') || str_contains($roleUpper, 'COCINERO'); if ($isCocina) { $menu = array_filter($menu, function($item) { return $item['name'] === 'Cocina'; }); \Illuminate\Support\Facades\Log::info("CHISMOSO: Dock filtrado para el cocinero {$user->email}. Solo se muestra la opción Cocina."); } // --- RESTRICCIÓN RÍGIDA DEL DOCK DE NAVEGACIÓN PARA BAR --- $isBar = str_contains($roleUpper, 'BAR') || str_contains($roleUpper, 'BARTENDER'); if ($isBar) { $menu = array_filter($menu, function($item) { return $item['name'] === 'Bar'; }); \Illuminate\Support\Facades\Log::info("CHISMOSO: Dock filtrado para el bartender {$user->email}. Solo se muestra la opción Bar."); } @endphp {{-- ESTILOS OBSIDIAN DOCK (Integrados aquí para que no falten) --}} {{-- Estilos Dinámicos con CSS Variables para Actualización en Tiempo Real --}} @php // Helper simple para convertir formato Flutter (0xAARRGGBB) a CSS (#RRGGBB) $convertColor = function($color) { if (empty($color)) return null; if (str_starts_with($color, '#')) return $color; if (str_starts_with($color, '0x')) { return '#' . substr($color, -6); } return $color; }; // Helper para contraste inteligente $getContrastColor = function($hex) { if(!$hex) return '#ffffff'; $hex = str_replace('#', '', $hex); if(strlen($hex) == 3) { $hex = $hex[0].$hex[0].$hex[1].$hex[1].$hex[2].$hex[2]; } $r = hexdec(substr($hex, 0, 2)); $g = hexdec(substr($hex, 2, 2)); $b = hexdec(substr($hex, 4, 2)); $yiq = (($r * 299) + ($g * 587) + ($b * 114)) / 1000; return ($yiq >= 128) ? '#0f172a' : '#ffffff'; }; // --- CONSULTA DINÁMICA DE COLORES DEL DUEÑO DE LA EMPRESA (Sincronización Móvil) --- $ownerColorPreferido = null; $ownerColorFondoPreferido = null; if ($user && !empty($user->empresa_id)) { try { $ownerProfileIds = \Illuminate\Support\Facades\DB::table('dbo.Seguridad_Perfiles') ->where('empresa_id', $user->empresa_id) ->where('nombre', 'LIKE', '%DUEÑO%') ->pluck('id_perfil'); if ($ownerProfileIds->isNotEmpty()) { $ownerUser = \Illuminate\Support\Facades\DB::table('dbo.Seguridad_Usuarios') ->where('empresa_id', $user->empresa_id) ->whereIn('perfil_id', $ownerProfileIds) ->first(); if ($ownerUser) { $ownerColorPreferido = $ownerUser->color_preferido; $ownerColorFondoPreferido = $ownerUser->color_fondo_preferido; } } } catch (\Exception $e) { // Silencioso } } // --- Sincronización Universal Inteligente --- $userDockBg = $convertColor($ownerColorPreferido ?? $user->color_preferido ?? null) ?? '#020617'; $userAccent = $convertColor($ownerColorFondoPreferido ?? $user->color_fondo_preferido ?? null) ?? '#6366f1'; $userDockText = $getContrastColor($userDockBg); $isDarkDock = $userDockText === '#ffffff'; @endphp {{-- Backdrop Glass Global Discreto --}}
{{-- 1. LOGO (Todo-Terreno) --}}
Logo
{{-- 2. MENÚ CENTRAL --}} {{-- 3. PERFIL (Derecha) --}}
{{-- MODAL DE CIERRE DE SESIÓN PREMIUM (Cargando...) --}}