280 lines
10 KiB
PHP
280 lines
10 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Paket;
|
|
use App\Models\Sewa;
|
|
use App\Models\StockModel;
|
|
use App\Models\OngkirKota;
|
|
use App\Models\PaketOngkirKota;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\Storage;
|
|
use Carbon\Carbon;
|
|
|
|
class SewaController extends Controller
|
|
{
|
|
/**
|
|
* Menampilkan halaman sewa dengan paket yang tersedia
|
|
*/
|
|
public function index(Request $request)
|
|
{
|
|
// Mengambil paket yang aktif
|
|
$pakets = Paket::where('status', 'aktif')
|
|
->latest()
|
|
->get();
|
|
|
|
return view('sewa', compact('pakets'));
|
|
}
|
|
|
|
/**
|
|
* Menampilkan riwayat sewa
|
|
*/
|
|
public function riwayat(Request $request)
|
|
{
|
|
$query = Sewa::with(['user', 'paket']);
|
|
|
|
// Jika view=all dan user adalah admin, tampilkan semua data sewa
|
|
if ($request->view == 'all' && auth()->user()->tipe_pengguna === 'admin') {
|
|
$sewas = $query->orderBy('created_at', 'desc')->get();
|
|
return view('sewa.index', [
|
|
'sewas' => $sewas,
|
|
'showDetailPenyewa' => true
|
|
]);
|
|
}
|
|
|
|
// Jika user biasa, hanya tampilkan sewa miliknya
|
|
if (auth()->user()->tipe_pengguna !== 'admin') {
|
|
$query->where('user_id', auth()->id());
|
|
}
|
|
|
|
$sewas = $query->orderBy('created_at', 'desc')->get();
|
|
return view('sewa.index', [
|
|
'sewas' => $sewas,
|
|
'showDetailPenyewa' => false
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Menampilkan form pemesanan paket
|
|
*/
|
|
public function create($id)
|
|
{
|
|
$paket = Paket::with('ongkirKota')->findOrFail($id);
|
|
return view('sewa.create', compact('paket'));
|
|
}
|
|
|
|
/**
|
|
* Menyimpan data sewa baru
|
|
*/
|
|
public function store(Request $request)
|
|
{
|
|
$request->validate([
|
|
'paket_id' => 'required|exists:pakets,id',
|
|
'tanggal_mulai' => 'required|date',
|
|
'tanggal_selesai' => 'required|date|after_or_equal:tanggal_mulai',
|
|
'lokasi' => 'required|string',
|
|
'kota_id' => 'required|exists:paket_ongkir_kota,id',
|
|
'catatan' => 'nullable|string',
|
|
]);
|
|
|
|
try {
|
|
$paket = Paket::findOrFail($request->paket_id);
|
|
$kota = PaketOngkirKota::where('id', $request->kota_id)
|
|
->where('paket_id', $request->paket_id)
|
|
->firstOrFail();
|
|
|
|
// Hitung durasi sewa dalam hari
|
|
$tanggal_mulai = Carbon::parse($request->tanggal_mulai);
|
|
$tanggal_selesai = Carbon::parse($request->tanggal_selesai);
|
|
$durasi = $tanggal_mulai->diffInDays($tanggal_selesai) + 1;
|
|
|
|
// Ambil ongkir dari kota yang dipilih
|
|
$ongkir = $kota->biaya_ongkir;
|
|
|
|
// Hitung total harga
|
|
$total_harga = ($paket->harga * $durasi) + $ongkir;
|
|
|
|
$sewa = Sewa::create([
|
|
'user_id' => auth()->id(),
|
|
'paket_id' => $request->paket_id,
|
|
'kota_id' => $kota->id,
|
|
'ongkir' => $ongkir,
|
|
'tanggal_mulai' => $request->tanggal_mulai,
|
|
'tanggal_selesai' => $request->tanggal_selesai,
|
|
'lokasi' => $request->lokasi,
|
|
'catatan' => $request->catatan,
|
|
'total_harga' => $total_harga,
|
|
'status' => 'pending'
|
|
]);
|
|
|
|
return redirect()->route('sewa.show', $sewa->id)
|
|
->with('success', 'Silakan upload bukti pembayaran dan jaminan untuk melanjutkan proses penyewaan.');
|
|
} catch (\Exception $e) {
|
|
return back()->with('error', 'Terjadi kesalahan: ' . $e->getMessage());
|
|
}
|
|
}
|
|
|
|
public function show($id)
|
|
{
|
|
$sewa = Sewa::with(['paket', 'user', 'kota'])->findOrFail($id);
|
|
return view('sewa.show', compact('sewa'));
|
|
}
|
|
|
|
public function uploadBukti(Request $request, $id)
|
|
{
|
|
$request->validate([
|
|
'nominal_pembayaran' => 'required|numeric|min:0',
|
|
'bukti_pembayaran' => 'required|image|max:2048', // max 2MB
|
|
'jenis_jaminan' => 'required|in:ktp,sim',
|
|
'foto_jaminan' => 'required|image|max:2048', // max 2MB
|
|
]);
|
|
|
|
try {
|
|
$sewa = Sewa::findOrFail($id);
|
|
|
|
// Validasi nominal pembayaran
|
|
if ($request->nominal_pembayaran > $sewa->total_harga) {
|
|
return back()->with('error', 'Nominal pembayaran tidak boleh melebihi total harga sewa.');
|
|
}
|
|
|
|
// Pastikan yang mengupload adalah pemilik sewa
|
|
if ($sewa->user_id !== auth()->id()) {
|
|
return back()->with('error', 'Anda tidak memiliki akses untuk mengupload bukti pembayaran ini.');
|
|
}
|
|
|
|
// Pastikan status masih pending
|
|
if ($sewa->status !== 'pending') {
|
|
return back()->with('error', 'Status sewa tidak valid untuk upload bukti pembayaran.');
|
|
}
|
|
|
|
if ($request->hasFile('bukti_pembayaran') && $request->hasFile('foto_jaminan')) {
|
|
// Hapus file lama jika ada
|
|
if ($sewa->bukti_pembayaran) {
|
|
Storage::disk('public')->delete($sewa->bukti_pembayaran);
|
|
}
|
|
if ($sewa->foto_jaminan) {
|
|
Storage::disk('public')->delete($sewa->foto_jaminan);
|
|
}
|
|
|
|
// Simpan bukti pembayaran dengan nama unik
|
|
$pathBukti = $request->file('bukti_pembayaran')->store('bukti-pembayaran/' . date('Y/m'), 'public');
|
|
|
|
// Simpan foto jaminan dengan nama unik
|
|
$pathJaminan = $request->file('foto_jaminan')->store('jaminan/' . date('Y/m'), 'public');
|
|
|
|
// Update data sewa - status tetap pending menunggu verifikasi admin
|
|
$sewa->update([
|
|
'bukti_pembayaran' => $pathBukti,
|
|
'jenis_jaminan' => $request->jenis_jaminan,
|
|
'foto_jaminan' => $pathJaminan,
|
|
'nominal_pembayaran' => $request->nominal_pembayaran,
|
|
'tanggal_pembayaran' => now(),
|
|
'status' => 'pending' // Status tetap pending sampai admin verifikasi
|
|
]);
|
|
|
|
return redirect()->route('riwayat')
|
|
->with('success', 'Bukti pembayaran dan jaminan berhasil diupload. Mohon tunggu verifikasi dari admin.');
|
|
}
|
|
|
|
return back()->with('error', 'Terjadi kesalahan saat upload bukti pembayaran dan jaminan.');
|
|
} catch (\Exception $e) {
|
|
return back()->with('error', 'Terjadi kesalahan: ' . $e->getMessage());
|
|
}
|
|
}
|
|
|
|
public function uploadJaminan(Request $request, $id)
|
|
{
|
|
$request->validate([
|
|
'jenis_jaminan' => 'required|in:ktp,sim',
|
|
'foto_jaminan' => 'required|image|max:2048', // max 2MB
|
|
]);
|
|
|
|
$sewa = Sewa::findOrFail($id);
|
|
|
|
if ($request->hasFile('foto_jaminan')) {
|
|
// Hapus file jaminan lama jika ada
|
|
if ($sewa->foto_jaminan) {
|
|
Storage::disk('public')->delete($sewa->foto_jaminan);
|
|
}
|
|
|
|
// Simpan file jaminan baru
|
|
$path = $request->file('foto_jaminan')->store('jaminan', 'public');
|
|
|
|
// Update data sewa
|
|
$sewa->jenis_jaminan = $request->jenis_jaminan;
|
|
$sewa->foto_jaminan = $path;
|
|
$sewa->save();
|
|
|
|
return redirect()->route('sewa.show', $sewa->id)
|
|
->with('success', 'Jaminan berhasil diupload.');
|
|
}
|
|
|
|
return back()->with('error', 'Terjadi kesalahan saat upload jaminan.');
|
|
}
|
|
|
|
/**
|
|
* Membatalkan penyewaan
|
|
*/
|
|
public function batal($id)
|
|
{
|
|
$sewa = Sewa::findOrFail($id);
|
|
|
|
// Pastikan yang membatalkan adalah pemilik sewa
|
|
if ($sewa->user_id !== auth()->id()) {
|
|
return back()->with('error', 'Anda tidak memiliki akses untuk membatalkan penyewaan ini.');
|
|
}
|
|
|
|
// Cek status sewa
|
|
if (!in_array($sewa->status, ['pending', 'confirmed'])) {
|
|
return back()->with('error', 'Penyewaan tidak dapat dibatalkan karena status sudah ' . $sewa->status);
|
|
}
|
|
|
|
// Jika status sudah confirmed, tambahkan catatan pembatalan
|
|
if ($sewa->status === 'confirmed') {
|
|
$sewa->catatan = $sewa->catatan . "\n[DIBATALKAN OLEH PENYEWA SETELAH DISETUJUI] - " . now();
|
|
}
|
|
|
|
// Update status menjadi dibatalkan
|
|
$sewa->status = 'dibatalkan';
|
|
$sewa->save();
|
|
|
|
return redirect()->route('sewa.riwayat')
|
|
->with('success', 'Penyewaan berhasil dibatalkan.' .
|
|
($sewa->status === 'confirmed' ? ' Mohon hubungi admin untuk informasi biaya pembatalan.' : ''));
|
|
}
|
|
|
|
/**
|
|
* Mengambil detail sewa untuk ditampilkan di modal
|
|
*/
|
|
public function detail($id)
|
|
{
|
|
try {
|
|
$sewa = Sewa::with(['user', 'paket', 'kota'])
|
|
->findOrFail($id);
|
|
|
|
// Jika bukan admin, pastikan hanya bisa melihat sewa miliknya
|
|
if (auth()->user()->tipe_pengguna !== 'admin' && $sewa->user_id !== auth()->id()) {
|
|
return response()->json([
|
|
'error' => 'Unauthorized'
|
|
], 403);
|
|
}
|
|
|
|
// Format tanggal
|
|
$sewa->tanggal_mulai = Carbon::parse($sewa->tanggal_mulai)->format('d M Y');
|
|
$sewa->tanggal_selesai = Carbon::parse($sewa->tanggal_selesai)->format('d M Y');
|
|
|
|
// Format angka
|
|
$sewa->total_harga = number_format($sewa->total_harga, 0, ',', '.');
|
|
if ($sewa->nominal_pembayaran) {
|
|
$sewa->nominal_pembayaran = number_format($sewa->nominal_pembayaran, 0, ',', '.');
|
|
}
|
|
|
|
return response()->json($sewa);
|
|
} catch (\Exception $e) {
|
|
return response()->json([
|
|
'error' => 'Terjadi kesalahan: ' . $e->getMessage()
|
|
], 500);
|
|
}
|
|
}
|
|
}
|