MIF_E31220412/app/Http/Controllers/SewaController.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);
}
}
}