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 @@
+ Pantau siswa terlambat dan berikan sanksi jika diperlukan. Tidak ada siswa yang terlambat hari ini.Manajemen Denda & Sanksi
+
+
+
+
+
+
+
+ @forelse ($siswaTelat as $item)
+ NO
+ SISWA & KELAS
+ BUKU TERLAMBAT
+ STATUS
+ DENDA
+ AKSI
+
+
+ @empty
+ {{ $loop->iteration }}
+
+
+
+
+
+ @foreach ($item['books'] as $buku)
+
+
+
+ Telat {{ $item['hari_terlambat'] }} Hari
+
+
+
+
+
+
+
+
+
+ @endforelse
+
+
+
+