900 lines
34 KiB
PHP
900 lines
34 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use Carbon\Carbon;
|
|
|
|
class DummyDataService
|
|
{
|
|
/**
|
|
* Data dummy untuk daftar siswa dan pengguna.
|
|
*/
|
|
public static function getAllSiswa(): array
|
|
{
|
|
return [
|
|
[
|
|
'id' => 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' => '<p>Video animasi seru yang menjelaskan tentang planet-planet di tata surya kita...</p>',
|
|
],
|
|
[
|
|
'id' => 2,
|
|
'judul' => 'Macam-macam Zat dan Perubahannya - IPA Kelas 7',
|
|
'kategori' => 'IPA',
|
|
'youtube_link' => 'https://www.youtube.com/watch?v=CfwPsKdC5w8',
|
|
'deskripsi' => '<p>Zat (materi) adalah sesuatu yang menempati ruang dan mempunyai massa...</p>',
|
|
],
|
|
[
|
|
'id' => 3,
|
|
'judul' => 'Sejarah Kerajaan Majapahit, Kerajaan Terbesar di Nusantara',
|
|
'kategori' => 'IPS',
|
|
'youtube_link' => 'https://www.youtube.com/watch?v=2Z9hqVqPY_s',
|
|
'deskripsi' => '<p>Pelajari sejarah salah satu kerajaan terbesar di Indonesia...</p>',
|
|
],
|
|
[
|
|
'id' => 4,
|
|
'judul' => 'Belajar HTML dari NOL untuk Pemula',
|
|
'kategori' => 'Informatika',
|
|
'youtube_link' => 'https://www.youtube.com/watch?v=NBZ9Ro6UKV8',
|
|
'deskripsi' => '<p>Ingin belajar membuat website? Mulai dari sini!...</p>',
|
|
],
|
|
[
|
|
'id' => 5,
|
|
'judul' => 'Rumus Cepat Teorema Pythagoras',
|
|
'kategori' => 'Matematika',
|
|
'youtube_link' => 'https://youtu.be/JJaptwjRbxc?si=XRxkrAf5G76iJ5CG',
|
|
'deskripsi' => '<p>Jangan takut lagi dengan soal Pythagoras!...</p>',
|
|
],
|
|
[
|
|
'id' => 6,
|
|
'judul' => 'Cara Menggambar Perspektif 1 Titik Hilang',
|
|
'kategori' => 'Seni Budaya',
|
|
'youtube_link' => 'https://youtu.be/SS7dLGDWUSs?si=lVw8jBkaWT---7ch',
|
|
'deskripsi' => '<p>Buat gambarmu terlihat lebih hidup dan realistis!...</p>',
|
|
],
|
|
[
|
|
'id' => 7,
|
|
'judul' => 'Sistem Peredaran Darah pada Manusia',
|
|
'kategori' => 'IPA',
|
|
'youtube_link' => 'https://youtu.be/QLoqMruGbkc?si=KiP5VZ4ByKSdFJK9',
|
|
'deskripsi' => '<p>Pahami bagaimana jantung memompa darah ke seluruh tubuh...</p>',
|
|
],
|
|
[
|
|
'id' => 8,
|
|
'judul' => 'Unsur-Unsur Intrinsik Cerpen',
|
|
'kategori' => 'Bahasa Indonesia',
|
|
'youtube_link' => 'https://youtu.be/PQNuvyQZYvI?si=Lr9AeTO_k6vY21ei',
|
|
'deskripsi' => '<p>Analisis sebuah cerita pendek menjadi lebih mudah...</p>',
|
|
],
|
|
[
|
|
'id' => 9,
|
|
'judul' => 'Apa itu Pemanasan Global?',
|
|
'kategori' => 'IPS',
|
|
'youtube_link' => 'https://youtu.be/pVjXm340tbw?si=GeMhYK1FSOGtV86X',
|
|
'deskripsi' => '<p>Mengapa suhu bumi semakin panas? Pelajari tentang penyebabnya...</p>',
|
|
],
|
|
[
|
|
'id' => 10,
|
|
'judul' => 'APA ITU LUBANG HITAM?',
|
|
'kategori' => 'Sains',
|
|
'youtube_link' => 'https://youtu.be/Tx87wEaDtxo?si=fNORkTYOeLiH9_xh',
|
|
'deskripsi' => '<p>Jelajahi salah satu objek paling misterius di alam semesta...</p>',
|
|
],
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* 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',
|
|
'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],
|
|
]
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* 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',
|
|
'kode_buku' => '510',
|
|
'judul_utama' => 'Modul Ajar IPAS',
|
|
'tanggal_pinjam' => '20/05/2024',
|
|
'tanggal_kembali' => '27/05/2024',
|
|
'status' => 'Dikembalikan',
|
|
'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' => 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,
|
|
],
|
|
]
|
|
],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* 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);
|
|
}
|
|
}
|