add school year model

This commit is contained in:
root
2026-06-07 00:52:01 -04:00
parent a192ed433d
commit 6866aedf42
36 changed files with 4771 additions and 88 deletions
+36 -18
View File
@@ -126,6 +126,7 @@ use App\Http\Controllers\Api\Documentation\DocsCatalogController;
use App\Http\Controllers\Api\Parents\AuthorizedUserInviteController;
use App\Http\Controllers\Api\Administrator\AdministratorPromotionController;
use App\Http\Controllers\Api\Parents\ParentPromotionController;
use App\Http\Controllers\Api\SchoolYears\SchoolYearController;
use App\Http\Controllers\Api\Public\PublicWinnersController;
use App\Http\Controllers\Api\ScannerController;
use App\Http\Controllers\Api\Staff\TimeOffNotificationController;
@@ -154,6 +155,10 @@ Route::middleware('auth.docs')->group(function () {
Route::get('docs/public', [ApiDocsAdminController::class, 'public'])->name('api-docs.public');
// Legacy email extractor endpoints still used by the SPA parity page.
Route::middleware('auth:api')->get('emails', [EmailExtractorController::class, 'emails']);
Route::middleware('auth:api')->post('compare', [EmailExtractorController::class, 'compare']);
Route::get('access_denied', [AccessDeniedController::class, 'accessDenied'])->name('access_denied');
Route::get('certificates/verify/{token}', [CertificateController::class, 'verify'])
@@ -302,13 +307,13 @@ Route::prefix('v1')->group(function () {
->name('api.v1.administrator.attendance-templates.bootstrap');
Route::get('absence', [AdministratorAbsenceController::class, 'index']);
Route::post('absence', [AdministratorAbsenceController::class, 'store']);
Route::post('absence', [AdministratorAbsenceController::class, 'store'])->middleware('school_year.editable');
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::post('teacher-submissions/notify', [AdministratorTeacherSubmissionController::class, 'notify'])->middleware('school_year.editable');
Route::prefix('trophy')->group(function () {
Route::get('/', [AdministratorTrophyController::class, 'index']);
@@ -317,22 +322,22 @@ Route::prefix('v1')->group(function () {
});
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::post('teacher-class/assign', [TeacherClassAssignmentController::class, 'store'])->middleware('school_year.editable');
Route::post('teacher-class/delete', [TeacherClassAssignmentController::class, 'destroy'])->middleware('school_year.editable');
Route::get('notifications/alerts', [AdministratorNotificationController::class, 'alerts']);
Route::post('notifications/alerts', [AdministratorNotificationController::class, 'saveAlerts']);
Route::post('notifications/alerts', [AdministratorNotificationController::class, 'saveAlerts'])->middleware('school_year.editable');
Route::get('notifications/print-recipients', [AdministratorNotificationController::class, 'printRecipients']);
Route::post('notifications/print-recipients', [AdministratorNotificationController::class, 'savePrintRecipients']);
Route::post('notifications/print-recipients', [AdministratorNotificationController::class, 'savePrintRecipients'])->middleware('school_year.editable');
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::post('enrollment-withdrawal/update-statuses', [AdministratorEnrollmentController::class, 'updateStatuses'])->middleware('school_year.editable');
Route::get('enroll-withdrawal', [AdministratorEnrollmentController::class, 'index']);
Route::get('enroll-withdrawal/new-students', [AdministratorEnrollmentController::class, 'newStudents']);
Route::post('enroll-withdrawal/update-statuses', [AdministratorEnrollmentController::class, 'updateStatuses']);
Route::post('enroll-withdrawal/update-statuses', [AdministratorEnrollmentController::class, 'updateStatuses'])->middleware('school_year.editable');
Route::prefix('promotions')->group(function () {
Route::prefix('promotions')->middleware('school_year.editable')->group(function () {
Route::get('/', [AdministratorPromotionController::class, 'index']);
Route::get('summary', [AdministratorPromotionController::class, 'summary']);
Route::post('evaluate', [AdministratorPromotionController::class, 'evaluate']);
@@ -392,9 +397,9 @@ Route::prefix('v1')->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::post('/', [ExpenseController::class, 'store'])->middleware('school_year.editable');
Route::put('{id}', [ExpenseController::class, 'update'])->middleware('school_year.editable');
Route::post('{id}/status', [ExpenseController::class, 'updateStatus'])->middleware('school_year.editable');
});
Route::prefix('reports')->group(function () {
@@ -471,7 +476,20 @@ Route::prefix('v1')->group(function () {
});
});
Route::middleware('auth:api')->prefix('attendance')->group(function () {
Route::middleware(['auth:api', 'admin.access'])->prefix('school-years')->group(function () {
Route::get('/', [SchoolYearController::class, 'index']);
Route::post('/', [SchoolYearController::class, 'store']);
Route::patch('{schoolYear}', [SchoolYearController::class, 'update'])->whereNumber('schoolYear');
Route::get('{schoolYear}/summary', [SchoolYearController::class, 'summary'])->whereNumber('schoolYear');
Route::post('{schoolYear}/validate-close', [SchoolYearController::class, 'validateClose'])->whereNumber('schoolYear');
Route::post('{schoolYear}/preview-close', [SchoolYearController::class, 'previewClose'])->whereNumber('schoolYear');
Route::post('{schoolYear}/close', [SchoolYearController::class, 'close'])->whereNumber('schoolYear');
Route::post('{schoolYear}/reopen', [SchoolYearController::class, 'reopen'])->whereNumber('schoolYear');
Route::get('{schoolYear}/parent-balances', [SchoolYearController::class, 'parentBalances'])->whereNumber('schoolYear');
Route::get('{schoolYear}/promotion-preview', [SchoolYearController::class, 'promotionPreview'])->whereNumber('schoolYear');
});
Route::middleware(['auth:api', 'school_year.editable'])->prefix('attendance')->group(function () {
// Teacher
Route::get('/teacher/grid', [TeacherAttendanceApiController::class, 'grid']);
Route::get('/teacher/form', [TeacherAttendanceApiController::class, 'form']);
@@ -513,7 +531,7 @@ Route::prefix('v1')->group(function () {
});
});
Route::middleware('auth:api')->prefix('attendance-tracking')->group(function () {
Route::middleware(['auth:api', 'school_year.editable'])->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']);
@@ -525,7 +543,7 @@ Route::prefix('v1')->group(function () {
Route::post('/save-notification-note', [AttendanceTrackingController::class, 'saveNotificationNote']);
});
Route::middleware('auth:api')->prefix('attendance-comment-templates')->group(function () {
Route::middleware(['auth:api', 'school_year.editable'])->prefix('attendance-comment-templates')->group(function () {
Route::get('/', [AttendanceCommentTemplateController::class, 'index'])->name('api.v1.attendance-comment-templates.index');
Route::get('list-data', [AttendanceCommentTemplateController::class, 'listData'])
->name('api.v1.attendance-comment-templates.list-data');
@@ -538,19 +556,19 @@ Route::prefix('v1')->group(function () {
/*
| Legacy attendance template list/save/delete endpoints (auth:api).
*/
Route::middleware('auth:api')->prefix('attendance-templates')->group(function () {
Route::middleware(['auth:api', 'school_year.editable'])->prefix('attendance-templates')->group(function () {
Route::get('/', [AttendanceCommentTemplateController::class, 'listData'])->name('api.v1.attendance-templates.legacy');
Route::post('save', [AttendanceCommentTemplateController::class, 'legacySave']);
Route::post('delete', [AttendanceCommentTemplateController::class, 'legacyDelete']);
});
Route::middleware('auth:api')->prefix('assignments')->group(function () {
Route::middleware(['auth:api', 'school_year.editable'])->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::middleware(['auth:api', 'school_year.editable'])->group(function () {
// Legacy alias: same handler as GET /api/v1/scores/homework
Route::get('teacher/homework-list', [HomeworkScoreController::class, 'index']);
// Legacy alias: teacher add-homework page and save action