name('publik.index'); Route::get('/publik/penerima', [PublikController::class, 'penerima'])->name('publik.penerima'); Route::get('/publik/peta', [PublikController::class, 'peta'])->name('publik.peta'); Route::get('/publik/peta/data', [PublikController::class, 'petaData'])->name('publik.peta.data'); // ========== ADMIN & PORTAL LAYOUT ========== Route::middleware(['auth', 'role:superadmin|admin|user'])->prefix('admin')->name('admin.')->group(function () { Route::get('/dashboard', function () { $totalWarga = \App\Models\Warga::count(); $totalPenerima = \App\Models\HasilSaw::where('status', 'penerima')->count(); $totalPenilaian = \App\Models\PenilaianWarga::count(); $periodeAktif = \App\Models\PeriodeSeleksi::where('status', 'aktif')->latest()->first(); $periodeList = \App\Models\PeriodeSeleksi::latest()->take(5)->get(); // Early Warning: cek apakah periode aktif hampir selesai (≤ 3 hari) $periodeHampirSelesai = false; $sisaHari = null; if ($periodeAktif) { $selesai = \Carbon\Carbon::parse($periodeAktif->tanggal_selesai)->endOfDay(); $sekarang = \Carbon\Carbon::now(); if (!$selesai->isPast()) { $sisaHari = (int) $sekarang->diffInDays($selesai, false); if ($sisaHari <= 3) { $periodeHampirSelesai = true; } } } return view('admin.dashboard', compact( 'totalWarga', 'totalPenerima', 'totalPenilaian', 'periodeAktif', 'periodeList', 'periodeHampirSelesai', 'sisaHari' )); })->name('dashboard'); // Akses hasil SAW dan GIS (Bisa diakses Superadmin, Admin, dan User) Route::get('/saw/{periode}/hasil', [SawController::class, 'hasil'])->name('saw.hasil'); Route::get('/saw/{periode}/export-pdf', [SawController::class, 'exportPdf'])->name('saw.exportPdf'); Route::get('/gis', [\App\Http\Controllers\Admin\GisController::class, 'index'])->name('gis.index'); Route::get('/gis/data', [\App\Http\Controllers\Admin\GisController::class, 'data'])->name('gis.data'); // ========== HANYA SUPERADMIN & ADMIN (OPERASIONAL) ========== Route::middleware(['role:superadmin|admin'])->group(function () { Route::get('/warga/export/excel', [WargaController::class, 'export'])->name('warga.export'); Route::resource('warga', WargaController::class); Route::resource('periode', PeriodeSeleksiController::class); // Kriteria Index (bisa dibaca Admin & Superadmin) Route::get('/kriteria', [KriteriaController::class, 'index'])->name('kriteria.index'); Route::get('/penilaian/export/excel/{periode_id}', [PenilaianWargaController::class, 'export'])->name('penilaian.export'); Route::post('/penilaian/import/excel', [PenilaianWargaController::class, 'import'])->name('penilaian.import'); Route::resource('penilaian', PenilaianWargaController::class); Route::get('/saw/{periode}', [SawController::class, 'index'])->name('saw.index'); Route::post('/saw/{periode}/hitung', [SawController::class, 'hitung'])->name('saw.hitung'); Route::post('/saw/{periode}/tetapkan', [SawController::class, 'tetapkan'])->name('saw.tetapkan'); }); // ========== HANYA SUPERADMIN (MANAJEMEN PENGGUNA & KRITERIA WRITE) ========== Route::middleware(['role:superadmin'])->group(function () { Route::resource('users', \App\Http\Controllers\Admin\UserController::class); // CRUD Kriteria (Hanya Superadmin) Route::get('/kriteria/create', [KriteriaController::class, 'create'])->name('kriteria.create'); Route::post('/kriteria', [KriteriaController::class, 'store'])->name('kriteria.store'); Route::get('/kriteria/{kriterium}/edit', [KriteriaController::class, 'edit'])->name('kriteria.edit'); Route::put('/kriteria/{kriterium}', [KriteriaController::class, 'update'])->name('kriteria.update'); Route::delete('/kriteria/{kriterium}', [KriteriaController::class, 'destroy'])->name('kriteria.destroy'); }); });