From 3fb658fe9cea9b71cb431e41e82588b39d4ae98b Mon Sep 17 00:00:00 2001 From: cukiprit Date: Mon, 9 Mar 2026 01:19:08 +0700 Subject: [PATCH] feat: Implement custom borrow/due dates for loans, update profile statistics, and refine book management forms. --- .../Admin/AdminPeminjamanController.php | 1 + app/Http/Controllers/DashboardController.php | 2 +- app/Http/Controllers/PeminjamanController.php | 19 ++++-- app/Http/Controllers/ProfileController.php | 10 ++-- app/Http/Requests/ProfileUpdateRequest.php | 2 +- resources/views/admin/buku/create.blade.php | 2 +- resources/views/admin/buku/edit.blade.php | 4 +- .../views/admin/peminjaman/index.blade.php | 7 ++- resources/views/peminjaman/form.blade.php | 15 ++--- resources/views/profile/index.blade.php | 58 +++++++++---------- routes/web.php | 1 + 11 files changed, 65 insertions(+), 56 deletions(-) diff --git a/app/Http/Controllers/Admin/AdminPeminjamanController.php b/app/Http/Controllers/Admin/AdminPeminjamanController.php index d55a783..084ade2 100644 --- a/app/Http/Controllers/Admin/AdminPeminjamanController.php +++ b/app/Http/Controllers/Admin/AdminPeminjamanController.php @@ -28,6 +28,7 @@ public function index(Request $request) 'id_peminjaman' => 'PIN-ADM-'.sprintf('%03d', $userId), 'user_id' => $userId, 'peminjam' => $user->nama_lengkap ?? 'Unknown', + 'email' => $user->email, 'nomor_hp' => $user->phone ?? '-', 'tanggal_pinjam' => $firstLoan->borrowed_at, 'tenggat_kembali' => $firstLoan->due_at, diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php index ef9da8e..564d8b2 100644 --- a/app/Http/Controllers/DashboardController.php +++ b/app/Http/Controllers/DashboardController.php @@ -24,7 +24,7 @@ public function index() $bukuPinjamOffline = $loans->map(function ($loan) { $dueAt = Carbon::parse($loan->due_at); - $sisaHari = (int) now()->diffInDays($dueAt, false); + $sisaHari = (int) now()->startOfDay()->diffInDays($dueAt->startOfDay(), false); return [ 'id' => $loan->book->id, diff --git a/app/Http/Controllers/PeminjamanController.php b/app/Http/Controllers/PeminjamanController.php index 4c88e24..c35a3f1 100644 --- a/app/Http/Controllers/PeminjamanController.php +++ b/app/Http/Controllers/PeminjamanController.php @@ -98,12 +98,23 @@ public function store(Request $request) { $request->validate([ 'buku_ids' => 'required|array|min:1|max:3', - 'buku_ids.*' => 'exists:books,id' + 'buku_ids.*' => 'exists:books,id', + 'tanggal_pinjam' => 'required', + 'tanggal_kembali' => 'required', ]); $bukuIds = $request->input('buku_ids'); + + // Parse dates from format "Y-m-d" (standard from flatpickr) + try { + $borrowedAt = Carbon::parse($request->tanggal_pinjam); + $dueAt = Carbon::parse($request->tanggal_kembali); + } catch (\Exception $e) { + $borrowedAt = now(); + $dueAt = now()->addDays(7); + } - DB::transaction(function () use ($bukuIds) { + DB::transaction(function () use ($bukuIds, $borrowedAt, $dueAt) { foreach ($bukuIds as $bukuId) { $book = Book::lockForUpdate()->find($bukuId); @@ -115,8 +126,8 @@ public function store(Request $request) 'user_id' => Auth::id(), 'book_id' => $bukuId, 'loan_code' => 'PIN-' . date('Ym') . '-' . strtoupper(Str::random(4)) . '-' . $bukuId, - 'borrowed_at' => now(), - 'due_at' => now()->addDays(7), + 'borrowed_at' => $borrowedAt, + 'due_at' => $dueAt, 'status' => 'Dipinjam', ]); diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php index 983123f..d2449c9 100644 --- a/app/Http/Controllers/ProfileController.php +++ b/app/Http/Controllers/ProfileController.php @@ -99,9 +99,9 @@ public function index(Request $request): \Illuminate\View\View|\Illuminate\Http\ ]); $viewData['statistik'] = [ - ['label' => 'Buku dipinjam', 'value' => $loans->count(), 'icon' => 'bi-book-half', 'color' => 'primary'], - ['label' => 'Tenggat Waktu', 'value' => $viewData['bukuOffline']->where('sisa_hari', '<=', 3)->where('sisa_hari', '>=', 0)->count(), 'icon' => 'bi-clock-history', 'color' => 'danger'], - ['label' => 'Buku dikembalikan', 'value' => Loan::where('user_id', $user->id)->where('status', 'Dikembalikan')->count(), 'icon' => 'bi-check-circle', 'color' => 'success'], + ['label' => 'Buku yang dipinjam', 'value' => $loans->count(), 'icon' => 'bi-journal-bookmark-fill', 'color' => 'primary'], + ['label' => 'Tenggat Waktu', 'value' => $viewData['bukuOffline']->where('sisa_hari', '<=', 3)->count(), 'icon' => 'bi-clock-fill', 'color' => 'danger'], + ['label' => 'Buku dikembalikan', 'value' => Loan::where('user_id', $user->id)->where('status', 'Dikembalikan')->count(), 'icon' => 'bi-check-circle-fill', 'color' => 'success'], ['label' => 'History Baca', 'value' => Loan::where('user_id', $user->id)->count(), 'icon' => 'bi-hourglass-split', 'color' => 'warning'], ]; @@ -142,11 +142,11 @@ public function edit(Request $request): View /** * Update data profil ke Database MySQL. */ - public function update(Request $request): RedirectResponse + public function update(ProfileUpdateRequest $request): RedirectResponse { $user = $request->user(); $user->fill($request->validated()); - $user->name = $user->nama_lengkap; // Sync for compatibility + $user->nama_lengkap = $user->name; // Sync for compatibility if ($user->isDirty('email')) { $user->email_verified_at = null; diff --git a/app/Http/Requests/ProfileUpdateRequest.php b/app/Http/Requests/ProfileUpdateRequest.php index f01b359..00b4838 100644 --- a/app/Http/Requests/ProfileUpdateRequest.php +++ b/app/Http/Requests/ProfileUpdateRequest.php @@ -16,7 +16,7 @@ class ProfileUpdateRequest extends FormRequest public function rules(): array { return [ - 'nama_lengkap' => ['required', 'string', 'max:255'], + 'name' => ['required', 'string', 'max:255'], 'email' => [ 'required', 'string', diff --git a/resources/views/admin/buku/create.blade.php b/resources/views/admin/buku/create.blade.php index 6d8dc71..390447e 100644 --- a/resources/views/admin/buku/create.blade.php +++ b/resources/views/admin/buku/create.blade.php @@ -54,7 +54,7 @@
+ value="1" min="0" required oninput="this.value = this.value.replace(/[^0-9]/g, '')">
diff --git a/resources/views/admin/buku/edit.blade.php b/resources/views/admin/buku/edit.blade.php index 408db3d..ab87fdb 100644 --- a/resources/views/admin/buku/edit.blade.php +++ b/resources/views/admin/buku/edit.blade.php @@ -51,8 +51,8 @@
- +
diff --git a/resources/views/admin/peminjaman/index.blade.php b/resources/views/admin/peminjaman/index.blade.php index f3f8451..a68e5d2 100644 --- a/resources/views/admin/peminjaman/index.blade.php +++ b/resources/views/admin/peminjaman/index.blade.php @@ -212,6 +212,7 @@ @@ -346,12 +347,15 @@ function hitungTotalDenda(modal) { }); const userId = modalEl.find('.btn-konfirmasi-kembali').data('user-id'); + const userEmail = modalEl.find('.btn-konfirmasi-kembali').data('email'); const totalDenda = dendaOverdueTotal + totalDendaRusak; // Construct WA Message let waLink = null; if (isWaChecked && hp && hp !== '-') { let phone = hp; + // Clean phone number from non-numeric characters + phone = phone.replace(/[^0-9]/g, ''); if (phone.startsWith('0')) phone = '62' + phone.substring(1); let message = `*BUKTI PENGEMBALIAN BUKU*\n\n`; @@ -371,10 +375,9 @@ function hitungTotalDenda(modal) { // Loading Kirim Email flow if (isEmailChecked) { - const dummyEmail = nama.replace(/\s+/g, '.').toLowerCase() + '@sekolah.sch.id'; modernSwal.fire({ title: 'Mengirim Email...', - html: `Mengirim nota ke: ${dummyEmail}`, + html: `Mengirim nota ke: ${userEmail}`, timer: 2000, timerProgressBar: true, didOpen: () => Swal.showLoading() diff --git a/resources/views/peminjaman/form.blade.php b/resources/views/peminjaman/form.blade.php index da30e6b..e747327 100644 --- a/resources/views/peminjaman/form.blade.php +++ b/resources/views/peminjaman/form.blade.php @@ -296,7 +296,7 @@ class="bi bi-check-circle me-1">Tersedia
PENTING: Aturan Peminjaman!

Sesuai peraturan perpustakaan, durasi peminjaman buku maksimal adalah - 2 HARI. + 7 HARI.
Mohon kembalikan tepat waktu untuk menghindari denda (Rp 1.000/hari).

@@ -320,20 +320,18 @@ class="bi bi-check-circle me-1">Tersedia