runningInConsole() && Schema::hasTable('settings')) { $rawSettings = Setting::pluck('value', 'key')->toArray(); View::share('setting', (object) $rawSettings); } // 3. VIEW COMPOSER (Fungsi Notifikasi Stok Tetap Berjalan) $alertViews = ['layouts.app', 'layouts.navigation-sidebar', 'dashboard', 'pages.*']; View::composer($alertViews, function ($view) { $stockData = Cache::remember('low_stock_alerts', 600, function () { $lowMedicines = Medicine::where('qty', '<', 5)->get(['nama_obat', 'qty', 'unit']); $lowFoods = Food::where('qty', '<', 5)->get(['nama_makanan', 'qty', 'unit']); return [ 'lowStockMedicines' => $lowMedicines, 'lowStockFoods' => $lowFoods, 'totalAlerts' => $lowMedicines->count() + $lowFoods->count(), ]; }); $view->with($stockData); }); // 4. SISTEM OTORISASI GLOBAL (Gate Permission) Gate::define('check-access', function ($user, $module, $permission) { // Hindari pengecekan jika user tidak memiliki role_id atau data role if (!$user->role_id && !$user->role) return false; // Deteksi Role: Apakah string (lama) atau object (baru) // Jika $user->role adalah string, ambil langsung. Jika object, ambil slug-nya. $roleIdentifier = is_object($user->role) ? $user->role->slug : $user->role; // Admin Bypass: Role admin memiliki akses ke seluruh fitur if ($roleIdentifier === 'admin') { return true; } // Menyelaraskan nama kolom (can_read, can_create, can_update, can_delete) $column = str_starts_with($permission, 'can_') ? $permission : 'can_' . $permission; // Cek matriks di tabel role_permissions berdasarkan role_id return \App\Models\RolePermission::where('role_id', $user->role_id) ->where('module_slug', $module) ->where($column, 1) ->exists(); }); } }