check()) { return redirect()->route('dashboard'); } if (auth()->check()) { return redirect()->route('user.dashboard'); } $featuredCars = Category::where('status', 'available') ->orderBy('created_at', 'desc') ->take(3) ->get(); $availableCount = Category::where('status', 'available')->count(); return view('welcome', compact('featuredCars', 'availableCount')); }); Route::get('/mobil-bekas', [CategoryController::class, 'userIndex'])->name('mobil-bekas'); Route::get('/dashboard-user', [CategoryController::class, 'userIndex'])->middleware('auth')->name('user.dashboard'); Route::get('/semua-mobil-bekas', [CategoryController::class, 'allCars'])->name('semua-mobil-bekas'); Route::get('/rekomendasi-budget', [CategoryController::class, 'budgetCars'])->name('rekomendasi-budget'); Route::get('/csrf-token', fn () => response()->json(['token' => csrf_token()]))->name('csrf.token'); Route::get('/mobil-bekas/{category}', [CategoryController::class, 'show'])->name('mobil-bekas.detail'); Route::middleware('auth')->group(function () { Route::post('/mobil-bekas/{category}/bayar', [TransactionController::class, 'beginPayment'])->name('transactions.begin'); Route::get('/pembayaran/{transaction}', [TransactionController::class, 'showPayment'])->name('transactions.payment'); Route::post('/pembayaran/{transaction}', [TransactionController::class, 'uploadProof'])->name('transactions.upload'); }); Route::get('/profil', function () { if (!auth()->check()) { return redirect()->route('login'); } return view('user.profile'); })->name('user.profile'); // Favorite routes (protected for logged-in users) Route::post('/favorites/{category}', [CategoryController::class, 'addToFavorites'])->name('favorites.add')->middleware('auth'); Route::delete('/favorites/{category}', [CategoryController::class, 'removeFromFavorites'])->name('favorites.remove')->middleware('auth'); // Support default Laravel /home link Route::redirect('/home', '/dashboard'); // ── Auth Routes ────────────────────────────────────────────── Route::middleware('guest:admin')->group(function () { Route::get('/login', [AuthController::class, 'showLogin'])->name('login'); Route::post('/login', [AuthController::class, 'login']); Route::get('/register', [AuthController::class, 'showRegister'])->name('register'); Route::post('/register', [AuthController::class, 'register']); Route::get('/forgot-password', [AuthController::class, 'showForgotPassword'])->name('password.request'); Route::post('/forgot-password', [AuthController::class, 'sendResetPasswordLink'])->name('password.email'); Route::get('/reset-password/{token}', [AuthController::class, 'showResetPassword'])->name('password.reset'); Route::post('/reset-password', [AuthController::class, 'resetPassword'])->name('password.update'); }); Route::post('/logout', [AuthController::class, 'logout'])->name('logout'); Route::get('/logout', function () { return redirect()->route('login'); }); Route::post('/whatsapp/admin-notify/{category}', [ChatController::class, 'notifyAdminWithCarImage'])->name('whatsapp.admin.notify'); Route::get('/whatsapp/contact-admin/{category?}', [ChatController::class, 'redirectAdminWhatsApp'])->name('whatsapp.contact'); // ── Protected Routes ───────────────────────────────────────── Route::middleware('auth:admin')->group(function () { Route::get('/dashboard', function () { Category::releaseExpiredReservations(); $users = User::all(); $categories = Category::orderBy('created_at', 'desc')->get(); $transactions = Transaction::with('category')->latest()->get(); return view('admin.dashboard', compact('users', 'categories', 'transactions')); })->name('dashboard'); Route::get('/kategori', [CategoryController::class, 'index'])->name('kategori'); Route::post('/kategori', [CategoryController::class, 'store'])->name('kategori.store'); Route::get('/kategori/{category}/edit', [CategoryController::class, 'edit'])->name('kategori.edit'); Route::patch('/kategori/{category}', [CategoryController::class, 'update'])->name('kategori.update'); Route::delete('/kategori/{category}', [CategoryController::class, 'destroy'])->name('kategori.destroy'); Route::get('/riwayat', [TransactionController::class, 'index'])->name('riwayat'); Route::patch('/riwayat/{transaction}/konfirmasi', [TransactionController::class, 'confirmPayment'])->name('transactions.confirm'); Route::get('/input', [TransactionController::class, 'create'])->name('input'); Route::post('/input', [TransactionController::class, 'store'])->name('input.store'); Route::get('/laporan', function (\Illuminate\Http\Request $request) { Category::releaseExpiredReservations(); $startDate = $request->query('start_date', now()->startOfMonth()->toDateString()); $endDate = $request->query('end_date', now()->toDateString()); $transactions = Transaction::with('category') ->whereDate('created_at', '>=', $startDate) ->whereDate('created_at', '<=', $endDate) ->latest() ->get(); $paidTransactions = $transactions->where('payment_status', 'paid'); $summary = [ 'total_transactions' => $transactions->count(), 'paid_transactions' => $paidTransactions->count(), 'pending_transactions' => $transactions->where('payment_status', 'pending')->count(), 'cancelled_transactions' => $transactions->where('payment_status', 'cancelled')->count(), 'total_sales' => $paidTransactions->sum('total_amount'), 'average_sales' => $paidTransactions->count() ? $paidTransactions->avg('total_amount') : 0, 'available_cars' => Category::where('status', 'available')->count(), 'sold_cars' => Category::where('status', 'sold')->count(), ]; $dailySales = $paidTransactions ->groupBy(fn ($transaction) => $transaction->created_at->format('Y-m-d')) ->map(fn ($items) => $items->sum('total_amount')); $chartData = [ 'daily_sales' => $dailySales, 'max_daily_sales' => max((float) $dailySales->max(), 1), 'payment_status' => collect([ 'Lunas' => $summary['paid_transactions'], 'Pending' => $summary['pending_transactions'], 'Dibatalkan' => $summary['cancelled_transactions'], ]), 'payment_method' => collect([ 'Tunai' => $transactions->where('payment_method', 'cash')->count(), 'Transfer Bank' => $transactions->where('payment_method', 'transfer')->count(), ]), 'car_status' => collect([ 'Tersedia' => $summary['available_cars'], 'Terjual' => $summary['sold_cars'], ]), ]; return view('admin.laporan', compact('transactions', 'summary', 'chartData', 'startDate', 'endDate')); })->name('laporan'); });