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') -
Validasi Gagal
+