diff --git a/app/Auth/DummyUserProvider.php b/app/Auth/DummyUserProvider.php index f0cd936..4d82d6a 100644 --- a/app/Auth/DummyUserProvider.php +++ b/app/Auth/DummyUserProvider.php @@ -29,14 +29,11 @@ public function retrieveById($identifier) /** * Rehash the user's password if required. - * Method ini wajib ada di Laravel 12. Kita biarkan kosong karena tidak relevan untuk data dummy. */ public function rehashPasswordIfRequired(Authenticatable $user, array $credentials, bool $force = false): void { - // Biarkan kosong } - // Fungsi-fungsi di bawah ini tidak kita pakai, tapi harus ada. public function retrieveByToken($identifier, $token) { return null; } public function updateRememberToken(Authenticatable $user, $token) { } public function retrieveByCredentials(array $credentials) { return null; } diff --git a/app/Http/Controllers/Admin/AdminPeminjamanController.php b/app/Http/Controllers/Admin/AdminPeminjamanController.php index 1918310..c56109e 100644 --- a/app/Http/Controllers/Admin/AdminPeminjamanController.php +++ b/app/Http/Controllers/Admin/AdminPeminjamanController.php @@ -9,36 +9,78 @@ class AdminPeminjamanController extends Controller { - /** - * Menampilkan halaman utama manajemen peminjaman (Tabel). - */ public function index(Request $request) { - // Panggil data dari DummyDataService $peminjamanAktif = DummyDataService::getAdminPeminjamanAktif(); + + // LOGIC DENDA & WA LINK (Update Request Client) + $peminjamanAktif = $peminjamanAktif->map(function ($item) { + // Hitung Denda Flat 1000/hari + $tenggat = Carbon::parse($item['tenggat_kembali']); + $now = Carbon::now(); + + $item['hari_terlambat'] = 0; + $item['total_denda'] = 0; + + if ($now->greaterThan($tenggat)) { + $hariTelat = $tenggat->diffInDays($now); + $item['hari_terlambat'] = $hariTelat; + $item['total_denda'] = $hariTelat * 1000; + $item['denda_per_hari'] = 1000; + } + // Generate WA Link + $hp = $item['nomor_hp']; + if (substr($hp, 0, 1) == '0') { + $hp = '62' . substr($hp, 1); + } + + $pesan = "Halo kak {$item['peminjam']}, buku anda sudah terlambat {$item['hari_terlambat']} hari dengan denda Rp " . number_format($item['total_denda'], 0, ',', '.') . ". Mohon segera dikembalikan ya."; + $item['wa_link'] = "https://wa.me/{$hp}?text=" . urlencode($pesan); + + return $item; + }); + $daftarPeminjam = $peminjamanAktif->pluck('peminjam')->unique(); - return view('admin.peminjaman.index', [ - 'pageTitle' => 'Manajemen Peminjaman', + 'pageTitle' => 'Manajemen Peminjaman & Denda', 'peminjamanAktif' => $peminjamanAktif, 'daftarPeminjam' => $daftarPeminjam, ]); } - /** - * Menampilkan formulir untuk membuat peminjaman manual. - */ public function create() { $allUsers = collect(DummyDataService::getAllSiswa()); + $peminjamanAktif = DummyDataService::getAdminPeminjamanAktif(); - // Kelompokkan berdasarkan 'role' $groupedUsers = $allUsers ->whereIn('role', ['siswa', 'guru']) + ->map(function ($user) use ($peminjamanAktif) { + + // Hitung berapa buku yang sedang dipinjam + $jumlahPinjam = $peminjamanAktif->where('peminjam', $user['nama_lengkap'])->count(); + + // Cek Status + $user['jumlah_pinjam'] = $jumlahPinjam; + $user['kena_limit'] = $jumlahPinjam >= 2; + + // Cek apakah user di-banned (Nonaktif Manual) + $user['is_banned'] = $user['is_banned'] ?? false; + $user['disabled'] = $user['kena_limit'] || $user['is_banned']; + + if ($user['is_banned']) { + $user['status_text'] = "(Akun Dibekukan)"; + } elseif ($user['kena_limit']) { + $user['status_text'] = "(Limit Penuh: 2/2)"; + } else { + $user['status_text'] = ""; + } + + return $user; + }) ->groupBy('role'); - // Filter hanya buku offline $daftarBuku = DummyDataService::getAllBooks() ->where('status', 'Tersedia') ->filter(function ($buku) { @@ -54,4 +96,96 @@ public function create() 'daftarBuku' => $daftarBuku, ]); } -} + + /** + * Menampilkan halaman KHUSUS Manajemen Denda (Siswa & Guru Telat). + */ + public function dendaIndex() + { + $allData = DummyDataService::getAdminPeminjamanAktif(); + $allSiswaRaw = collect(DummyDataService::getAllSiswa()); + $now = \Carbon\Carbon::now(); + + // LOGIC AUTO-BAN + $allSiswa = $allSiswaRaw->map(function ($siswa) use ($allData, $now) { + + // Cek siswa punya pinjaman yang telat + $pinjamanUser = $allData->firstWhere('user_id', $siswa['id']); + + $isTelat = false; + if ($pinjamanUser) { + $isTelat = $pinjamanUser['tenggat_kembali']->startOfDay()->lt($now->startOfDay()); + } + + // Jika Role SISWA dan TELAT -> Wajib AUTO BAN (Override true) + // ika Role GURU -> Ikut status asli database (Manual Ban) + if ($siswa['role'] === 'siswa' && $isTelat) { + $siswa['is_banned'] = true; + } + + return $siswa; + }); + + $siswaTelat = $allData->filter(function ($item) use ($now, $allSiswa) { + $userData = $allSiswa->firstWhere('id', $item['user_id']); + + if (!$userData) + return false; + + $isTelat = $item['tenggat_kembali']->startOfDay()->lt($now->startOfDay()); + $isBanned = $userData['is_banned']; + $isTargetRole = in_array($userData['role'], ['siswa', 'guru']); + + return ($isTelat || $isBanned) && $isTargetRole; + })->map(function ($item) use ($now, $allSiswa) { + + // Hitungan Denda + $tenggat = $item['tenggat_kembali']->startOfDay(); + + // Jika belum telat (tapi banned/manual), hari telat 0 + $hariTelat = ($tenggat->lt($now->startOfDay())) + ? $tenggat->diffInDays($now->startOfDay()) + : 0; + + $totalDenda = $hariTelat * $item['denda_per_hari']; + + $item['hari_terlambat'] = $hariTelat; + $item['total_denda'] = $totalDenda; + + // Ambil status is_banned TERBARU dari $allSiswa + $dataSiswa = $allSiswa->firstWhere('id', $item['user_id']); + $item['is_banned'] = $dataSiswa['is_banned'] ?? false; + $item['kelas'] = $dataSiswa['kelas'] ?? 'Guru'; + + // Link WA + $hp = $item['nomor_hp']; + if (substr($hp, 0, 1) == '0') + $hp = '62' . substr($hp, 1); + + if ($hariTelat > 0) { + $pesan = "Halo {$item['peminjam']}, anda terlambat pengembalian buku. Total Denda: Rp " . number_format($totalDenda, 0, ',', '.'); + } else { + $pesan = "Halo {$item['peminjam']}, akun anda sedang dinonaktifkan sementara. Mohon hubungi petugas."; + } + $item['wa_link'] = "https://wa.me/{$hp}?text=" . urlencode($pesan); + + return $item; + }); + + $listKelas = $siswaTelat->pluck('kelas')->unique()->values(); + + return view('admin.denda.index', [ + 'pageTitle' => 'Manajemen Denda & Sanksi', + 'siswaTelat' => $siswaTelat, + 'listKelas' => $listKelas + ]); + } + + /** + * Dummy function untuk tombol Sanksi + */ + public function berikanSanksi(Request $request) + { + return response()->json(['status' => 'success']); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php index 129d09f..e7ea746 100644 --- a/app/Http/Controllers/DashboardController.php +++ b/app/Http/Controllers/DashboardController.php @@ -11,17 +11,31 @@ class DashboardController extends Controller public function index() { $user = Auth::user(); + $bukuPinjam = DummyDataService::getBukuPinjamOffline($user); + + $isTelat = collect($bukuPinjam)->contains(function ($buku) { + return $buku['sisa_hari'] < 0; + }); + + if ($isTelat && $user->role === 'siswa') { + $user->is_banned = true; + } + $stats = DummyDataService::getDashboardStats(); $pengumuman = DummyDataService::getPengumuman(); $pemberitahuan = DummyDataService::getPemberitahuan(); $progressMembaca = DummyDataService::getProgressMembaca(); $statistikBulanan = DummyDataService::getStatistikBulanan(); - $bukuPinjamOffline = DummyDataService::getBukuPinjamOffline($user); + $bukuPinjamOffline = $bukuPinjam; $bacaBukuOnline = DummyDataService::getBacaBukuOnline($user); $rekomendasiPembelajaran = DummyDataService::getRekomendasiPembelajaran(); + $personalNotif = DummyDataService::getNotifikasiForUser($user); + + // Cek apakah ada notifikasi denda aktif + $dendaAlert = collect($personalNotif)->where('type', 'denda_active'); // Menambahkan thumbnail YouTube ke setiap rekomendasi - $rekomendasiPembelajaran = DummyDataService::getRekomendasiPembelajaran()->map(function ($item) { + $rekomendasiPembelajaran = $rekomendasiPembelajaran->map(function ($item) { $videoId = $this->extractYouTubeId($item['youtube_link']); if ($videoId) { $item['thumbnail'] = "https://img.youtube.com/vi/{$videoId}/hqdefault.jpg"; @@ -31,30 +45,32 @@ public function index() return $item; }); + $dendaAlert = collect($personalNotif)->where('type', 'denda_active'); + $hour = date('H'); $greeting = "Selamat Pagi"; - if ($hour >= 12 && $hour < 15) { + if ($hour >= 12 && $hour < 15) $greeting = "Selamat Siang"; - } elseif ($hour >= 15 && $hour < 18) { + elseif ($hour >= 15 && $hour < 18) $greeting = "Selamat Sore"; - } elseif ($hour >= 18) { + elseif ($hour >= 18) $greeting = "Selamat Malam"; - } return view('dashboard', compact( 'user', 'stats', 'pengumuman', 'pemberitahuan', + 'dendaAlert', 'progressMembaca', 'statistikBulanan', 'bukuPinjamOffline', 'bacaBukuOnline', 'greeting', 'rekomendasiPembelajaran' - )); + ))->with('notifikasi', $personalNotif); } - + /** * Helper function untuk mengekstrak ID video dari URL YouTube. */ @@ -63,4 +79,4 @@ private function extractYouTubeId(string $url): ?string preg_match('/(v=|vi=|youtu.be\/|embed\/|\/v\/|\?v=|\&v=)(.+?)\b/i', $url, $matches); return $matches[2] ?? null; } -} +} \ No newline at end of file diff --git a/app/Http/Controllers/KatalogController.php b/app/Http/Controllers/KatalogController.php index 2b19f3f..af3a3e4 100644 --- a/app/Http/Controllers/KatalogController.php +++ b/app/Http/Controllers/KatalogController.php @@ -4,13 +4,23 @@ use App\Services\DummyDataService; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; class KatalogController extends Controller { public function index(Request $request) { - $filters = $request->only(['search', 'kategori', 'tahun', 'penulis']); + $user = Auth::user(); + $isBanned = false; + if ($user && $user->role === 'siswa') { + $bukuPinjam = DummyDataService::getBukuPinjamOffline($user); + $isTelat = collect($bukuPinjam)->contains(fn($b) => $b['sisa_hari'] < 0); + $isBannedManual = $user->is_banned ?? false; + $isBanned = $isTelat || $isBannedManual; + } + + $filters = $request->only(['search', 'kategori', 'tahun', 'penulis']); $semuaBuku = DummyDataService::getKatalogBuku($filters); $filterOptions = DummyDataService::getFilterOptions(); @@ -20,6 +30,7 @@ public function index(Request $request) 'input' => $filters, 'pageTitle' => 'Katalog Buku', 'mode' => 'umum', + 'isBanned' => $isBanned, ]); } -} +} \ No newline at end of file diff --git a/app/Http/Controllers/PeminjamanController.php b/app/Http/Controllers/PeminjamanController.php index 620da36..54a833a 100644 --- a/app/Http/Controllers/PeminjamanController.php +++ b/app/Http/Controllers/PeminjamanController.php @@ -10,6 +10,18 @@ class PeminjamanController extends Controller { public function index(Request $request) { + $user = \Illuminate\Support\Facades\Auth::user(); + $bukuPinjam = \App\Services\DummyDataService::getBukuPinjamOffline($user); + $isTelat = collect($bukuPinjam)->contains(function ($buku) { + return $buku['sisa_hari'] < 0; + }); + + $isBannedManual = $user->is_banned ?? false; + + if (($isTelat || $isBannedManual) && $user->role === 'siswa') { + return redirect()->route('dashboard')->with('error', 'AKSES DITOLAK: Akun Anda sedang dibekukan karena ada buku terlambat!'); + } + $filters = $request->only(['search', 'kategori', 'tahun', 'penulis']); $filters['tipe_akses'] = 'offline'; $semuaBuku = DummyDataService::getKatalogBuku($filters); diff --git a/app/Http/Controllers/RiwayatController.php b/app/Http/Controllers/RiwayatController.php index 472cb4e..9180c87 100644 --- a/app/Http/Controllers/RiwayatController.php +++ b/app/Http/Controllers/RiwayatController.php @@ -4,15 +4,16 @@ use App\Services\DummyDataService; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; // Tambahkan ini class RiwayatController extends Controller { - /** - * Menampilkan halaman riwayat peminjaman offline. - */ public function offlineIndex() { - $riwayatOffline = DummyDataService::getRiwayatOffline(); + $user = \Illuminate\Support\Facades\Auth::user(); + if (!$user) $user = (object) ['id' => 1]; + + $riwayatOffline = DummyDataService::getRiwayatOffline($user); return view('riwayat.offline', [ 'pageTitle' => 'Riwayat Peminjaman Offline', @@ -20,9 +21,6 @@ public function offlineIndex() ]); } - /** - * Menampilkan halaman riwayat baca online. - */ public function onlineIndex() { $riwayatOnline = DummyDataService::getRiwayatOnline(); diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 0c8f63a..a9e04f9 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -3,6 +3,7 @@ namespace App\Providers; use App\Services\DummyDataService; +use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\URL; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\View; @@ -26,18 +27,18 @@ public function boot(): void URL::forceScheme('https'); } + // View Composer untuk semua view (*) View::composer('*', function ($view) { - $notifikasi = collect([]); - $unreadNotificationsCount = 0; - - // Hanya ambil notifikasi jika ada pengguna yang login - if (auth()->check()) { - $user = auth()->user(); + if (Auth::check()) { + $user = Auth::user(); $notifikasi = collect(DummyDataService::getNotifikasiForUser($user)); - $unreadNotificationsCount = $notifikasi->where('read', false)->count(); + $unreadCount = $notifikasi->where('read', false)->count(); + $view->with('notifikasi', $notifikasi); + $view->with('unreadNotificationsCount', $unreadCount); + } else { + $view->with('notifikasi', collect([])); + $view->with('unreadNotificationsCount', 0); } - - $view->with(compact('notifikasi', 'unreadNotificationsCount')); }); } } diff --git a/app/Services/DummyDataService.php b/app/Services/DummyDataService.php index 0e65daa..4ead6c1 100644 --- a/app/Services/DummyDataService.php +++ b/app/Services/DummyDataService.php @@ -22,6 +22,7 @@ public static function getAllSiswa(): array 'role' => 'siswa', 'kelas' => 'XII RPL', 'golongan' => 'A', + 'is_banned' => false, ], [ 'id' => 2, @@ -41,6 +42,7 @@ public static function getAllSiswa(): array 'role' => 'siswa', 'kelas' => 'XII RPL A', 'golongan' => 'A', + 'is_banned' => true, ], [ @@ -53,6 +55,7 @@ public static function getAllSiswa(): array 'role' => 'siswa', 'kelas' => 'XII RPL A', 'golongan' => 'A', + 'is_banned' => false, ], [ 'id' => 5, @@ -61,6 +64,7 @@ public static function getAllSiswa(): array 'email' => 'rina.marlina@smkn1perpus.sch.id', 'password' => 'password', 'role' => 'guru', + 'is_banned' => false, ], ]; } @@ -81,157 +85,39 @@ public static function getAktivitasMingguan(): array */ public static function getAdminPeminjamanAktif(): \Illuminate\Support\Collection { - return collect([ - [ - 'id_peminjaman' => 'PIN-202510-001', - 'peminjam' => 'Silvi Rahmawati', - 'nomor_hp' => '08123456789', - 'tanggal_pinjam' => Carbon::now()->subDays(12), - 'tenggat_kembali' => Carbon::now()->subDays(5), // Terlambat 5 hari - 'denda_per_hari' => 1000, - 'books' => [ - ['id' => 5, 'judul' => 'Si Anak Pintar'], - ['id' => 8, 'judul' => 'Ayah'], - ] - ], - [ - 'id_peminjaman' => 'PIN-202510-002', - 'peminjam' => 'Andi Pratama', - 'nomor_hp' => '081556677889', - 'tanggal_pinjam' => Carbon::now()->subDays(4), - 'tenggat_kembali' => Carbon::now()->addDays(3), // Sisa 3 hari - 'denda_per_hari' => 1000, - 'books' => [ - ['id' => 7, 'judul' => 'The Last Spell Breather'], - ] - ], - [ - 'id_peminjaman' => 'PIN-202510-003', - 'peminjam' => 'Siti Nurhaliza', - 'nomor_hp' => '081998877665', + $allBooks = self::getAllBooks(); + $allSiswa = collect(self::getAllSiswa()); + $bukuDipinjam = $allBooks->whereIn('status', ['Dipinjam', 'Terlambat']); + $grouped = $bukuDipinjam->groupBy(function ($item) { + return is_array($item['user_id']) ? $item['user_id'][0] : $item['user_id']; + }); + + return $grouped->map(function ($books, $userId) use ($allSiswa) { + $siswa = $allSiswa->firstWhere('id', $userId); + $firstBook = $books->first(); + $tglKembali = Carbon::now()->addDays($firstBook['sisa_hari']); + + return [ + 'id_peminjaman' => 'PIN-ADM-' . sprintf('%03d', $userId), + 'user_id' => $userId, + 'role' => $siswa ? $siswa['role'] : 'siswa', + 'is_banned' => $siswa ? ($siswa['is_banned'] ?? false) : false, + + 'peminjam' => $siswa ? $siswa['nama_lengkap'] : 'User Tidak Dikenal', + 'nomor_hp' => $siswa ? ($siswa['nomor_hp'] ?? '-') : '-', 'tanggal_pinjam' => Carbon::now()->subDays(7), - 'tenggat_kembali' => Carbon::now(), // Hari ini + 'tenggat_kembali' => $tglKembali, 'denda_per_hari' => 1000, - 'books' => [ - ['id' => 1, 'judul' => 'Modul Ajar IPAS'], - ] - ], - [ - 'id_peminjaman' => 'PIN-202510-004', - 'peminjam' => 'Dewi Lestari', - 'nomor_hp' => '082134567891', - 'tanggal_pinjam' => Carbon::now()->subDays(15), - 'tenggat_kembali' => Carbon::now()->subDays(8), // Terlambat 8 hari - 'denda_per_hari' => 1000, - 'books' => [ - ['id' => 2, 'judul' => 'Modul Ajar Pendidikan Pancasila'], - ['id' => 6, 'judul' => 'Matematika Dasar'], - ] - ], - [ - 'id_peminjaman' => 'PIN-202510-005', - 'peminjam' => 'Eko Prasetyo', - 'nomor_hp' => '085612345678', - 'tanggal_pinjam' => Carbon::now()->subDays(2), - 'tenggat_kembali' => Carbon::now()->addDays(5), // Sisa 5 hari - 'denda_per_hari' => 1000, - 'books' => [ - ['id' => 9, 'judul' => 'Senja, Hujan, & Cerita yang Telah Usai'], - ] - ], - [ - 'id_peminjaman' => 'PIN-202510-006', - 'peminjam' => 'Rina Marlina', - 'nomor_hp' => '081987654321', - 'tanggal_pinjam' => Carbon::now()->subDays(10), - 'tenggat_kembali' => Carbon::now()->subDays(3), // Terlambat 3 hari - 'denda_per_hari' => 1000, - 'books' => [ - ['id' => 4, 'judul' => 'Modul Pembelajaran Seni Budaya'], - ] - ], - [ - 'id_peminjaman' => 'PIN-202510-007', - 'peminjam' => 'Budi Santoso', - 'nomor_hp' => '082298765432', - 'tanggal_pinjam' => Carbon::now()->subDays(6), - 'tenggat_kembali' => Carbon::now()->addDays(1), // Sisa 1 hari - 'denda_per_hari' => 1000, - 'books' => [ - ['id' => 3, 'judul' => 'Modul Belajar Sosiologi'], - ['id' => 10, 'judul' => 'Hijrah itu Cinta'], - ] - ], - [ - 'id_peminjaman' => 'PIN-202510-008', - 'peminjam' => 'Putri Amelia', - 'nomor_hp' => '085743219876', - 'tanggal_pinjam' => Carbon::now()->subDays(18), - 'tenggat_kembali' => Carbon::now()->subDays(11), // Terlambat 11 hari - 'denda_per_hari' => 1000, - 'books' => [ - ['id' => 1, 'judul' => 'Modul Ajar IPAS'], - ] - ], - [ - 'id_peminjaman' => 'PIN-202510-009', - 'peminjam' => 'Ahmad Haziq', - 'nomor_hp' => '081345678902', - 'tanggal_pinjam' => Carbon::now()->subDays(3), - 'tenggat_kembali' => Carbon::now()->addDays(4), // Sisa 4 hari - 'denda_per_hari' => 1000, - 'books' => [ - ['id' => 7, 'judul' => 'The Last Spell Breather'], - ['id' => 8, 'judul' => 'Ayah'], - ] - ], - [ - 'id_peminjaman' => 'PIN-202510-010', - 'peminjam' => 'John Wick', - 'nomor_hp' => '082187654309', - 'tanggal_pinjam' => Carbon::now()->subDays(8), - 'tenggat_kembali' => Carbon::now()->subDays(1), // Terlambat 1 hari - 'denda_per_hari' => 1000, - 'books' => [ - ['id' => 5, 'judul' => 'Si Anak Pintar'], - ] - ], - [ - 'id_peminjaman' => 'PIN-202510-011', - 'peminjam' => 'Silvi Rahmawati', - 'nomor_hp' => '08123456789', - 'tanggal_pinjam' => Carbon::now()->subDays(5), - 'tenggat_kembali' => Carbon::now()->addDays(2), // Sisa 2 hari - 'denda_per_hari' => 1000, - 'books' => [ - ['id' => 2, 'judul' => 'Modul Ajar Pendidikan Pancasila'], - ['id' => 4, 'judul' => 'Modul Pembelajaran Seni Budaya'], - ] - ], - [ - 'id_peminjaman' => 'PIN-202510-012', - 'peminjam' => 'Andi Pratama', - 'nomor_hp' => '081556677889', - 'tanggal_pinjam' => Carbon::now()->subDays(20), - 'tenggat_kembali' => Carbon::now()->subDays(13), // Terlambat 13 hari - 'denda_per_hari' => 1000, - 'books' => [ - ['id' => 6, 'judul' => 'Matematika Dasar'], - ] - ], - [ - 'id_peminjaman' => 'PIN-202510-013', - 'peminjam' => 'Siti Nurhaliza', - 'nomor_hp' => '081998877665', - 'tanggal_pinjam' => Carbon::now()->subDays(1), - 'tenggat_kembali' => Carbon::now()->addDays(6), // Sisa 6 hari - 'denda_per_hari' => 1000, - 'books' => [ - ['id' => 9, 'judul' => 'Senja, Hujan, & Cerita yang Telah Usai'], - ['id' => 10, 'judul' => 'Hijrah itu Cinta'], - ] - ], - ]); + + 'books' => $books->map(function ($b) { + return [ + 'id' => $b['id'], + 'judul' => $b['judul'], + 'cover' => $b['cover'] + ]; + })->toArray() + ]; + })->values(); } /** @@ -328,7 +214,7 @@ public static function getSiswaTeraktif(): array ['nama' => 'Rina Marlina', 'total_buku' => 20, 'kelas' => 'XII TKJ A'], ['nama' => 'Budi Santoso', 'total_buku' => 18, 'kelas' => 'X OTKP'], ['nama' => 'Putri Amelia', 'total_buku' => 16, 'kelas' => 'XI RPL C'], - ['nama' => 'Ahmad Haziq', 'total_buku' => 12, 'kelas' => 'X TKJ B'], + ['nama' => 'Ahmad Jono', 'total_buku' => 12, 'kelas' => 'X TKJ B'], ]; } @@ -483,158 +369,157 @@ public static function getStatistikBulanan(): array * @return \Illuminate\Support\Collection */ public static function getAllBooks() -{ - return collect([ - [ - 'id' => 1, - 'judul' => 'Modul Ajar IPAS', - 'penulis' => 'Tim Kemdikbud Ristek', - 'cover' => 'images/covers/ipas.jpg', - 'kode_buku' => '510', // 500 (Sains) - 'kategori' => 'Sains', - 'tahun' => 2022, - 'status' => 'Tersedia', - 'is_new' => true, - 'tipe_akses' => ['online', 'offline'], - 'file_pdf' => 'ipas.pdf', - 'progress' => 75, - 'sisa_hari' => 14, - 'user_id' => 1, - ], - [ - 'id' => 2, - 'judul' => 'Modul Ajar Pendidikan Pancasila', - 'penulis' => 'Tim Guru Pancasila', - 'cover' => 'images/covers/pancasila.jpg', - 'kode_buku'=> '370', // 370 (Pendidikan, bagian dari 300-Sosial) - 'kategori' => 'Pendidikan', - 'tahun' => 2023, - 'status' => 'Tersedia', - 'is_new' => false, - 'tipe_akses' => 'offline', - 'sisa_hari' => 3, - 'progress' => 100, - 'user_id' => [3, 1], - ], - [ - 'id' => 3, - 'judul' => 'Modul Belajar Sosiologi', - 'penulis' => 'Tim Cendekia', - 'cover' => 'images/covers/sosiologi.jpg', - 'kode_buku' => '340', // 300 (Ilmu Sosial) - 'kategori' => 'Sosial', - 'tahun' => 2021, - 'status' => 'Dipinjam', - 'is_new' => false, - 'tipe_akses' => 'offline', - 'sisa_hari' => 8, - 'user_id' => 3, - ], - [ - 'id' => 4, - 'judul' => 'Modul Pembelajaran Seni Budaya', - 'penulis' => 'Cahya Wulan, S.Pd.', - 'cover' => 'images/covers/senbud.jpg', - 'kode_buku' => '752', // 700 (Seni) - 'kategori' => 'Seni', - 'tahun' => 2022, - 'status' => 'Dipinjam', - 'is_new' => false, - 'tipe_akses' => 'offline', - 'sisa_hari' => 14, - 'user_id' => [1, 3], - ], - [ - 'id' => 5, - 'judul' => 'Si Anak Pintar', - 'penulis' => 'Tere Liye', - 'cover' => 'images/covers/sianakpintar.jpg', - 'kode_buku' => '843', // 800 (Fiksi/Sastra) - 'kategori' => 'Fiksi', - 'tahun' => 2018, - 'status' => 'Dipinjam', - 'is_new' => true, - 'tipe_akses' => 'offline', - 'sisa_hari' => 5, - 'user_id' => 1, - ], - [ - 'id' => 6, - 'judul' => 'Matematika Dasar', - 'penulis' => 'Prof. Dr. Matematikus', - 'cover' => 'images/covers/mtk.jpg', - 'kode_buku' => '374', // 370 (Pendidikan) - 'kategori' => 'Pendidikan', - 'tahun' => 2023, - 'status' => 'Tersedia', - 'is_new' => true, - 'tipe_akses' => ['online', 'offline'], - 'file_pdf' => 'mtk.pdf', - 'sisa_hari' => 7, - 'progress' => 40, - 'user_id' => [1, 4, 5], - ], - [ - 'id' => 7, - 'judul' => 'The Last Spell Breather', - 'penulis' => 'Julie Pike', - 'cover' => 'images/covers/thelastspellbreather.jpg', - 'kode_buku' => '834', // 800 (Fantasi/Sastra) - 'kategori' => 'Fantasi', - 'tahun' => 2024, - 'status' => 'Tersedia', - 'is_new' => true, - 'tipe_akses' => 'offline', - 'sisa_hari' => 4, - 'progress' => 0, - 'user_id' => [3, 1] - ], - [ - 'id' => 8, - 'judul' => 'Ayah', - 'penulis' => 'Andrea Hirata', - 'cover' => 'images/covers/ayah.png', - 'kategori' => 'Novel', - 'tahun' => 2015, - 'status' => 'Tersedia', - 'is_new' => true, - 'tipe_akses' => 'online', - 'file_pdf' => 'ayah.pdf', - 'progress' => 0, - 'user_id' => [1, 2, 3], - ], - [ - 'id' => 9, - 'judul' => 'Senja, Hujan, & Cerita yang Telah Usai', - 'penulis' => 'Boy Candra', - 'cover' => 'images/covers/senja.png', - 'kode_buku' => '845', // 800 (Novel/Sastra) - 'kategori' => 'Novel', - 'tahun' => 2015, - 'status' => 'Tersedia', - 'is_new' => true, - 'tipe_akses' => ['online', 'offline'], - 'file_pdf' => 'senja.pdf', - 'progress' => 0, - 'sisa_hari' => 14, - 'user_id' => [1, 3], - ], - [ - 'id' => 10, - 'judul' => 'Hijrah itu Cinta', - 'penulis' => 'Abay Adhitya', - 'cover' => 'images/covers/hijrah.png', - 'kategori' => 'Religi', - 'tahun' => 2018, - 'status' => 'Tersedia', - 'is_new' => true, - 'tipe_akses' => 'online', - 'file_pdf' => 'hijrah.pdf', - 'progress' => 0, - 'user_id' => [2, 3], - ] - ]); -} + { + return collect([ + // --- BUKU MILIK USER 1 (SILVI) --- + [ + 'id' => 1, + 'judul' => 'Modul Ajar IPAS', + 'penulis' => 'Tim Kemdikbud Ristek', + 'cover' => 'images/covers/ipas.jpg', + 'kode_buku' => '510', + 'kategori' => 'Sains', + 'tahun' => 2022, + 'status' => 'Dipinjam', + 'is_new' => true, + 'tipe_akses' => ['online', 'offline'], + 'sisa_hari' => -5, + 'user_id' => 1, + ], + [ + 'id' => 2, + 'judul' => 'Perahu Kertas', + 'penulis' => 'Dewi Lestari', + 'cover' => 'images/covers/ayah.png', + 'kode_buku' => '844', + 'kategori' => 'Fiksi', + 'tahun' => 2012, + 'status' => 'Dipinjam', + 'is_new' => false, + 'tipe_akses' => 'offline', + 'sisa_hari' => 3, + 'user_id' => 1, + ], + + // --- BUKU TERSEDIA (UNTUK CEK PEMINJAMAN BARU) --- + [ + 'id' => 3, + 'judul' => 'Si Anak Pintar', + 'penulis' => 'Tere Liye', + 'cover' => 'images/covers/sianakpintar.jpg', + 'kode_buku' => '843', + 'kategori' => 'Fiksi', + 'tahun' => 2018, + 'status' => 'Tersedia', + 'is_new' => true, + 'tipe_akses' => 'offline', + 'sisa_hari' => 0, + 'user_id' => null, + ], + [ + 'id' => 4, + 'judul' => 'Laskar Pelangi', + 'penulis' => 'Andrea Hirata', + 'cover' => 'https://upload.wikimedia.org/wikipedia/id/8/8e/Laskar_pelangi_sampul.jpg', + 'kode_buku' => 'NOV-001', + 'kategori' => 'Novel', + 'tahun' => 2005, + 'status' => 'Tersedia', + 'is_new' => false, + 'tipe_akses' => 'offline', + 'sisa_hari' => 0, + 'user_id' => null, + ], + [ + 'id' => 5, + 'judul' => 'Filosofi Teras', + 'penulis' => 'Henry Manampiring', + 'cover' => 'https://upload.wikimedia.org/wikipedia/id/3/36/Filosofi_Teras.jpg', + 'kode_buku' => 'PSI-002', + 'kategori' => 'Psikologi', + 'tahun' => 2018, + 'status' => 'Tersedia', + 'is_new' => true, + 'tipe_akses' => 'offline', + 'sisa_hari' => 0, + 'user_id' => null, + ], + [ + 'id' => 6, + 'judul' => 'Atomic Habits', + 'penulis' => 'James Clear', + 'cover' => 'https://images-na.ssl-images-amazon.com/images/I/91bYsX41DVL.jpg', + 'kode_buku' => 'SELF-003', + 'kategori' => 'Refleksi Diri', + 'tahun' => 2018, + 'status' => 'Tersedia', + 'is_new' => true, + 'tipe_akses' => ['offline', 'online'], + 'sisa_hari' => 0, + 'user_id' => null, + ], + [ + 'id' => 7, + 'judul' => 'Bumi Manusia', + 'penulis' => 'Pramoedya Ananta Toer', + 'cover' => 'https://upload.wikimedia.org/wikipedia/id/4/44/Bumi_Manusia.jpg', + 'kode_buku' => 'SAS-004', + 'kategori' => 'Sastra', + 'tahun' => 1980, + 'status' => 'Tersedia', + 'is_new' => false, + 'tipe_akses' => 'offline', + 'sisa_hari' => 0, + 'user_id' => null, + ], + [ + 'id' => 8, + 'judul' => 'Laut Bercerita', + 'penulis' => 'Leila S. Chudori', + 'cover' => 'https://upload.wikimedia.org/wikipedia/id/6/6d/Laut_Bercerita.jpeg', + 'kode_buku' => 'NOV-005', + 'kategori' => 'Novel', + 'tahun' => 2017, + 'status' => 'Tersedia', + 'is_new' => true, + 'tipe_akses' => 'offline', + 'sisa_hari' => 0, + 'user_id' => null, + ], + // --- BUKU MILIK USER 3 (SITI) - TELAT --- + [ + 'id' => 99, + 'judul' => 'Seni Berbicara', + 'penulis' => 'Larry King', + 'cover' => 'https://via.placeholder.com/150', + 'kode_buku' => 'COM-001', + 'kategori' => 'Refleksi Diri', + 'tahun' => 2019, + 'status' => 'Dipinjam', + 'is_new' => false, + 'tipe_akses' => 'offline', + 'sisa_hari' => -2, + 'user_id' => 3, + ], + + // --- BUKU MILIK GURU (USER 5) - TESTING MANUAL BAN --- + [ + 'id' => 88, + 'judul' => 'Strategi Pembelajaran Abad 21', + 'penulis' => 'Prof. Dr. Pendidikan', + 'cover' => 'https://via.placeholder.com/150', + 'kode_buku' => 'GURU-001', + 'kategori' => 'Pendidikan', + 'tahun' => 2020, + 'status' => 'Dipinjam', + 'is_new' => false, + 'tipe_akses' => 'offline', + 'sisa_hari' => -3, + 'user_id' => 5, + ], + ]); + } + /** * Data untuk buku pinjam offline @@ -642,9 +527,16 @@ public static function getAllBooks() public static function getBukuPinjamOffline($user): array { return self::getAllBooks() - ->where('tipe_akses', 'offline') + ->filter(function ($buku) { + // Handle tipe akses string atau array + if (is_array($buku['tipe_akses'])) { + return in_array('offline', $buku['tipe_akses']); + } + return $buku['tipe_akses'] === 'offline'; + }) ->filter(function ($buku) use ($user) { - if (!isset($buku['user_id'])) return false; + if (!isset($buku['user_id']) || $buku['user_id'] === null) + return false; if (is_array($buku['user_id'])) { return in_array($user->id, $buku['user_id']); @@ -669,7 +561,8 @@ public static function getBacaBukuOnline($user): array return self::getAllBooks() ->where('tipe_akses', 'online') ->filter(function ($buku) use ($user) { - if (!isset($buku['user_id'])) return false; + if (!isset($buku['user_id'])) + return false; if (is_array($buku['user_id'])) { return in_array($user->id, $buku['user_id']); @@ -738,52 +631,47 @@ public static function getFilterOptions(): array * Data untuk riwayat peminjaman offline. * Setiap item mewakili satu transaksi peminjaman. */ - public static function getRiwayatOffline(): array + public static function getRiwayatOffline($user): array { - return [ - [ - 'id' => 1, - 'id_peminjaman' => 'PIN-20240520-001', - 'kode_buku' => '510', - 'judul_utama' => 'Modul Ajar IPAS', - 'tanggal_pinjam' => '20/05/2024', - 'tanggal_kembali' => '27/05/2024', - 'status' => 'Dikembalikan', + $allBooks = self::getAllBooks(); + $myBooks = $allBooks->filter(function ($buku) use ($user) { + if (is_array($buku['user_id'])) { + return in_array($user->id, $buku['user_id']); + } + return $buku['user_id'] == $user->id; + })->whereIn('status', ['Dipinjam', 'Dikembalikan', 'Terlambat']); + + // Mapping ke format tampilan View + return $myBooks->map(function ($buku, $index) { + + // Logika Tanggal Dummy + $tglPinjam = Carbon::now()->subDays(7); + + // Hitung tanggal kembali berdasarkan sisa hari di Master Data + $tglKembali = Carbon::now()->addDays($buku['sisa_hari']); + + return [ + 'id' => $index + 1, + 'id_peminjaman' => 'PIN-' . date('Ym') . '-' . sprintf('%03d', $buku['id']), + 'kode_buku' => $buku['kode_buku'], + 'judul_utama' => $buku['judul'], + 'tanggal_pinjam' => $tglPinjam->format('d/m/Y'), + 'tanggal_kembali' => $tglKembali->format('d/m/Y'), + 'status' => $buku['status'], 'books' => [ [ - 'id' => 1, - 'judul' => 'Modul Ajar IPAS', - 'kode_buku' => '510', - 'cover' => 'images/covers/ipas.jpg', - 'deskripsi' => 'Buku ini berisi ajakan kepada anak-anak untuk semangat pergi ke sekolah dan menuntut ilmu.', - 'kategori' => 'Pendidikan', - 'tahun' => 2022, - 'keterangan' => 'Buku dikembalikan dalam kondisi baik. Terdapat denda keterlambatan 2 hari: Rp 2.000,-' + 'id' => $buku['id'], + 'judul' => $buku['judul'], + 'kode_buku' => $buku['kode_buku'], + 'cover' => $buku['cover'], + 'deskripsi' => 'Deskripsi buku ' . $buku['judul'], + 'kategori' => $buku['kategori'], + 'tahun' => $buku['tahun'], + 'keterangan' => ($buku['sisa_hari'] < 0) ? 'Buku Terlambat' : null, ] ] - ], - [ - 'id' => 2, - 'id_peminjaman' => 'PIN-20240527-002', - 'kode_buku' => '844', - 'judul_utama' => 'Perahu Kertas', - 'tanggal_pinjam' => '27/05/2024', - 'tanggal_kembali' => '04/06/2024', - 'status' => 'Dipinjam', - 'books' => [ - [ - 'id' => 8, - 'judul' => 'Perahu Kertas', - 'kode_buku' => '844', - 'cover' => 'images/covers/ayah.png', - 'deskripsi' => 'Cerita penggambaran pasang surut hubungan dua anak manusia, yaitu Kugy dan Keenan.', - 'kategori' => 'Fiksi', - 'tahun' => 2022, - 'keterangan' => null, - ], - ] - ], - ]; + ]; + })->values()->toArray(); } /** @@ -821,79 +709,62 @@ public static function getRiwayatOnline(): array public static function getNotifikasiForUser($user): array { $notifikasi = []; + $allBooks = self::getAllBooks(); + $myBooks = $allBooks->filter(function ($buku) use ($user) { + if (!isset($buku['user_id']) || $buku['user_id'] === null) { + return false; + } - $bukuPinjaman = self::getBukuPinjamOffline($user); + if (is_array($buku['user_id'])) { + return in_array($user->id, $buku['user_id']); + } + return $buku['user_id'] == $user->id; + }); - if (!empty($bukuPinjaman)) { - $bukuTerbaru = $bukuPinjaman[0]; - $notifikasi[] = [ - 'icon' => 'bi-check2-circle', - 'color' => 'success', - 'title' => 'Buku "' . $bukuTerbaru['judul'] . '" berhasil dipinjam.', - 'time' => '5 menit yang lalu', - 'read' => false, - 'type' => 'riwayat_peminjaman', - 'link_id' => null, - ]; - } + foreach ($myBooks as $buku) { + // LOGIC TELAT + if ($buku['sisa_hari'] < 0 && $buku['status'] == 'Dipinjam') { + $hariTelat = abs($buku['sisa_hari']); + $denda = $hariTelat * 1000; - - foreach ($bukuPinjaman as $buku) { - if ($buku['sisa_hari'] <= 3) { $notifikasi[] = [ - 'icon' => 'bi-exclamation-triangle', + 'icon' => 'bi-exclamation-octagon-fill', 'color' => 'danger', - 'title' => 'Buku "' . $buku['judul'] . '" akan jatuh tempo!', - 'time' => '1 jam yang lalu', + 'title' => 'TERLAMBAT: ' . $buku['judul'], + 'content' => "Telat {$hariTelat} hari. Denda: Rp " . number_format($denda, 0, ',', '.'), + 'time' => 'Sekarang', 'read' => false, - 'type' => 'riwayat_peminjaman', + 'type' => 'denda_active', + 'link_id' => null, + ]; + } + // LOGIC JATUH TEMPO + elseif ($buku['sisa_hari'] >= 0 && $buku['sisa_hari'] <= 3 && $buku['status'] == 'Dipinjam') { + $notifikasi[] = [ + 'icon' => 'bi-exclamation-triangle-fill', + 'color' => 'warning', + 'title' => 'Jatuh Tempo: ' . $buku['judul'], + 'content' => "Sisa waktu tinggal " . $buku['sisa_hari'] . " hari lagi.", + 'time' => 'Segera', + 'read' => false, + 'type' => 'warning_jatuh_tempo', 'link_id' => null, ]; } } - if ($user->role === 'guru') { - $notifikasi[] = [ - 'icon' => 'bi-lightbulb-fill', - 'color' => 'success', - 'title' => 'Rekomendasi pembelajaran baru telah ditambahkan.', - 'time' => 'Kemarin', - 'read' => true, - 'type' => 'rekomendasi', - 'link_id' => 1, - ]; - } - - $notifikasiUmum = [ - [ - 'icon' => 'bi-book-half', - 'color' => 'info', - 'title' => 'Buku baru ditambahkan ke kategori Fiksi.', - 'time' => '3 jam yang lalu', - 'read' => false, - 'type' => 'katalog_kategori', - 'link_id' => 'Fiksi', - ], - [ - 'icon' => 'bi-megaphone-fill', - 'color' => 'warning', - 'title' => 'Perpustakaan akan tutup lebih awal pada hari Jumat.', - 'time' => '1 hari yang lalu', - 'read' => true, - 'type' => 'halaman_profil', - 'link_id' => null, - ], - [ - 'icon' => 'bi-calendar-event', - 'color' => 'primary', - 'title' => 'Acara "Bedah Buku" akan diadakan minggu depan.', - 'time' => '2 hari yang lalu', - 'read' => true, - 'type' => 'halaman_profil', - 'link_id' => null, - ], + // Notif Default + $notifikasi[] = [ + 'icon' => 'bi-info-circle-fill', + 'color' => 'primary', + 'title' => 'Selamat Datang di DigiPus!', + 'content' => 'Silakan jelajahi koleksi buku terbaru kami.', + 'time' => 'Baru saja', + 'read' => true, + 'type' => 'info', + 'link_id' => null, ]; - return array_merge($notifikasi, $notifikasiUmum); + return $notifikasi; } } diff --git a/package-lock.json b/package-lock.json index 7cb82b8..7f9dbbf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -825,7 +825,6 @@ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "license": "MIT", - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -2590,7 +2589,6 @@ "resolved": "https://registry.npmjs.org/sass/-/sass-1.93.2.tgz", "integrity": "sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==", "license": "MIT", - "peer": true, "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -2677,8 +2675,7 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.16.tgz", "integrity": "sha512-pONL5awpaQX4LN5eiv7moSiSPd/DLDzKVRJz8Q9PgzmAdd1R4307GQS2ZpfiN7ZmekdQrfhZZiSE5jkLR4WNaA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/tapable": { "version": "2.3.0", @@ -2735,7 +2732,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -2779,7 +2775,6 @@ "integrity": "sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -2884,7 +2879,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, diff --git a/resources/js/peminjaman-form.js b/resources/js/peminjaman-form.js index cda8ece..7fa862b 100644 --- a/resources/js/peminjaman-form.js +++ b/resources/js/peminjaman-form.js @@ -6,7 +6,7 @@ if (formPeminjamanElement) { const bukuAwal = JSON.parse(formPeminjamanElement.dataset.bukuAwal); let bukuTerpilih = [bukuAwal.id]; - const maxBuku = 3; + const maxBuku = 2; document.addEventListener('DOMContentLoaded', function () { updateCounter(); diff --git a/resources/views/admin/denda/index.blade.php b/resources/views/admin/denda/index.blade.php new file mode 100644 index 0000000..d2199a8 --- /dev/null +++ b/resources/views/admin/denda/index.blade.php @@ -0,0 +1,248 @@ + + @section('page-title', 'Manajemen Denda') + +
+
+

Manajemen Denda & Sanksi

+

Pantau siswa terlambat dan berikan sanksi jika diperlukan.

+
+
+ + {{-- FILTER SECTION --}} +
+
+
+
+ Filter Data: +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+
+ + + + + + + + + + + + + @forelse ($siswaTelat as $item) + + + + + + + + + + @empty + + + + @endforelse + +
NOSISWA & KELASBUKU TERLAMBATSTATUSDENDAAKSI
{{ $loop->iteration }} +
{{ $item['peminjam'] }}
+ {{ $item['kelas'] }} +
{{ $item['nomor_hp'] }}
+
+
    + @foreach ($item['books'] as $buku) +
  • {{ $buku['judul'] }}
  • + @endforeach +
+
+ + Telat {{ $item['hari_terlambat'] }} Hari + +
+ Tenggat: {{ $item['tenggat_kembali']->format('d/m/Y') }} +
+
+
Rp + {{ number_format($item['total_denda'], 0, ',', '.') }}
+ Rp 1.000/hari +
+
+ {{-- Tombol WA --}} + + + + + {{-- LOGIC TOMBOL AKTIFKAN / SANKSI --}} + @if ($item['is_banned']) + {{-- Jika sudah dibekukan (Otomatis/Manual), muncul tombol AKTIFKAN --}} + + @else + {{-- Jika belum dibekukan, muncul tombol SANKSI (Manual) --}} + + @endif +
+
+
+ +

Tidak ada siswa yang terlambat hari ini.

+
+
+
+
+
+ + @push('scripts') + + @endpush +
diff --git a/resources/views/admin/peminjaman/create.blade.php b/resources/views/admin/peminjaman/create.blade.php index 5f0c954..a2b8c5b 100644 --- a/resources/views/admin/peminjaman/create.blade.php +++ b/resources/views/admin/peminjaman/create.blade.php @@ -10,7 +10,7 @@
@csrf
- +
@@ -18,20 +18,24 @@
Data Peminjaman
- +
- +
@@ -40,8 +44,8 @@
- +
@@ -51,13 +55,13 @@
Buku Terpilih
0 Buku
- +

Belum ada buku yang dipilih.

-
+
@@ -66,7 +70,7 @@ Simpan Peminjaman
- +
@@ -96,19 +100,16 @@
- Cover
{{ $buku['judul'] }}

{{ $buku['penulis'] }}

- {{ $buku['kategori'] }} + {{ $buku['kategori'] }}
@@ -125,10 +126,7 @@ class="badge bg-info-soft">{{ $buku['kategori'] }} @push('scripts') @endpush - \ No newline at end of file + diff --git a/resources/views/admin/peminjaman/index.blade.php b/resources/views/admin/peminjaman/index.blade.php index 280c01a..40be248 100644 --- a/resources/views/admin/peminjaman/index.blade.php +++ b/resources/views/admin/peminjaman/index.blade.php @@ -14,7 +14,8 @@
- +
@@ -32,6 +33,7 @@ $now = \Carbon\Carbon::now(); $counter = 1; @endphp + @forelse ($peminjamanAktif as $transaksi) @php $tenggat = $transaksi['tenggat_kembali']; @@ -39,177 +41,178 @@ $isHariIni = $now->startOfDay()->isSameDay($tenggat->startOfDay()); $selisihHari = $now->startOfDay()->diffInDays($tenggat->startOfDay(), false); - $statusKeterlambatan = ''; - $dendaKeterlambatan = 0; - $statusClass = ''; - if ($isTerlambat) { - $hariTerlambat = $tenggat->startOfDay()->diffInDays($now->startOfDay()); - $statusKeterlambatan = "Terlambat $hariTerlambat hari"; - $dendaKeterlambatan = $hariTerlambat * $transaksi['denda_per_hari']; $statusClass = 'badge rounded-pill bg-danger-subtle text-danger-emphasis'; + $statusText = + 'Terlambat ' . $tenggat->startOfDay()->diffInDays($now->startOfDay()) . ' hari'; } elseif ($isHariIni) { - $statusKeterlambatan = 'Hari ini'; $statusClass = 'badge rounded-pill bg-warning-subtle text-warning-emphasis'; + $statusText = 'Jatuh Tempo Hari Ini'; } else { - $sisaHari = abs($selisihHari); - $statusKeterlambatan = "Sisa $sisaHari hari"; $statusClass = 'badge rounded-pill bg-success-subtle text-success-emphasis'; + $statusText = 'Sisa ' . abs($selisihHari) . ' hari'; } @endphp - @foreach ($transaksi['books'] as $index => $buku) - - - - - - - - - - + + + + + + + + + + - - + @endforelse @@ -220,44 +223,53 @@ class="form-label small text-muted">Catatan Petugas @push('scripts') @endpush - diff --git a/resources/views/dashboard.blade.php b/resources/views/dashboard.blade.php index 7be4bcf..93dbfac 100644 --- a/resources/views/dashboard.blade.php +++ b/resources/views/dashboard.blade.php @@ -6,6 +6,28 @@ Pinjam Buku Baru --}} + {{-- CEK STATUS BANNED --}} + @if (Auth::user()->is_banned) + + @endif +
@@ -192,7 +214,9 @@ class="badge bg-{{ $item['type'] }}-soft text-{{ $item['type'] }} rounded-pill p @forelse($bukuPinjamOffline as $buku)
-
+
+ Sisa: {{ $buku['sisa_hari'] }} hari
diff --git a/resources/views/katalog/index.blade.php b/resources/views/katalog/index.blade.php index ea2e136..b3ae114 100644 --- a/resources/views/katalog/index.blade.php +++ b/resources/views/katalog/index.blade.php @@ -68,48 +68,44 @@ class="badge fw-normal {{ $buku['status'] == 'Tersedia' ? 'bg-success-subtle tex
- @if ($mode === 'offline') - @if ($buku['status'] == 'Dipinjam') - + @endif + @elseif($userBanned) + {{-- LOGIC : Jika Banned, tombol Pinjam MATI --}} + @else - Pinjam + Pinjam @endif - @elseif($mode === 'online') + @endif + + {{-- TOMBOL BACA (ONLINE) - Selalu Nyala --}} + @if ($isOnlineAccess && $mode !== 'offline') - Baca + Baca - @else - {{-- Mode 'umum' --}} - @if ($buku['status'] == 'Dipinjam') - - @else - @if (is_array($buku['tipe_akses'])) - Pinjam - - Baca - @elseif ($buku['tipe_akses'] === 'offline') - - Pinjam - - @elseif ($buku['tipe_akses'] === 'online') - - Baca - - @endif - @endif @endif
diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index ffc3678..417a886 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -32,6 +32,13 @@
@include('layouts.navigation')
+ @if (session('error')) + + @endif {{ $slot }}
@@ -60,6 +67,8 @@ if (isset($item['type'])) { if ($item['type'] === 'riwayat_peminjaman') { $url = route('riwayat.offline'); + } elseif ($item['type'] === 'denda_active') { + $url = route('riwayat.offline'); } elseif ($item['type'] === 'rekomendasi' && isset($item['link_id'])) { $url = route('rekomendasi.show', $item['link_id']); } elseif ($item['type'] === 'katalog_kategori' && isset($item['link_id'])) { @@ -103,6 +112,8 @@ class="notification-item d-flex my-1 rounded-3 text-body text-decoration-none @i + + @stack('scripts') diff --git a/resources/views/layouts/navigation.blade.php b/resources/views/layouts/navigation.blade.php index 40c2604..b376f05 100644 --- a/resources/views/layouts/navigation.blade.php +++ b/resources/views/layouts/navigation.blade.php @@ -44,6 +44,8 @@ class="badge bg-primary-subtle text-primary-emphasis rounded-pill">{{ $unreadNot if (isset($item['type'])) { if ($item['type'] === 'riwayat_peminjaman') { $url = route('riwayat.offline'); + } elseif ($item['type'] === 'denda_active') { + $url = route('riwayat.offline'); } elseif ($item['type'] === 'rekomendasi' && isset($item['link_id'])) { $url = route('rekomendasi.show', $item['link_id']); } elseif ($item['type'] === 'katalog_kategori' && isset($item['link_id'])) { diff --git a/resources/views/layouts/sidebar.blade.php b/resources/views/layouts/sidebar.blade.php index 88f31cc..569736c 100644 --- a/resources/views/layouts/sidebar.blade.php +++ b/resources/views/layouts/sidebar.blade.php @@ -39,6 +39,10 @@ class="bi bi-book-fill">Manajemen Buku Manajemen Pinjaman +
@php $counter = 1; @endphp - @forelse ($riwayatOffline as $transaksi) - @foreach ($transaksi['books'] as $buku) - - - - - - - - - - + @if (count($riwayatOffline) > 0) + @foreach ($riwayatOffline as $transaksi) + @foreach ($transaksi['books'] as $buku) + @php + try { + $tglKembali = \Carbon\Carbon::createFromFormat( + 'd/m/Y', + $transaksi['tanggal_kembali'], + )->startOfDay(); + } catch (\Exception $e) { + $tglKembali = \Carbon\Carbon::parse( + $transaksi['tanggal_kembali'], + )->startOfDay(); + } + + $today = now()->startOfDay(); + $isTelat = $today->gt($tglKembali) && $transaksi['status'] == 'Dipinjam'; + + $hariTelat = 0; + $denda = 0; + + if ($isTelat) { + $hariTelat = $tglKembali->diffInDays($today); + $denda = $hariTelat * 1000; + } + @endphp + + + + + + + + + + + + @endforeach @endforeach - @empty - - - @endforelse + @endif
NO
{{ $counter++ }} - {{ $transaksi['id_peminjaman'] }} - {{ $transaksi['peminjam'] }}{{ $buku['judul'] }}{{ $transaksi['tanggal_pinjam']->format('d/m/Y') }}{{ $transaksi['tenggat_kembali']->format('d/m/Y') }} - {{ $statusKeterlambatan }} - - -
{{ $counter++ }} + {{ $transaksi['id_peminjaman'] }} + +
{{ $transaksi['peminjam'] }}
+
{{ $transaksi['nomor_hp'] }}
+
+
    + @foreach ($transaksi['books'] as $buku) +
  • {{ $buku['judul'] }}
  • + @endforeach +
+
{{ $transaksi['tanggal_pinjam']->format('d/m/Y') }}{{ $transaksi['tenggat_kembali']->format('d/m/Y') }} + {{ $statusText }} + + +
-
- -

Tidak ada data peminjaman yang sedang aktif.

-
-
Tidak ada data.
{{ $counter++ }}{{ $transaksi['id_peminjaman'] }}{{ $buku['kode_buku'] }}{{ $buku['judul'] }}{{ $transaksi['tanggal_pinjam'] }}{{ $transaksi['tanggal_kembali'] }} - @if ($transaksi['status'] == 'Dikembalikan') - {{ $transaksi['status'] }} - @else - {{ $transaksi['status'] }} - @endif - - -
{{ $counter++ }}{{ $transaksi['id_peminjaman'] }}{{ $buku['kode_buku'] }}{{ $buku['judul'] }}{{ $transaksi['tanggal_pinjam'] }}{{ $transaksi['tanggal_kembali'] }} + @if ($transaksi['status'] == 'Dikembalikan') + Dikembalikan + @elseif($isTelat) + Terlambat + @else + Dipinjam + @endif + + +
Tidak ada riwayat peminjaman.
- {{-- MODAL DETAIL RIWAYAT --}} -