group(function () { Route::prefix('auth')->group(function () { Route::get('register/captcha', [RegisterController::class, 'captcha']); Route::post('register', [RegisterController::class, 'store']); Route::post('login', [AuthController::class, 'login']); Route::post('refresh', [AuthController::class, 'refresh'])->middleware('jwt.auth'); Route::post('logout', [AuthController::class, 'logout'])->middleware('auth:api'); Route::get('me', [AuthController::class, 'me'])->middleware('auth:api'); }); Route::prefix('policies')->group(function () { Route::get('school', [PolicyController::class, 'school']); Route::get('picture', [PolicyController::class, 'picture']); }); Route::prefix('pages')->group(function () { Route::get('privacy', [PageController::class, 'privacyPolicy']); Route::get('terms', [PageController::class, 'termsOfService']); Route::get('help', [PageController::class, 'helpCenter']); Route::post('contact', [PageController::class, 'submitContact']); }); Route::post('contact', [SupportContactController::class, 'send']); Route::prefix('frontend')->group(function () { Route::get('/', [FrontendController::class, 'index']); Route::get('facility', [FrontendController::class, 'facility']); Route::get('team', [FrontendController::class, 'team']); Route::get('call-to-action', [FrontendController::class, 'callToAction']); Route::get('testimonial', [FrontendController::class, 'testimonial']); Route::get('not-found', [FrontendController::class, 'notFound']); Route::get('me', [FrontendController::class, 'fetchUser'])->middleware('auth:api'); }); Route::get('health', [HealthController::class, 'index']); Route::get('system/db-check', [DatabaseHealthController::class, 'index']); Route::middleware('auth:api')->prefix('preferences')->group(function () { Route::get('/', [PreferencesController::class, 'show']); Route::post('/', [PreferencesController::class, 'store']); Route::get('list', [PreferencesController::class, 'index']); Route::get('{userId}', [PreferencesController::class, 'showForUser']); Route::put('{userId}', [PreferencesController::class, 'updateForUser']); Route::delete('{userId}', [PreferencesController::class, 'destroy']); }); Route::middleware('auth:api')->prefix('nav-builder')->group(function () { Route::get('menu', [NavBuilderController::class, 'menu']); Route::get('data', [NavBuilderController::class, 'data']); Route::post('/', [NavBuilderController::class, 'store']); Route::delete('{id}', [NavBuilderController::class, 'destroy']); Route::post('reorder', [NavBuilderController::class, 'reorder']); }); Route::middleware('auth:api')->prefix('landing')->group(function () { Route::get('/', [LandingPageController::class, 'index']); Route::get('teacher', [LandingPageController::class, 'teacher']); Route::get('parent', [LandingPageController::class, 'parent']); Route::get('administrator', [LandingPageController::class, 'administrator']); Route::get('admin', [LandingPageController::class, 'admin']); Route::get('student', [LandingPageController::class, 'student']); Route::get('guest', [LandingPageController::class, 'guest']); }); Route::middleware('auth:api')->prefix('info-icon')->group(function () { Route::get('profile', [InfoIconController::class, 'profileIcon']); }); Route::middleware('auth:api')->prefix('administrator')->group(function () { Route::get('absence', [AdministratorAbsenceController::class, 'index']); Route::post('absence', [AdministratorAbsenceController::class, 'store']); Route::get('dashboard/metrics', [AdministratorDashboardController::class, 'metrics']); Route::get('dashboard/user-search', [AdministratorDashboardController::class, 'userSearch']); Route::get('teacher-submissions', [AdministratorTeacherSubmissionController::class, 'index']); Route::post('teacher-submissions/notify', [AdministratorTeacherSubmissionController::class, 'notify']); Route::get('teacher-class/assignments', [TeacherClassAssignmentController::class, 'index']); Route::post('teacher-class/assign', [TeacherClassAssignmentController::class, 'store']); Route::post('teacher-class/delete', [TeacherClassAssignmentController::class, 'destroy']); Route::get('notifications/alerts', [AdministratorNotificationController::class, 'alerts']); Route::post('notifications/alerts', [AdministratorNotificationController::class, 'saveAlerts']); Route::get('notifications/print-recipients', [AdministratorNotificationController::class, 'printRecipients']); Route::post('notifications/print-recipients', [AdministratorNotificationController::class, 'savePrintRecipients']); Route::get('enrollment-withdrawal', [AdministratorEnrollmentController::class, 'index']); Route::get('enrollment-withdrawal/new-students', [AdministratorEnrollmentController::class, 'newStudents']); Route::post('enrollment-withdrawal/update-statuses', [AdministratorEnrollmentController::class, 'updateStatuses']); Route::get('emergency-contacts', [AdministratorEmergencyContactController::class, 'index']); Route::get('emergency-contacts/data', [AdministratorEmergencyContactController::class, 'index']); Route::get('emergency-contacts/{contactId}', [AdministratorEmergencyContactController::class, 'show']); Route::patch('emergency-contacts/{contactId}', [AdministratorEmergencyContactController::class, 'update']); Route::delete('emergency-contacts/{contactId}', [AdministratorEmergencyContactController::class, 'destroy']); }); Route::middleware('auth:api')->prefix('attendance')->group(function () { // Teacher Route::get('/teacher/grid', [TeacherAttendanceApiController::class, 'grid']); Route::get('/teacher/form', [TeacherAttendanceApiController::class, 'form']); Route::post('/teacher/submit', [TeacherAttendanceApiController::class, 'submit']); // Admin daily/student attendance Route::get('/admin/daily', [AdminAttendanceApiController::class, 'dailyData']); Route::post('/admin/update', [AdminAttendanceApiController::class, 'updateManagement']); Route::post('/admin/add-entry', [AdminAttendanceApiController::class, 'addEntry']); // Staff/admin monthly/admin attendance Route::get('/staff/month', [StaffAttendanceApiController::class, 'monthData']); Route::get('/staff/admins', [StaffAttendanceApiController::class, 'admins']); Route::post('/staff/admins/save', [StaffAttendanceApiController::class, 'saveAdmins']); Route::post('/staff/cell', [StaffAttendanceApiController::class, 'saveCell']); Route::get('/staff/month-csv', [StaffAttendanceApiController::class, 'monthCsv']); Route::prefix('late-slip-logs')->group(function () { Route::get('/', [LateSlipLogsController::class, 'index']); Route::get('{id}', [LateSlipLogsController::class, 'show']); Route::delete('{id}', [LateSlipLogsController::class, 'destroy']); }); }); Route::prefix('attendance-tracking')->group(function () { Route::get('/pending-violations', [AttendanceTrackingController::class, 'pendingViolations']); Route::get('/notified-violations', [AttendanceTrackingController::class, 'notifiedViolations']); Route::get('/student-case/{studentId}', [AttendanceTrackingController::class, 'studentCase']); Route::post('/record', [AttendanceTrackingController::class, 'record']); Route::post('/send-auto-emails', [AttendanceTrackingController::class, 'sendAutoEmails']); Route::get('/compose', [AttendanceTrackingController::class, 'compose']); Route::post('/send-manual-email', [AttendanceTrackingController::class, 'sendManualEmail']); Route::get('/parents-info', [AttendanceTrackingController::class, 'parentsInfo']); Route::post('/save-notification-note', [AttendanceTrackingController::class, 'saveNotificationNote']); }); Route::prefix('assignments')->group(function () { Route::get('/', [AssignmentApiController::class, 'index']); Route::post('/', [AssignmentApiController::class, 'store']); Route::get('/class-assignment-data', [AssignmentApiController::class, 'classAssignmentData']); }); Route::middleware('auth:api')->group(function () { Route::get('dashboard/route', [DashboardController::class, 'route']); Route::get('emergency-contacts', [AdministratorEmergencyContactController::class, 'index']); Route::prefix('utilities/phone')->group(function () { Route::post('format', [PhoneFormatterController::class, 'format']); }); Route::prefix('ui')->group(function () { Route::post('style', [UiController::class, 'style']); }); Route::prefix('support')->group(function () { Route::get('/', [ApiSupportController::class, 'index']); Route::post('/', [ApiSupportController::class, 'store']); Route::get('teacher', [ApiSupportController::class, 'teacher']); }); Route::prefix('staff')->group(function () { Route::get('/', [StaffController::class, 'index']); Route::get('{id}', [StaffController::class, 'show']); Route::post('/', [StaffController::class, 'store']); Route::patch('{id}', [StaffController::class, 'update']); Route::delete('{id}', [StaffController::class, 'destroy']); }); Route::prefix('messages')->group(function () { Route::get('/', [MessagesController::class, 'index']); Route::get('inbox', [MessagesController::class, 'inbox']); Route::get('sent', [MessagesController::class, 'sent']); Route::get('drafts', [MessagesController::class, 'drafts']); Route::get('trash', [MessagesController::class, 'trash']); Route::post('/', [MessagesController::class, 'store']); Route::post('receive', [MessagesController::class, 'receive']); Route::get('recipients/{type}', [MessagesController::class, 'recipients']); Route::get('{id}', [MessagesController::class, 'show']); Route::patch('{id}', [MessagesController::class, 'update']); Route::delete('{id}', [MessagesController::class, 'destroy']); }); Route::prefix('settings')->group(function () { Route::get('/', [SettingsController::class, 'index']); Route::patch('/', [SettingsController::class, 'update']); }); Route::prefix('ip-bans')->group(function () { Route::get('/', [IpBanController::class, 'index']); Route::get('{id}', [IpBanController::class, 'show']); Route::post('ban', [IpBanController::class, 'ban']); Route::post('unban', [IpBanController::class, 'unban']); }); Route::prefix('class-sections')->group(function () { Route::get('/', [ClassSectionController::class, 'index']); Route::post('/', [ClassSectionController::class, 'store']); Route::get('{classSection}', [ClassSectionController::class, 'show']); Route::put('{classSection}', [ClassSectionController::class, 'update']); Route::delete('{classSection}', [ClassSectionController::class, 'destroy']); Route::get('{classSectionId}/attendance', [ClassSectionController::class, 'attendance']); Route::post('seed-defaults', [ClassSectionController::class, 'seedDefaults']); }); Route::get('stats', [StatsController::class, 'index']); Route::prefix('notifications')->group(function () { Route::get('/', [ApiNotificationController::class, 'index']); Route::post('/', [ApiNotificationController::class, 'store']); Route::get('active', [ApiNotificationController::class, 'active']); Route::get('deleted', [ApiNotificationController::class, 'deleted']); Route::get('{notificationId}', [ApiNotificationController::class, 'show']); Route::patch('{notificationId}', [ApiNotificationController::class, 'update']); Route::delete('{notificationId}', [ApiNotificationController::class, 'destroy']); Route::post('{notificationId}/restore', [ApiNotificationController::class, 'restore']); Route::post('{notificationId}/read', [ApiNotificationController::class, 'markRead']); }); Route::prefix('role-permissions')->group(function () { Route::get('roles', [RolePermissionController::class, 'roles']); Route::post('roles', [RolePermissionController::class, 'storeRole']); Route::get('roles/{roleId}', [RolePermissionController::class, 'showRole']); Route::patch('roles/{roleId}', [RolePermissionController::class, 'updateRole']); Route::delete('roles/{roleId}', [RolePermissionController::class, 'deleteRole']); Route::get('users', [RolePermissionController::class, 'users']); Route::post('users/{userId}/roles', [RolePermissionController::class, 'assignRoles']); Route::get('permissions', [RolePermissionController::class, 'permissions']); Route::post('permissions', [RolePermissionController::class, 'storePermission']); Route::get('permissions/{permissionId}', [RolePermissionController::class, 'showPermission']); Route::patch('permissions/{permissionId}', [RolePermissionController::class, 'updatePermission']); Route::delete('permissions/{permissionId}', [RolePermissionController::class, 'deletePermission']); Route::get('roles/{roleId}/permissions', [RolePermissionController::class, 'rolePermissions']); Route::put('roles/{roleId}/permissions', [RolePermissionController::class, 'updateRolePermissions']); }); Route::prefix('role-switcher')->group(function () { Route::get('/', [RoleSwitcherController::class, 'index']); Route::post('switch', [RoleSwitcherController::class, 'switch']); }); Route::prefix('settings/school-calendar')->group(function () { Route::get('options', [SchoolCalendarController::class, 'options']); Route::get('events', [SchoolCalendarController::class, 'index']); Route::get('events/{eventId}', [SchoolCalendarController::class, 'show']); Route::post('events', [SchoolCalendarController::class, 'store']); Route::patch('events/{eventId}', [SchoolCalendarController::class, 'update']); Route::delete('events/{eventId}', [SchoolCalendarController::class, 'destroy']); }); Route::prefix('settings/events')->group(function () { Route::get('/', [EventController::class, 'index']); Route::post('/', [EventController::class, 'store']); Route::get('charges/list', [EventController::class, 'charges']); Route::post('{eventId}/charges', [EventController::class, 'updateCharges']); Route::get('charges/students', [EventController::class, 'studentsWithCharges']); Route::get('{eventId}', [EventController::class, 'show']); Route::patch('{eventId}', [EventController::class, 'update']); Route::delete('{eventId}', [EventController::class, 'destroy']); }); Route::prefix('whatsapp')->group(function () { Route::get('links', [WhatsappController::class, 'index']); Route::post('links', [WhatsappController::class, 'store']); Route::get('links/{linkId}', [WhatsappController::class, 'show']); Route::patch('links/{linkId}', [WhatsappController::class, 'update']); Route::delete('links/{linkId}', [WhatsappController::class, 'destroy']); Route::get('parent-contacts', [WhatsappController::class, 'parentContacts']); Route::get('parent-contacts-by-class', [WhatsappController::class, 'parentContactsByClass']); Route::post('invites/send', [WhatsappController::class, 'sendInvites']); Route::post('membership', [WhatsappController::class, 'updateMembership']); }); Route::prefix('teachers')->group(function () { Route::get('classes', [TeacherController::class, 'classes']); Route::post('classes/switch', [TeacherController::class, 'switchClass']); Route::get('absence/form', [TeacherController::class, 'absenceForm']); Route::post('absence', [TeacherController::class, 'submitAbsence']); }); Route::prefix('students')->group(function () { Route::get('/', [StudentApiController::class, 'index']); Route::post('/', [StudentApiController::class, 'store']); Route::get('assignments', [StudentApiController::class, 'assignments']); Route::post('assign-class', [StudentApiController::class, 'assignClass']); Route::post('remove-class', [StudentApiController::class, 'removeClass']); Route::get('removed', [StudentApiController::class, 'removed']); Route::post('set-active', [StudentApiController::class, 'setActive']); Route::post('auto-distribute', [StudentApiController::class, 'autoDistribute']); Route::get('promotion-totals', [StudentApiController::class, 'promotionTotals']); Route::patch('{studentId}', [StudentApiController::class, 'update']); Route::delete('{studentId}', [StudentApiController::class, 'destroy']); Route::get('{studentId}', [StudentApiController::class, 'show']); Route::get('{studentId}/classes', [StudentApiController::class, 'classes']); Route::post('{studentId}/classes', [StudentApiController::class, 'assignClassForStudent']); Route::delete('{studentId}/classes/{classSectionId}', [StudentApiController::class, 'removeClassForStudent']); Route::post('{studentId}/promote', [StudentApiController::class, 'promote']); Route::get('{studentId}/attendance', [StudentApiController::class, 'attendance']); Route::get('{studentId}/incidents', [StudentApiController::class, 'incidents']); Route::get('{studentId}/scores', [StudentApiController::class, 'scores']); Route::get('{studentId}/notes', [StudentApiController::class, 'notes']); Route::get('{studentId}/parents', [StudentApiController::class, 'parents']); Route::get('{studentId}/emergency-contacts', [StudentApiController::class, 'emergencyContacts']); Route::post('{studentId}/emergency-contacts', [StudentApiController::class, 'addEmergencyContact']); Route::patch('{studentId}/emergency-contacts/{contactId}', [StudentApiController::class, 'updateEmergencyContact']); Route::post('{studentId}/rfid', [StudentApiController::class, 'updateRfid']); Route::post('{studentId}/photo', [StudentApiController::class, 'uploadPhoto']); Route::get('{studentId}/photo', [StudentApiController::class, 'photo']); Route::get('{studentId}/report-card', [ReportCardsController::class, 'studentReport']); Route::get('{studentId}/score-card', [StudentApiController::class, 'scoreCard']); }); Route::prefix('parents')->group(function () { Route::get('attendance', [ParentApiController::class, 'attendance']); Route::get('invoices', [ParentApiController::class, 'invoices']); Route::get('enrollments', [ParentApiController::class, 'enrollments']); Route::post('enrollments', [ParentApiController::class, 'updateEnrollments']); Route::get('registration', [ParentApiController::class, 'registration']); Route::post('registration', [ParentApiController::class, 'storeRegistration']); Route::patch('students/{studentId}', [ParentApiController::class, 'updateStudent']); Route::delete('students/{studentId}', [ParentApiController::class, 'deleteStudent']); Route::get('emergency-contacts', [ParentApiController::class, 'emergencyContacts']); Route::post('emergency-contacts', [ParentApiController::class, 'storeEmergencyContact']); Route::patch('emergency-contacts/{contactId}', [ParentApiController::class, 'updateEmergencyContact']); Route::get('profile', [ParentApiController::class, 'profile']); Route::patch('profile', [ParentApiController::class, 'updateProfile']); Route::get('events', [ParentApiController::class, 'events']); Route::post('events/participation', [ParentApiController::class, 'updateParticipation']); Route::get('attendance-reports/form', [ParentAttendanceReportApiController::class, 'form']); Route::post('attendance-reports', [ParentAttendanceReportApiController::class, 'submit']); Route::get('attendance-reports', [ParentAttendanceReportApiController::class, 'list']); Route::post('attendance-reports/check-existing', [ParentAttendanceReportApiController::class, 'checkExisting']); Route::patch('attendance-reports/{reportId}', [ParentAttendanceReportApiController::class, 'update']); }); Route::prefix('users')->group(function () { Route::get('/', [UserController::class, 'index']); Route::post('/', [UserController::class, 'store']); Route::get('login-activity', [UserController::class, 'loginActivity']); Route::put('{userId}', [UserController::class, 'update']); Route::delete('{userId}', [UserController::class, 'destroy']); }); Route::prefix('broadcast-email')->group(function () { Route::get('options', [BroadcastEmailController::class, 'options']); Route::post('send', [BroadcastEmailController::class, 'send']); Route::post('upload-image', [BroadcastEmailController::class, 'uploadImage']); }); Route::prefix('email')->group(function () { Route::get('senders', [EmailController::class, 'senders']); Route::post('send', [EmailController::class, 'send']); }); Route::prefix('email-extractor')->group(function () { Route::get('emails', [EmailExtractorController::class, 'emails']); Route::post('compare', [EmailExtractorController::class, 'compare']); }); Route::prefix('communications')->group(function () { Route::get('options', [CommunicationController::class, 'options']); Route::get('students/{studentId}/families', [CommunicationController::class, 'families']); Route::get('families/{familyId}/guardians', [CommunicationController::class, 'guardians']); Route::post('preview', [CommunicationController::class, 'preview']); Route::post('send', [CommunicationController::class, 'send']); }); Route::prefix('inventory')->group(function () { Route::get('items', [InventoryController::class, 'index']); Route::get('items/{id}', [InventoryController::class, 'show']); Route::post('items', [InventoryController::class, 'store']); Route::patch('items/{id}', [InventoryController::class, 'update']); Route::delete('items/{id}', [InventoryController::class, 'destroy']); Route::post('items/{id}/audit', [InventoryController::class, 'audit']); Route::post('items/{id}/adjust', [InventoryController::class, 'adjust']); Route::get('summary/{type}', [InventoryController::class, 'summary']); Route::get('summary-all', [InventoryController::class, 'summaryAll']); Route::get('teacher-distribution', [InventoryController::class, 'teacherDistribution']); Route::post('teacher-distribution', [InventoryController::class, 'teacherDistributionStore']); Route::get('categories', [InventoryCategoryController::class, 'index']); Route::post('categories', [InventoryCategoryController::class, 'store']); Route::patch('categories/{id}', [InventoryCategoryController::class, 'update']); Route::delete('categories/{id}', [InventoryCategoryController::class, 'destroy']); Route::get('movements', [InventoryMovementController::class, 'index']); Route::post('movements', [InventoryMovementController::class, 'store']); Route::patch('movements/{id}', [InventoryMovementController::class, 'update']); Route::delete('movements/{id}', [InventoryMovementController::class, 'destroy']); Route::post('movements/bulk-delete', [InventoryMovementController::class, 'bulkDelete']); Route::get('suppliers', [SupplierController::class, 'index']); Route::post('suppliers', [SupplierController::class, 'store']); Route::patch('suppliers/{id}', [SupplierController::class, 'update']); Route::delete('suppliers/{id}', [SupplierController::class, 'destroy']); Route::get('supply-categories', [SupplyCategoryController::class, 'index']); Route::post('supply-categories', [SupplyCategoryController::class, 'store']); Route::patch('supply-categories/{id}', [SupplyCategoryController::class, 'update']); Route::delete('supply-categories/{id}', [SupplyCategoryController::class, 'destroy']); }); Route::prefix('family-admin')->group(function () { Route::get('/', [FamilyAdminController::class, 'index']); Route::get('search', [FamilyAdminController::class, 'search']); Route::get('card', [FamilyAdminController::class, 'card']); Route::post('compose-email', [FamilyAdminController::class, 'composeEmail']); }); Route::prefix('families')->group(function () { Route::get('by-student/{studentId}', [FamilyController::class, 'familiesByStudent']); Route::get('{familyId}/guardians', [FamilyController::class, 'guardiansByFamily']); Route::post('bootstrap', [FamilyController::class, 'bootstrap']); Route::post('attach-second/by-user', [FamilyController::class, 'attachSecondByUser']); Route::post('attach-second/by-email', [FamilyController::class, 'attachSecondByEmail']); Route::post('set-primary-home', [FamilyController::class, 'setPrimaryHome']); Route::post('set-guardian-flags', [FamilyController::class, 'setGuardianFlags']); Route::post('unlink-guardian', [FamilyController::class, 'unlinkGuardian']); Route::post('unlink-student', [FamilyController::class, 'unlinkStudent']); Route::post('import-legacy-second-parents', [FamilyController::class, 'importSecondParentsFromLegacy']); }); Route::prefix('competition-scores')->group(function () { Route::get('/', [CompetitionScoresController::class, 'index']); Route::get('{id}', [CompetitionScoresController::class, 'edit']); Route::post('{id}', [CompetitionScoresController::class, 'save']); }); Route::prefix('discounts')->group(function () { Route::get('options', [DiscountController::class, 'options']); Route::post('apply', [DiscountController::class, 'apply']); Route::get('vouchers', [DiscountController::class, 'listVouchers']); Route::get('vouchers/{id}', [DiscountController::class, 'showVoucher']); Route::post('vouchers', [DiscountController::class, 'storeVoucher']); Route::put('vouchers/{id}', [DiscountController::class, 'updateVoucher']); Route::delete('vouchers/{id}', [DiscountController::class, 'deleteVoucher']); }); Route::prefix('expenses')->group(function () { Route::get('/', [ExpenseController::class, 'index']); Route::get('options', [ExpenseController::class, 'options']); Route::get('{id}', [ExpenseController::class, 'show']); Route::post('/', [ExpenseController::class, 'store']); Route::put('{id}', [ExpenseController::class, 'update']); Route::post('{id}/status', [ExpenseController::class, 'updateStatus']); }); Route::prefix('finance')->group(function () { Route::get('financial-report', [FinancialController::class, 'report']); Route::get('financial-summary', [FinancialController::class, 'summary']); Route::get('financial-report/csv', [FinancialController::class, 'downloadCsv']); Route::get('financial-report/pdf', [FinancialController::class, 'downloadPdf']); Route::get('unpaid-parents', [FinancialController::class, 'unpaidParents']); Route::post('fees/refund', [FeeCalculationController::class, 'refund']); Route::post('fees/tuition-total', [FeeCalculationController::class, 'tuitionTotal']); Route::prefix('refunds')->group(function () { Route::post('recalculate-overpayments', [RefundController::class, 'recalculateOverpayments']); Route::get('parent-balances/{parentId}', [RefundController::class, 'parentBalances']); Route::get('/', [RefundController::class, 'index']); Route::post('/', [RefundController::class, 'store']); Route::get('{refundId}', [RefundController::class, 'show']); Route::patch('{refundId}', [RefundController::class, 'update']); Route::delete('{refundId}', [RefundController::class, 'destroy']); Route::post('{refundId}/approve', [RefundController::class, 'approve']); Route::post('{refundId}/reject', [RefundController::class, 'reject']); Route::post('{refundId}/payments', [RefundController::class, 'recordPayment']); }); Route::prefix('reimbursements')->group(function () { Route::get('under-processing', [ReimbursementController::class, 'underProcessing']); Route::post('mark-donation', [ReimbursementController::class, 'markDonation']); Route::post('batches', [ReimbursementController::class, 'createBatch']); Route::post('batches/assign', [ReimbursementController::class, 'updateBatchAssignment']); Route::post('batches/lock', [ReimbursementController::class, 'lockBatch']); Route::post('batches/admin-files', [ReimbursementController::class, 'uploadBatchAdminFile']); Route::get('batches/admin-files/{name}/{mode?}', [ReimbursementController::class, 'serveAdminCheckFile']); Route::post('batches/email', [ReimbursementController::class, 'sendBatchEmail']); Route::get('export', [ReimbursementController::class, 'export']); Route::get('batches/export', [ReimbursementController::class, 'exportBatch']); Route::get('reimbursed-expenses', [ReimbursementController::class, 'reimbursedExpenses']); Route::get('/', [ReimbursementController::class, 'index']); Route::post('/', [ReimbursementController::class, 'store']); Route::post('process', [ReimbursementController::class, 'process']); Route::put('{id}', [ReimbursementController::class, 'update']); }); Route::prefix('purchase-orders')->group(function () { Route::get('/', [PurchaseOrderController::class, 'index']); Route::get('options', [PurchaseOrderController::class, 'options']); Route::get('{id}', [PurchaseOrderController::class, 'show']); Route::post('/', [PurchaseOrderController::class, 'store']); Route::post('{id}/receive', [PurchaseOrderController::class, 'receive']); Route::post('{id}/cancel', [PurchaseOrderController::class, 'cancel']); }); Route::prefix('invoices')->group(function () { Route::get('management', [InvoiceController::class, 'management']); Route::post('generate', [InvoiceController::class, 'generate']); Route::get('parent/{parentId}', [InvoiceController::class, 'byParent']); Route::get('parent-payment', [InvoiceController::class, 'parentPayment']); Route::post('{invoiceId}/status', [InvoiceController::class, 'updateStatus']); Route::get('unpaid', [InvoiceController::class, 'unpaid']); Route::get('{invoiceId}/pdf', [InvoiceController::class, 'pdf']); }); Route::prefix('payments')->group(function () { Route::post('/', [PaymentController::class, 'store']); Route::get('parent/{parentId}', [PaymentController::class, 'byParent']); Route::post('{paymentId}/balance', [PaymentController::class, 'updateBalance']); }); Route::prefix('manual-pay')->group(function () { Route::get('search', [PaymentManualController::class, 'search']); Route::get('suggest', [PaymentManualController::class, 'suggest']); Route::post('invoices/{invoiceId}/payments', [PaymentManualController::class, 'record']); Route::put('payments/{paymentId}', [PaymentManualController::class, 'edit']); Route::get('files/{filename}', [PaymentManualController::class, 'file']); }); Route::prefix('event-charges')->group(function () { Route::get('/', [PaymentEventChargesController::class, 'index']); Route::post('/', [PaymentEventChargesController::class, 'store']); Route::get('parents/{parentId}/students', [PaymentEventChargesController::class, 'enrolledStudents']); }); Route::prefix('payment-notifications')->group(function () { Route::get('/', [PaymentNotificationController::class, 'index']); Route::post('send', [PaymentNotificationController::class, 'send']); }); Route::prefix('payment-transactions')->group(function () { Route::post('/', [PaymentTransactionController::class, 'store']); Route::get('payment/{paymentId}', [PaymentTransactionController::class, 'byPayment']); Route::post('{transactionId}/status', [PaymentTransactionController::class, 'updateStatus']); }); Route::prefix('paypal-transactions')->group(function () { Route::get('/', [PaypalTransactionsController::class, 'index']); Route::get('csv', [PaypalTransactionsController::class, 'downloadCsv']); }); Route::prefix('paypal')->group(function () { Route::get('redirect', [PaypalPaymentController::class, 'redirect']); Route::post('payments/{paymentId}/create', [PaypalPaymentController::class, 'create']); Route::post('execute', [PaypalPaymentController::class, 'execute']); Route::get('cancel', [PaypalPaymentController::class, 'cancel']); }); }); Route::prefix('files')->group(function () { Route::get('receipts/{name}', [FilesController::class, 'receipt']); Route::get('reimbursements/{name}', [FilesController::class, 'reimb']); Route::get('early-dismissal/{name}', [FilesController::class, 'earlyDismissalSignature']); Route::get('exams/teacher/{name}', [FilesController::class, 'examDraftTeacher']); Route::get('exams/final/{name}', [FilesController::class, 'examDraftFinal']); }); Route::prefix('reports/slips')->group(function () { Route::post('print', [SlipPrinterController::class, 'print']); Route::post('preview', [SlipPrinterController::class, 'preview']); Route::get('logs', [SlipPrinterController::class, 'logs']); Route::post('reprint', [SlipPrinterController::class, 'reprint']); }); Route::prefix('reports/stickers')->group(function () { Route::get('form-data', [StickersController::class, 'formData']); Route::get('students', [StickersController::class, 'studentsByClass']); Route::post('print', [StickersController::class, 'print']); }); Route::prefix('reports/report-cards')->group(function () { Route::get('meta', [ReportCardsController::class, 'meta']); Route::get('completeness', [ReportCardsController::class, 'completeness']); Route::get('acknowledgement', [ReportCardsController::class, 'acknowledgement']); Route::get('students/{studentId}', [ReportCardsController::class, 'studentReport']); Route::post('students/{studentId}', [ReportCardsController::class, 'studentReport']); Route::get('classes/{classSectionId}', [ReportCardsController::class, 'classReport']); Route::post('classes/{classSectionId}', [ReportCardsController::class, 'classReport']); }); Route::prefix('subjects/curriculum')->group(function () { Route::get('/', [SubjectCurriculumApiController::class, 'index']); Route::get('{id}', [SubjectCurriculumApiController::class, 'show']); Route::post('/', [SubjectCurriculumApiController::class, 'store']); Route::patch('{id}', [SubjectCurriculumApiController::class, 'update']); Route::delete('{id}', [SubjectCurriculumApiController::class, 'destroy']); }); Route::prefix('exams/drafts')->group(function () { Route::get('teacher', [ExamDraftApiController::class, 'teacherIndex']); Route::post('teacher', [ExamDraftApiController::class, 'teacherStore']); Route::get('admin', [ExamDraftApiController::class, 'adminIndex']); Route::post('admin/legacy', [ExamDraftApiController::class, 'adminUploadLegacy']); Route::post('admin/review', [ExamDraftApiController::class, 'adminReview']); }); Route::prefix('configuration')->group(function () { Route::get('/', [ConfigurationAdminController::class, 'index']); Route::get('key/{config_key}', [ConfigurationAdminController::class, 'getByKey']); Route::post('/', [ConfigurationAdminController::class, 'store']); Route::patch('{id}', [ConfigurationAdminController::class, 'update']); Route::delete('{id}', [ConfigurationAdminController::class, 'destroy']); }); Route::prefix('system')->group(function () { Route::get('semester-range/school-year', [SemesterRangeController::class, 'schoolYearRange']); Route::get('semester-range/semester', [SemesterRangeController::class, 'semesterRange']); Route::get('semester-range/normalize', [SemesterRangeController::class, 'normalize']); Route::get('semester-range/resolve', [SemesterRangeController::class, 'resolve']); Route::get('school-ids/student', [SchoolIdController::class, 'generateStudent']); Route::get('school-ids/user', [SchoolIdController::class, 'generateUser']); Route::post('school-ids/assign', [SchoolIdController::class, 'assign']); }); Route::prefix('incidents')->group(function () { Route::get('current', [IncidentApiController::class, 'current']); Route::get('history', [IncidentApiController::class, 'history']); Route::get('processed', [IncidentApiController::class, 'processed']); Route::get('analysis', [IncidentApiController::class, 'analysis']); Route::get('grades/{gradeId}/students', [IncidentApiController::class, 'studentsByGrade']); Route::post('/', [IncidentApiController::class, 'store']); Route::post('{incidentId}/state', [IncidentApiController::class, 'updateState']); Route::post('{incidentId}/close', [IncidentApiController::class, 'close']); Route::post('{incidentId}/cancel', [IncidentApiController::class, 'cancel']); }); Route::prefix('scores')->group(function () { Route::get('overview', [ScoreDashboardController::class, 'overview']); Route::post('lock', [ScoreDashboardController::class, 'lock']); Route::get('student-scores', [ScoreDashboardController::class, 'studentScores']); Route::prefix('projects')->group(function () { Route::get('/', [ProjectScoreController::class, 'index']); Route::get('by-year', [ProjectScoreController::class, 'bySchoolYear']); Route::post('/', [ProjectScoreController::class, 'update']); Route::post('columns', [ProjectScoreController::class, 'addColumn']); }); Route::prefix('quizzes')->group(function () { Route::get('/', [QuizScoreController::class, 'index']); Route::get('by-year', [QuizScoreController::class, 'bySchoolYear']); Route::post('/', [QuizScoreController::class, 'update']); Route::post('columns', [QuizScoreController::class, 'addColumn']); }); Route::prefix('homework')->group(function () { Route::get('/', [HomeworkScoreController::class, 'index']); Route::get('by-year', [HomeworkScoreController::class, 'bySchoolYear']); Route::post('/', [HomeworkScoreController::class, 'update']); Route::post('columns', [HomeworkScoreController::class, 'addColumn']); }); Route::prefix('midterm')->group(function () { Route::get('/', [MidtermScoreController::class, 'index']); Route::get('by-year', [MidtermScoreController::class, 'bySchoolYear']); Route::post('/', [MidtermScoreController::class, 'update']); }); Route::prefix('final')->group(function () { Route::get('/', [FinalScoreController::class, 'index']); Route::get('by-year', [FinalScoreController::class, 'bySchoolYear']); Route::post('/', [FinalScoreController::class, 'update']); }); Route::prefix('participation')->group(function () { Route::get('/', [ParticipationScoreController::class, 'index']); Route::get('by-year', [ParticipationScoreController::class, 'bySchoolYear']); Route::post('/', [ParticipationScoreController::class, 'update']); }); Route::get('predictor', [ScorePredictorController::class, 'index']); Route::prefix('comments')->group(function () { Route::get('/', [ScoreCommentApiController::class, 'index']); Route::post('/', [ScoreCommentApiController::class, 'store']); Route::put('/', [ScoreCommentApiController::class, 'update']); }); }); Route::prefix('grading')->group(function () { Route::get('overview', [GradingApiController::class, 'overview']); Route::get('scores/{type}/{classSectionId}/{studentId}', [GradingApiController::class, 'show']); Route::put('scores', [GradingApiController::class, 'update']); Route::post('locks/toggle', [GradingApiController::class, 'toggleLock']); Route::post('locks/all', [GradingApiController::class, 'lockAll']); Route::post('refresh', [GradingApiController::class, 'refresh']); Route::get('placement', [GradingApiController::class, 'placement']); Route::post('placement/level', [GradingApiController::class, 'updatePlacementLevel']); Route::post('placement/levels', [GradingApiController::class, 'updatePlacementLevels']); Route::post('placement/batch', [GradingApiController::class, 'createPlacementBatch']); Route::get('placement/batch/{batchId}', [GradingApiController::class, 'showPlacementBatch']); Route::put('placement/batch/{batchId}', [GradingApiController::class, 'updatePlacementBatch']); Route::get('below-sixty', [GradingApiController::class, 'belowSixty']); Route::get('below-sixty/email', [GradingApiController::class, 'belowSixtyEmail']); Route::post('below-sixty/email', [GradingApiController::class, 'sendBelowSixtyEmail']); Route::post('below-sixty/status', [GradingApiController::class, 'updateBelowSixtyStatus']); Route::get('below-sixty/meeting', [GradingApiController::class, 'belowSixtyMeeting']); Route::post('below-sixty/meeting', [GradingApiController::class, 'saveBelowSixtyMeeting']); Route::get('homework-tracking', [HomeworkTrackingController::class, 'index']); }); Route::prefix('extra-charges')->group(function () { Route::get('/', [ExtraChargesController::class, 'list']); Route::get('options', [ExtraChargesController::class, 'options']); Route::get('parents', [ExtraChargesController::class, 'parentOptions']); Route::get('invoices', [ExtraChargesController::class, 'invoicesForParent']); Route::post('/', [ExtraChargesController::class, 'store']); Route::put('{id}', [ExtraChargesController::class, 'update']); Route::post('{id}/void', [ExtraChargesController::class, 'void']); Route::post('{id}/reverse', [ExtraChargesController::class, 'reverse']); }); Route::prefix('class-prep')->group(function () { Route::get('/', [ClassPreparationController::class, 'index']); Route::post('mark-printed', [ClassPreparationController::class, 'markPrinted']); Route::post('adjustments', [ClassPreparationController::class, 'saveAdjustments']); Route::post('print/{classSectionId}/{schoolYear}', [ClassPreparationController::class, 'print']); Route::get('sticker-counts', [ClassPreparationController::class, 'stickerCounts']); Route::get('classes/{classSectionId}/students', [ClassPreparationController::class, 'studentsByClass']); }); Route::prefix('class-progress')->group(function () { Route::get('meta', [ClassProgressController::class, 'meta']); Route::get('/', [ClassProgressController::class, 'index']); Route::post('/', [ClassProgressController::class, 'store']); Route::get('{class_progress}', [ClassProgressController::class, 'show']); Route::patch('{class_progress}', [ClassProgressController::class, 'update']); Route::delete('{class_progress}', [ClassProgressController::class, 'destroy']); Route::get('{class_progress}/attachment', [ClassProgressController::class, 'downloadLegacyAttachment']); Route::get('attachments/{attachment}', [ClassProgressController::class, 'downloadAttachment']); }); Route::prefix('badges')->group(function () { Route::get('form-data', [BadgeController::class, 'formData']); Route::post('pdf', [BadgeController::class, 'generatePdf']); Route::get('print-status', [BadgeController::class, 'printStatus']); Route::post('log-print', [BadgeController::class, 'logPrint']); }); }); }); Route::prefix('attendance-comment-templates')->group(function () { Route::get('/', [AttendanceCommentTemplateController::class, 'index']); Route::get('list-data', [AttendanceCommentTemplateController::class, 'listData']); Route::get('{id}', [AttendanceCommentTemplateController::class, 'show']); Route::post('/', [AttendanceCommentTemplateController::class, 'store']); Route::put('{id}', [AttendanceCommentTemplateController::class, 'update']); Route::delete('{id}', [AttendanceCommentTemplateController::class, 'destroy']); }); Route::prefix('attendance-tracking')->group(function () { Route::get('pending-violations', [AttendanceTrackingController::class, 'pendingViolations']); Route::get('notified-violations', [AttendanceTrackingController::class, 'notifiedViolations']); Route::get('student-case/{studentId}', [AttendanceTrackingController::class, 'studentCase']); Route::post('record', [AttendanceTrackingController::class, 'record']); Route::post('send-auto-emails', [AttendanceTrackingController::class, 'sendAutoEmails']); Route::get('compose', [AttendanceTrackingController::class, 'compose']); Route::post('send-manual-email', [AttendanceTrackingController::class, 'sendManualEmail']); Route::get('parents-info', [AttendanceTrackingController::class, 'parentsInfo']); Route::post('save-notification-note', [AttendanceTrackingController::class, 'saveNotificationNote']); }); Route::middleware('auth:api')->group(function () { Route::prefix('assignments')->group(function () { Route::get('/', [AssignmentApiController::class, 'index']); Route::post('/', [AssignmentApiController::class, 'store']); Route::get('class-assignment-data', [AssignmentApiController::class, 'classAssignmentData']); }); Route::prefix('badges')->group(function () { Route::get('form-data', [BadgeController::class, 'formData']); Route::post('pdf', [BadgeController::class, 'generatePdf']); Route::get('print-status', [BadgeController::class, 'printStatus']); Route::post('log-print', [BadgeController::class, 'logPrint']); }); Route::prefix('class-prep')->group(function () { Route::get('/', [ClassPreparationController::class, 'index']); Route::post('mark-printed', [ClassPreparationController::class, 'markPrinted']); Route::post('adjustments', [ClassPreparationController::class, 'saveAdjustments']); Route::post('print/{classSectionId}/{schoolYear}', [ClassPreparationController::class, 'print']); Route::get('sticker-counts', [ClassPreparationController::class, 'stickerCounts']); Route::get('classes/{classSectionId}/students', [ClassPreparationController::class, 'studentsByClass']); }); });