MIF_E31220480/app/Http/Controllers/TransaksiController.php

252 lines
9.0 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Transaksi;
use App\Models\Booking;
use App\Models\Finance;
use App\Models\Expense;
use Carbon\Carbon;
use App\Models\PerpanjanganBooking;
use Illuminate\Support\Facades\File;
class TransaksiController extends Controller
{
public function index(Request $request)
{
$query = Transaksi::with('booking.user', 'booking.room');
if ($request->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!');
}
}