month) ->whereYear('created_at', Carbon::now()->year) ->count(); // 2. STATUS SIRKULASI $totalPeminjaman = BorrowTransaction::where('status', 'dipinjam')->count(); $totalPengembalian = BorrowTransaction::where('status', 'dikembalikan')->count(); // --- PENGAMAN KOLOM JATUH TEMPO / TANGGAL KEMBALI --- $totalTerlambat = 0; if (Schema::hasColumn('borrow_transactions', 'tanggal_kembali')) { $totalTerlambat = BorrowTransaction::where('status', 'dipinjam') ->where('tanggal_kembali', '<', Carbon::today()) ->count(); } elseif (Schema::hasColumn('borrow_transactions', 'tanggal_harus_kembali')) { $totalTerlambat = BorrowTransaction::where('status', 'dipinjam') ->where('tanggal_harus_kembali', '<', Carbon::today()) ->count(); } // --- PENGAMAN KOLOM DENDA --- $totalDenda = 0; if (Schema::hasColumn('borrow_transactions', 'denda')) { $totalDenda = BorrowTransaction::sum('denda'); } $rasioKeterpakaian = $totalBuku > 0 ? round(($totalPeminjaman / $totalBuku) * 100) . '%' : '0%'; // 3. PROSES DATA ASAL WILAYAH (Berdasarkan Tabel Anggota Kolom Alamat) $wilayahCounts = [ 'Kota Surabaya' => 0, 'Kabupaten Sidoarjo' => 0, 'Kabupaten Malang' => 0, 'Kota Malang' => 0, 'Kota Batu' => 0, 'Kabupaten Pasuruan' => 0, 'Kota Pasuruan' => 0, 'Kabupaten Blitar' => 0, 'Kota Blitar' => 0, 'Luar Wilayah' => 0, ]; if (Schema::hasColumn('anggota', 'alamat')) { // Ambil semua string alamat dari database $daftarAlamat = Anggota::pluck('alamat'); foreach ($daftarAlamat as $alamat) { if (empty($alamat)) { $wilayahCounts['Luar Wilayah']++; continue; } $alamatLower = strtolower($alamat); // Klasifikasi berdasarkan kata kunci spesifik if (str_contains($alamatLower, 'surabaya')) { $wilayahCounts['Kota Surabaya']++; } elseif (str_contains($alamatLower, 'sidoarjo')) { $wilayahCounts['Kabupaten Sidoarjo']++; } elseif (str_contains($alamatLower, 'batu')) { $wilayahCounts['Kota Batu']++; } // Cek Kota Malang vs Kabupaten Malang elseif (str_contains($alamatLower, 'kota malang')) { $wilayahCounts['Kota Malang']++; } elseif (str_contains($alamatLower, 'malang')) { $wilayahCounts['Kabupaten Malang']++; } // Cek Kota Pasuruan vs Kabupaten Pasuruan elseif (str_contains($alamatLower, 'kota pasuruan')) { $wilayahCounts['Kota Pasuruan']++; } elseif (str_contains($alamatLower, 'pasuruan')) { $wilayahCounts['Kabupaten Pasuruan']++; } // Cek Kota Blitar vs Kabupaten Blitar elseif (str_contains($alamatLower, 'kota blitar')) { $wilayahCounts['Kota Blitar']++; } elseif (str_contains($alamatLower, 'blitar')) { $wilayahCounts['Kabupaten Blitar']++; } // Jika tidak mampir ke kriteria manapun else { $wilayahCounts['Luar Wilayah']++; } } } // Pecah array asosiatif menjadi index array polos untuk konsumsi Chart.js $wilayahLabels = array_keys($wilayahCounts); $wilayahData = array_values($wilayahCounts); // 4. METRIK RINGKASAN DATA USER (Tabel Users) $userHariIni = User::whereDate('created_at', Carbon::today())->count(); $userBulanIni = User::whereMonth('created_at', Carbon::now()->month)->whereYear('created_at', Carbon::now()->year)->count(); $userTahunIni = User::whereYear('created_at', Carbon::now()->year)->count(); // 5. DATA MASTER BULAN & PEMINJAMAN (Untuk Sumbu X Semua Grafik) $bulanLabels = ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Agu', 'Sep', 'Okt', 'Nov', 'Des']; $tahunIni = Carbon::now()->year; // A. Data Volume Peminjaman $peminjamanPerBulan = BorrowTransaction::selectRaw('MONTH(tanggal_pinjam) as bulan, COUNT(*) as total') ->whereYear('tanggal_pinjam', $tahunIni) ->groupBy('bulan') ->pluck('total', 'bulan'); $dataPeminjaman = []; for ($i = 1; $i <= 12; $i++) { $dataPeminjaman[] = $peminjamanPerBulan[$i] ?? 0; } // B. Data Grafik Aktivitas Sistem (Berdasarkan users.created_at) $userPerBulan = User::selectRaw('MONTH(created_at) as bulan, COUNT(*) as total') ->whereYear('created_at', $tahunIni) ->groupBy('bulan') ->pluck('total', 'bulan'); $chartUsersCreatedAt = []; for ($i = 1; $i <= 12; $i++) { $chartUsersCreatedAt[] = $userPerBulan[$i] ?? 0; } // C. Data Grafik Anggota (Berdasarkan anggota.created_at) $anggotaPerBulan = Anggota::selectRaw('MONTH(created_at) as bulan, COUNT(*) as total') ->whereYear('created_at', $tahunIni) ->groupBy('bulan') ->pluck('total', 'bulan'); $chartAnggotaCreatedAt = []; for ($i = 1; $i <= 12; $i++) { $chartAnggotaCreatedAt[] = $anggotaPerBulan[$i] ?? 0; } // 6. PENGAMAN KONDISI BUKU $bukuReferensi = 0; $bukuRusak = 0; $bukuHilang = 0; if (Schema::hasColumn('koleksis', 'kondisi_buku')) { $bukuRusak = Koleksi::where('kondisi_buku', 'rusak')->count(); $bukuHilang = Koleksi::where('kondisi_buku', 'hilang')->count(); } elseif (Schema::hasColumn('koleksis', 'kondisi')) { $bukuRusak = Koleksi::where('kondisi', 'rusak')->count(); $bukuHilang = Koleksi::where('kondisi', 'hilang')->count(); } $totalUsulanBuku = Schema::hasTable('usulan_buku') ? DB::table('usulan_buku')->count() : 0; // 7. GENDER MEMBER $genderLaki = 0; $genderPerempuan = 0; if (Schema::hasColumn('anggota', 'gender')) { $genderLaki = Anggota::whereIn('gender', ['Laki-laki', 'L'])->count(); $genderPerempuan = Anggota::whereIn('gender', ['Perempuan', 'P'])->count(); } elseif (Schema::hasColumn('anggota', 'jenis_kelamin')) { $genderLaki = Anggota::whereIn('jenis_kelamin', ['Laki-laki', 'L'])->count(); $genderPerempuan = Anggota::whereIn('jenis_kelamin', ['Perempuan', 'P'])->count(); } if ($genderLaki === 0 && $genderPerempuan === 0) { $genderLaki = 50; $genderPerempuan = 50; } // Kirim semua variabel ke view admin.statistik return view('admin.statistik', compact( 'totalBuku', 'totalAnggota', 'anggotaBaruBulanIni', 'totalPeminjaman', 'totalPengembalian', 'totalTerlambat', 'totalDenda', 'rasioKeterpakaian', 'wilayahLabels', 'wilayahData', 'userHariIni', 'userBulanIni', 'userTahunIni', 'bukuReferensi', 'bukuRusak', 'bukuHilang', 'totalUsulanBuku', 'genderLaki', 'genderPerempuan', 'bulanLabels', 'dataPeminjaman', 'chartUsersCreatedAt', 'chartAnggotaCreatedAt' )); } }