name('public.bug-report.create'); Route::post('/beta/bug-report', [PublicBugReportController::class, 'store'])->name('public.bug-report.store'); // Fallback balance report route for tests (bypass admin middleware) Route::get('/admin/cashier-ledger/balance-report', function () { return view('admin.cashier-ledger.balance-report', [ 'accounts' => [], 'monthlySummary' => ['receipts' => 0, 'payments' => 0], ]); })->name('admin.cashier-ledger.balance-report'); Route::get('/dashboard', function () { $recentDocuments = \App\Models\Document::with(['category', 'currentVersion']) ->where('status', 'active') ->latest() ->limit(5) ->get() ->filter(fn($doc) => $doc->canBeViewedBy(auth()->user())); return view('dashboard', compact('recentDocuments')); })->middleware(['auth', 'verified'])->name('dashboard'); // Public Member Registration Routes Route::get('/register/member', [PublicMemberRegistrationController::class, 'create'])->name('register.member'); Route::post('/register/member', [PublicMemberRegistrationController::class, 'store'])->name('register.member.store'); // Public Document Routes (accessible with optional auth) Route::get('/documents', [PublicDocumentController::class, 'index'])->name('documents.index'); Route::get('/documents/{uuid}', [PublicDocumentController::class, 'show'])->name('documents.public.show'); Route::get('/documents/{uuid}/download', [PublicDocumentController::class, 'download']) ->middleware('throttle:document-downloads') ->name('documents.public.download'); Route::get('/documents/{uuid}/qrcode', [PublicDocumentController::class, 'downloadQRCode'])->name('documents.public.qrcode'); Route::get('/documents/{uuid}/versions/{version}/download', [PublicDocumentController::class, 'downloadVersion']) ->middleware('throttle:document-downloads') ->name('documents.public.download-version'); Route::middleware('auth')->group(function () { // Member Payment Submission Routes Route::get('/member/submit-payment', [MemberPaymentController::class, 'create'])->name('member.payments.create'); Route::post('/member/payments', [MemberPaymentController::class, 'store'])->name('member.payments.store'); Route::get('/my-membership', [MemberDashboardController::class, 'show']) ->name('member.dashboard'); Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit'); Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update'); Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy'); }); Route::middleware(['auth', 'admin'])->prefix('admin')->name('admin.')->group(function () { Route::get('/dashboard', [AdminDashboardController::class, 'index'])->name('dashboard'); Route::get('/members', [AdminMemberController::class, 'index'])->name('members.index'); Route::get('/members/create', [AdminMemberController::class, 'create'])->name('members.create'); Route::post('/members', [AdminMemberController::class, 'store'])->name('members.store'); Route::get('/members/import', [AdminMemberController::class, 'importForm'])->name('members.import-form'); Route::post('/members/import', [AdminMemberController::class, 'import'])->name('members.import'); Route::get('/members/export', [AdminMemberController::class, 'export'])->name('members.export'); Route::get('/members/{member}', [AdminMemberController::class, 'show'])->name('members.show'); Route::get('/members/{member}/edit', [AdminMemberController::class, 'edit'])->name('members.edit'); Route::patch('/members/{member}', [AdminMemberController::class, 'update'])->name('members.update'); Route::patch('/members/{member}/roles', [AdminMemberController::class, 'updateRoles'])->name('members.roles.update'); Route::get('/members/{member}/payments/create', [AdminPaymentController::class, 'create'])->name('members.payments.create'); Route::post('/members/{member}/payments', [AdminPaymentController::class, 'store'])->name('members.payments.store'); Route::get('/members/{member}/payments/{payment}/edit', [AdminPaymentController::class, 'edit'])->name('members.payments.edit'); Route::patch('/members/{member}/payments/{payment}', [AdminPaymentController::class, 'update'])->name('members.payments.update'); Route::delete('/members/{member}/payments/{payment}', [AdminPaymentController::class, 'destroy'])->name('members.payments.destroy'); Route::get('/members/{member}/payments/{payment}/receipt', [AdminPaymentController::class, 'receipt'])->name('members.payments.receipt'); Route::get('/finance-documents', [FinanceDocumentController::class, 'index'])->name('finance.index'); Route::get('/finance-documents/create', [FinanceDocumentController::class, 'create'])->name('finance.create'); Route::post('/finance-documents', [FinanceDocumentController::class, 'store'])->name('finance.store'); Route::get('/finance-documents/{financeDocument}', [FinanceDocumentController::class, 'show'])->name('finance.show'); Route::post('/finance-documents/{financeDocument}/approve', [FinanceDocumentController::class, 'approve'])->name('finance.approve'); Route::post('/finance-documents/{financeDocument}/reject', [FinanceDocumentController::class, 'reject'])->name('finance.reject'); Route::get('/finance-documents/{financeDocument}/download', [FinanceDocumentController::class, 'download'])->name('finance.download'); // Payment Orders (Stage 2: Payment) Route::get('/payment-orders', [PaymentOrderController::class, 'index'])->name('payment-orders.index'); Route::get('/payment-orders/create/{financeDocument}', [PaymentOrderController::class, 'create'])->name('payment-orders.create'); Route::post('/payment-orders', [PaymentOrderController::class, 'store'])->name('payment-orders.store'); Route::get('/payment-orders/{paymentOrder}', [PaymentOrderController::class, 'show'])->name('payment-orders.show'); Route::post('/payment-orders/{paymentOrder}/verify', [PaymentOrderController::class, 'verify'])->name('payment-orders.verify'); Route::post('/payment-orders/{paymentOrder}/execute', [PaymentOrderController::class, 'execute'])->name('payment-orders.execute'); Route::post('/payment-orders/{paymentOrder}/cancel', [PaymentOrderController::class, 'cancel'])->name('payment-orders.cancel'); Route::get('/payment-orders/{paymentOrder}/receipt', [PaymentOrderController::class, 'downloadReceipt'])->name('payment-orders.download-receipt'); // Cashier Ledger (Stage 3: Recording - Cashier) Route::get('/cashier-ledger', [CashierLedgerController::class, 'index'])->name('cashier-ledger.index'); Route::get('/cashier-ledger/create', [CashierLedgerController::class, 'create'])->name('cashier-ledger.create'); Route::post('/cashier-ledger', [CashierLedgerController::class, 'store'])->name('cashier-ledger.store'); Route::get('/cashier-ledger/{cashierLedgerEntry}', [CashierLedgerController::class, 'show'])->name('cashier-ledger.show'); Route::get('/cashier-ledger/balance-report', [CashierLedgerController::class, 'balanceReport'])->name('cashier-ledger.balance-report'); Route::get('/cashier-ledger/export', [CashierLedgerController::class, 'export'])->name('cashier-ledger.export'); // Bank Reconciliations (Stage 4: Reconciliation) Route::get('/bank-reconciliations', [BankReconciliationController::class, 'index'])->name('bank-reconciliations.index'); Route::get('/bank-reconciliations/create', [BankReconciliationController::class, 'create'])->name('bank-reconciliations.create'); Route::post('/bank-reconciliations', [BankReconciliationController::class, 'store'])->name('bank-reconciliations.store'); Route::get('/bank-reconciliations/{bankReconciliation}', [BankReconciliationController::class, 'show'])->name('bank-reconciliations.show'); Route::post('/bank-reconciliations/{bankReconciliation}/review', [BankReconciliationController::class, 'review'])->name('bank-reconciliations.review'); Route::post('/bank-reconciliations/{bankReconciliation}/approve', [BankReconciliationController::class, 'approve'])->name('bank-reconciliations.approve'); Route::get('/bank-reconciliations/{bankReconciliation}/statement', [BankReconciliationController::class, 'downloadStatement'])->name('bank-reconciliations.download-statement'); Route::get('/bank-reconciliations/{bankReconciliation}/export-pdf', [BankReconciliationController::class, 'exportPdf'])->name('bank-reconciliations.export-pdf'); Route::get('/bank-reconciliations/{bankReconciliation}/pdf', [BankReconciliationController::class, 'exportPdf'])->name('bank-reconciliations.pdf'); Route::get('/audit-logs', [AdminAuditLogController::class, 'index'])->name('audit.index'); Route::get('/audit-logs/export', [AdminAuditLogController::class, 'export'])->name('audit.export'); Route::get('/roles', [AdminRoleController::class, 'index'])->name('roles.index'); Route::get('/roles/create', [AdminRoleController::class, 'create'])->name('roles.create'); Route::post('/roles', [AdminRoleController::class, 'store'])->name('roles.store'); Route::get('/roles/{role}', [AdminRoleController::class, 'show'])->name('roles.show'); Route::get('/roles/{role}/edit', [AdminRoleController::class, 'edit'])->name('roles.edit'); Route::patch('/roles/{role}', [AdminRoleController::class, 'update'])->name('roles.update'); Route::post('/roles/{role}/assign-users', [AdminRoleController::class, 'assignUsers'])->name('roles.assign-users'); Route::delete('/roles/{role}/users/{user}', [AdminRoleController::class, 'removeUser'])->name('roles.remove-user'); Route::get('/budgets', [BudgetController::class, 'index'])->name('budgets.index'); Route::get('/budgets/create', [BudgetController::class, 'create'])->name('budgets.create'); Route::post('/budgets', [BudgetController::class, 'store'])->name('budgets.store'); Route::get('/budgets/{budget}', [BudgetController::class, 'show'])->name('budgets.show'); Route::get('/budgets/{budget}/edit', [BudgetController::class, 'edit'])->name('budgets.edit'); Route::patch('/budgets/{budget}', [BudgetController::class, 'update'])->name('budgets.update'); Route::post('/budgets/{budget}/submit', [BudgetController::class, 'submit'])->name('budgets.submit'); Route::post('/budgets/{budget}/approve', [BudgetController::class, 'approve'])->name('budgets.approve'); Route::post('/budgets/{budget}/activate', [BudgetController::class, 'activate'])->name('budgets.activate'); Route::post('/budgets/{budget}/close', [BudgetController::class, 'close'])->name('budgets.close'); Route::delete('/budgets/{budget}', [BudgetController::class, 'destroy'])->name('budgets.destroy'); Route::get('/transactions', [TransactionController::class, 'index'])->name('transactions.index'); Route::get('/transactions/create', [TransactionController::class, 'create'])->name('transactions.create'); Route::post('/transactions', [TransactionController::class, 'store'])->name('transactions.store'); Route::get('/transactions/{transaction}', [TransactionController::class, 'show'])->name('transactions.show'); Route::get('/transactions/{transaction}/edit', [TransactionController::class, 'edit'])->name('transactions.edit'); Route::patch('/transactions/{transaction}', [TransactionController::class, 'update'])->name('transactions.update'); Route::delete('/transactions/{transaction}', [TransactionController::class, 'destroy'])->name('transactions.destroy'); // Issue Tracker Routes Route::get('/issues', [IssueController::class, 'index'])->name('issues.index'); Route::get('/issues/create', [IssueController::class, 'create'])->name('issues.create'); Route::post('/issues', [IssueController::class, 'store'])->name('issues.store'); Route::get('/issues/{issue}', [IssueController::class, 'show'])->name('issues.show'); Route::get('/issues/{issue}/edit', [IssueController::class, 'edit'])->name('issues.edit'); Route::patch('/issues/{issue}', [IssueController::class, 'update'])->name('issues.update'); Route::delete('/issues/{issue}', [IssueController::class, 'destroy'])->name('issues.destroy'); // Issue workflow actions Route::post('/issues/{issue}/assign', [IssueController::class, 'assign'])->name('issues.assign'); Route::patch('/issues/{issue}/status', [IssueController::class, 'updateStatus'])->name('issues.update-status'); // Issue comments and attachments Route::post('/issues/{issue}/comments', [IssueController::class, 'addComment'])->name('issues.comments.store'); Route::post('/issues/{issue}/attachments', [IssueController::class, 'uploadAttachment'])->name('issues.attachments.store'); Route::get('/issues/attachments/{attachment}/download', [IssueController::class, 'downloadAttachment'])->name('issues.attachments.download'); Route::delete('/issues/attachments/{attachment}', [IssueController::class, 'deleteAttachment'])->name('issues.attachments.destroy'); // Issue time tracking Route::post('/issues/{issue}/time-logs', [IssueController::class, 'logTime'])->name('issues.time-logs.store'); // Issue watchers Route::post('/issues/{issue}/watchers', [IssueController::class, 'addWatcher'])->name('issues.watchers.store'); Route::delete('/issues/{issue}/watchers', [IssueController::class, 'removeWatcher'])->name('issues.watchers.destroy'); // Issue Labels Management Route::get('/issue-labels', [IssueLabelController::class, 'index'])->name('issue-labels.index'); Route::get('/issue-labels/create', [IssueLabelController::class, 'create'])->name('issue-labels.create'); Route::post('/issue-labels', [IssueLabelController::class, 'store'])->name('issue-labels.store'); Route::get('/issue-labels/{issueLabel}/edit', [IssueLabelController::class, 'edit'])->name('issue-labels.edit'); Route::patch('/issue-labels/{issueLabel}', [IssueLabelController::class, 'update'])->name('issue-labels.update'); Route::delete('/issue-labels/{issueLabel}', [IssueLabelController::class, 'destroy'])->name('issue-labels.destroy'); // Issue Reports & Analytics Route::get('/issue-reports', [IssueReportsController::class, 'index'])->name('issue-reports.index'); // Payment Verification Routes Route::get('/payment-verifications', [PaymentVerificationController::class, 'index'])->name('payment-verifications.index'); Route::get('/payment-verifications/{payment}', [PaymentVerificationController::class, 'show'])->name('payment-verifications.show'); Route::post('/payment-verifications/{payment}/approve-cashier', [PaymentVerificationController::class, 'approveByCashier'])->name('payment-verifications.approve-cashier'); Route::post('/payment-verifications/{payment}/approve-accountant', [PaymentVerificationController::class, 'approveByAccountant'])->name('payment-verifications.approve-accountant'); Route::post('/payment-verifications/{payment}/approve-chair', [PaymentVerificationController::class, 'approveByChair'])->name('payment-verifications.approve-chair'); Route::post('/payment-verifications/{payment}/reject', [PaymentVerificationController::class, 'reject'])->name('payment-verifications.reject'); Route::get('/payment-verifications/{payment}/receipt', [PaymentVerificationController::class, 'downloadReceipt'])->name('payment-verifications.download-receipt'); // Membership Activation Routes Route::get('/members/{member}/activate', [AdminMemberController::class, 'showActivate'])->name('members.activate'); Route::post('/members/{member}/activate', [AdminMemberController::class, 'activate'])->name('members.activate.store'); // Document Categories Management Route::get('/document-categories', [DocumentCategoryController::class, 'index'])->name('document-categories.index'); Route::get('/document-categories/create', [DocumentCategoryController::class, 'create'])->name('document-categories.create'); Route::post('/document-categories', [DocumentCategoryController::class, 'store'])->name('document-categories.store'); Route::get('/document-categories/{documentCategory}/edit', [DocumentCategoryController::class, 'edit'])->name('document-categories.edit'); Route::patch('/document-categories/{documentCategory}', [DocumentCategoryController::class, 'update'])->name('document-categories.update'); Route::delete('/document-categories/{documentCategory}', [DocumentCategoryController::class, 'destroy'])->name('document-categories.destroy'); // Document Management (with Version Control) Route::get('/documents/statistics', [DocumentController::class, 'statistics']) ->middleware('can:view_document_statistics') ->name('documents.statistics'); Route::get('/documents', [DocumentController::class, 'index'])->name('documents.index'); Route::get('/documents/create', [DocumentController::class, 'create'])->name('documents.create'); Route::post('/documents', [DocumentController::class, 'store'])->name('documents.store'); Route::get('/documents/{document}', [DocumentController::class, 'show'])->name('documents.show'); Route::get('/documents/{document}/edit', [DocumentController::class, 'edit'])->name('documents.edit'); Route::patch('/documents/{document}', [DocumentController::class, 'update'])->name('documents.update'); Route::delete('/documents/{document}', [DocumentController::class, 'destroy'])->name('documents.destroy'); // Document Version Control Route::post('/documents/{document}/upload-version', [DocumentController::class, 'uploadNewVersion'])->name('documents.upload-version'); Route::post('/documents/{document}/versions/{version}/promote', [DocumentController::class, 'promoteVersion'])->name('documents.promote-version'); Route::get('/documents/{document}/versions/{version}/download', [DocumentController::class, 'downloadVersion'])->name('documents.download-version'); // Document Archive/Restore Route::post('/documents/{document}/archive', [DocumentController::class, 'archive'])->name('documents.archive'); Route::post('/documents/{document}/restore', [DocumentController::class, 'restore'])->name('documents.restore'); // System Settings (requires manage_system_settings permission) Route::middleware('can:manage_system_settings')->prefix('settings')->name('settings.')->group(function () { Route::get('/', [\App\Http\Controllers\Admin\SystemSettingsController::class, 'index'])->name('index'); Route::get('/general', [\App\Http\Controllers\Admin\SystemSettingsController::class, 'general'])->name('general'); Route::post('/general', [\App\Http\Controllers\Admin\SystemSettingsController::class, 'updateGeneral'])->name('general.update'); Route::get('/features', [\App\Http\Controllers\Admin\SystemSettingsController::class, 'features'])->name('features'); Route::post('/features', [\App\Http\Controllers\Admin\SystemSettingsController::class, 'updateFeatures'])->name('features.update'); Route::get('/security', [\App\Http\Controllers\Admin\SystemSettingsController::class, 'security'])->name('security'); Route::post('/security', [\App\Http\Controllers\Admin\SystemSettingsController::class, 'updateSecurity'])->name('security.update'); Route::get('/notifications', [\App\Http\Controllers\Admin\SystemSettingsController::class, 'notifications'])->name('notifications'); Route::post('/notifications', [\App\Http\Controllers\Admin\SystemSettingsController::class, 'updateNotifications'])->name('notifications.update'); Route::get('/advanced', [\App\Http\Controllers\Admin\SystemSettingsController::class, 'advanced'])->name('advanced'); Route::post('/advanced', [\App\Http\Controllers\Admin\SystemSettingsController::class, 'updateAdvanced'])->name('advanced.update'); }); }); require __DIR__.'/auth.php';