count('title'); $jumlahEksemplar = Koleksi::whereNotNull('kode_eksemplar')->count(); $jumlahUser = User::count(); $totalBuku = $jumlahJudul; $totalAnggota = Anggota::count(); // 2. Statistik Anggota & Sirkulasi $anggotaBulanIni = Anggota::whereMonth('created_at', date('m'))->count(); // Menghitung buku yang sedang aktif dipinjam $totalPeminjaman = BorrowTransaction::where('status', 'dipinjam')->count(); /** * UPDATE: Menghitung total pengembalian. * Menggunakan status 'kembali' atau 'dikembalikan' agar sinkron dengan database */ $totalPengembalian = BorrowTransaction::whereIn('status', ['kembali', 'dikembalikan'])->count(); // 3. Menghitung Notifikasi (PENGECEKAN KETAT) $pendingMembers = Anggota::whereIn('status', ['pending', 'menunggu'])->count(); /** * UPDATE: Notifikasi Peminjaman/Pengembalian Baru * Menghitung transaksi yang statusnya 'menunggu' (pinjam baru), * 'pengembalian_menunggu' (user lapor sudah mengembalikan), * dan 'perpanjangan_menunggu' (user minta perpanjang). */ $pendingLoans = BorrowTransaction::whereIn('status', [ 'menunggu', 'pengembalian_menunggu', 'perpanjangan_menunggu' ])->count(); // 4. Data Chart (Sirkulasi Peminjaman Bulanan) $chartData = BorrowTransaction::selectRaw('MONTH(tanggal_pinjam) as bulan, COUNT(*) as total') ->whereYear('tanggal_pinjam', date('Y')) ->groupBy('bulan') ->orderBy('bulan') ->pluck('total', 'bulan') ->toArray(); $chartDataFull = []; for ($i = 1; $i <= 12; $i++) { $chartDataFull[] = $chartData[$i] ?? 0; } $bulanLabel = ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Agu', 'Sep', 'Okt', 'Nov', 'Des']; // 5. Rating & Feedback $ratings = Rating::with(['user', 'transaction.koleksi']) ->orderBy('created_at', 'desc') ->take(10) ->get(); // 6. Buku Terpopuler $mostBorrowedBook = BorrowTransaction::select('koleksi_id') ->selectRaw('COUNT(*) as total') ->groupBy('koleksi_id') ->orderByDesc('total') ->with('koleksi') ->first(); // 7. Return ke View return view('admin.dashboard', compact( 'jumlahJudul', 'jumlahEksemplar', 'jumlahUser', 'totalBuku', 'totalAnggota', 'anggotaBulanIni', 'totalPeminjaman', 'totalPengembalian', 'pendingMembers', 'pendingLoans', 'chartDataFull', 'bulanLabel', 'ratings', 'mostBorrowedBook' )); } // TURUNKAN ADMIN MENJADI USER public function turunkanAdmin($id) { $auth = Auth::user(); if (!$auth || $auth->role !== 'super_admin') { abort(403, 'Akses ditolak!'); } $user = User::findOrFail($id); $user->role = 'user'; $user->save(); return back()->with( 'success', 'Admin berhasil dijadikan user.' ); } // BLOKIR USER public function blokirUser($id) { $auth = Auth::user(); if (!$auth || $auth->role !== 'super_admin') { abort(403, 'Akses ditolak!'); } $user = User::findOrFail($id); $user->blocked_at = now(); $user->save(); return back()->with( 'success', 'User berhasil diblokir.' ); } }