User::where('role', 'customer')->count(), 'packages' => Paket::count(), 'rentals' => Sewa::whereIn('status', ['disetujui', 'selesai'])->count(), 'revenue' => Sewa::where('status', 'selesai')->sum('total_harga') ]; // Mengambil aktivitas terbaru $activities = $this->getRecentActivities(); // Mengambil pesanan yang dibatalkan terbaru (untuk notifikasi) $recentCancellations = Sewa::with(['user', 'paket']) ->where('status', 'dibatalkan') ->whereNotNull('detail_status') ->latest() ->take(5) ->get(); return view('admin.dashboard', compact('stats', 'activities', 'recentCancellations')); } private function getRecentActivities() { $activities = []; // Aktivitas sewa terbaru $recentRentals = Sewa::with(['user', 'paket']) ->whereIn('status', ['disetujui', 'selesai']) ->latest() ->take(5) ->get(); foreach ($recentRentals as $rental) { $activities[] = [ 'title' => 'Sewa Baru', 'description' => "{$rental->user->name} menyewa paket {$rental->paket->nama_paket}", 'time' => Carbon::parse($rental->created_at)->diffForHumans(), 'color' => 'blue', 'icon' => 'M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2' ]; } // Aktivitas pembayaran $recentPayments = Sewa::where('status', 'selesai') ->latest() ->take(5) ->get(); foreach ($recentPayments as $payment) { $activities[] = [ 'title' => 'Pembayaran Selesai', 'description' => "Pembayaran sewa paket {$payment->paket->nama_paket} oleh {$payment->user->name}", 'time' => Carbon::parse($payment->updated_at)->diffForHumans(), 'color' => 'green', 'icon' => 'M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z' ]; } // Aktivitas pembatalan $recentCancellations = Sewa::with(['user', 'paket']) ->where('status', 'dibatalkan') ->latest() ->take(3) ->get(); foreach ($recentCancellations as $cancellation) { $activities[] = [ 'title' => 'Pesanan Dibatalkan', 'description' => "{$cancellation->user->name} membatalkan pesanan paket {$cancellation->paket->nama_paket}", 'time' => Carbon::parse($cancellation->updated_at)->diffForHumans(), 'color' => 'red', 'icon' => 'M6 18L18 6M6 6l12 12' ]; } // Urutkan berdasarkan waktu terbaru usort($activities, function($a, $b) { return strtotime($b['time']) - strtotime($a['time']); }); return array_slice($activities, 0, 5); } /** * Menampilkan halaman daftar pesanan yang dibatalkan */ public function cancelledOrders() { if (Auth::user()->tipe_pengguna !== 'admin') { return redirect()->route('dashboard')->with('error', 'Akses ditolak.'); } $cancelledOrders = Sewa::with(['user', 'paket', 'kota']) ->where('status', 'dibatalkan') ->orderBy('updated_at', 'desc') ->paginate(15); return view('admin.cancelled-orders', compact('cancelledOrders')); } /** * Menampilkan detail pesanan yang dibatalkan */ public function showCancelledOrder($id) { if (Auth::user()->tipe_pengguna !== 'admin') { return redirect()->route('dashboard')->with('error', 'Akses ditolak.'); } $sewa = Sewa::with(['user', 'paket', 'kota'])->findOrFail($id); if ($sewa->status !== 'dibatalkan') { return redirect()->route('admin.cancelled-orders')->with('error', 'Pesanan ini tidak dibatalkan.'); } return view('admin.cancelled-order-detail', compact('sewa')); } /** * API untuk mendapatkan jumlah pesanan yang dibatalkan (untuk notifikasi) */ public function getCancelledOrdersCount() { if (Auth::user()->tipe_pengguna !== 'admin') { return response()->json(['error' => 'Unauthorized'], 403); } $count = Sewa::where('status', 'dibatalkan') ->whereNotNull('detail_status') ->where('updated_at', '>=', now()->subDays(7)) // Hanya 7 hari terakhir ->count(); return response()->json(['count' => $count]); } /** * API untuk mendapatkan notifikasi pembatalan terbaru */ public function getRecentCancellations() { if (Auth::user()->tipe_pengguna !== 'admin') { return response()->json(['error' => 'Unauthorized'], 403); } $recentCancellations = Sewa::with(['user', 'paket']) ->where('status', 'dibatalkan') ->whereNotNull('detail_status') ->where('updated_at', '>=', now()->subHours(24)) // Hanya 24 jam terakhir ->orderBy('updated_at', 'desc') ->take(5) ->get() ->map(function ($cancellation) { return [ 'id' => $cancellation->id, 'user_name' => $cancellation->user->name ?? 'N/A', 'paket_name' => $cancellation->paket->nama ?? 'N/A', 'alasan' => $cancellation->detail_status, 'cancelled_at' => $cancellation->updated_at->diffForHumans(), 'total_harga' => number_format($cancellation->total_harga, 0, ',', '.') ]; }); return response()->json(['cancellations' => $recentCancellations]); } }