From 78df5b3a72b76e22240a2d4c4230e7b6d3af4885 Mon Sep 17 00:00:00 2001 From: cukiprit Date: Tue, 14 Apr 2026 00:19:26 +0700 Subject: [PATCH] refactor: update book stock management, refine validation constraints, and adjust dashboard statistics and UI components. --- .../Controllers/Admin/AdminPeminjamanController.php | 5 +++-- .../Controllers/Admin/AdminRekomendasiController.php | 4 ++-- app/Http/Controllers/Admin/BookController.php | 4 ++++ app/Http/Controllers/Admin/DashboardController.php | 2 +- app/Http/Controllers/Admin/PengumumanController.php | 4 ++-- app/Http/Controllers/DashboardController.php | 2 +- app/Http/Controllers/PeminjamanController.php | 10 +++++++--- app/Http/Requests/ProfileUpdateRequest.php | 2 +- resources/views/admin/pengumuman/create.blade.php | 2 +- resources/views/admin/pengumuman/edit.blade.php | 2 +- resources/views/admin/rekomendasi/create.blade.php | 2 +- resources/views/admin/rekomendasi/edit.blade.php | 2 +- resources/views/katalog/index.blade.php | 2 +- .../update-profile-information-form.blade.php | 4 ++-- resources/views/riwayat/online.blade.php | 11 +++++------ 15 files changed, 33 insertions(+), 25 deletions(-) diff --git a/app/Http/Controllers/Admin/AdminPeminjamanController.php b/app/Http/Controllers/Admin/AdminPeminjamanController.php index ce0188e..8a5169f 100644 --- a/app/Http/Controllers/Admin/AdminPeminjamanController.php +++ b/app/Http/Controllers/Admin/AdminPeminjamanController.php @@ -126,9 +126,10 @@ public function store(Request $request) ]); // Update book status and decrement stock + $newStok = $book->stok - 1; $book->update([ - 'status' => 'Dipinjam', - 'stok' => $book->stok - 1, + 'status' => $newStok <= 0 ? 'Dipinjam' : 'Tersedia', + 'stok' => $newStok, ]); } diff --git a/app/Http/Controllers/Admin/AdminRekomendasiController.php b/app/Http/Controllers/Admin/AdminRekomendasiController.php index 34f974f..8fcde8d 100644 --- a/app/Http/Controllers/Admin/AdminRekomendasiController.php +++ b/app/Http/Controllers/Admin/AdminRekomendasiController.php @@ -61,7 +61,7 @@ public function store(Request $request) 'judul' => 'required|string|min:3|max:50', 'kategori' => 'required|string|min:3|max:50', 'youtube_link' => 'required|url', - 'deskripsi' => 'required|string', + 'deskripsi' => 'required|string|max:255', ]); $validated['user_id'] = auth()->id(); @@ -78,7 +78,7 @@ public function update(Request $request, $id) 'judul' => 'required|string|min:3|max:50', 'kategori' => 'required|string|min:3|max:50', 'youtube_link' => 'required|url', - 'deskripsi' => 'required|string', + 'deskripsi' => 'required|string|max:255', ]); $rekomendasi->update($validated); diff --git a/app/Http/Controllers/Admin/BookController.php b/app/Http/Controllers/Admin/BookController.php index e2f0cc6..7480885 100644 --- a/app/Http/Controllers/Admin/BookController.php +++ b/app/Http/Controllers/Admin/BookController.php @@ -101,6 +101,8 @@ public function store(Request $request) $validated['file_pdf'] = basename($path); } + $validated['status'] = $validated['stok'] <= 0 ? 'Dipinjam' : 'Tersedia'; + Book::create($validated); return redirect()->route('admin.buku.index')->with('success', 'Buku berhasil ditambahkan.'); @@ -132,6 +134,8 @@ public function update(Request $request, $id) $validated['file_pdf'] = basename($path); } + $validated['status'] = $validated['stok'] <= 0 ? 'Dipinjam' : 'Tersedia'; + $buku->update($validated); return redirect()->route('admin.buku.index')->with('success', 'Buku berhasil diperbarui.'); diff --git a/app/Http/Controllers/Admin/DashboardController.php b/app/Http/Controllers/Admin/DashboardController.php index ae77115..263bb8e 100644 --- a/app/Http/Controllers/Admin/DashboardController.php +++ b/app/Http/Controllers/Admin/DashboardController.php @@ -22,7 +22,7 @@ public function index() ['label' => 'Total Buku', 'value' => $allBooks, 'icon' => 'bi-journal-bookmark-fill', 'color' => 'primary'], ['label' => 'Total Anggota', 'value' => $allUsers, 'icon' => 'bi-people-fill', 'color' => 'success'], ['label' => 'Buku Dipinjam', 'value' => $bukuDipinjam, 'icon' => 'bi-arrow-up-right-circle-fill', 'color' => 'warning'], - ['label' => 'Total Denda', 'value' => 'Rp ' . number_format(Loan::where('status', 'Terlambat')->sum('fine_overdue'), 0, ',', '.'), 'icon' => 'bi-cash-coin', 'color' => 'danger'], + ['label' => 'Total Denda', 'value' => 'Rp ' . number_format(Loan::sum('fine_overdue') + Loan::sum('fine_damage'), 0, ',', '.'), 'icon' => 'bi-cash-coin', 'color' => 'danger'], ]; // Monthly stats (last 7 months) diff --git a/app/Http/Controllers/Admin/PengumumanController.php b/app/Http/Controllers/Admin/PengumumanController.php index ff24540..bbc3b2a 100644 --- a/app/Http/Controllers/Admin/PengumumanController.php +++ b/app/Http/Controllers/Admin/PengumumanController.php @@ -47,7 +47,7 @@ public function store(Request $request) { $validated = $request->validate([ 'title' => 'required|string|min:3|max:50', - 'content' => 'required|string', + 'content' => 'required|string|max:255', 'type' => 'required|in:info,warning,success,danger', 'icon' => 'nullable|string|max:50', ]); @@ -69,7 +69,7 @@ public function update(Request $request, $id) $validated = $request->validate([ 'title' => 'required|string|min:3|max:50', - 'content' => 'required|string', + 'content' => 'required|string|max:255', 'type' => 'required|in:info,warning,success,danger', 'icon' => 'nullable|string|max:50', ]); diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php index 564d8b2..adbe98c 100644 --- a/app/Http/Controllers/DashboardController.php +++ b/app/Http/Controllers/DashboardController.php @@ -45,7 +45,7 @@ public function index() // Stats calculation $stats = [ ['label' => 'Buku yang dipinjam', 'value' => $loans->count(), 'icon' => 'bi-book-half', 'color' => 'primary'], - ['label' => 'Tenggat Waktu', 'value' => $bukuPinjamOffline->where('sisa_hari', '<=', 3)->where('sisa_hari', '>=', 0)->count(), 'icon' => 'bi-clock-history', 'color' => 'danger'], + ['label' => 'Tenggat Waktu', 'value' => $bukuPinjamOffline->where('sisa_hari', '<=', 2)->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' => 'History Baca', 'value' => Loan::where('user_id', $user->id)->count(), 'icon' => 'bi-hourglass-split', 'color' => 'warning'], ]; diff --git a/app/Http/Controllers/PeminjamanController.php b/app/Http/Controllers/PeminjamanController.php index d6fafff..b3d9905 100644 --- a/app/Http/Controllers/PeminjamanController.php +++ b/app/Http/Controllers/PeminjamanController.php @@ -88,7 +88,7 @@ public function form($id) $buku = Book::with('category')->findOrFail($id); $semuaBuku = Book::whereJsonContains('tipe_akses', 'offline') - ->where('status', 'Tersedia') + ->where('stok', '>', 0) ->get(); return view('peminjaman.form', compact('user', 'buku', 'semuaBuku')); @@ -113,7 +113,7 @@ public function store(Request $request) foreach ($bukuIds as $bukuId) { $book = Book::lockForUpdate()->find($bukuId); - if ($book->status !== 'Tersedia') { + if ($book->stok <= 0) { throw new \Exception("Buku '{$book->judul}' sudah tidak tersedia."); } @@ -126,7 +126,11 @@ public function store(Request $request) 'status' => 'Dipinjam', ]); - $book->update(['status' => 'Dipinjam']); + $newStok = $book->stok - 1; + $book->update([ + 'stok' => $newStok, + 'status' => $newStok <= 0 ? 'Dipinjam' : 'Tersedia' + ]); } }); diff --git a/app/Http/Requests/ProfileUpdateRequest.php b/app/Http/Requests/ProfileUpdateRequest.php index b6bda61..7ca9986 100644 --- a/app/Http/Requests/ProfileUpdateRequest.php +++ b/app/Http/Requests/ProfileUpdateRequest.php @@ -25,7 +25,7 @@ public function rules(): array 'max:255', Rule::unique(User::class)->ignore($this->user()->id), ], - 'phone' => ['required', 'numeric', 'digits_between:13,15'], + 'phone' => ['required', 'string', 'min:13', 'max:16'], ]; } } diff --git a/resources/views/admin/pengumuman/create.blade.php b/resources/views/admin/pengumuman/create.blade.php index 208a0dc..0d8207c 100644 --- a/resources/views/admin/pengumuman/create.blade.php +++ b/resources/views/admin/pengumuman/create.blade.php @@ -37,7 +37,7 @@
- + @error('content')
{{ $message }}
@enderror diff --git a/resources/views/admin/pengumuman/edit.blade.php b/resources/views/admin/pengumuman/edit.blade.php index ad454b8..d11844e 100644 --- a/resources/views/admin/pengumuman/edit.blade.php +++ b/resources/views/admin/pengumuman/edit.blade.php @@ -38,7 +38,7 @@
- + @error('content')
{{ $message }}
@enderror diff --git a/resources/views/admin/rekomendasi/create.blade.php b/resources/views/admin/rekomendasi/create.blade.php index d6750b1..74df1b0 100644 --- a/resources/views/admin/rekomendasi/create.blade.php +++ b/resources/views/admin/rekomendasi/create.blade.php @@ -40,7 +40,7 @@
- + @error('deskripsi')
{{ $message }}
@enderror diff --git a/resources/views/admin/rekomendasi/edit.blade.php b/resources/views/admin/rekomendasi/edit.blade.php index bf3f860..ab169c6 100644 --- a/resources/views/admin/rekomendasi/edit.blade.php +++ b/resources/views/admin/rekomendasi/edit.blade.php @@ -41,7 +41,7 @@
- + @error('deskripsi')
{{ $message }}
@enderror diff --git a/resources/views/katalog/index.blade.php b/resources/views/katalog/index.blade.php index 842fbfa..9d770fc 100644 --- a/resources/views/katalog/index.blade.php +++ b/resources/views/katalog/index.blade.php @@ -76,7 +76,7 @@ class="badge fw-normal {{ $buku['status'] == 'Tersedia' ? 'bg-success-subtle tex $isOnlineAccess = $buku['tipe_akses'] === 'online' || (is_array($buku['tipe_akses']) && in_array('online', $buku['tipe_akses'])); - $stokHabis = $buku['status'] == 'Dipinjam'; + $stokHabis = $buku['stok'] <= 0; @endphp {{-- TOMBOL PINJAM (OFFLINE) --}} diff --git a/resources/views/profile/partials/update-profile-information-form.blade.php b/resources/views/profile/partials/update-profile-information-form.blade.php index 0c8bc00..9a894ac 100644 --- a/resources/views/profile/partials/update-profile-information-form.blade.php +++ b/resources/views/profile/partials/update-profile-information-form.blade.php @@ -59,8 +59,8 @@ class="form-control @error('email') is-invalid @enderror" value="{{ old('email',
+ value="{{ old('phone', $user->phone) }}" + maxlength="16" pattern="\+?[0-9]+" oninput="this.value = this.value.replace(/[^0-9+]/g, '')"> @error('phone')
{{ $message }}
@enderror diff --git a/resources/views/riwayat/online.blade.php b/resources/views/riwayat/online.blade.php index 6f1efab..cf2b661 100644 --- a/resources/views/riwayat/online.blade.php +++ b/resources/views/riwayat/online.blade.php @@ -19,7 +19,7 @@ @php $counter = 1; @endphp - @forelse ($riwayatOnline as $transaksi) + @foreach ($riwayatOnline as $transaksi) @foreach ($transaksi['books'] as $buku) {{ $counter++ }} @@ -38,11 +38,7 @@ @endforeach - @empty - - Tidak ada riwayat baca buku online. - - @endforelse + @endforeach
@@ -82,6 +78,9 @@ class="bi bi-book-half me-2 text-primary">Detail Riwayat searching: false, pageLength: 10, order: [[0, 'asc']], + language: { + emptyTable: "Tidak ada riwayat baca buku online." + }, columnDefs: [ { responsivePriority: 1, targets: 2 }, { responsivePriority: 2, targets: 5 }