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
+22
View File
@@ -3,6 +3,7 @@
use App\Http\Controllers\Api\Auth\AuthSessionController;
use App\Http\Controllers\Api\Auth\SessionTimeoutController;
use App\Http\Controllers\Api\System\DashboardRedirectController;
use App\Http\Controllers\Web\SchoolYearAdminPageController;
use App\Http\Controllers\Web\TeacherCalendarPageController;
use Illuminate\Support\Facades\Route;
@@ -80,6 +81,27 @@ Route::middleware('web')->group(function () {
->name('teacher.calendar');
Route::middleware('auth')->get('app/teacher/calendar', [TeacherCalendarPageController::class, 'show'])
->name('app.teacher.calendar');
Route::middleware(['auth', 'admin.access'])->get('administrator/school-years', [SchoolYearAdminPageController::class, 'show'])
->name('admin.school-years');
Route::middleware(['auth', 'admin.access'])->get('app/administrator/school-years', [SchoolYearAdminPageController::class, 'show'])
->name('app.admin.school-years');
Route::middleware(['auth', 'admin.access'])->post('administrator/school-years', [SchoolYearAdminPageController::class, 'store'])
->name('admin.school-years.store');
Route::middleware(['auth', 'admin.access'])->patch('administrator/school-years/{schoolYear}', [SchoolYearAdminPageController::class, 'update'])
->whereNumber('schoolYear')
->name('admin.school-years.update');
Route::middleware(['auth', 'admin.access'])->post('administrator/school-years/{schoolYear}/validate-close', [SchoolYearAdminPageController::class, 'validateClose'])
->whereNumber('schoolYear')
->name('admin.school-years.validate-close');
Route::middleware(['auth', 'admin.access'])->post('administrator/school-years/{schoolYear}/preview-close', [SchoolYearAdminPageController::class, 'previewClose'])
->whereNumber('schoolYear')
->name('admin.school-years.preview-close');
Route::middleware(['auth', 'admin.access'])->post('administrator/school-years/{schoolYear}/close', [SchoolYearAdminPageController::class, 'close'])
->whereNumber('schoolYear')
->name('admin.school-years.close');
Route::middleware(['auth', 'admin.access'])->post('administrator/school-years/{schoolYear}/reopen', [SchoolYearAdminPageController::class, 'reopen'])
->whereNumber('schoolYear')
->name('admin.school-years.reopen');
Route::middleware('auth')->get('teacher/absence-vacation', function () {
return redirect('/app/teacher/absence-vacation');
})->name('teacher.absence-vacation');