1, 'nisn' => '1234567890', 'nama_lengkap' => 'Silvi Rahmawati', 'email' => 'silvi.rahmawati@smkn1perpus.sch.id', 'nomor_hp' => '08123456789', 'password' => 'password', 'role' => 'siswa', 'kelas' => 'XII RPL', 'golongan' => 'A', ], [ 'id' => 2, 'nama_lengkap' => 'Budi Santoso', 'nip' => '197812312005011', 'email' => 'budi.santoso@smkn1perpus.sch.id', 'password' => 'password', 'role' => 'penjaga perpus', ], [ 'id' => 3, 'nisn' => '9988776655', 'nama_lengkap' => 'Siti Nurhaliza', 'email' => 'siti.nurhaliza@smkn1perpus.sch.id', 'nomor_hp' => '081998877665', 'password' => 'password', 'role' => 'siswa', 'kelas' => 'XII RPL A', 'golongan' => 'A', ], [ 'id' => 4, 'nisn' => '5566778899', 'nama_lengkap' => 'Andi Pratama', 'email' => 'andi.pratama@smkn1perpus.sch.id', 'nomor_hp' => '081556677889', 'password' => 'password', 'role' => 'siswa', 'kelas' => 'XII RPL A', 'golongan' => 'A', ], [ 'id' => 5, 'nama_lengkap' => 'Rina Marlina', 'nip' => '198506152010012', 'email' => 'rina.marlina@smkn1perpus.sch.id', 'password' => 'password', 'role' => 'guru', ], ]; } /** * Data dummy untuk grafik aktivitas membaca mingguan di laporan guru. */ public static function getAktivitasMingguan(): array { return [ 'labels' => ['Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat', 'Sabtu', 'Minggu'], 'data' => [15, 22, 18, 25, 20, 30, 28], ]; } /** * Data dummy untuk tabel peminjaman aktif di dashboard admin. */ 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', 'tanggal_pinjam' => Carbon::now()->subDays(7), 'tenggat_kembali' => Carbon::now(), // Hari ini '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'], ] ], ]); } /** *Data Dummy untuk fitur Rekomendasi Pembelajaran. */ public static function getRekomendasiPembelajaran(): \Illuminate\Support\Collection { return collect([ [ 'id' => 1, 'judul' => 'Sistem Tata Surya - Rangkuman Materi IPA Terpadu', 'kategori' => 'IPA', 'youtube_link' => 'https://www.youtube.com/watch?v=libKVRa01L8', 'deskripsi' => '
Video animasi seru yang menjelaskan tentang planet-planet di tata surya kita...
', ], [ 'id' => 2, 'judul' => 'Macam-macam Zat dan Perubahannya - IPA Kelas 7', 'kategori' => 'IPA', 'youtube_link' => 'https://www.youtube.com/watch?v=CfwPsKdC5w8', 'deskripsi' => 'Zat (materi) adalah sesuatu yang menempati ruang dan mempunyai massa...
', ], [ 'id' => 3, 'judul' => 'Sejarah Kerajaan Majapahit, Kerajaan Terbesar di Nusantara', 'kategori' => 'IPS', 'youtube_link' => 'https://www.youtube.com/watch?v=2Z9hqVqPY_s', 'deskripsi' => 'Pelajari sejarah salah satu kerajaan terbesar di Indonesia...
', ], [ 'id' => 4, 'judul' => 'Belajar HTML dari NOL untuk Pemula', 'kategori' => 'Informatika', 'youtube_link' => 'https://www.youtube.com/watch?v=NBZ9Ro6UKV8', 'deskripsi' => 'Ingin belajar membuat website? Mulai dari sini!...
', ], [ 'id' => 5, 'judul' => 'Rumus Cepat Teorema Pythagoras', 'kategori' => 'Matematika', 'youtube_link' => 'https://youtu.be/JJaptwjRbxc?si=XRxkrAf5G76iJ5CG', 'deskripsi' => 'Jangan takut lagi dengan soal Pythagoras!...
', ], [ 'id' => 6, 'judul' => 'Cara Menggambar Perspektif 1 Titik Hilang', 'kategori' => 'Seni Budaya', 'youtube_link' => 'https://youtu.be/SS7dLGDWUSs?si=lVw8jBkaWT---7ch', 'deskripsi' => 'Buat gambarmu terlihat lebih hidup dan realistis!...
', ], [ 'id' => 7, 'judul' => 'Sistem Peredaran Darah pada Manusia', 'kategori' => 'IPA', 'youtube_link' => 'https://youtu.be/QLoqMruGbkc?si=KiP5VZ4ByKSdFJK9', 'deskripsi' => 'Pahami bagaimana jantung memompa darah ke seluruh tubuh...
', ], [ 'id' => 8, 'judul' => 'Unsur-Unsur Intrinsik Cerpen', 'kategori' => 'Bahasa Indonesia', 'youtube_link' => 'https://youtu.be/PQNuvyQZYvI?si=Lr9AeTO_k6vY21ei', 'deskripsi' => 'Analisis sebuah cerita pendek menjadi lebih mudah...
', ], [ 'id' => 9, 'judul' => 'Apa itu Pemanasan Global?', 'kategori' => 'IPS', 'youtube_link' => 'https://youtu.be/pVjXm340tbw?si=GeMhYK1FSOGtV86X', 'deskripsi' => 'Mengapa suhu bumi semakin panas? Pelajari tentang penyebabnya...
', ], [ 'id' => 10, 'judul' => 'APA ITU LUBANG HITAM?', 'kategori' => 'Sains', 'youtube_link' => 'https://youtu.be/Tx87wEaDtxo?si=fNORkTYOeLiH9_xh', 'deskripsi' => 'Jelajahi salah satu objek paling misterius di alam semesta...
', ], ]); } /** * Data dummy untuk menampilkan 10 siswa paling aktif di laporan guru. */ public static function getSiswaTeraktif(): array { return [ ['nama' => 'Silvi Rahmawati', 'total_buku' => 45, 'kelas' => 'XII RPL'], ['nama' => 'Siti Nurhaliza', 'total_buku' => 33, 'kelas' => 'XII RPL A'], ['nama' => 'Andi Pratama', 'total_buku' => 30, 'kelas' => 'XII RPL B'], ['nama' => 'John Wick', 'total_buku' => 28, 'kelas' => 'XI TKJ'], ['nama' => 'Dewi Lestari', 'total_buku' => 25, 'kelas' => 'XII AKL'], ['nama' => 'Eko Prasetyo', 'total_buku' => 22, 'kelas' => 'XI MM'], ['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'], ]; } /** * Data dummy untuk halaman Laporan Minat Baca khusus Guru. */ public static function getLaporanMinatBaca(): array { return [ 'buku_terpopuler' => [ ['judul' => 'Modul Ajar IPAS', 'penulis' => 'Tim Kemdikbud Ristek', 'total_pembaca' => 125, 'cover' => 'images/covers/ipas.jpg'], ['judul' => 'Ayah', 'penulis' => 'Andrea Hirata', 'total_pembaca' => 98, 'cover' => 'images/covers/ayah.png'], ['judul' => 'Si Anak Pintar', 'penulis' => 'Tere Liye', 'total_pembaca' => 92, 'cover' => 'images/covers/sianakpintar.jpg'], ], 'kategori_populer' => [ ['nama' => 'Sains', 'total_pembaca' => 230, 'trend' => 'naik', 'icon' => 'bi-arrow-up-right'], ['nama' => 'Fiksi', 'total_pembaca' => 190, 'trend' => 'stabil', 'icon' => 'bi-arrow-right'], ['nama' => 'Pendidikan', 'total_pembaca' => 150, 'trend' => 'turun', 'icon' => 'bi-arrow-down-right'], ['nama' => 'Novel', 'total_pembaca' => 110, 'trend' => 'naik', 'icon' => 'bi-arrow-up-right'], ], 'insight' => 'Siswa menunjukkan minat baca tertinggi pada kategori Sains dan Fiksi. Buku-buku karangan Tere Liye dan Andrea Hirata masih menjadi favorit.', ]; } /** * Data dummy untuk Halaman Dashboard Statistik Petugas Perpus */ public static function getAdminDashboardStats(): array { $allBooks = self::getAllBooks(); $allUsers = self::getAllSiswa(); $bukuDipinjam = $allBooks->filter(fn($buku) => $buku['status'] === 'Dipinjam')->count(); return [ ['label' => 'Total Buku', 'value' => $allBooks->count(), 'icon' => 'bi-journal-bookmark-fill', 'color' => 'primary'], ['label' => 'Total Anggota', 'value' => count($allUsers), 'icon' => 'bi-people-fill', 'color' => 'success'], ['label' => 'Buku Dipinjam', 'value' => $bukuDipinjam, 'icon' => 'bi-arrow-up-right-circle-fill', 'color' => 'warning'], ['label' => 'Denda Menunggu', 'value' => 0, 'icon' => 'bi-cash-coin', 'color' => 'danger'], ]; } /** * Data untuk bar chart di dashboard admin (total peminjaman per bulan). */ public static function getStatistikPeminjamanAdmin(): array { return [ 'labels' => ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul'], 'data' => [65, 59, 80, 81, 56, 55, 70], ]; } /** * Data untuk donut chart di dashboard admin (komposisi buku). */ public static function getKomposisiBukuAdmin(): array { $allBooks = self::getAllBooks(); return [ 'tersedia' => $allBooks->where('status', 'Tersedia')->count(), 'dipinjam' => $allBooks->where('status', 'Dipinjam')->count(), ]; } /** * Data untuk tabel aktivitas terakhir di dashboard admin. */ public static function getAktivitasTerakhir(): array { return [ ['nama' => 'Silvi Rahmawati', 'judul_buku' => 'Perahu Kertas', 'tipe' => 'Peminjaman', 'waktu' => '5 menit yang lalu', 'status' => 'Dipinjam'], ['nama' => 'Andi Pratama', 'judul_buku' => 'The Last Spell Breather', 'tipe' => 'Pengembalian', 'waktu' => '1 jam yang lalu', 'status' => 'Dikembalikan'], ['nama' => 'Siti Nurhaliza', 'judul_buku' => 'Ayah', 'tipe' => 'Baca Online', 'waktu' => '3 jam yang lalu', 'status' => 'Selesai'], ['nama' => 'Rina Marlina', 'judul_buku' => 'Modul Ajar IPAS', 'tipe' => 'Peminjaman', 'waktu' => 'Kemarin', 'status' => 'Dipinjam'], ]; } /** * Data untuk halaman Dashboard Siswa dan Guru dengan warna spesifik. */ public static function getDashboardStats(): array { return [ ['label' => 'Buku yang dipinjam', 'value' => 3, 'icon' => 'bi-book-half', 'color' => 'primary'], ['label' => 'Tenggat Waktu', 'value' => '2', 'icon' => 'bi-clock-history', 'color' => 'danger'], ['label' => 'Buku dikembalikan', 'value' => 12, 'icon' => 'bi-check-circle', 'color' => 'success'], ['label' => 'History Baca', 'value' => 15, 'icon' => 'bi-hourglass-split', 'color' => 'warning'], ]; } /** * Data untuk pengumuman */ public static function getPengumuman(): array { $pengumuman = [ ['id' => 1, 'type' => 'warning', 'icon' => 'bi-exclamation-triangle-fill', 'title' => 'Perpustakaan Tutup', 'content' => 'Perpustakaan akan tutup pada tanggal 25 Desember untuk perayaan Natal.'], ['id' => 2, 'type' => 'info', 'icon' => 'bi-info-circle-fill', 'title' => 'Buku Baru Tersedia', 'content' => 'Edisi baru telah ditambahkan ke koleksi perpustakaan digital.'], ]; // Buat 30 data dummy tambahan dengan 'id' for ($i = 3; $i <= 32; $i++) { $pengumuman[] = ['id' => $i, 'type' => 'secondary', 'icon' => 'bi-megaphone-fill', 'title' => "Pengumuman Biasa #{$i}", 'content' => "Ini adalah isi dari pengumuman rutin nomor {$i}."]; } return $pengumuman; } /** * Data untuk pemberitahuan */ public static function getPemberitahuan(): array { $pemberitahuan = [ ['type' => 'danger', 'icon' => 'bi-exclamation-octagon', 'title' => 'Buku Akan Jatuh Tempo Besok', 'content' => 'Sejarah Indonesia Modern', 'badge' => 'Segera!'], ['type' => 'success', 'icon' => 'bi-check2-circle', 'title' => 'Peminjaman Berhasil', 'content' => 'Buku Kimia Dasar Berhasil Dipinjam', 'badge' => 'Baru'], ]; // Buat 20 data dummy tambahan for ($i = 1; $i <= 20; $i++) { $pemberitahuan[] = ['type' => 'info', 'icon' => 'bi-bell-fill', 'title' => "Notifikasi Sistem #{$i}", 'content' => "Pemberitahuan sistem terjadwal nomor {$i}.", 'badge' => 'Info']; } return $pemberitahuan; } /** * Data untuk progress membaca (donut chart) */ public static function getProgressMembaca(): array { return ['selesai' => 70, 'sisa' => 30]; } /** * Data untuk statistik bulanan (bar chart) */ public static function getStatistikBulanan(): array { return [ 'labels' => ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul'], 'data' => [10, 15, 8, 20, 18, 25, 22], ]; } /** * Master list untuk semua buku * @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', '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', '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', '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', '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', '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', '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', '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', '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], ] ]); } /** * Data untuk buku pinjam offline */ public static function getBukuPinjamOffline($user): array { return self::getAllBooks() ->where('tipe_akses', 'offline') ->filter(function ($buku) use ($user) { if (!isset($buku['user_id'])) return false; if (is_array($buku['user_id'])) { return in_array($user->id, $buku['user_id']); } return $buku['user_id'] == $user->id; }) ->map(fn($buku) => [ 'judul' => $buku['judul'], 'penulis' => $buku['penulis'], 'sisa_hari' => $buku['sisa_hari'], 'cover' => $buku['cover'], ]) ->values() ->all(); } /** * Data untuk baca buku online */ 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 (is_array($buku['user_id'])) { return in_array($user->id, $buku['user_id']); } return $buku['user_id'] == $user->id; }) ->map(fn($buku) => [ 'judul' => $buku['judul'], 'penulis' => $buku['penulis'], 'progress' => $buku['progress'], 'cover' => $buku['cover'], ]) ->values() ->all(); } /** * Mengambil daftar buku untuk katalog dengan filter. */ public static function getKatalogBuku(array $filters = []): \Illuminate\Support\Collection { $buku = self::getAllBooks(); $buku = $buku->when($filters['search'] ?? null, function ($query, $search) { return $query->filter(fn($item) => str_contains(strtolower($item['judul']), strtolower($search))); })->when($filters['kategori'] ?? null, function ($query, $kategori) { return $query->where('kategori', $kategori); })->when($filters['tahun'] ?? null, function ($query, $tahun) { return $query->where('tahun', $tahun); })->when($filters['penulis'] ?? null, function ($query, $penulis) { return $query->where('penulis', $penulis); }) ->when($filters['tipe_akses'] ?? null, function ($query, $tipe) { if ($tipe === 'offline') { return $query->filter(function ($buku) { return $buku['tipe_akses'] === 'offline' || (is_array($buku['tipe_akses']) && in_array('offline', $buku['tipe_akses'])); }); } if ($tipe === 'online') { return $query->filter(function ($buku) { return $buku['tipe_akses'] === 'online' || (is_array($buku['tipe_akses']) && in_array('online', $buku['tipe_akses'])); }); } return $query; }) ->sortByDesc('status'); return $buku; } /** * Method baru untuk mengambil daftar unik untuk dropdown filter */ public static function getFilterOptions(): array { $buku = self::getAllBooks(); return [ 'kategori' => $buku->pluck('kategori')->unique()->sort()->values(), 'tahun' => $buku->pluck('tahun')->unique()->sortDesc()->values(), 'penulis' => $buku->pluck('penulis')->unique()->sort()->values(), ]; } /** * Data untuk riwayat peminjaman offline. * Setiap item mewakili satu transaksi peminjaman. */ public static function getRiwayatOffline(): array { return [ [ 'id' => 1, 'id_peminjaman' => 'PIN-20240520-001', 'judul_utama' => 'Yuk, Mari Sekolah', 'tanggal_pinjam' => '20/05/2024', 'tanggal_kembali' => '27/05/2024', 'status' => 'Dikembalikan', 'books' => [ [ 'id' => 1, 'judul' => 'Yuk, Mari Sekolah', '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' => 2, 'id_peminjaman' => 'PIN-20240527-002', 'judul_utama' => 'Perahu Kertas & 1 lainnya', 'tanggal_pinjam' => '27/05/2024', 'tanggal_kembali' => '04/06/2024', 'status' => 'Dipinjam', 'books' => [ [ 'id' => 8, 'judul' => 'Perahu Kertas', 'cover' => 'images/covers/ayah.png', 'deskripsi' => 'Cerita penggambaran pasang surut hubungan dua anak manusia, yaitu Kugy dan Keenan.', 'kategori' => 'Fiksi', 'tahun' => 2022, 'keterangan' => null, ], [ 'id' => 7, 'judul' => 'The Last Spell Breather', 'cover' => 'images/covers/thelastspellbreather.jpg', 'deskripsi' => 'Sebuah petualangan fantasi di dunia sihir yang menakjubkan.', 'kategori' => 'Fantasi', 'tahun' => 2024, 'keterangan' => null, ] ] ], ]; } /** * Data untuk riwayat baca buku online. */ public static function getRiwayatOnline(): array { return [ [ 'id' => 1, 'id_baca' => 'BCO-20240527-002', 'judul_buku' => 'Ayah', 'tanggal_akses' => '27/05/2024', 'status' => 'Selesai', 'books' => [ [ 'id' => 9, 'judul' => 'Ayah', 'cover' => 'images/covers/ayah.png', 'deskripsi' => 'Novel yang mengisahkan perjuangan dan kasih sayang seorang ayah.', 'kategori' => 'Novel', 'tahun' => 2015, 'keterangan' => null ] ] ], ]; } /** * Data untuk notifikasi pengguna. * @param \App\Models\User $user Pengguna yang sedang login. * @return array Daftar notifikasi. */ public static function getNotifikasiForUser($user): array { $notifikasi = []; $bukuPinjaman = self::getBukuPinjamOffline($user); 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 ($bukuPinjaman as $buku) { if ($buku['sisa_hari'] <= 3) { $notifikasi[] = [ 'icon' => 'bi-exclamation-triangle', 'color' => 'danger', 'title' => 'Buku "' . $buku['judul'] . '" akan jatuh tempo!', 'time' => '1 jam yang lalu', 'read' => false, 'type' => 'riwayat_peminjaman', '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, ], ]; return array_merge($notifikasi, $notifikasiUmum); } }