MIF_E31220412/app/Http/Controllers/RiwayatController.php

169 lines
5.7 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Sewa;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage;
class RiwayatController extends Controller
{
/**
* Menampilkan daftar riwayat pemesanan
*/
public function index()
{
// Ambil data sewa yang terkait dengan user yang sedang login dan bukan draft
$sewas = Sewa::with(['paket', 'kota'])
->where('user_id', Auth::id())
->where('status', '!=', 'draft')
->orderBy('created_at', 'desc')
->get();
return view('riwayat', compact('sewas'));
}
/**
* Menampilkan detail riwayat pemesanan
*/
public function show($id)
{
$sewa = Sewa::with(['paket', 'kota', 'user'])
->findOrFail($id);
// Pastikan yang melihat adalah pemilik pesanan
if ($sewa->user_id != Auth::id() && !Auth::user()->tipe_pengguna == 'admin') {
return redirect()->route('riwayat')
->with('error', 'Anda tidak memiliki akses untuk melihat pesanan ini.');
}
// Jika request adalah AJAX, kembalikan response JSON
if (request()->ajax()) {
return response()->json([
'id' => $sewa->id,
'tanggal_pembayaran' => $sewa->tanggal_pembayaran ? $sewa->tanggal_pembayaran->format('d/m/Y H:i') : null,
'status_pembayaran' => $sewa->nominal_pembayaran
? ($sewa->nominal_pembayaran >= $sewa->total_harga ? 'Lunas' : 'DP ' . number_format(($sewa->nominal_pembayaran / $sewa->total_harga) * 100, 0) . '%')
: 'Belum Bayar',
'lokasi' => $sewa->lokasi,
'kota' => $sewa->kota,
'ongkir' => $sewa->ongkir,
'bukti_pembayaran' => $sewa->bukti_pembayaran,
'jenis_jaminan' => $sewa->jenis_jaminan,
'foto_jaminan' => $sewa->foto_jaminan
]);
}
return view('detail-riwayat', compact('sewa'));
}
/**
* Membatalkan pemesanan
*/
public function cancel($id)
{
$sewa = Sewa::findOrFail($id);
// Pastikan yang membatalkan adalah pemilik pesanan
if ($sewa->user_id != Auth::id()) {
return redirect()->route('riwayat')
->with('error', 'Anda tidak memiliki akses untuk membatalkan pesanan ini.');
}
// Izinkan pembatalan untuk status yang belum selesai atau dibatalkan
if (in_array($sewa->status, ['completed', 'dibatalkan', 'ongoing'])) {
return redirect()->route('riwayat')
->with('error', 'Pesanan ini tidak dapat dibatalkan karena status sudah ' . $sewa->status);
}
// Tambahkan catatan jika pembatalan setelah disetujui
if ($sewa->status === 'confirmed') {
$sewa->catatan = ($sewa->catatan ? $sewa->catatan . "\n" : '') .
"[DIBATALKAN OLEH PENYEWA SETELAH DISETUJUI] - " . now();
}
$sewa->status = 'dibatalkan';
$sewa->save();
$message = 'Pesanan berhasil dibatalkan.';
if ($sewa->status === 'confirmed') {
$message .= ' Mohon hubungi admin untuk informasi biaya pembatalan.';
}
return redirect()->route('riwayat')
->with('success', $message);
}
/**
* Halaman untuk admin melihat semua riwayat pesanan
*/
public function adminIndex()
{
// Hanya admin yang bisa akses
if (!Auth::user()->tipe_pengguna == 'admin') {
return redirect()->route('dashboard');
}
$sewas = Sewa::with(['paket', 'user'])
->orderBy('created_at', 'desc')
->get();
return view('admin.riwayat', compact('sewas'));
}
/**
* Mengubah status pemesanan (khusus admin)
*/
public function updateStatus(Request $request, $id)
{
// Hanya admin yang bisa akses
if (!Auth::user()->tipe_pengguna == 'admin') {
return redirect()->route('dashboard');
}
$request->validate([
'status' => 'required|in:pending,confirmed,ongoing,completed,dibatalkan',
]);
$sewa = Sewa::findOrFail($id);
$sewa->status = $request->status;
$sewa->save();
return redirect()->route('admin.riwayat')
->with('success', 'Status pesanan berhasil diperbarui.');
}
/**
* Menghapus riwayat pemesanan
*/
public function hapus($id)
{
$sewa = Sewa::findOrFail($id);
// Pastikan yang menghapus adalah pemilik pesanan
if ($sewa->user_id != Auth::id()) {
return redirect()->route('riwayat')
->with('error', 'Anda tidak memiliki akses untuk menghapus pesanan ini.');
}
// Hanya bisa menghapus pesanan yang sudah selesai atau dibatalkan
if (!in_array($sewa->status, ['completed', 'dibatalkan'])) {
return redirect()->route('riwayat')
->with('error', 'Hanya pesanan yang sudah selesai atau dibatalkan yang dapat dihapus.');
}
// Hapus file bukti pembayaran dan jaminan jika ada
if ($sewa->bukti_pembayaran) {
Storage::disk('public')->delete($sewa->bukti_pembayaran);
}
if ($sewa->foto_jaminan) {
Storage::disk('public')->delete($sewa->foto_jaminan);
}
$sewa->delete();
return redirect()->route('riwayat')
->with('success', 'Riwayat pesanan berhasil dihapus.');
}
}