162 lines
7.9 KiB
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');
|
|
});
|