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()); } } }