orderBy('created_at', 'desc') ->get(); return view('admin.peminjaman', compact('transactions')); } public function downloadSuratPengantar($id) { $transaction = BorrowTransaction::findOrFail($id); if (!$transaction->surat_pengantar) { return back()->with('error', 'File surat pengantar tidak tersedia.'); } $filePath = 'public/surat_pengantar/' . $transaction->surat_pengantar; if (!Storage::exists($filePath)) { return back()->with('error', 'File surat pengantar tidak ditemukan.'); } return Storage::download($filePath, $transaction->surat_pengantar); } public function kembalikan($id) { $transaction = BorrowTransaction::findOrFail($id); if (!in_array($transaction->status, ['dipinjam', 'pengembalian_menunggu'])) { return redirect()->route('admin.peminjaman') ->with('error', 'Transaksi ini belum dipinjam atau sudah dikembalikan.'); } $transaction->markAsDikembalikan(); if ($transaction->anggota && $transaction->anggota->email) { try { Mail::to($transaction->anggota->email)->send(new BukuDikembalikanMail($transaction)); } catch (\Exception $e) { } } return redirect()->route('admin.peminjaman') ->with('success', 'Buku berhasil ditandai sebagai dikembalikan.'); } public function setujui(Request $request, $id) { $transaction = BorrowTransaction::findOrFail($id); if (!in_array($transaction->status, ['menunggu', 'pending'])) { return redirect()->back()->with('error', 'Transaksi ini sudah diproses.'); } $request->validate([ 'pickup_date' => 'required|date', 'pickup_time' => 'required|date_format:H:i', 'tanggal_kembali' => 'nullable|date|after_or_equal:pickup_date', ]); $tanggalKembali = $request->tanggal_kembali ? Carbon::parse($request->tanggal_kembali) : Carbon::parse($request->pickup_date)->addDays(7); $transaction->pickup_date = $request->pickup_date; $transaction->pickup_time = $request->pickup_time; $transaction->tanggal_kembali = $tanggalKembali; $transaction->status = 'disetujui'; $transaction->save(); if ($transaction->anggota && $transaction->anggota->email) { try { Mail::to($transaction->anggota->email) ->send(new BukuSiapDiambilMail($transaction)); } catch (\Exception $e) { } } return redirect()->route('admin.peminjaman') ->with('success', 'Peminjaman disetujui. Email pemberitahuan telah dikirim ke anggota.'); } public function ambilBuku($id) { $transaction = BorrowTransaction::findOrFail($id); if ($transaction->status !== 'disetujui') { return redirect()->route('admin.peminjaman') ->with('error', 'Buku belum disetujui atau sudah diambil.'); } $transaction->markAsDipinjam(); return redirect()->route('admin.peminjaman') ->with('success', 'Buku berhasil diambil. Status transaksi: Dipinjam.'); } public function tolak($id) { $transaction = BorrowTransaction::findOrFail($id); if (!in_array($transaction->status, ['menunggu', 'pending'])) { return redirect()->back()->with('error', 'Transaksi ini sudah diproses.'); } $transaction->markAsDitolak(); if ($transaction->anggota && $transaction->anggota->email) { try { Mail::to($transaction->anggota->email) ->send(new PeminjamanDitolakMail($transaction)); } catch (\Exception $e) { } } return redirect()->route('admin.peminjaman') ->with('success', 'Peminjaman ditolak dan email pemberitahuan dikirim.'); } public function setujuiPengembalian($id) { $transaction = BorrowTransaction::findOrFail($id); if ($transaction->status !== 'pengembalian_menunggu') { return back()->with('error', 'Transaksi ini tidak menunggu pengembalian.'); } $transaction->markAsDikembalikan(); if ($transaction->anggota && $transaction->anggota->email) { try { Mail::to($transaction->anggota->email)->send(new BukuDikembalikanMail($transaction)); } catch (\Exception $e) { } } return redirect()->route('admin.peminjaman') ->with('success', 'Pengembalian buku telah disetujui oleh admin.'); } public function store(Request $request) { $request->validate([ 'anggota_id' => 'required|exists:anggota,id', 'koleksi_id' => 'required|exists:koleksis,biblio_id', 'tanggal_pinjam' => 'required|date', 'surat_pengantar' => 'nullable|file|mimes:pdf|max:2048', ]); $data = $request->only('anggota_id', 'koleksi_id', 'tanggal_pinjam'); if ($request->hasFile('surat_pengantar')) { $file = $request->file('surat_pengantar'); $filename = time() . '_' . $file->getClientOriginalName(); $file->storeAs('public/surat_pengantar', $filename); $data['surat_pengantar'] = $filename; } $data['status'] = 'menunggu'; BorrowTransaction::create($data); return redirect()->route('admin.peminjaman') ->with('success', 'Transaksi peminjaman berhasil dibuat dan menunggu persetujuan.'); } public function setujuiPerpanjangan($id) { $transaction = BorrowTransaction::findOrFail($id); if ($transaction->status !== 'perpanjangan_menunggu') { return back()->with('error', 'Transaksi ini tidak menunggu perpanjangan.'); } $transaction->tanggal_kembali = Carbon::parse($transaction->tanggal_kembali)->addDays(7); $transaction->status = 'dipinjam'; $transaction->save(); if ($transaction->anggota && $transaction->anggota->email) { try { Mail::to($transaction->anggota->email) ->send(new PerpanjanganDisetujuiMail($transaction)); } catch (\Exception $e) { } } return back()->with('success', 'Perpanjangan disetujui dan email telah dikirim ke anggota.'); } public function tolakPerpanjangan($id) { $transaction = BorrowTransaction::findOrFail($id); if ($transaction->status !== 'perpanjangan_menunggu') { return back()->with('error', 'Transaksi ini tidak menunggu perpanjangan.'); } $transaction->status = 'dipinjam'; $transaction->save(); if ($transaction->anggota && $transaction->anggota->email) { try { Mail::to($transaction->anggota->email) ->send(new PerpanjanganDitolakMail($transaction)); } catch (\Exception $e) { } } return back()->with('success', 'Perpanjangan ditolak dan email pemberitahuan telah dikirim.'); } }