whereNotNull('bukti_pembayaran') ->whereNotNull('foto_jaminan') ->with(['user', 'paket', 'kota']) ->latest() ->get(); return view('admin.verifikasi-pembayaran', compact('sewas')); } /** * Menyetujui pembayaran */ public function approve($id) { try { $sewa = Sewa::findOrFail($id); // Pastikan status masih pending if ($sewa->status !== 'pending') { return back()->with('error', 'Status sewa tidak valid untuk diverifikasi.'); } // Update status menjadi confirmed $sewa->update([ 'status' => 'confirmed' ]); return back()->with('success', 'Pembayaran berhasil diverifikasi dan disetujui.'); } catch (\Exception $e) { return back()->with('error', 'Terjadi kesalahan: ' . $e->getMessage()); } } /** * Menolak pembayaran */ public function reject(Request $request, $id) { try { $sewa = Sewa::findOrFail($id); // Pastikan status masih pending if ($sewa->status !== 'pending') { return back()->with('error', 'Status sewa tidak valid untuk ditolak.'); } // Validasi alasan penolakan $request->validate([ 'alasan_penolakan' => 'required|string|max:255', 'alasan_lainnya' => 'nullable|string|max:255' ]); // Ambil alasan penolakan $alasan = trim($request->alasan_penolakan); if ($alasan === 'Lainnya') { $alasanLainnya = trim($request->alasan_lainnya ?? ''); if (empty($alasanLainnya)) { return back()->with('error', 'Silakan isi alasan lainnya.'); } $alasan = $alasanLainnya; } // Pastikan alasan tidak kosong if (empty($alasan)) { return back()->with('error', 'Alasan penolakan tidak boleh kosong.'); } // Update status menjadi ditolak dan simpan alasan ke detail_status $sewa->update([ 'status' => 'ditolak', 'detail_status' => $alasan, 'catatan' => 'Pembayaran ditolak: ' . $alasan ]); return back()->with('success', 'Pembayaran telah ditolak.'); } catch (\Exception $e) { return back()->with('error', 'Terjadi kesalahan: ' . $e->getMessage()); } } /** * Mendapatkan daftar alasan penolakan */ public function getAlasanPenolakan() { return response()->json([ 'alasan_penolakan' => self::ALASAN_PENOLAKAN ]); } }