has('search') && !empty($request->search)) { $query->where('status_transaksi', 'like', '%' . $request->search . '%'); } $transaksi = $query->orderBy('tanggal_pembayaran', 'desc')->paginate(10); return view('admin.transaksi', compact('transaksi')); } public function create() { $bookings = Booking::all(); return view('admin.createtransaksi', compact('bookings')); } public function store(Request $request) { $request->validate([ 'id_booking' => 'required|exists:booking,id_booking', 'jumlah_pembayaran' => 'required|numeric|min:0', 'metode_pembayaran' => 'required|in:Transfer,E-Wallet,Tunai', 'status_transaksi' => 'required|in:Belum Lunas,Lunas,Refund', 'bukti_pembayaran' => 'nullable|image|mimes:jpeg,png,jpg|max:2048', 'tanggal_pembayaran' => 'required|date', ]); $filePath = null; if ($request->hasFile('bukti_pembayaran')) { $file = $request->file('bukti_pembayaran'); $filename = time() . '_' . $file->getClientOriginalName(); $file->move(public_path('assets/admin'), $filename); $filePath = 'assets/admin/' . $filename; } Transaksi::create([ 'id_booking' => $request->id_booking, 'jumlah_pembayaran' => $request->jumlah_pembayaran, 'metode_pembayaran' => $request->metode_pembayaran, 'status_transaksi' => $request->status_transaksi, 'bukti_pembayaran' => $filePath, 'tanggal_pembayaran' => $request->tanggal_pembayaran, ]); $this->updateFinance(); return redirect()->route('admin.transaksi')->with('success', 'Transaksi berhasil ditambahkan.'); } public function edit($id_transaksi) { $transaksi = Transaksi::findOrFail($id_transaksi); $bookings = Booking::all(); return view('admin.edittransaksi', compact('transaksi', 'bookings')); } public function update(Request $request, $id_transaksi) { $request->validate([ 'id_booking' => 'required|exists:booking,id_booking', 'jumlah_pembayaran' => 'required|numeric|min:0', 'metode_pembayaran' => 'required|in:Transfer,E-Wallet,Tunai', 'status_transaksi' => 'required|in:Belum Lunas,Lunas,Refund', 'bukti_pembayaran' => 'nullable|image|mimes:jpeg,png,jpg|max:2048', 'tanggal_pembayaran' => 'required|date', ]); $transaksi = Transaksi::findOrFail($id_transaksi); if ($request->hasFile('bukti_pembayaran')) { if ($transaksi->bukti_pembayaran && File::exists(public_path($transaksi->bukti_pembayaran))) { File::delete(public_path($transaksi->bukti_pembayaran)); } $file = $request->file('bukti_pembayaran'); $filename = time() . '_' . $file->getClientOriginalName(); $file->move(public_path('assets/admin'), $filename); $transaksi->bukti_pembayaran = 'assets/admin/' . $filename; } $transaksi->update([ 'id_booking' => $request->id_booking, 'jumlah_pembayaran' => $request->jumlah_pembayaran, 'metode_pembayaran' => $request->metode_pembayaran, 'status_transaksi' => $request->status_transaksi, 'tanggal_pembayaran' => $request->tanggal_pembayaran, ]); return redirect()->route('admin.transaksi')->with('success', 'Transaksi berhasil diperbarui.'); } public function destroy($id_transaksi) { $transaksi = Transaksi::findOrFail($id_transaksi); if ($transaksi->bukti_pembayaran && File::exists(public_path($transaksi->bukti_pembayaran))) { File::delete(public_path($transaksi->bukti_pembayaran)); } $transaksi->delete(); return redirect()->route('admin.transaksi')->with('success', 'Transaksi berhasil dihapus.'); } /** * Fungsi bantu untuk memperbarui data keuangan setelah transaksi disimpan. */ private function updateFinance() { $totalPemasukan = Transaksi::sum('jumlah_pembayaran'); $totalPengeluaran = Expense::sum('jumlah_pengeluaran'); $totalKeuntungan = $totalPemasukan - $totalPengeluaran; Finance::create([ 'tanggal' => now()->format('Y-m-d'), 'pemasukan' => $totalPemasukan, 'pengeluaran' => $totalPengeluaran, 'keuntungan' => $totalKeuntungan, 'keterangan' => 'Update otomatis dari transaksi baru' ]); } public function perpanjang(Request $request, $id_booking) { $booking = Booking::with('room')->findOrFail($id_booking); $request->validate([ 'tanggal_checkout_baru' => 'required|date|after:' . $booking->tanggal_checkout, 'metode_pembayaran' => 'required|string', 'bukti_pembayaran' => 'required|image|max:2048', ]); // Upload bukti pembayaran $file = $request->file('bukti_pembayaran'); $filename = time() . '_' . $file->getClientOriginalName(); $file->move(public_path('assets/users/'), $filename); // Hitung selisih bulan $oldDate = Carbon::parse($booking->tanggal_checkout); $newDate = Carbon::parse($request->tanggal_checkout_baru); $selisih_bulan = $oldDate->diffInMonths($newDate); // Hitung total biaya $harga_per_bulan = $booking->room->harga; $total = $selisih_bulan * $harga_per_bulan; // Simpan ke tabel transaksi (misalnya) Transaksi::create([ 'id_booking' => $id_booking, 'tanggal_transaksi' => now(), 'tanggal_checkout_lama' => $booking->tanggal_checkout, 'tanggal_checkout_baru' => $request->tanggal_checkout_baru, 'metode_pembayaran' => $request->metode_pembayaran, 'bukti_pembayaran' => 'assets/users/' . $filename, 'total_biaya' => $total, 'status_transaksi' => 'Lunas', ]); // Update status booking jadi pending (konfirmasi admin) $booking->update([ 'status_booking' => 'Pending' ]); return redirect('/petakos')->with('success', 'Permintaan perpanjangan berhasil diajukan.'); } // Fungsi untuk menampilkan form perpanjangan public function formPerpanjang($id_booking) { // Ambil data booking beserta relasi room dan user $booking = Booking::with(['room', 'user'])->findOrFail($id_booking); // Mengembalikan tampilan form perpanjangan sewa return view('users.perpanjangan-sewa', compact('booking')); } // Fungsi untuk memproses permintaan perpanjangan sewa public function prosesPerpanjang(Request $request, $id_booking) { $request->validate([ 'durasi_bulan' => 'required|integer|min:1', 'metode_pembayaran' => 'required', 'bukti_pembayaran' => 'required|image|max:2048', ]); $booking = Booking::with('room')->findOrFail($id_booking); // Hitung tanggal baru $tanggal_checkout_lama = $booking->tanggal_checkout; $tanggal_checkout_baru = Carbon::parse($tanggal_checkout_lama)->addMonths($request->durasi_bulan); // Hitung total biaya $harga_per_bulan = $booking->room->harga; $total_biaya = $request->durasi_bulan * $harga_per_bulan; // Upload bukti pembayaran ke public/assets/users/ $file = $request->file('bukti_pembayaran'); $filename = time() . '_' . $file->getClientOriginalName(); $file->move(public_path('assets/users/'), $filename); $buktiPath = 'assets/users/' . $filename; // Simpan data perpanjangan PerpanjanganBooking::create([ 'id_booking' => $booking->id_booking, 'tanggal_checkout_lama' => $tanggal_checkout_lama, 'tanggal_checkout_baru' => $tanggal_checkout_baru, 'durasi_bulan' => $request->durasi_bulan, 'metode_pembayaran' => $request->metode_pembayaran, 'bukti_pembayaran' => $buktiPath, 'total_biaya' => $total_biaya, 'tanggal_pengajuan' => now(), 'status' => 'Pending', ]); // Buat transaksi baru Transaksi::create([ 'id_booking' => $booking->id_booking, 'jumlah_pembayaran' => $total_biaya, 'metode_pembayaran' => $request->metode_pembayaran, 'status_transaksi' => 'Lunas', 'bukti_pembayaran' => $buktiPath, 'tanggal_pembayaran' => now(), ]); // Update data di tabel booking $booking->update([ 'tanggal_checkout' => $tanggal_checkout_baru, 'status_booking' => 'Pending', ]); return redirect()->route('users.peta')->with('success', 'Permintaan perpanjangan berhasil diajukan!'); } }