252 lines
9.0 KiB
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!');
|
|
}
|
|
|
|
} |