TKK_E32230908/app/Http/Controllers/Admin/StatistikController.php

199 lines
8.2 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Koleksi;
use App\Models\Anggota;
use App\Models\BorrowTransaction;
use App\Models\User; // Menggunakan model User untuk data pendaftaran akun
use Illuminate\Http\Request;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\Auth;
class StatistikController extends Controller
{
public function index()
{
// 1. RINGKASAN UTAMA
$totalBuku = Koleksi::count('kode_eksemplar');
$totalAnggota = Anggota::count();
$anggotaBaruBulanIni = Anggota::whereMonth('created_at', Carbon::now()->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'
));
}
}