'admin', 'as' => 'admin.'], function () { // Login Routes. Route::post('/login/submit', [LoginController::class, 'login'])->name('login.submit'); Route::get('/login/submit', function() { return redirect()->route('admin.login'); }); // Logout Routes. Route::get('/logout/submit', [LoginController::class, 'logout'])->name('logout.submit'); Route::get('/login', [LoginController::class, 'showLoginForm'])->name('login'); }); /** * ADMIN PREFIX ROUTES (Sesuai Struktur Asli Anda) */ Route::group(['prefix' => 'admin', 'as' => 'admin.', 'middleware' => ['auth:admin']], function () { // Rute yang WAJIB dicek Menu Sidebar Route::middleware(['menu'])->group(function () { Route::resource('admins', AdminsController::class); Route::resource('roles', RolesController::class); Route::get('/', [DashboardController::class, 'index'])->name('dashboard'); Route::get('/rayon', [RayonController::class, 'index'])->name('rayon.index'); Route::get('/rayon/create', [RayonController::class, 'create'])->name('rayon.create'); Route::get('/rayon/edit/{id}', [RayonController::class, 'edit'])->name('rayon.edit'); Route::get('/cost', [CostCentreController::class, 'index'])->name('cost.index'); Route::get('/cost/create', [CostCentreController::class, 'create'])->name('cost.create'); Route::get('/cost/edit/{id}', [CostCentreController::class, 'edit'])->name('cost.edit'); Route::get('/category', [CategoryController::class, 'index'])->name('category.index'); Route::get('/category/create', [CategoryController::class, 'create'])->name('category.create'); Route::get('/category/edit/{id}', [CategoryController::class, 'edit'])->name('category.edit'); Route::get('/region', [RegionController::class, 'index'])->name('region.index'); Route::get('/region/create', [RegionController::class, 'create'])->name('region.create'); Route::get('/region/edit/{id}', [RegionController::class, 'edit'])->name('region.edit'); Route::get('/cabang', [CabangController::class, 'index'])->name('cabang.index'); Route::get('/cabang/create', [CabangController::class, 'create'])->name('cabang.create'); Route::get('/cabang/edit/{id}', [CabangController::class, 'edit'])->name('cabang.edit'); // --- PENYEMPURNAAN RUTE AUDIT TRAIL --- Route::get('/audit-trails', [AuditTrailController::class, 'index'])->name('audit-trail.index'); Route::get('/audit-trails/export', [AuditTrailController::class, 'exportExcel'])->name('audit-trail.export'); Route::delete('/audit-trails/clear', [AuditTrailController::class, 'clearAll'])->name('audit-trail.clear'); }); // Rute Aksi Admin (Dikeluarkan dari middleware menu agar tidak 403) Route::get('/admins/expense/{user_id}', [AdminsController::class, 'expense'])->name('admins.expense'); Route::get('/nextcloud/download/{file}', [NextCloudController::class, 'download'])->name('nextcloud.download'); Route::get('/nextcloud/preview/{file}', [NextCloudController::class, 'preview'])->name('nextcloud.preview'); Route::post('/rayon/store', [RayonController::class, 'store'])->name('rayon.store'); Route::put('/rayon/update/{id}', [RayonController::class, 'update'])->name('rayon.update'); Route::delete('/rayon/destroy/{id}', [RayonController::class, 'destroy'])->name('rayon.destroy'); Route::post('/cost/store', [CostCentreController::class, 'store'])->name('cost.store'); Route::put('/cost/update/{id}', [CostCentreController::class, 'update'])->name('cost.update'); Route::delete('/cost/destroy/{id}', [CostCentreController::class, 'destroy'])->name('cost.destroy'); Route::post('/category/store', [CategoryController::class, 'store'])->name('category.store'); Route::put('/category/update/{id}', [CategoryController::class, 'update'])->name('category.update'); Route::delete('/category/destroy/{id}', [CategoryController::class, 'destroy'])->name('category.destroy'); Route::post('/region/store', [RegionController::class, 'store'])->name('region.store'); Route::put('/region/update/{id}', [RegionController::class, 'update'])->name('region.update'); Route::delete('/region/destroy/{id}', [RegionController::class, 'destroy'])->name('region.destroy'); Route::post('/cabang/store', [CabangController::class, 'store'])->name('cabang.store'); Route::put('/cabang/update/{id}', [CabangController::class, 'update'])->name('cabang.update'); Route::delete('/cabang/destroy/{id}', [CabangController::class, 'destroy'])->name('cabang.destroy'); Route::get('/backend/audit-trail/clear-cache', [AuditTrailController::class, 'clearCache'])->name('audit-trail.clear-cache'); }); /** * NON-PREFIX ROUTES (Forms, Budgets, Reports - Sesuai Struktur Asli) */ Route::middleware(['auth:admin'])->group(function () { // 1. Bagian yang dicek Menu Sidebar (Dashboard, Budget, Report, Form Index) Route::middleware(['menu'])->group(function () { Route::get('/', [DashboardController::class, 'index'])->name('dashboard.index'); Route::post('/mark_all_read', [DashboardController::class, 'mark_all_read'])->name('dashboard.mark_all_read'); // Pastikan diletakkan di dalam group admin Route::group(['prefix' => 'admin', 'as' => 'admin.'], function () { // Rute Dashboard Utama Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard'); // TAMBAHKAN BARIS INI: Rute untuk melihat detail cabang Route::get('/dashboard/{id}', [DashboardController::class, 'show'])->name('dashboard.show'); }); Route::get('/budgets', [BudgetControlController::class, 'index'])->name('budget_control'); // Budget approve Accounting Route::post('/budget-control/upload-proof', [BudgetControlController::class, 'uploadProof'])->name('budget_control.upload_proof'); Route::post('/budget-control/approve-transfer/{id}', [BudgetControlController::class, 'approveTransfer'])->name('budget_control.approve_transfer'); Route::post('/budget-control/reject-transfer/{id}', [BudgetControlController::class, 'rejectTransfer'])->name('budget_control.reject_transfer'); Route::post('/budget-control/bulk-upload', [BudgetControlController::class, 'bulkUpload'])->name('budget_control.bulk_upload'); Route::get('/budget-control/download-template', [BudgetControlController::class, 'downloadTemplate'])->name('budget_control.download_template'); // --- RUTE LOG DIPINDAHKAN KE SINI AGAR MENDAPATKAN $MENU UNTUK SIDEBAR --- Route::get('/budgets/log', [BudgetControlController::class, 'log'])->name('budget_control.log'); Route::get('/budgets/view/{id}', [BudgetControlController::class, 'view'])->name('budget_control.view'); Route::get('/budgets/create', [BudgetControlController::class, 'create'])->name('budget_control.create'); Route::get('/budgets/edit/{id}', [BudgetControlController::class, 'edit'])->name('budget_control.edit'); Route::prefix('reports')->group(function () { Route::get('/upcountry', [ReportController::class, 'upcountry'])->name('reports.upcountry'); Route::get('/vehicle', [ReportController::class, 'vehicle'])->name('reports.vehicle'); Route::get('/entertainment', [ReportController::class, 'entertainment'])->name('reports.entertainment'); Route::get('/meeting', [ReportController::class, 'meeting'])->name('reports.meeting'); Route::get('/others', [ReportController::class, 'others'])->name('reports.others'); Route::get('/all', [ReportController::class, 'all'])->name('reports.all'); Route::get('/jurnal', [ReportController::class, 'jurnal'])->name('reports.jurnal'); Route::get('/generateJurnal', [ReportController::class, 'generateJurnal'])->name('reports.jurnal.generate'); }); Route::prefix('forms')->group(function () { Route::get('/up-country', [FormUpCountryController::class, 'index'])->name('forms.up-country'); Route::get('/up-country/view/{id}', [FormUpCountryController::class, 'view'])->name('forms.up-country.view'); Route::get('/up-country/create', [FormUpCountryController::class, 'create'])->name('forms.up-country.create'); Route::get('/up-country/edit/{id}', [FormUpCountryController::class, 'edit'])->name('forms.up-country.edit'); Route::get('/vehicle-running-cost', [FormVehicleController::class, 'index'])->name('forms.vehicle'); Route::get('/vehicle-running-cost/view/{id}', [FormVehicleController::class, 'view'])->name('forms.vehicle.view'); Route::get('/vehicle-running-cost/create', [FormVehicleController::class, 'create'])->name('forms.vehicle.create'); Route::get('/vehicle-running-cost/edit/{id}', [FormVehicleController::class, 'edit'])->name('forms.vehicle.edit'); Route::get('/entertainment-presentation', [FormEntertainmentPresentationController::class, 'index'])->name('forms.entertainment'); Route::get('/entertainment-presentation/view/{id}', [FormEntertainmentPresentationController::class, 'view'])->name('forms.entertainment.view'); Route::get('/entertainment-presentation/create', [FormEntertainmentPresentationController::class, 'create'])->name('forms.entertainment.create'); Route::get('/entertainment-presentation/edit/{id}', [FormEntertainmentPresentationController::class, 'edit'])->name('forms.entertainment.edit'); Route::get('/meeting-seminar', [FormMeetingSeminarController::class, 'index'])->name('forms.meeting'); Route::get('/meeting-seminar/view/{id}', [FormMeetingSeminarController::class, 'view'])->name('forms.meeting.view'); Route::get('/meeting-seminar/create', [FormMeetingSeminarController::class, 'create'])->name('forms.meeting.create'); Route::get('/meeting-seminar/edit/{id}', [FormMeetingSeminarController::class, 'edit'])->name('forms.meeting.edit'); Route::get('/other', [FormOtherController::class, 'index'])->name('forms.other'); Route::get('/other/view/{id}', [FormOtherController::class, 'view'])->name('forms.other.view'); Route::get('/other/create', [FormOtherController::class, 'create'])->name('forms.other.create'); Route::get('/other/edit/{id}', [FormOtherController::class, 'edit'])->name('forms.other.edit'); }); Route::get('/auth/menu-tree/{id}', [MenuRoleController::class, 'index'])->name('auth.menurole.index'); }); // 2. Bagian AKSI (Reject, Approve, Store) - TIDAK dicek Menu Sidebar agar TIDAK 403 Route::get('/budgets/detail/{id}', [BudgetControlController::class, 'detail'])->name('budget_control.detail'); Route::post('/budgets/store', [BudgetControlController::class, 'store'])->name('budget_control.store'); Route::put('/budgets/update/{id}', [BudgetControlController::class, 'update'])->name('budget_control.update'); Route::delete('/budgets/destroy/{id}', [BudgetControlController::class, 'destroy'])->name('budget_control.destroy'); Route::post('/auth/menu-tree/submit', [MenuRoleController::class, 'saveMenu'])->name('auth.menurole.submit'); Route::get('/report/jurnal', [BudgetControlController::class, 'jurnal'])->name('report.jurnal'); Route::post('/report/jurnal/generate', [BudgetControlController::class, 'generateJurnal'])->name('report.jurnal.generate'); Route::prefix('forms')->group(function () { // Aksi Up Country Route::get('/up-country/detail/{id}', [FormUpCountryController::class, 'detail'])->name('forms.up-country.detail'); Route::post('/up-country/store', [FormUpCountryController::class, 'store'])->name('forms.up-country.store'); Route::put('/up-country/update/{id}', [FormUpCountryController::class, 'update'])->name('forms.up-country.update'); Route::delete('/up-country/{form}/attachments/{attachment}', [FormUpCountryController::class, 'deleteAttachment'])->name('forms.up-country.attachments.destroy'); Route::delete('/up-country/destroy/{id}', [FormUpCountryController::class, 'destroy'])->name('forms.up-country.destroy'); Route::put('/up-country/approve/{id}', [FormUpCountryController::class, 'approve'])->name('forms.up-country.approve'); Route::put('/up-country/approve2/{id}', [FormUpCountryController::class, 'approve2'])->name('forms.up-country.approve2'); Route::put('/up-country/reject/{id}', [FormUpCountryController::class, 'reject'])->name('forms.up-country.reject'); Route::put('/up-country/final-approve/{id}', [FormUpCountryController::class, 'finalApprove'])->name('forms.up-country.final-approve'); Route::put('/up-country/open/{id}', [FormUpCountryController::class, 'open'])->name('forms.up-country.open'); // Aksi Vehicle Route::get('/vehicle-running-cost/detail/{id}', [FormVehicleController::class, 'detail'])->name('forms.vehicle.detail'); Route::post('/vehicle-running-cost/store', [FormVehicleController::class, 'store'])->name('forms.vehicle.store'); Route::put('/vehicle-running-cost/update/{id}', [FormVehicleController::class, 'update'])->name('forms.vehicle.update'); Route::delete('/vehicle-running-cost/{form}/attachments/{attachment}', [FormVehicleController::class, 'deleteAttachment'])->name('forms.vehicle.attachments.destroy'); Route::delete('/vehicle-running-cost/destroy/{id}', [FormVehicleController::class, 'destroy'])->name('forms.vehicle.destroy'); Route::put('/vehicle-running-cost/approve/{id}', [FormVehicleController::class, 'approve'])->name('forms.vehicle.approve'); Route::put('/vehicle-running-cost/approve2/{id}', [FormVehicleController::class, 'approve2'])->name('forms.vehicle.approve2'); Route::put('/vehicle-running-cost/reject/{id}', [FormVehicleController::class, 'reject'])->name('forms.vehicle.reject'); Route::put('/vehicle-running-cost/final-approve/{id}', [FormVehicleController::class, 'finalApprove'])->name('forms.vehicle.final-approve'); Route::put('/vehicle-running-cost/open/{id}', [FormVehicleController::class, 'open'])->name('forms.vehicle.open'); // Aksi Entertainment Route::get('/entertainment-presentation/detail/{id}', [FormEntertainmentPresentationController::class, 'detail'])->name('forms.entertainment.detail'); Route::post('/entertainment-presentation/store', [FormEntertainmentPresentationController::class, 'store'])->name('forms.entertainment.store'); Route::put('/entertainment-presentation/update/{id}', [FormEntertainmentPresentationController::class, 'update'])->name('forms.entertainment.update'); Route::delete('/entertainment-presentation/{form}/attachments/{attachment}', [FormEntertainmentPresentationController::class, 'deleteAttachment'])->name('forms.entertainment.attachments.destroy'); Route::delete('/entertainment-presentation/destroy/{id}', [FormEntertainmentPresentationController::class, 'destroy'])->name('forms.entertainment.destroy'); Route::put('/entertainment-presentation/approve/{id}', [FormEntertainmentPresentationController::class, 'approve'])->name('forms.entertainment.approve'); Route::put('/entertainment-presentation/approve2/{id}', [FormEntertainmentPresentationController::class, 'approve2'])->name('forms.entertainment.approve2'); Route::put('/entertainment-presentation/reject/{id}', [FormEntertainmentPresentationController::class, 'reject'])->name('forms.entertainment.reject'); Route::put('/entertainment-presentation/final-approve/{id}', [FormEntertainmentPresentationController::class, 'finalApprove'])->name('forms.entertainment.final-approve'); Route::put('/entertainment-presentation/open/{id}', [FormEntertainmentPresentationController::class, 'open'])->name('forms.entertainment.open'); // Aksi Meeting Route::get('/meeting-seminar/detail/{id}', [FormMeetingSeminarController::class, 'detail'])->name('forms.meeting.detail'); Route::post('/meeting-seminar/store', [FormMeetingSeminarController::class, 'store'])->name('forms.meeting.store'); Route::put('/meeting-seminar/update/{id}', [FormMeetingSeminarController::class, 'update'])->name('forms.meeting.update'); Route::delete('/meeting-seminar/{form}/attachments/{attachment}', [FormMeetingSeminarController::class, 'deleteAttachment'])->name('forms.meeting.attachments.destroy'); Route::delete('/meeting-seminar/destroy/{id}', [FormMeetingSeminarController::class, 'destroy'])->name('forms.meeting.destroy'); Route::put('/meeting-seminar/approve/{id}', [FormMeetingSeminarController::class, 'approve'])->name('forms.meeting.approve'); Route::put('/meeting-seminar/approve2/{id}', [FormMeetingSeminarController::class, 'approve2'])->name('forms.meeting.approve2'); Route::put('/meeting-seminar/reject/{id}', [FormMeetingSeminarController::class, 'reject'])->name('forms.meeting.reject'); Route::put('/meeting-seminar/final-approve/{id}', [FormMeetingSeminarController::class, 'finalApprove'])->name('forms.meeting.final-approve'); Route::put('/meeting-seminar/open/{id}', [FormMeetingSeminarController::class, 'open'])->name('forms.meeting.open'); // Aksi Others Route::get('/other/detail/{id}', [FormOtherController::class, 'detail'])->name('forms.other.detail'); Route::post('/other/store', [FormOtherController::class, 'store'])->name('forms.other.store'); Route::put('/other/update/{id}', [FormOtherController::class, 'update'])->name('forms.other.update'); Route::delete('/other/{form}/attachments/{attachment}', [FormOtherController::class, 'deleteAttachment'])->name('forms.other.attachments.destroy'); Route::delete('/other/destroy/{id}', [FormOtherController::class, 'destroy'])->name('forms.other.destroy'); Route::put('/other/approve/{id}', [FormOtherController::class, 'approve'])->name('forms.other.approve'); Route::put('/other/approve2/{id}', [FormOtherController::class, 'approve2'])->name('forms.other.approve2'); Route::put('/other/reject/{id}', [FormOtherController::class, 'reject'])->name('forms.other.reject'); Route::put('/other/final-approve/{id}', [FormOtherController::class, 'finalApprove'])->name('forms.other.final-approve'); Route::put('/other/open/{id}', [FormOtherController::class, 'open'])->name('forms.other.open'); }); }); Route::get('/check-workers', function (Request $request) { return response()->json([ 'octane_client' => app()->bound(\Laravel\Octane\Contracts\Client::class), 'worker_pid' => getmypid(), ]); });