MIF_E31220412/app/Http/Controllers/RiwayatController.php

331 lines
12 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Sewa;
use App\Models\Setting;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\Log;
class RiwayatController extends Controller
{
public function index()
{
$sewas = Sewa::with(['paket', 'kota'])
->where('user_id', Auth::id())
->where('status', '!=', 'draft')
->orderBy('created_at', 'desc')
->get();
return view('riwayat', compact('sewas'));
}
/**
* Menampilkan riwayat untuk admin
*/
public function adminIndex()
{
if (Auth::user()->tipe_pengguna !== 'admin') {
return redirect()->route('dashboard')->with('error', 'Akses ditolak.');
}
$sewas = Sewa::with(['paket', 'kota', 'user'])
->where('status', '!=', 'draft')
->orderBy('created_at', 'desc')
->get();
return view('admin.riwayat', compact('sewas'));
}
public function updateStatus(Request $request, $id)
{
if (Auth::user()->tipe_pengguna !== 'admin') {
return redirect()->route('dashboard')->with('error', 'Akses ditolak.');
}
$request->validate([
'status' => 'required|in:selesai'
]);
$sewa = Sewa::findOrFail($id);
if ($sewa->status !== 'confirmed') {
return back()->with('error', 'Status hanya bisa diubah jika saat ini adalah confirmed.');
}
$sewa->status = $request->status;
$sewa->save();
return back()->with('success', 'Status berhasil diperbarui menjadi selesai. Stok paket telah diaktifkan kembali.');
}
public function hapus($id)
{
$sewa = Sewa::findOrFail($id);
if ($sewa->user_id != Auth::id()) {
return redirect()->route('riwayat')
->with('error', 'Anda tidak memiliki akses untuk menghapus pesanan ini.');
}
if (!in_array($sewa->status, ['selesai', 'dibatalkan'])) {
return redirect()->route('riwayat')
->with('error', 'Hanya pesanan yang sudah selesai atau dibatalkan yang dapat dihapus.');
}
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.');
}
/**
* Mengaktifkan stok paket dari halaman riwayat
*/
public function activateStock($id)
{
if (Auth::user()->tipe_pengguna !== 'admin') {
return redirect()->route('dashboard')->with('error', 'Akses ditolak.');
}
try {
$sewa = Sewa::with('paket')->findOrFail($id);
// Pastikan status sewa adalah confirmed atau ongoing
if (!in_array($sewa->status, ['confirmed', 'ongoing'])) {
return back()->with('error', 'Hanya sewa dengan status confirmed atau ongoing yang dapat diaktifkan.');
}
// Update status sewa menjadi selesai
$sewa->update(['status' => 'selesai']);
return back()->with('success', 'Stok paket berhasil diaktifkan kembali. Status sewa diubah menjadi selesai.');
} catch (\Exception $e) {
return back()->with('error', 'Terjadi kesalahan: ' . $e->getMessage());
}
}
public function show($id)
{
try {
$sewa = Sewa::with(['paket', 'kota'])->findOrFail($id);
// Pastikan hanya user yang berhak yang bisa akses
if ($sewa->user_id != Auth::id()) {
return response()->json(['error' => 'Unauthorized'], 403);
}
// Cek apakah tabel settings ada dan ambil nomor rekening dengan aman
$nomor_rekening = null;
try {
if (Schema::hasTable('settings')) {
$setting = Setting::where('key', 'nomor_rekening')->first();
$nomor_rekening = $setting ? $setting->value : null;
}
} catch (\Exception $e) {
// Jika ada error saat mengakses tabel settings, set null
$nomor_rekening = null;
}
return response()->json([
'tanggal_pembayaran' => $sewa->tanggal_pembayaran,
'status_pembayaran' => $sewa->status,
'detail_status' => $sewa->detail_status,
'lokasi' => $sewa->lokasi,
'kota' => $sewa->kota ?? null,
'ongkir' => $sewa->ongkir,
'bukti_pembayaran' => $sewa->bukti_pembayaran,
'foto_jaminan' => $sewa->foto_jaminan,
'jenis_jaminan' => $sewa->jenis_jaminan,
'nomor_rekening' => $nomor_rekening,
'paket' => $sewa->paket ?? null,
]);
} catch (\Exception $e) {
return response()->json([
'error' => 'Terjadi kesalahan: ' . $e->getMessage()
], 500);
}
}
/**
* Membatalkan pesanan
*/
public function cancel(Request $request, $id)
{
try {
$sewa = Sewa::findOrFail($id);
// Pastikan hanya user yang berhak yang bisa membatalkan
if ($sewa->user_id != Auth::id()) {
if ($request->ajax()) {
return response()->json([
'success' => false,
'message' => 'Anda tidak memiliki akses untuk membatalkan pesanan ini.'
], 403);
}
return redirect()->route('riwayat')
->with('error', 'Anda tidak memiliki akses untuk membatalkan pesanan ini.');
}
// Cek apakah status memungkinkan untuk dibatalkan
if (in_array($sewa->status, ['selesai', 'dibatalkan', 'ongoing'])) {
if ($request->ajax()) {
return response()->json([
'success' => false,
'message' => 'Pesanan dengan status ini tidak dapat dibatalkan.'
], 400);
}
return redirect()->route('riwayat')
->with('error', 'Pesanan dengan status ini tidak dapat dibatalkan.');
}
// Ambil alasan pembatalan dari request
$alasanPembatalan = $request->input('alasan_pembatalan', 'Tidak ada alasan yang diberikan');
// Update status menjadi dibatalkan dan simpan alasan
$sewa->status = 'dibatalkan';
$sewa->detail_status = $alasanPembatalan;
$sewa->save();
// Log aktivitas pembatalan untuk dashboard admin
Log::info('Pesanan dibatalkan dengan alasan', [
'sewa_id' => $sewa->id,
'user_id' => $sewa->user_id,
'user_name' => Auth::user()->name,
'paket_name' => $sewa->paket->nama ?? 'N/A',
'alasan_pembatalan' => $alasanPembatalan,
'cancelled_at' => now()
]);
if ($request->ajax()) {
return response()->json([
'success' => true,
'message' => 'Pesanan berhasil dibatalkan. Alasan pembatalan telah dikirim ke admin.',
'data' => [
'sewa_id' => $sewa->id,
'status' => $sewa->status,
'alasan' => $alasanPembatalan
]
]);
}
return redirect()->route('riwayat')
->with('success', 'Pesanan berhasil dibatalkan. Alasan pembatalan telah dikirim ke admin.');
} catch (\Exception $e) {
if ($request->ajax()) {
return response()->json([
'success' => false,
'message' => 'Terjadi kesalahan saat membatalkan pesanan: ' . $e->getMessage()
], 500);
}
return redirect()->route('riwayat')
->with('error', 'Terjadi kesalahan saat membatalkan pesanan: ' . $e->getMessage());
}
}
/**
* Menampilkan form pembatalan
*/
public function showCancelForm($id)
{
try {
$sewa = Sewa::with(['paket', 'kota'])->findOrFail($id);
// Pastikan hanya user yang berhak yang bisa akses
if ($sewa->user_id != Auth::id()) {
return redirect()->route('riwayat')
->with('error', 'Anda tidak memiliki akses untuk membatalkan pesanan ini.');
}
// Cek apakah status memungkinkan untuk dibatalkan
if (in_array($sewa->status, ['selesai', 'dibatalkan', 'ongoing'])) {
return redirect()->route('riwayat')
->with('error', 'Pesanan dengan status ini tidak dapat dibatalkan.');
}
return view('riwayat.cancel-form', compact('sewa'));
} catch (\Exception $e) {
return redirect()->route('riwayat')
->with('error', 'Terjadi kesalahan: ' . $e->getMessage());
}
}
/**
* Memproses pembatalan pesanan
*/
public function processCancel(Request $request, $id)
{
try {
$request->validate([
'alasan_pembatalan' => 'required|string|max:500'
]);
$sewa = Sewa::findOrFail($id);
// Pastikan hanya user yang berhak yang bisa membatalkan
if ($sewa->user_id != Auth::id()) {
return redirect()->route('riwayat')
->with('error', 'Anda tidak memiliki akses untuk membatalkan pesanan ini.');
}
// Cek apakah status memungkinkan untuk dibatalkan
if (in_array($sewa->status, ['selesai', 'dibatalkan', 'ongoing'])) {
return redirect()->route('riwayat')
->with('error', 'Pesanan dengan status ini tidak dapat dibatalkan.');
}
// Update status menjadi dibatalkan dan simpan alasan
$sewa->status = 'dibatalkan';
$sewa->detail_status = $request->alasan_pembatalan;
$sewa->save();
// Log aktivitas pembatalan untuk dashboard admin
Log::info('Pesanan dibatalkan dengan alasan', [
'sewa_id' => $sewa->id,
'user_id' => $sewa->user_id,
'user_name' => Auth::user()->name,
'paket_name' => $sewa->paket->nama ?? 'N/A',
'alasan_pembatalan' => $request->alasan_pembatalan,
'cancelled_at' => now()
]);
return redirect()->route('riwayat')
->with('success', 'Pesanan berhasil dibatalkan.');
} catch (\Exception $e) {
return redirect()->route('riwayat')
->with('error', 'Terjadi kesalahan saat membatalkan pesanan: ' . $e->getMessage());
}
}
/**
* Menampilkan form update pembayaran
*/
public function showUpdatePaymentForm($id)
{
if (Auth::user()->tipe_pengguna !== 'admin') {
return redirect()->route('dashboard')->with('error', 'Akses ditolak.');
}
try {
$sewa = Sewa::with(['paket', 'kota', 'user'])->findOrFail($id);
return view('admin.update-payment-form', compact('sewa'));
} catch (\Exception $e) {
return back()->with('error', 'Terjadi kesalahan: ' . $e->getMessage());
}
}
}