142 lines
4.1 KiB
PHP
142 lines
4.1 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use Illuminate\Http\Request;
|
|
use App\Models\User;
|
|
use App\Models\Anggota;
|
|
use App\Models\Koleksi;
|
|
use App\Models\BorrowTransaction;
|
|
use App\Models\Rating;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class DashboardController extends Controller
|
|
{
|
|
public function index()
|
|
{
|
|
// 1. Menghitung Data Dasar Koleksi
|
|
$jumlahJudul = Koleksi::distinct('title')->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.'
|
|
);
|
|
}
|
|
}
|
|
|