diff --git a/app/Http/Controllers/AdminBukuController.php b/app/Http/Controllers/AdminBukuController.php index 147afdd..fa8aa99 100644 --- a/app/Http/Controllers/AdminBukuController.php +++ b/app/Http/Controllers/AdminBukuController.php @@ -27,7 +27,7 @@ public function store(Request $request) 'nomor_panggil' => 'required|string|max:50', 'eksemplar' => 'required|integer|min:1', 'id_kategori' => 'required|exists:kategori,id_kategori', - 'cover' => 'nullable|image|mimes:jpeg,png,jpg|max:2048' + 'cover' => 'image|mimes:jpeg,png,jpg,webp|max:2048', ]); if ($request->hasFile('cover')) { @@ -78,7 +78,7 @@ public function update(Request $request, $id) 'nomor_panggil' => 'required|string|max:50', 'eksemplar' => 'required|integer|min:1', 'id_kategori' => 'required|exists:kategori,id_kategori', - 'cover' => 'nullable|image|mimes:jpeg,png,jpg|max:2048' + 'cover' => 'image|mimes:jpeg,png,jpg,webp|max:2048' ]); if ($request->hasFile('cover')) { diff --git a/app/Http/Controllers/AdminPeminjamanController.php b/app/Http/Controllers/AdminPeminjamanController.php index 12af923..bb55361 100644 --- a/app/Http/Controllers/AdminPeminjamanController.php +++ b/app/Http/Controllers/AdminPeminjamanController.php @@ -305,4 +305,61 @@ public function kembalikan($id) return redirect()->back()->with('success', $pesan); } + + public function resendWa($id) + { + $peminjaman = Peminjaman::with(['buku', 'anggota'])->findOrFail($id); + + try { + $targetNum = $peminjaman->anggota->no_hp ?? ''; + $fonnteToken = env('FONNTE_TOKEN', 'vpzqxF2ZGgTGz9F5UbUS'); + + if (!empty($targetNum)) { + $targetNum = preg_replace('/^0/', '62', trim($targetNum)); + } + + if (!empty($targetNum) && !empty($fonnteToken)) { + $pesanStruk = "🏢 *PERPUSTAKAAN DAERAH JEMBER*\n"; + $pesanStruk .= "Jl. Mastrip No. 1, Kabupaten Jember\n"; + $pesanStruk .= "===============================\n\n"; + $pesanStruk .= "📄 *SALINAN BUKTI PEMINJAMAN*\n"; + $pesanStruk .= "No. Transaksi : PMJ-{$peminjaman->id_peminjaman}\n"; + $pesanStruk .= "Tanggal Cetak : " . \Carbon\Carbon::now()->format('d-m-Y H:i') . "\n\n"; + $pesanStruk .= "*DATA PEMINJAM*\n"; + $pesanStruk .= "Nama : {$peminjaman->anggota->nama}\n"; + $pesanStruk .= "No. HP : {$peminjaman->anggota->no_hp}\n\n"; + $pesanStruk .= "*DETAIL BUKU*\n"; + $pesanStruk .= "Judul : {$peminjaman->buku->judul}\n"; + $pesanStruk .= "Kode Panggil : {$peminjaman->buku->bibid}\n"; + $pesanStruk .= "Pinjam : " . \Carbon\Carbon::parse($peminjaman->tanggal_pinjam)->format('d F Y') . "\n"; + $pesanStruk .= "Kembali: *" . \Carbon\Carbon::parse($peminjaman->tanggal_kembali)->format('d F Y') . "*\n\n"; + $pesanStruk .= "===============================\n"; + $pesanStruk .= "⚠️ *Catatan:*\n"; + $pesanStruk .= "Tunjukkan Kode Panggil ke Admin saat pengembalian buku.\n"; + $pesanStruk .= "Harap kembalikan buku tepat waktu.\n"; + $pesanStruk .= "Denda keterlambatan: Rp 1.000/hari.\n\n"; + $pesanStruk .= "Terima kasih atas kunjungan Anda!\n"; + $pesanStruk .= "_Sistem Sarakata - TA 2026_"; + + $response = \Illuminate\Support\Facades\Http::withoutVerifying()->timeout(15)->withHeaders([ + 'Authorization' => $fonnteToken, + ])->post('https://api.fonnte.com/send', [ + 'target' => $targetNum, + 'message' => $pesanStruk, + ]); + + if ($response->successful() && ($response->json('status') == true)) { + return back()->with('success', 'Struk WhatsApp berhasil dikirim ulang ke nomor ' . $targetNum); + } else { + \Illuminate\Support\Facades\Log::warning("Fonnte Log: Gagal Terkirim Ulang", ['body' => $response->body()]); + return back()->with('error', 'Gagal mengirim ulang WA. API Fonnte menolak koneksi (Status: '.$response->status().').'); + } + } else { + return back()->with('error', 'Nomor HP anggota kosong atau Token Fonnte belum dikonfigurasi.'); + } + } catch (\Exception $e) { + \Illuminate\Support\Facades\Log::error("Error WA Pengiriman Ulang: " . $e->getMessage()); + return back()->with('error', 'Terjadi kesalahan sistem saat menghubungi server WhatsApp.'); + } + } } diff --git a/app/Http/Controllers/AnggotaController.php b/app/Http/Controllers/AnggotaController.php index 0eb16a4..0c94bdd 100644 --- a/app/Http/Controllers/AnggotaController.php +++ b/app/Http/Controllers/AnggotaController.php @@ -33,7 +33,7 @@ public function store(Request $request) 'nama' => 'required|string|max:255', 'jenis_anggota' => 'required|in:Mahasiswa,Siswa,Dosen,Umum', 'no_identitas' => 'required|unique:anggotas,no_identitas', - 'no_ktp' => 'required|numeric|digits_between:10,16', + 'no_ktp' => 'nullable|numeric|digits_between:1,16', 'prodi' => 'nullable|string|max:255', 'no_hp' => 'required|string|max:20', 'alamat' => 'required|string', @@ -60,7 +60,7 @@ public function update(Request $request, Anggota $member) 'nama' => 'required|string|max:255', 'jenis_anggota' => 'required|in:Mahasiswa,Siswa,Dosen,Umum', 'no_identitas' => 'required|unique:anggotas,no_identitas,' . $member->id, - 'no_ktp' => 'required|numeric|digits_between:10,16', + 'no_ktp' => 'nullable|numeric|digits_between:1,16', 'prodi' => 'nullable|string|max:255', 'no_hp' => 'required|string|max:20', 'alamat' => 'required|string', diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index de23726..13b704d 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,6 +2,7 @@ namespace App\Providers; +use Illuminate\Pagination\Paginator; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider @@ -19,7 +20,7 @@ public function register(): void */ public function boot(): void { - // + Paginator::useTailwind(); } - + } diff --git a/resources/views/admin/akun/index.blade.php b/resources/views/admin/akun/index.blade.php index 7303f18..7b4ecb4 100644 --- a/resources/views/admin/akun/index.blade.php +++ b/resources/views/admin/akun/index.blade.php @@ -3,7 +3,7 @@ @section('title', 'Manajemen Admin') @section('content') -
+
+ @if ($errors->any()) +
+

Validasi Gagal

+ +
+ @endif +
@csrf
- - + +
- - + +
- - + +
- - + +
diff --git a/resources/views/admin/peminjaman/index.blade.php b/resources/views/admin/peminjaman/index.blade.php index fcb7c7e..d2f7453 100644 --- a/resources/views/admin/peminjaman/index.blade.php +++ b/resources/views/admin/peminjaman/index.blade.php @@ -153,6 +153,14 @@ class="text-green-600 font-bold px-3 py-1.5 text-xs bg-green-50 rounded border b Cetak Struk + + @csrf + + @if ($item->status_peminjaman == 'Dipinjam')
@@ -98,7 +98,7 @@
- diff --git a/resources/views/anggota/edit.blade.php b/resources/views/anggota/edit.blade.php index 105b0d5..8490b77 100644 --- a/resources/views/anggota/edit.blade.php +++ b/resources/views/anggota/edit.blade.php @@ -25,7 +25,7 @@
- @foreach(['Mahasiswa', 'Siswa', 'Dosen', 'Umum'] as $jenis) @@ -70,7 +70,7 @@
- +
@@ -98,7 +98,7 @@
- @foreach(['Orang Tua', 'Saudara', 'Dosen Wali', 'Lainnya'] as $hub) diff --git a/resources/views/anggota/index.blade.php b/resources/views/anggota/index.blade.php index 1688489..416336c 100644 --- a/resources/views/anggota/index.blade.php +++ b/resources/views/anggota/index.blade.php @@ -164,7 +164,7 @@ class="inline-block px-4 pt-5 pb-4 overflow-hidden text-left align-bottom transi
- @@ -229,7 +229,7 @@ class="inline-block px-4 pt-5 pb-4 overflow-hidden text-left align-bottom transi
- diff --git a/resources/views/components/card.blade.php b/resources/views/components/card.blade.php index 6466283..b12f8c0 100644 --- a/resources/views/components/card.blade.php +++ b/resources/views/components/card.blade.php @@ -1,5 +1,5 @@ -
merge(['class' => 'bg-white overflow-hidden shadow-sm sm:rounded-lg']) }}> -
+
merge(['class' => 'bg-white overflow-hidden shadow-[0_8px_30px_rgb(0,0,0,0.04)] sm:rounded-2xl border border-gray-100']) }}> +
{{ $slot }}
diff --git a/resources/views/components/primary-button.blade.php b/resources/views/components/primary-button.blade.php index d71f0b6..2155bf0 100644 --- a/resources/views/components/primary-button.blade.php +++ b/resources/views/components/primary-button.blade.php @@ -1,3 +1,3 @@ - diff --git a/resources/views/components/text-input.blade.php b/resources/views/components/text-input.blade.php index da1b12d..6efb46e 100644 --- a/resources/views/components/text-input.blade.php +++ b/resources/views/components/text-input.blade.php @@ -1,3 +1,3 @@ @props(['disabled' => false]) -merge(['class' => 'border-gray-300 focus:border-indigo-500 focus:ring-indigo-500 rounded-md shadow-sm']) }}> +merge(['class' => 'border border-gray-200 bg-gray-50 text-gray-900 text-sm rounded-xl focus:ring-blue-500 focus:border-blue-500 block w-full p-3 shadow-sm hover:bg-white transition-all duration-200 outline-none']) }}> diff --git a/resources/views/layouts/admin.blade.php b/resources/views/layouts/admin.blade.php index de955e9..87366da 100644 --- a/resources/views/layouts/admin.blade.php +++ b/resources/views/layouts/admin.blade.php @@ -26,12 +26,17 @@ .gradient-text { background: linear-gradient(135deg, #4f46e5 0%, #7c3aed 50%, #2563eb 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } - + {{-- TOP HEADER --}}
-
+ + + +

SARAKATA

@@ -49,9 +54,12 @@
-
+
+ + + {{-- SIDEBAR --}} -