199 lines
8.2 KiB
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'
|
|
));
|
|
}
|
|
} |