auth()->check() ? redirect()->route('qms.dashboard') : redirect()->route('sso.connect'))->name('qms.root'); Route::get('/login', [SsoLoginController::class, 'connect'])->name('login'); Route::get('/sso/connect', [SsoLoginController::class, 'connect'])->name('sso.connect'); Route::get('/sso/callback', [SsoLoginController::class, 'callback'])->name('sso.callback'); Route::get('/sso/error', [SsoLoginController::class, 'failed'])->name('sso.failed'); Route::post('/logout', [SsoLoginController::class, 'logout'])->name('logout'); Route::get('/sso/logout-bridge', [SsoLoginController::class, 'logoutBridge'])->name('sso.logout-bridge'); Route::get('/sso/logout-frontchannel', [SsoLoginController::class, 'frontchannelLogout'])->name('sso.logout-frontchannel'); Route::get('/sso/platform-signed-out', [SsoLoginController::class, 'platformSignedOut'])->name('sso.platform-signed-out'); Route::get('/signed-out', fn () => auth()->check() ? redirect()->route('qms.dashboard') : view('auth.signed-out'))->name('qms.signed-out'); // Public: digital display Route::get('/display/{token}', [DisplayPublicController::class, 'show'])->name('qms.display.public'); Route::get('/display/{token}/data', [DisplayPublicController::class, 'data'])->name('qms.display.data'); Route::post('/display/{token}/announcements/{announcement}/played', [DisplayPublicController::class, 'played'])->name('qms.display.announcement.played'); // Public: mobile queue Route::get('/join', [MobileQueueController::class, 'joinForm'])->name('qms.mobile.join'); Route::post('/join', [MobileQueueController::class, 'join'])->name('qms.mobile.join.store'); Route::get('/m/{qrToken}', [MobileQueueController::class, 'show'])->name('qms.mobile.show'); Route::get('/m/{qrToken}/data', [MobileQueueController::class, 'data'])->name('qms.mobile.data'); Route::post('/m/{qrToken}/delay', [MobileQueueController::class, 'delay'])->name('qms.mobile.delay'); Route::post('/m/{qrToken}/cancel', [MobileQueueController::class, 'cancel'])->name('qms.mobile.cancel'); // Public: customer feedback Route::get('/feedback/{qrToken}', [FeedbackController::class, 'show'])->name('qms.feedback.show'); Route::post('/feedback/{qrToken}', [FeedbackController::class, 'store'])->name('qms.feedback.store'); // Public: kiosk device Route::middleware(['qms.device:kiosk', 'throttle:60,1'])->prefix('kiosk/d')->group(function () { Route::get('/{token}', [KioskDeviceController::class, 'show'])->name('qms.kiosk.device'); Route::post('/{token}/issue', [KioskDeviceController::class, 'issue'])->name('qms.kiosk.device.issue'); }); Route::middleware(['auth', 'platform.session'])->group(function () { Route::get('/notifications', [NotificationController::class, 'index'])->name('notifications.index'); Route::get('/notifications/unread', [NotificationController::class, 'unread'])->name('notifications.unread'); Route::post('/notifications/{id}/read', [NotificationController::class, 'markAsRead'])->name('notifications.mark-read'); Route::post('/notifications/mark-all-read', [NotificationController::class, 'markAllAsRead'])->name('notifications.mark-all-read'); Route::get('/onboarding', [OnboardingController::class, 'show'])->name('qms.onboarding.show'); Route::post('/onboarding', [OnboardingController::class, 'store'])->name('qms.onboarding.store'); Route::post('/ai/chat', [AiController::class, 'chat'])->middleware('throttle:30,1')->name('qms.ai.chat'); Route::get('/wallet', fn () => redirect()->away(ladill_account_url('/wallet')))->name('qms.wallet'); Route::middleware(['qms.setup'])->group(function () { Route::get('/dashboard', [DashboardController::class, 'index'])->name('qms.dashboard'); Route::get('/board', [QueueBoardController::class, 'index'])->name('qms.board.index'); Route::get('/queues', [ServiceQueueController::class, 'index'])->name('qms.queues.index'); Route::get('/queues/create', [ServiceQueueController::class, 'create'])->name('qms.queues.create'); Route::post('/queues', [ServiceQueueController::class, 'store'])->name('qms.queues.store'); Route::get('/queues/{serviceQueue}', [ServiceQueueController::class, 'show'])->name('qms.queues.show'); Route::get('/queues/{serviceQueue}/edit', [ServiceQueueController::class, 'edit'])->name('qms.queues.edit'); Route::put('/queues/{serviceQueue}', [ServiceQueueController::class, 'update'])->name('qms.queues.update'); Route::post('/queues/{serviceQueue}/pause', [ServiceQueueController::class, 'pause'])->name('qms.queues.pause'); Route::post('/queues/{serviceQueue}/resume', [ServiceQueueController::class, 'resume'])->name('qms.queues.resume'); Route::get('/tickets', [TicketController::class, 'index'])->name('qms.tickets.index'); Route::get('/tickets/create', [TicketController::class, 'create'])->name('qms.tickets.create'); Route::post('/tickets', [TicketController::class, 'store'])->name('qms.tickets.store'); Route::get('/tickets/{ticket}', [TicketController::class, 'show'])->name('qms.tickets.show'); Route::get('/tickets/{ticket}/print', [TicketController::class, 'print'])->name('qms.tickets.print'); Route::get('/counters', [CounterController::class, 'index'])->name('qms.counters.index'); Route::get('/counters/create', [CounterController::class, 'create'])->name('qms.counters.create'); Route::post('/counters', [CounterController::class, 'store'])->name('qms.counters.store'); Route::get('/counters/{counter}', [CounterController::class, 'show'])->name('qms.counters.show'); Route::get('/counters/{counter}/edit', [CounterController::class, 'edit'])->name('qms.counters.edit'); Route::put('/counters/{counter}', [CounterController::class, 'update'])->name('qms.counters.update'); Route::get('/console/{counter}', [ConsoleController::class, 'show'])->name('qms.console.show'); Route::post('/console/{counter}/action', [ConsoleController::class, 'action'])->name('qms.console.action'); Route::get('/displays', [DisplayScreenController::class, 'index'])->name('qms.displays.index'); Route::get('/displays/create', [DisplayScreenController::class, 'create'])->name('qms.displays.create'); Route::post('/displays', [DisplayScreenController::class, 'store'])->name('qms.displays.store'); Route::get('/displays/{display}', [DisplayScreenController::class, 'show'])->name('qms.displays.show'); Route::get('/displays/{display}/edit', [DisplayScreenController::class, 'edit'])->name('qms.displays.edit'); Route::put('/displays/{display}', [DisplayScreenController::class, 'update'])->name('qms.displays.update'); Route::get('/devices', [DeviceController::class, 'index'])->name('qms.devices.index'); Route::get('/devices/create', [DeviceController::class, 'create'])->name('qms.devices.create'); Route::post('/devices', [DeviceController::class, 'store'])->name('qms.devices.store'); Route::post('/devices/{device}/regenerate-token', [DeviceController::class, 'regenerateToken'])->name('qms.devices.regenerate-token'); Route::get('/appointments', [AppointmentController::class, 'index'])->name('qms.appointments.index'); Route::get('/appointments/create', [AppointmentController::class, 'create'])->name('qms.appointments.create'); Route::post('/appointments', [AppointmentController::class, 'store'])->name('qms.appointments.store'); Route::get('/appointments/{appointment}/edit', [AppointmentController::class, 'edit'])->name('qms.appointments.edit'); Route::put('/appointments/{appointment}', [AppointmentController::class, 'update'])->name('qms.appointments.update'); Route::post('/appointments/{appointment}/check-in', [AppointmentController::class, 'checkIn'])->name('qms.appointments.check-in'); Route::post('/appointments/{appointment}/cancel', [AppointmentController::class, 'cancel'])->name('qms.appointments.cancel'); Route::get('/workflows', [WorkflowController::class, 'index'])->name('qms.workflows.index'); Route::get('/workflows/create', [WorkflowController::class, 'create'])->name('qms.workflows.create'); Route::post('/workflows', [WorkflowController::class, 'store'])->name('qms.workflows.store'); Route::get('/workflows/{workflow}', [WorkflowController::class, 'show'])->name('qms.workflows.show'); Route::get('/workflows/{workflow}/edit', [WorkflowController::class, 'edit'])->name('qms.workflows.edit'); Route::put('/workflows/{workflow}', [WorkflowController::class, 'update'])->name('qms.workflows.update'); Route::delete('/workflows/{workflow}', [WorkflowController::class, 'destroy'])->name('qms.workflows.destroy'); Route::get('/queues/{serviceQueue}/rules', [QueueRuleController::class, 'index'])->name('qms.rules.index'); Route::post('/queues/{serviceQueue}/rules', [QueueRuleController::class, 'store'])->name('qms.rules.store'); Route::delete('/queues/{serviceQueue}/rules/{rule}', [QueueRuleController::class, 'destroy'])->name('qms.rules.destroy'); Route::get('/analytics', [AnalyticsController::class, 'index'])->name('qms.analytics.index'); Route::get('/reports', [ReportController::class, 'index'])->name('qms.reports.index'); Route::get('/reports/{type}', [ReportController::class, 'show'])->name('qms.reports.show'); Route::get('/reports/{type}/export', [ReportController::class, 'export'])->name('qms.reports.export'); Route::get('/feedback', [FeedbackAdminController::class, 'index'])->name('qms.feedback.admin'); Route::get('/admin/departments', [DepartmentController::class, 'index'])->name('qms.departments.index'); Route::get('/admin/departments/create', [DepartmentController::class, 'create'])->name('qms.departments.create'); Route::post('/admin/departments', [DepartmentController::class, 'store'])->name('qms.departments.store'); Route::get('/admin/departments/{department}/edit', [DepartmentController::class, 'edit'])->name('qms.departments.edit'); Route::put('/admin/departments/{department}', [DepartmentController::class, 'update'])->name('qms.departments.update'); Route::delete('/admin/departments/{department}', [DepartmentController::class, 'destroy'])->name('qms.departments.destroy'); Route::get('/admin/audit', [AuditLogController::class, 'index'])->name('qms.audit.index'); Route::get('/admin/audit/export', [AuditLogController::class, 'export'])->name('qms.audit.export'); Route::get('/settings', [SettingsController::class, 'edit'])->name('qms.settings.edit'); Route::put('/settings', [SettingsController::class, 'update'])->name('qms.settings.update'); Route::post('/settings/industry-package', [SettingsController::class, 'reinstallPackage'])->name('qms.settings.package.reinstall'); Route::get('/settings/branches', [BranchController::class, 'index'])->name('qms.branches.index'); Route::get('/settings/branches/create', [BranchController::class, 'create'])->name('qms.branches.create'); Route::post('/settings/branches', [BranchController::class, 'store'])->name('qms.branches.store'); Route::get('/settings/branches/{branch}/edit', [BranchController::class, 'edit'])->name('qms.branches.edit'); Route::put('/settings/branches/{branch}', [BranchController::class, 'update'])->name('qms.branches.update'); Route::get('/settings/team', [MemberController::class, 'index'])->name('qms.members.index'); Route::get('/settings/team/create', [MemberController::class, 'create'])->name('qms.members.create'); Route::post('/settings/team', [MemberController::class, 'store'])->name('qms.members.store'); Route::delete('/settings/team/{member}', [MemberController::class, 'destroy'])->name('qms.members.destroy'); Route::redirect('/admin/branches', '/settings/branches'); Route::redirect('/admin/members', '/settings/team'); Route::get('/pro', [ProController::class, 'index'])->name('qms.pro.index'); Route::post('/pro/subscribe', [ProController::class, 'subscribe'])->name('qms.pro.subscribe'); Route::post('/pro/subscribe-enterprise', [ProController::class, 'subscribeEnterprise'])->name('qms.pro.subscribe-enterprise'); Route::post('/pro/subscribe-prepaid', [ProController::class, 'subscribePrepaid'])->name('qms.pro.subscribe-prepaid'); Route::get('/pro/paystack/callback', [ProController::class, 'paystackCallback'])->name('qms.pro.paystack.callback'); Route::get('/report-issue', [IssueReportController::class, 'create'])->name('qms.issues.create'); Route::post('/report-issue', [IssueReportController::class, 'store'])->name('qms.issues.store'); }); });