331 lines
12 KiB
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());
|
|
}
|
|
}
|
|
}
|