TA/web_JMW/routes/web.php

162 lines
7.9 KiB
PHP

<?php
use Illuminate\Support\Facades\Route;
use App\Models\User;
use App\Models\Category;
use App\Models\Transaction;
use App\Http\Controllers\AuthController;
use App\Http\Controllers\CategoryController;
use App\Http\Controllers\ChatController;
use App\Http\Controllers\TransactionController;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "web" middleware group. Make something great!
|
*/
// Halaman awal untuk pengunjung sebelum login.
Route::get('/', function () {
Category::releaseExpiredReservations();
if (auth('admin')->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');
});