@brite-future-schools-contracts/contracts 2.0.23 → 2.0.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-TBCAMVHG.js → chunk-CL7UHAQE.js} +5 -5
- package/dist/chunk-CL7UHAQE.js.map +1 -0
- package/dist/{chunk-ZHUFBLV5.js → chunk-YKK4SQI7.js} +2 -2
- package/dist/contracts/index.cjs +4 -4
- package/dist/contracts/index.cjs.map +1 -1
- package/dist/contracts/index.d.cts +2 -2
- package/dist/contracts/index.d.ts +2 -2
- package/dist/contracts/index.js +2 -2
- package/dist/index.cjs +47 -47
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -6
- package/dist/index.d.ts +6 -6
- package/dist/index.js +43 -43
- package/dist/index.js.map +1 -1
- package/dist/schemas/index.cjs +4 -4
- package/dist/schemas/index.cjs.map +1 -1
- package/dist/schemas/index.d.cts +1 -1
- package/dist/schemas/index.d.ts +1 -1
- package/dist/schemas/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-TBCAMVHG.js.map +0 -1
- /package/dist/{chunk-ZHUFBLV5.js.map → chunk-YKK4SQI7.js.map} +0 -0
package/dist/index.js
CHANGED
|
@@ -38,7 +38,7 @@ import {
|
|
|
38
38
|
studentsContract,
|
|
39
39
|
switchBranchContract,
|
|
40
40
|
updateStaffStatusContract
|
|
41
|
-
} from "./chunk-
|
|
41
|
+
} from "./chunk-YKK4SQI7.js";
|
|
42
42
|
import {
|
|
43
43
|
AcademicTermSchema,
|
|
44
44
|
AcademicYearSchema,
|
|
@@ -99,7 +99,7 @@ import {
|
|
|
99
99
|
TimestampsSchema,
|
|
100
100
|
UuidSchema,
|
|
101
101
|
paginatedOutputSchema
|
|
102
|
-
} from "./chunk-
|
|
102
|
+
} from "./chunk-CL7UHAQE.js";
|
|
103
103
|
|
|
104
104
|
// src/roles/helpers.ts
|
|
105
105
|
function hasRole(user, role) {
|
|
@@ -124,14 +124,14 @@ function isDirector(user) {
|
|
|
124
124
|
function isSystemAdmin(user) {
|
|
125
125
|
return hasRole(user, "SYSTEM_ADMIN");
|
|
126
126
|
}
|
|
127
|
-
function
|
|
128
|
-
return hasRole(user, "
|
|
127
|
+
function isHeadTeacher(user) {
|
|
128
|
+
return hasRole(user, "HEAD_TEACHER");
|
|
129
129
|
}
|
|
130
|
-
function
|
|
131
|
-
return hasRole(user, "
|
|
130
|
+
function isDeputyHeadTeacher(user) {
|
|
131
|
+
return hasRole(user, "DEPUTY_HEAD_TEACHER");
|
|
132
132
|
}
|
|
133
133
|
function isSeniorLeadership(user) {
|
|
134
|
-
return isProprietor(user) || isDirector(user) ||
|
|
134
|
+
return isProprietor(user) || isDirector(user) || isHeadTeacher(user) || isDeputyHeadTeacher(user);
|
|
135
135
|
}
|
|
136
136
|
function isHOD(user) {
|
|
137
137
|
return hasRoleOrSubRole(user, "HOD");
|
|
@@ -204,8 +204,8 @@ function isStaff(user) {
|
|
|
204
204
|
"PROPRIETOR",
|
|
205
205
|
"DIRECTOR",
|
|
206
206
|
"SYSTEM_ADMIN",
|
|
207
|
-
"
|
|
208
|
-
"
|
|
207
|
+
"HEAD_TEACHER",
|
|
208
|
+
"DEPUTY_HEAD_TEACHER",
|
|
209
209
|
"HOD",
|
|
210
210
|
"CLASS_TEACHER",
|
|
211
211
|
"SUBJECT_TEACHER",
|
|
@@ -237,76 +237,76 @@ function canMarkClassAttendance(user) {
|
|
|
237
237
|
const hasClassTeacherSubRole = user.subRoles?.some(
|
|
238
238
|
(s) => s.code === "CLASS_TEACHER"
|
|
239
239
|
) ?? false;
|
|
240
|
-
return hasClassTeacherSubRole || isHOD(user) ||
|
|
240
|
+
return hasClassTeacherSubRole || isHOD(user) || isHeadTeacher(user) || isDeputyHeadTeacher(user) || isSystemAdmin(user) || isDirector(user) || isProprietor(user);
|
|
241
241
|
}
|
|
242
242
|
function canViewClassAttendance(user) {
|
|
243
243
|
return canMarkClassAttendance(user);
|
|
244
244
|
}
|
|
245
245
|
function canMarkStaffAttendance(user) {
|
|
246
|
-
return isHrAdmin(user) ||
|
|
246
|
+
return isHrAdmin(user) || isHeadTeacher(user) || isDeputyHeadTeacher(user) || isSystemAdmin(user);
|
|
247
247
|
}
|
|
248
248
|
function canViewStaffAttendance(user) {
|
|
249
249
|
return canMarkStaffAttendance(user) || isDirector(user) || isProprietor(user);
|
|
250
250
|
}
|
|
251
251
|
function canViewStaffList(user) {
|
|
252
|
-
return isHrAdmin(user) ||
|
|
252
|
+
return isHrAdmin(user) || isHeadTeacher(user) || isDeputyHeadTeacher(user) || isSystemAdmin(user) || isDirector(user) || isProprietor(user);
|
|
253
253
|
}
|
|
254
254
|
function canManageStaff(user) {
|
|
255
|
-
return isHrAdmin(user) ||
|
|
255
|
+
return isHrAdmin(user) || isHeadTeacher(user) || isSystemAdmin(user) || isDirector(user) || isProprietor(user);
|
|
256
256
|
}
|
|
257
257
|
function canViewStudentList(user) {
|
|
258
|
-
return isClassTeacher(user) || isHOD(user) ||
|
|
258
|
+
return isClassTeacher(user) || isHOD(user) || isHeadTeacher(user) || isDeputyHeadTeacher(user) || isHrAdmin(user) || isSystemAdmin(user) || isDirector(user) || isProprietor(user);
|
|
259
259
|
}
|
|
260
260
|
function canManageStudents(user) {
|
|
261
|
-
return
|
|
261
|
+
return isHeadTeacher(user) || isDeputyHeadTeacher(user) || isHrAdmin(user) || isSystemAdmin(user) || isDirector(user) || isProprietor(user);
|
|
262
262
|
}
|
|
263
263
|
function canViewClasses(user) {
|
|
264
|
-
return isClassTeacher(user) || isHOD(user) ||
|
|
264
|
+
return isClassTeacher(user) || isHOD(user) || isHeadTeacher(user) || isDeputyHeadTeacher(user) || isSystemAdmin(user) || isDirector(user) || isProprietor(user);
|
|
265
265
|
}
|
|
266
266
|
function canAssignClassTeacher(user) {
|
|
267
|
-
return
|
|
267
|
+
return isHeadTeacher(user) || isDeputyHeadTeacher(user) || isSystemAdmin(user) || isDirector(user) || isProprietor(user);
|
|
268
268
|
}
|
|
269
269
|
function canAccessAdminDashboard(user) {
|
|
270
270
|
return !isStudent(user) && !isParent(user) && !isPrefect(user) && !isOrgSponsor(user) && !isIndividualSponsor(user);
|
|
271
271
|
}
|
|
272
272
|
function canManageLeaveTypes(user) {
|
|
273
|
-
return isHrAdmin(user) ||
|
|
273
|
+
return isHrAdmin(user) || isHeadTeacher(user) || isDeputyHeadTeacher(user) || isDirector(user) || isProprietor(user);
|
|
274
274
|
}
|
|
275
275
|
function canHodApproveLeave(user) {
|
|
276
|
-
return isHOD(user) ||
|
|
276
|
+
return isHOD(user) || isHeadTeacher(user) || isDeputyHeadTeacher(user) || isDirector(user) || isProprietor(user);
|
|
277
277
|
}
|
|
278
278
|
function canFinalApproveLeave(user) {
|
|
279
|
-
return
|
|
279
|
+
return isHeadTeacher(user) || isDeputyHeadTeacher(user) || isDirector(user) || isProprietor(user);
|
|
280
280
|
}
|
|
281
281
|
function canViewAllLeaveRequests(user) {
|
|
282
|
-
return isHrAdmin(user) || isHOD(user) ||
|
|
282
|
+
return isHrAdmin(user) || isHOD(user) || isHeadTeacher(user) || isDeputyHeadTeacher(user) || isDirector(user) || isProprietor(user);
|
|
283
283
|
}
|
|
284
284
|
function canManageQualifications(user) {
|
|
285
|
-
return isHrAdmin(user) ||
|
|
285
|
+
return isHrAdmin(user) || isHeadTeacher(user) || isDeputyHeadTeacher(user) || isDirector(user) || isProprietor(user);
|
|
286
286
|
}
|
|
287
287
|
function canVerifyQualification(user) {
|
|
288
|
-
return
|
|
288
|
+
return isHeadTeacher(user) || isDeputyHeadTeacher(user) || isDirector(user) || isProprietor(user);
|
|
289
289
|
}
|
|
290
290
|
function canManageSalaryStructure(user) {
|
|
291
|
-
return isHrAdmin(user) ||
|
|
291
|
+
return isHrAdmin(user) || isHeadTeacher(user) || isDirector(user) || isProprietor(user);
|
|
292
292
|
}
|
|
293
293
|
function canAssignSalaryGrade(user) {
|
|
294
|
-
return isHrAdmin(user) ||
|
|
294
|
+
return isHrAdmin(user) || isHeadTeacher(user) || isDirector(user) || isProprietor(user);
|
|
295
295
|
}
|
|
296
296
|
function canApproveSalary(user) {
|
|
297
|
-
return
|
|
297
|
+
return isHeadTeacher(user) || isDirector(user) || isProprietor(user);
|
|
298
298
|
}
|
|
299
299
|
function canInitiatePayroll(user) {
|
|
300
|
-
return isHrAdmin(user) ||
|
|
300
|
+
return isHrAdmin(user) || isHeadTeacher(user) || isDirector(user) || isProprietor(user);
|
|
301
301
|
}
|
|
302
302
|
function canApprovePayroll(user) {
|
|
303
|
-
return
|
|
303
|
+
return isHeadTeacher(user) || isDirector(user) || isProprietor(user);
|
|
304
304
|
}
|
|
305
305
|
function canExportPayroll(user) {
|
|
306
|
-
return
|
|
306
|
+
return isHeadTeacher(user) || isDirector(user) || isProprietor(user);
|
|
307
307
|
}
|
|
308
308
|
function canViewAllPayslips(user) {
|
|
309
|
-
return isHrAdmin(user) ||
|
|
309
|
+
return isHrAdmin(user) || isHeadTeacher(user) || isDeputyHeadTeacher(user) || isDirector(user) || isProprietor(user);
|
|
310
310
|
}
|
|
311
311
|
function canViewCrossBranchPayroll(user) {
|
|
312
312
|
return isDirector(user) || isProprietor(user);
|
|
@@ -315,40 +315,40 @@ function canEditTaxConfig(user) {
|
|
|
315
315
|
return isSystemAdmin(user);
|
|
316
316
|
}
|
|
317
317
|
function canManageFleet(user) {
|
|
318
|
-
return
|
|
318
|
+
return isHeadTeacher(user) || isDeputyHeadTeacher(user) || isDirector(user) || isProprietor(user) || isSystemAdmin(user);
|
|
319
319
|
}
|
|
320
320
|
function canViewFleet(user) {
|
|
321
321
|
return canManageFleet(user) || isHrAdmin(user);
|
|
322
322
|
}
|
|
323
323
|
function canManageRoutes(user) {
|
|
324
|
-
return
|
|
324
|
+
return isHeadTeacher(user) || isDeputyHeadTeacher(user) || isDirector(user) || isProprietor(user) || isSystemAdmin(user);
|
|
325
325
|
}
|
|
326
326
|
function canViewTransport(user) {
|
|
327
|
-
return isDriver(user) || isBursar(user) ||
|
|
327
|
+
return isDriver(user) || isBursar(user) || isHeadTeacher(user) || isDeputyHeadTeacher(user) || isHrAdmin(user) || isDirector(user) || isProprietor(user) || isSystemAdmin(user);
|
|
328
328
|
}
|
|
329
329
|
function canManageTrips(user) {
|
|
330
|
-
return
|
|
330
|
+
return isHeadTeacher(user) || isDeputyHeadTeacher(user) || isDirector(user) || isProprietor(user) || isSystemAdmin(user);
|
|
331
331
|
}
|
|
332
332
|
function canMarkBoardings(user) {
|
|
333
|
-
return isDriver(user) ||
|
|
333
|
+
return isDriver(user) || isHeadTeacher(user) || isDeputyHeadTeacher(user) || isDirector(user) || isProprietor(user);
|
|
334
334
|
}
|
|
335
335
|
function canSubmitFuelLog(user) {
|
|
336
|
-
return isDriver(user) ||
|
|
336
|
+
return isDriver(user) || isHeadTeacher(user) || isDeputyHeadTeacher(user) || isDirector(user) || isProprietor(user);
|
|
337
337
|
}
|
|
338
338
|
function canApproveFuelLog(user) {
|
|
339
|
-
return
|
|
339
|
+
return isHeadTeacher(user) || isDeputyHeadTeacher(user) || isDirector(user) || isProprietor(user);
|
|
340
340
|
}
|
|
341
341
|
function canSubmitMaintenanceRequest(user) {
|
|
342
|
-
return isDriver(user) ||
|
|
342
|
+
return isDriver(user) || isHeadTeacher(user) || isDeputyHeadTeacher(user) || isDirector(user) || isProprietor(user) || isSystemAdmin(user);
|
|
343
343
|
}
|
|
344
344
|
function canReviewMaintenance(user) {
|
|
345
|
-
return
|
|
345
|
+
return isHeadTeacher(user) || isDeputyHeadTeacher(user) || isDirector(user) || isProprietor(user);
|
|
346
346
|
}
|
|
347
347
|
function canReviewTransportApplication(user) {
|
|
348
|
-
return isBursar(user) ||
|
|
348
|
+
return isBursar(user) || isHeadTeacher(user) || isDeputyHeadTeacher(user) || isDirector(user) || isProprietor(user);
|
|
349
349
|
}
|
|
350
350
|
function isScopedToOwnVehicle(user) {
|
|
351
|
-
return isDriver(user) && !
|
|
351
|
+
return isDriver(user) && !isHeadTeacher(user) && !isDeputyHeadTeacher(user) && !isDirector(user) && !isProprietor(user) && !isSystemAdmin(user);
|
|
352
352
|
}
|
|
353
353
|
export {
|
|
354
354
|
AcademicTermSchema,
|
|
@@ -470,10 +470,11 @@ export {
|
|
|
470
470
|
isCaretaker,
|
|
471
471
|
isClassTeacher,
|
|
472
472
|
isCounsellor,
|
|
473
|
-
|
|
473
|
+
isDeputyHeadTeacher,
|
|
474
474
|
isDirector,
|
|
475
475
|
isDriver,
|
|
476
476
|
isHOD,
|
|
477
|
+
isHeadTeacher,
|
|
477
478
|
isHrAdmin,
|
|
478
479
|
isIndividualSponsor,
|
|
479
480
|
isItAdmin,
|
|
@@ -484,7 +485,6 @@ export {
|
|
|
484
485
|
isOrgSponsor,
|
|
485
486
|
isParent,
|
|
486
487
|
isPrefect,
|
|
487
|
-
isPrincipal,
|
|
488
488
|
isProprietor,
|
|
489
489
|
isSchoolNurse,
|
|
490
490
|
isScopedToOwnVehicle,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/roles/helpers.ts","../src/permissions/index.ts"],"sourcesContent":["/**\n * Brite Future Schools — bfs-contracts\n * Role helper functions.\n *\n * Every helper takes a SessionUser and returns a boolean.\n * Use these instead of hardcoded role string comparisons everywhere.\n *\n * Usage:\n * import { isProprietor, isPrincipal } from '@brite-future-schools-contracts/contracts'\n * if (isProprietor(user)) { ... }\n *\n * Phase History:\n * Phase 0.1 (2026-06-05): Initial creation\n * Phase 0.2 (2026-06-06): Roles reconciled against schema — added\n * SCHOOL_NURSE, LAB_TECHNICIAN, SPORTS_COACH,\n * CARETAKER, SECURITY, KITCHEN_STAFF, IT_ADMIN,\n * ORG_SPONSOR, INDIVIDUAL_SPONSOR, KITCHEN_MANAGER,\n * BOARDING_MASTER, PREFECT\n * Phase 6 (2026-07-10): hasRole and hasSubRole unified — helpers that can\n * appear as either a primary role or a subRole now\n * check both. Fixes CLASS_TEACHER, HOD, and others\n * assigned via the subRole system. isStaff fixed\n * to use null-safe branch check.\n *\n * @module src/roles/helpers\n * @since Phase 0.1\n */\n\nimport type { RoleName, SessionUser } from './types.js'\n\n// ── Private helpers ────────────────────────────────────────────────────────────\n\n/** Check primary roles — branch-scoped, null-safe. */\nfunction hasRole(user: SessionUser, role: RoleName): boolean {\n return user.roles.some(\n (r) =>\n r.name === role &&\n (!user.activeBranchId || r.branchId === user.activeBranchId),\n )\n}\n\n/** Check subRoles — branch-scoped, null-safe. */\nfunction hasSubRole(user: SessionUser, code: string): boolean {\n return (user.subRoles ?? []).some(\n (r) =>\n r.code === code &&\n (!user.activeBranchId || r.branchId === user.activeBranchId),\n )\n}\n\n/** Check either primary role OR subRole — use for roles that can be assigned either way. */\nfunction hasRoleOrSubRole(user: SessionUser, code: string): boolean {\n return hasRole(user, code as RoleName) || hasSubRole(user, code)\n}\n\n// ── Senior leadership ──────────────────────────────────────────────────────────\n\nexport function isProprietor(user: SessionUser): boolean {\n return hasRole(user, 'PROPRIETOR')\n}\n\nexport function isDirector(user: SessionUser): boolean {\n return hasRole(user, 'DIRECTOR')\n}\n\nexport function isSystemAdmin(user: SessionUser): boolean {\n return hasRole(user, 'SYSTEM_ADMIN')\n}\n\nexport function isPrincipal(user: SessionUser): boolean {\n return hasRole(user, 'PRINCIPAL')\n}\n\nexport function isDeputyPrincipal(user: SessionUser): boolean {\n return hasRole(user, 'DEPUTY_PRINCIPAL')\n}\n\nexport function isSeniorLeadership(user: SessionUser): boolean {\n return (\n isProprietor(user) ||\n isDirector(user) ||\n isPrincipal(user) ||\n isDeputyPrincipal(user)\n )\n}\n\n// ── Academic staff ─────────────────────────────────────────────────────────────\n\nexport function isHOD(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'HOD')\n}\n\nexport function isClassTeacher(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'CLASS_TEACHER')\n}\n\nexport function isSubjectTeacher(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'SUBJECT_TEACHER')\n}\n\n// ── Support staff ──────────────────────────────────────────────────────────────\n\nexport function isSchoolNurse(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'SCHOOL_NURSE')\n}\n\nexport function isLibrarian(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'LIBRARIAN')\n}\n\nexport function isLabTechnician(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'LAB_TECHNICIAN')\n}\n\nexport function isSportsCoach(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'SPORTS_COACH')\n}\n\nexport function isCounsellor(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'COUNSELLOR')\n}\n\nexport function isCaretaker(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'CARETAKER')\n}\n\nexport function isSecurity(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'SECURITY')\n}\n\nexport function isBoardingMaster(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'BOARDING_MASTER')\n}\n\n// ── Operations ─────────────────────────────────────────────────────────────────\n\nexport function isBursar(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'BURSAR')\n}\n\nexport function isHrAdmin(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'HR_ADMIN')\n}\n\nexport function isDriver(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'DRIVER')\n}\n\nexport function isKitchenStaff(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'KITCHEN_STAFF')\n}\n\nexport function isKitchenManager(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'KITCHEN_MANAGER')\n}\n\nexport function isItAdmin(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'IT_ADMIN')\n}\n\n// ── Students and parents ───────────────────────────────────────────────────────\n\nexport function isPrefect(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'PREFECT')\n}\n\nexport function isStudent(user: SessionUser): boolean {\n return hasRole(user, 'STUDENT')\n}\n\nexport function isParent(user: SessionUser): boolean {\n return hasRole(user, 'PARENT')\n}\n\n// ── Sponsors ───────────────────────────────────────────────────────────────────\n\nexport function isOrgSponsor(user: SessionUser): boolean {\n return hasRole(user, 'ORG_SPONSOR')\n}\n\nexport function isIndividualSponsor(user: SessionUser): boolean {\n return hasRole(user, 'INDIVIDUAL_SPONSOR')\n}\n\n// ── Broad groupings ────────────────────────────────────────────────────────────\n\nexport function isStaff(user: SessionUser): boolean {\n const staffRoles: RoleName[] = [\n 'PROPRIETOR', 'DIRECTOR', 'SYSTEM_ADMIN', 'PRINCIPAL', 'DEPUTY_PRINCIPAL',\n 'HOD', 'CLASS_TEACHER', 'SUBJECT_TEACHER', 'BURSAR', 'HR_ADMIN',\n 'SCHOOL_NURSE', 'LIBRARIAN', 'LAB_TECHNICIAN', 'SPORTS_COACH',\n 'COUNSELLOR', 'CARETAKER', 'SECURITY', 'KITCHEN_STAFF', 'KITCHEN_MANAGER',\n 'DRIVER', 'IT_ADMIN', 'BOARDING_MASTER', 'PREFECT',\n ]\n return (\n user.roles.some(\n (r) =>\n staffRoles.includes(r.name) &&\n (!user.activeBranchId || r.branchId === user.activeBranchId),\n ) ||\n (user.subRoles ?? []).some(\n (r) =>\n staffRoles.includes(r.code as RoleName) &&\n (!user.activeBranchId || r.branchId === user.activeBranchId),\n )\n )\n}","/**\n * Brite Future Schools — bfs-contracts\n * Permission helper functions.\n *\n * Answer \"can this user do X?\" — not \"is this user role Y?\".\n * Every UI gate and API guard must use these instead of raw role checks.\n *\n * Phase History:\n * Phase 2 (2026-06-08): Initial creation — attendance, staff, students,\n * dashboard permissions\n * Phase 3 (2026-06-10): Added canAssignClassTeacher, canViewClasses\n * Phase 5 (2026-06-21): Added HR, payroll, leave, qualification,\n * tax config, and salary permissions\n * Phase 6 (2026-06-22): Added transport permissions\n *\n * @module src/permissions/index\n * @since Phase 2\n */\n\nimport type { SessionUser } from '../roles/types.js'\nimport {\n isProprietor,\n isDirector,\n isSystemAdmin,\n isPrincipal,\n isDeputyPrincipal,\n isHOD,\n isClassTeacher,\n isHrAdmin,\n isStudent,\n isParent,\n isOrgSponsor,\n isIndividualSponsor,\n isPrefect,\n isBursar,\n isDriver,\n} from '../roles/helpers.js'\n\n// ── Attendance ─────────────────────────────────────────────────────────────────\n\n/** Class teacher marks roll for their own class; senior staff can mark any. */\nexport function canMarkClassAttendance(user: SessionUser): boolean {\n const hasClassTeacherSubRole = user.subRoles?.some(\n (s) => s.code === 'CLASS_TEACHER',\n ) ?? false\n return (\n hasClassTeacherSubRole ||\n isHOD(user) ||\n isPrincipal(user) ||\n isDeputyPrincipal(user) ||\n isSystemAdmin(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\nexport function canViewClassAttendance(user: SessionUser): boolean {\n return canMarkClassAttendance(user)\n}\n\nexport function canMarkStaffAttendance(user: SessionUser): boolean {\n return (\n isHrAdmin(user) ||\n isPrincipal(user) ||\n isDeputyPrincipal(user) ||\n isSystemAdmin(user)\n )\n}\n\nexport function canViewStaffAttendance(user: SessionUser): boolean {\n return (\n canMarkStaffAttendance(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n// ── Staff ──────────────────────────────────────────────────────────────────────\n\nexport function canViewStaffList(user: SessionUser): boolean {\n return (\n isHrAdmin(user) ||\n isPrincipal(user) ||\n isDeputyPrincipal(user) ||\n isSystemAdmin(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\nexport function canManageStaff(user: SessionUser): boolean {\n return (\n isHrAdmin(user) ||\n isPrincipal(user) ||\n isSystemAdmin(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n// ── Students ───────────────────────────────────────────────────────────────────\n\nexport function canViewStudentList(user: SessionUser): boolean {\n return (\n isClassTeacher(user) ||\n isHOD(user) ||\n isPrincipal(user) ||\n isDeputyPrincipal(user) ||\n isHrAdmin(user) ||\n isSystemAdmin(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\nexport function canManageStudents(user: SessionUser): boolean {\n return (\n isPrincipal(user) ||\n isDeputyPrincipal(user) ||\n isHrAdmin(user) ||\n isSystemAdmin(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n// ── Classes ────────────────────────────────────────────────────────────────────\n\nexport function canViewClasses(user: SessionUser): boolean {\n return (\n isClassTeacher(user) ||\n isHOD(user) ||\n isPrincipal(user) ||\n isDeputyPrincipal(user) ||\n isSystemAdmin(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\nexport function canAssignClassTeacher(user: SessionUser): boolean {\n return (\n isPrincipal(user) ||\n isDeputyPrincipal(user) ||\n isSystemAdmin(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n// ── Dashboard ──────────────────────────────────────────────────────────────────\n\nexport function canAccessAdminDashboard(user: SessionUser): boolean {\n return (\n !isStudent(user) &&\n !isParent(user) &&\n !isPrefect(user) &&\n !isOrgSponsor(user) &&\n !isIndividualSponsor(user)\n )\n}\n\n// ── Leave ──────────────────────────────────────────────────────────────────────\n\n/** Who can create and manage leave types. */\nexport function canManageLeaveTypes(user: SessionUser): boolean {\n return (\n isHrAdmin(user) ||\n isPrincipal(user) ||\n isDeputyPrincipal(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/** HOD can approve leave for their department (first step). */\nexport function canHodApproveLeave(user: SessionUser): boolean {\n return (\n isHOD(user) ||\n isPrincipal(user) ||\n isDeputyPrincipal(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/** Final leave approval — Principal and above only. */\nexport function canFinalApproveLeave(user: SessionUser): boolean {\n return (\n isPrincipal(user) ||\n isDeputyPrincipal(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/** Who can view all leave requests (not just their own). */\nexport function canViewAllLeaveRequests(user: SessionUser): boolean {\n return (\n isHrAdmin(user) ||\n isHOD(user) ||\n isPrincipal(user) ||\n isDeputyPrincipal(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n// ── Qualifications ─────────────────────────────────────────────────────────────\n\n/** Who can add or edit staff qualification records. */\nexport function canManageQualifications(user: SessionUser): boolean {\n return (\n isHrAdmin(user) ||\n isPrincipal(user) ||\n isDeputyPrincipal(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/** Who can mark a qualification as verified (triggers payroll effect). */\nexport function canVerifyQualification(user: SessionUser): boolean {\n return (\n isPrincipal(user) ||\n isDeputyPrincipal(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n// ── Remuneration ───────────────────────────────────────────────────────────────\n\n/** Who can manage salary grades and remuneration items. */\nexport function canManageSalaryStructure(user: SessionUser): boolean {\n return (\n isHrAdmin(user) ||\n isPrincipal(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/** Who can assign a salary grade to a staff member. */\nexport function canAssignSalaryGrade(user: SessionUser): boolean {\n return (\n isHrAdmin(user) ||\n isPrincipal(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/** Who can approve a staff salary record (moves DRAFT → ACTIVE). */\nexport function canApproveSalary(user: SessionUser): boolean {\n return (\n isPrincipal(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n// ── Payroll ────────────────────────────────────────────────────────────────────\n\n/** Who can initiate a payroll run. */\nexport function canInitiatePayroll(user: SessionUser): boolean {\n return (\n isHrAdmin(user) ||\n isPrincipal(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/** Who can approve a payroll run (moves draft → approved). */\nexport function canApprovePayroll(user: SessionUser): boolean {\n return (\n isPrincipal(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/** Who can export the payroll run (Equity CSV). */\nexport function canExportPayroll(user: SessionUser): boolean {\n return (\n isPrincipal(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/** Who can view all staff payslips (not just their own). */\nexport function canViewAllPayslips(user: SessionUser): boolean {\n return (\n isHrAdmin(user) ||\n isPrincipal(user) ||\n isDeputyPrincipal(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/** Who can view payroll summary across all branches. */\nexport function canViewCrossBranchPayroll(user: SessionUser): boolean {\n return isDirector(user) || isProprietor(user)\n}\n\n// ── Tax configuration ──────────────────────────────────────────────────────────\n\n/** Only SYSTEM_ADMIN can edit statutory tax rates. */\nexport function canEditTaxConfig(user: SessionUser): boolean {\n return isSystemAdmin(user)\n}\n\n// ── Transport ──────────────────────────────────────────────────────────────────\n\n/** Who can create, edit, and delete vehicles. */\nexport function canManageFleet(user: SessionUser): boolean {\n return (\n isPrincipal(user) ||\n isDeputyPrincipal(user) ||\n isDirector(user) ||\n isProprietor(user) ||\n isSystemAdmin(user)\n )\n}\n\n/** Who can view the full fleet list. */\nexport function canViewFleet(user: SessionUser): boolean {\n return (\n canManageFleet(user) ||\n isHrAdmin(user)\n )\n}\n\n/** Who can manage routes and stops. */\nexport function canManageRoutes(user: SessionUser): boolean {\n return (\n isPrincipal(user) ||\n isDeputyPrincipal(user) ||\n isDirector(user) ||\n isProprietor(user) ||\n isSystemAdmin(user)\n )\n}\n\n/** Who can view the transport module at all. */\nexport function canViewTransport(user: SessionUser): boolean {\n return (\n isDriver(user) ||\n isBursar(user) ||\n isPrincipal(user) ||\n isDeputyPrincipal(user) ||\n isHrAdmin(user) ||\n isDirector(user) ||\n isProprietor(user) ||\n isSystemAdmin(user)\n )\n}\n\n/** Who can create and manage trip logs. */\nexport function canManageTrips(user: SessionUser): boolean {\n return (\n isPrincipal(user) ||\n isDeputyPrincipal(user) ||\n isDirector(user) ||\n isProprietor(user) ||\n isSystemAdmin(user)\n )\n}\n\n/** Driver marks boardings on their own trip. */\nexport function canMarkBoardings(user: SessionUser): boolean {\n return (\n isDriver(user) ||\n isPrincipal(user) ||\n isDeputyPrincipal(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/** Who can submit a fuel log entry. */\nexport function canSubmitFuelLog(user: SessionUser): boolean {\n return (\n isDriver(user) ||\n isPrincipal(user) ||\n isDeputyPrincipal(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/** Who can approve a fuel log entry. */\nexport function canApproveFuelLog(user: SessionUser): boolean {\n return (\n isPrincipal(user) ||\n isDeputyPrincipal(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/** Who can submit a vehicle maintenance request. */\nexport function canSubmitMaintenanceRequest(user: SessionUser): boolean {\n return (\n isDriver(user) ||\n isPrincipal(user) ||\n isDeputyPrincipal(user) ||\n isDirector(user) ||\n isProprietor(user) ||\n isSystemAdmin(user)\n )\n}\n\n/** Who can review and resolve maintenance requests. */\nexport function canReviewMaintenance(user: SessionUser): boolean {\n return (\n isPrincipal(user) ||\n isDeputyPrincipal(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/** Who can review transport applications (route enrolment). */\nexport function canReviewTransportApplication(user: SessionUser): boolean {\n return (\n isBursar(user) ||\n isPrincipal(user) ||\n isDeputyPrincipal(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/**\n * Drivers see only their own vehicle and trips.\n * Returns true if the user is purely a driver with no senior role.\n */\nexport function isScopedToOwnVehicle(user: SessionUser): boolean {\n return (\n isDriver(user) &&\n !isPrincipal(user) &&\n !isDeputyPrincipal(user) &&\n !isDirector(user) &&\n !isProprietor(user) &&\n !isSystemAdmin(user)\n )\n}"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/roles/helpers.ts","../src/permissions/index.ts"],"sourcesContent":["/**\n * Brite Future Schools — bfs-contracts\n * Role helper functions.\n *\n * Every helper takes a SessionUser and returns a boolean.\n * Use these instead of hardcoded role string comparisons everywhere.\n *\n * Usage:\n * import { isProprietor, isHeadTeacher } from '@brite-future-schools-contracts/contracts'\n * if (isProprietor(user)) { ... }\n *\n * Phase History:\n * Phase 0.1 (2026-06-05): Initial creation\n * Phase 0.2 (2026-06-06): Roles reconciled against schema — added\n * SCHOOL_NURSE, LAB_TECHNICIAN, SPORTS_COACH,\n * CARETAKER, SECURITY, KITCHEN_STAFF, IT_ADMIN,\n * ORG_SPONSOR, INDIVIDUAL_SPONSOR, KITCHEN_MANAGER,\n * BOARDING_MASTER, PREFECT\n * Phase 6 (2026-07-10): hasRole and hasSubRole unified — helpers that can\n * appear as either a primary role or a subRole now\n * check both. Fixes CLASS_TEACHER, HOD, and others\n * assigned via the subRole system. isStaff fixed\n * to use null-safe branch check.\n *\n * @module src/roles/helpers\n * @since Phase 0.1\n */\n\nimport type { RoleName, SessionUser } from './types.js'\n\n// ── Private helpers ────────────────────────────────────────────────────────────\n\n/** Check primary roles — branch-scoped, null-safe. */\nfunction hasRole(user: SessionUser, role: RoleName): boolean {\n return user.roles.some(\n (r) =>\n r.name === role &&\n (!user.activeBranchId || r.branchId === user.activeBranchId),\n )\n}\n\n/** Check subRoles — branch-scoped, null-safe. */\nfunction hasSubRole(user: SessionUser, code: string): boolean {\n return (user.subRoles ?? []).some(\n (r) =>\n r.code === code &&\n (!user.activeBranchId || r.branchId === user.activeBranchId),\n )\n}\n\n/** Check either primary role OR subRole — use for roles that can be assigned either way. */\nfunction hasRoleOrSubRole(user: SessionUser, code: string): boolean {\n return hasRole(user, code as RoleName) || hasSubRole(user, code)\n}\n\n// ── Senior leadership ──────────────────────────────────────────────────────────\n\nexport function isProprietor(user: SessionUser): boolean {\n return hasRole(user, 'PROPRIETOR')\n}\n\nexport function isDirector(user: SessionUser): boolean {\n return hasRole(user, 'DIRECTOR')\n}\n\nexport function isSystemAdmin(user: SessionUser): boolean {\n return hasRole(user, 'SYSTEM_ADMIN')\n}\n\nexport function isHeadTeacher(user: SessionUser): boolean {\n return hasRole(user, 'HEAD_TEACHER')\n}\n\nexport function isDeputyHeadTeacher(user: SessionUser): boolean {\n return hasRole(user, 'DEPUTY_HEAD_TEACHER')\n}\n\nexport function isSeniorLeadership(user: SessionUser): boolean {\n return (\n isProprietor(user) ||\n isDirector(user) ||\n isHeadTeacher(user) ||\n isDeputyHeadTeacher(user)\n )\n}\n\n// ── Academic staff ─────────────────────────────────────────────────────────────\n\nexport function isHOD(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'HOD')\n}\n\nexport function isClassTeacher(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'CLASS_TEACHER')\n}\n\nexport function isSubjectTeacher(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'SUBJECT_TEACHER')\n}\n\n// ── Support staff ──────────────────────────────────────────────────────────────\n\nexport function isSchoolNurse(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'SCHOOL_NURSE')\n}\n\nexport function isLibrarian(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'LIBRARIAN')\n}\n\nexport function isLabTechnician(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'LAB_TECHNICIAN')\n}\n\nexport function isSportsCoach(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'SPORTS_COACH')\n}\n\nexport function isCounsellor(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'COUNSELLOR')\n}\n\nexport function isCaretaker(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'CARETAKER')\n}\n\nexport function isSecurity(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'SECURITY')\n}\n\nexport function isBoardingMaster(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'BOARDING_MASTER')\n}\n\n// ── Operations ─────────────────────────────────────────────────────────────────\n\nexport function isBursar(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'BURSAR')\n}\n\nexport function isHrAdmin(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'HR_ADMIN')\n}\n\nexport function isDriver(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'DRIVER')\n}\n\nexport function isKitchenStaff(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'KITCHEN_STAFF')\n}\n\nexport function isKitchenManager(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'KITCHEN_MANAGER')\n}\n\nexport function isItAdmin(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'IT_ADMIN')\n}\n\n// ── Students and parents ───────────────────────────────────────────────────────\n\nexport function isPrefect(user: SessionUser): boolean {\n return hasRoleOrSubRole(user, 'PREFECT')\n}\n\nexport function isStudent(user: SessionUser): boolean {\n return hasRole(user, 'STUDENT')\n}\n\nexport function isParent(user: SessionUser): boolean {\n return hasRole(user, 'PARENT')\n}\n\n// ── Sponsors ───────────────────────────────────────────────────────────────────\n\nexport function isOrgSponsor(user: SessionUser): boolean {\n return hasRole(user, 'ORG_SPONSOR')\n}\n\nexport function isIndividualSponsor(user: SessionUser): boolean {\n return hasRole(user, 'INDIVIDUAL_SPONSOR')\n}\n\n// ── Broad groupings ────────────────────────────────────────────────────────────\n\nexport function isStaff(user: SessionUser): boolean {\n const staffRoles: RoleName[] = [\n 'PROPRIETOR', 'DIRECTOR', 'SYSTEM_ADMIN', 'HEAD_TEACHER', 'DEPUTY_HEAD_TEACHER',\n 'HOD', 'CLASS_TEACHER', 'SUBJECT_TEACHER', 'BURSAR', 'HR_ADMIN',\n 'SCHOOL_NURSE', 'LIBRARIAN', 'LAB_TECHNICIAN', 'SPORTS_COACH',\n 'COUNSELLOR', 'CARETAKER', 'SECURITY', 'KITCHEN_STAFF', 'KITCHEN_MANAGER',\n 'DRIVER', 'IT_ADMIN', 'BOARDING_MASTER', 'PREFECT',\n ]\n return (\n user.roles.some(\n (r) =>\n staffRoles.includes(r.name) &&\n (!user.activeBranchId || r.branchId === user.activeBranchId),\n ) ||\n (user.subRoles ?? []).some(\n (r) =>\n staffRoles.includes(r.code as RoleName) &&\n (!user.activeBranchId || r.branchId === user.activeBranchId),\n )\n )\n}","/**\n * Brite Future Schools — bfs-contracts\n * Permission helper functions.\n *\n * Answer \"can this user do X?\" — not \"is this user role Y?\".\n * Every UI gate and API guard must use these instead of raw role checks.\n *\n * Phase History:\n * Phase 2 (2026-06-08): Initial creation — attendance, staff, students,\n * dashboard permissions\n * Phase 3 (2026-06-10): Added canAssignClassTeacher, canViewClasses\n * Phase 5 (2026-06-21): Added HR, payroll, leave, qualification,\n * tax config, and salary permissions\n * Phase 6 (2026-06-22): Added transport permissions\n *\n * @module src/permissions/index\n * @since Phase 2\n */\n\nimport type { SessionUser } from '../roles/types.js'\nimport {\n isProprietor,\n isDirector,\n isSystemAdmin,\n isHeadTeacher,\n isDeputyHeadTeacher,\n isHOD,\n isClassTeacher,\n isHrAdmin,\n isStudent,\n isParent,\n isOrgSponsor,\n isIndividualSponsor,\n isPrefect,\n isBursar,\n isDriver,\n} from '../roles/helpers.js'\n\n// ── Attendance ─────────────────────────────────────────────────────────────────\n\n/** Class teacher marks roll for their own class; senior staff can mark any. */\nexport function canMarkClassAttendance(user: SessionUser): boolean {\n const hasClassTeacherSubRole = user.subRoles?.some(\n (s) => s.code === 'CLASS_TEACHER',\n ) ?? false\n return (\n hasClassTeacherSubRole ||\n isHOD(user) ||\n isHeadTeacher(user) ||\n isDeputyHeadTeacher(user) ||\n isSystemAdmin(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\nexport function canViewClassAttendance(user: SessionUser): boolean {\n return canMarkClassAttendance(user)\n}\n\nexport function canMarkStaffAttendance(user: SessionUser): boolean {\n return (\n isHrAdmin(user) ||\n isHeadTeacher(user) ||\n isDeputyHeadTeacher(user) ||\n isSystemAdmin(user)\n )\n}\n\nexport function canViewStaffAttendance(user: SessionUser): boolean {\n return (\n canMarkStaffAttendance(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n// ── Staff ──────────────────────────────────────────────────────────────────────\n\nexport function canViewStaffList(user: SessionUser): boolean {\n return (\n isHrAdmin(user) ||\n isHeadTeacher(user) ||\n isDeputyHeadTeacher(user) ||\n isSystemAdmin(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\nexport function canManageStaff(user: SessionUser): boolean {\n return (\n isHrAdmin(user) ||\n isHeadTeacher(user) ||\n isSystemAdmin(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n// ── Students ───────────────────────────────────────────────────────────────────\n\nexport function canViewStudentList(user: SessionUser): boolean {\n return (\n isClassTeacher(user) ||\n isHOD(user) ||\n isHeadTeacher(user) ||\n isDeputyHeadTeacher(user) ||\n isHrAdmin(user) ||\n isSystemAdmin(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\nexport function canManageStudents(user: SessionUser): boolean {\n return (\n isHeadTeacher(user) ||\n isDeputyHeadTeacher(user) ||\n isHrAdmin(user) ||\n isSystemAdmin(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n// ── Classes ────────────────────────────────────────────────────────────────────\n\nexport function canViewClasses(user: SessionUser): boolean {\n return (\n isClassTeacher(user) ||\n isHOD(user) ||\n isHeadTeacher(user) ||\n isDeputyHeadTeacher(user) ||\n isSystemAdmin(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\nexport function canAssignClassTeacher(user: SessionUser): boolean {\n return (\n isHeadTeacher(user) ||\n isDeputyHeadTeacher(user) ||\n isSystemAdmin(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n// ── Dashboard ──────────────────────────────────────────────────────────────────\n\nexport function canAccessAdminDashboard(user: SessionUser): boolean {\n return (\n !isStudent(user) &&\n !isParent(user) &&\n !isPrefect(user) &&\n !isOrgSponsor(user) &&\n !isIndividualSponsor(user)\n )\n}\n\n// ── Leave ──────────────────────────────────────────────────────────────────────\n\n/** Who can create and manage leave types. */\nexport function canManageLeaveTypes(user: SessionUser): boolean {\n return (\n isHrAdmin(user) ||\n isHeadTeacher(user) ||\n isDeputyHeadTeacher(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/** HOD can approve leave for their department (first step). */\nexport function canHodApproveLeave(user: SessionUser): boolean {\n return (\n isHOD(user) ||\n isHeadTeacher(user) ||\n isDeputyHeadTeacher(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/** Final leave approval — Head Teacher and above only. */\nexport function canFinalApproveLeave(user: SessionUser): boolean {\n return (\n isHeadTeacher(user) ||\n isDeputyHeadTeacher(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/** Who can view all leave requests (not just their own). */\nexport function canViewAllLeaveRequests(user: SessionUser): boolean {\n return (\n isHrAdmin(user) ||\n isHOD(user) ||\n isHeadTeacher(user) ||\n isDeputyHeadTeacher(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n// ── Qualifications ─────────────────────────────────────────────────────────────\n\n/** Who can add or edit staff qualification records. */\nexport function canManageQualifications(user: SessionUser): boolean {\n return (\n isHrAdmin(user) ||\n isHeadTeacher(user) ||\n isDeputyHeadTeacher(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/** Who can mark a qualification as verified (triggers payroll effect). */\nexport function canVerifyQualification(user: SessionUser): boolean {\n return (\n isHeadTeacher(user) ||\n isDeputyHeadTeacher(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n// ── Remuneration ───────────────────────────────────────────────────────────────\n\n/** Who can manage salary grades and remuneration items. */\nexport function canManageSalaryStructure(user: SessionUser): boolean {\n return (\n isHrAdmin(user) ||\n isHeadTeacher(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/** Who can assign a salary grade to a staff member. */\nexport function canAssignSalaryGrade(user: SessionUser): boolean {\n return (\n isHrAdmin(user) ||\n isHeadTeacher(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/** Who can approve a staff salary record (moves DRAFT → ACTIVE). */\nexport function canApproveSalary(user: SessionUser): boolean {\n return (\n isHeadTeacher(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n// ── Payroll ────────────────────────────────────────────────────────────────────\n\n/** Who can initiate a payroll run. */\nexport function canInitiatePayroll(user: SessionUser): boolean {\n return (\n isHrAdmin(user) ||\n isHeadTeacher(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/** Who can approve a payroll run (moves draft → approved). */\nexport function canApprovePayroll(user: SessionUser): boolean {\n return (\n isHeadTeacher(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/** Who can export the payroll run (Equity CSV). */\nexport function canExportPayroll(user: SessionUser): boolean {\n return (\n isHeadTeacher(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/** Who can view all staff payslips (not just their own). */\nexport function canViewAllPayslips(user: SessionUser): boolean {\n return (\n isHrAdmin(user) ||\n isHeadTeacher(user) ||\n isDeputyHeadTeacher(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/** Who can view payroll summary across all branches. */\nexport function canViewCrossBranchPayroll(user: SessionUser): boolean {\n return isDirector(user) || isProprietor(user)\n}\n\n// ── Tax configuration ──────────────────────────────────────────────────────────\n\n/** Only SYSTEM_ADMIN can edit statutory tax rates. */\nexport function canEditTaxConfig(user: SessionUser): boolean {\n return isSystemAdmin(user)\n}\n\n// ── Transport ──────────────────────────────────────────────────────────────────\n\n/** Who can create, edit, and delete vehicles. */\nexport function canManageFleet(user: SessionUser): boolean {\n return (\n isHeadTeacher(user) ||\n isDeputyHeadTeacher(user) ||\n isDirector(user) ||\n isProprietor(user) ||\n isSystemAdmin(user)\n )\n}\n\n/** Who can view the full fleet list. */\nexport function canViewFleet(user: SessionUser): boolean {\n return (\n canManageFleet(user) ||\n isHrAdmin(user)\n )\n}\n\n/** Who can manage routes and stops. */\nexport function canManageRoutes(user: SessionUser): boolean {\n return (\n isHeadTeacher(user) ||\n isDeputyHeadTeacher(user) ||\n isDirector(user) ||\n isProprietor(user) ||\n isSystemAdmin(user)\n )\n}\n\n/** Who can view the transport module at all. */\nexport function canViewTransport(user: SessionUser): boolean {\n return (\n isDriver(user) ||\n isBursar(user) ||\n isHeadTeacher(user) ||\n isDeputyHeadTeacher(user) ||\n isHrAdmin(user) ||\n isDirector(user) ||\n isProprietor(user) ||\n isSystemAdmin(user)\n )\n}\n\n/** Who can create and manage trip logs. */\nexport function canManageTrips(user: SessionUser): boolean {\n return (\n isHeadTeacher(user) ||\n isDeputyHeadTeacher(user) ||\n isDirector(user) ||\n isProprietor(user) ||\n isSystemAdmin(user)\n )\n}\n\n/** Driver marks boardings on their own trip. */\nexport function canMarkBoardings(user: SessionUser): boolean {\n return (\n isDriver(user) ||\n isHeadTeacher(user) ||\n isDeputyHeadTeacher(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/** Who can submit a fuel log entry. */\nexport function canSubmitFuelLog(user: SessionUser): boolean {\n return (\n isDriver(user) ||\n isHeadTeacher(user) ||\n isDeputyHeadTeacher(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/** Who can approve a fuel log entry. */\nexport function canApproveFuelLog(user: SessionUser): boolean {\n return (\n isHeadTeacher(user) ||\n isDeputyHeadTeacher(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/** Who can submit a vehicle maintenance request. */\nexport function canSubmitMaintenanceRequest(user: SessionUser): boolean {\n return (\n isDriver(user) ||\n isHeadTeacher(user) ||\n isDeputyHeadTeacher(user) ||\n isDirector(user) ||\n isProprietor(user) ||\n isSystemAdmin(user)\n )\n}\n\n/** Who can review and resolve maintenance requests. */\nexport function canReviewMaintenance(user: SessionUser): boolean {\n return (\n isHeadTeacher(user) ||\n isDeputyHeadTeacher(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/** Who can review transport applications (route enrolment). */\nexport function canReviewTransportApplication(user: SessionUser): boolean {\n return (\n isBursar(user) ||\n isHeadTeacher(user) ||\n isDeputyHeadTeacher(user) ||\n isDirector(user) ||\n isProprietor(user)\n )\n}\n\n/**\n * Drivers see only their own vehicle and trips.\n * Returns true if the user is purely a driver with no senior role.\n */\nexport function isScopedToOwnVehicle(user: SessionUser): boolean {\n return (\n isDriver(user) &&\n !isHeadTeacher(user) &&\n !isDeputyHeadTeacher(user) &&\n !isDirector(user) &&\n !isProprietor(user) &&\n !isSystemAdmin(user)\n )\n}"],"mappings":"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","names":[]}
|
package/dist/schemas/index.cjs
CHANGED
|
@@ -129,7 +129,7 @@ var BranchRefSchema = z.object({
|
|
|
129
129
|
var z2 = __toESM(require("zod"), 1);
|
|
130
130
|
var SessionUserRoleSchema = z2.object({
|
|
131
131
|
id: z2.string().uuid(),
|
|
132
|
-
name: z2.string().meta({ description: "Role name, e.g.
|
|
132
|
+
name: z2.string().meta({ description: "Role name, e.g. HEAD_TEACHER" }),
|
|
133
133
|
branchId: z2.string().uuid(),
|
|
134
134
|
isPrimary: z2.boolean()
|
|
135
135
|
});
|
|
@@ -215,7 +215,7 @@ var CreateStaffInputSchema = z3.object({
|
|
|
215
215
|
nationalId: z3.string().min(1).max(20),
|
|
216
216
|
// Role assignment — DB-driven, any valid role code accepted
|
|
217
217
|
roleName: z3.string().min(1).meta({
|
|
218
|
-
description: "Role code from the roles table \u2014 e.g. TEACHER,
|
|
218
|
+
description: "Role code from the roles table \u2014 e.g. TEACHER, HEAD_TEACHER"
|
|
219
219
|
}),
|
|
220
220
|
isPrimaryRole: z3.boolean().default(true),
|
|
221
221
|
// Employment details
|
|
@@ -340,8 +340,8 @@ var CreateStudentInputSchema = z4.object({
|
|
|
340
340
|
lastName: z4.string().min(1).max(100),
|
|
341
341
|
dateOfBirth: z4.iso.date().meta({ description: "ISO date, e.g. 2015-03-22" }),
|
|
342
342
|
gender: GenderSchema,
|
|
343
|
-
admissionNo: z4.string().
|
|
344
|
-
description: "School-assigned admission number \u2014
|
|
343
|
+
admissionNo: z4.string().max(50).optional().meta({
|
|
344
|
+
description: "School-assigned admission number \u2014 auto-generated if not provided"
|
|
345
345
|
}),
|
|
346
346
|
nemisNo: z4.string().max(50).optional(),
|
|
347
347
|
admissionDate: z4.iso.date(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/schemas/index.ts","../../src/schemas/base.ts","../../src/schemas/auth.ts","../../src/schemas/hr.ts","../../src/schemas/students.ts","../../src/schemas/attendance.ts","../../src/schemas/calendar.ts","../../src/schemas/grades.ts"],"sourcesContent":["/**\n * Brite Future Schools — bfs-contracts\n * Schemas barrel.\n *\n * Phase History:\n * Phase 0.1 (2026-06-05): Initial creation\n * Phase 1 (2026-06-07): Added hr and students schemas\n * Phase 2.1 (2026-06-08): Added attendance schemas\n * Phase 4.1 (2026-06-12): Added calendar and grades schemas\n *\n * @module src/schemas/index\n * @since Phase 0.1\n */\n\nexport * from './base.js'\nexport * from './auth.js'\nexport * from './hr.js'\nexport * from './students.js'\nexport * from './attendance.js'\nexport * from './calendar.js'\nexport * from './grades.js'","/**\n * Brite Future Schools — bfs-contracts\n * Base Zod schemas: reusable primitives shared across all domain schemas.\n *\n * Phase History:\n * Phase 0.1 (2026-06-05): Initial creation\n *\n * @module src/schemas/base\n * @since Phase 0.1\n */\n\nimport * as z from 'zod'\n\n// ── ID ─────────────────────────────────────────────────────────────────────────\n\nexport const CuidSchema = z\n .string()\n .regex(/^[a-z][a-z0-9]{24}$/, 'Invalid cuid2 identifier')\n .meta({ description: 'cuid2 — prefixed, collision-resistant identifier' })\n\n// ── UUID ───────────────────────────────────────────────────────────────────────\n\nexport const UuidSchema = z\n .uuidv4()\n .meta({ description: 'RFC-4122 UUID v4' })\n\n// ── Timestamps ─────────────────────────────────────────────────────────────────\n\nconst IsoDatetime = z.iso.datetime()\n\nexport const TimestampsSchema = z.object({\n createdAt: IsoDatetime.meta({ description: 'ISO-8601 creation time (UTC)' }),\n updatedAt: IsoDatetime.meta({ description: 'ISO-8601 last update time (UTC)' }),\n})\n\n// ── Soft-delete ────────────────────────────────────────────────────────────────\n\nexport const SoftDeleteSchema = z.object({\n deletedAt: IsoDatetime.nullable().meta({\n description: 'Set when the record is soft-deleted; null if active',\n }),\n})\n\n// ── Pagination ─────────────────────────────────────────────────────────────────\n\nexport const PaginationInputSchema = z.object({\n cursor: z.string().optional().meta({\n description: 'Opaque cursor from the previous page response',\n }),\n limit: z\n .int()\n .min(1)\n .max(200)\n .default(20)\n .meta({ description: 'Number of items to return (1–200, default 20)' }),\n})\n\nexport function paginatedOutputSchema<T extends z.ZodTypeAny>(itemSchema: T) {\n return z.object({\n items: z.array(itemSchema),\n nextCursor: z.string().nullable().meta({\n description: 'Pass as `cursor` on the next request; null when no more pages',\n }),\n total: z\n .int()\n .nonnegative()\n .meta({ description: 'Total matching records (before pagination)' }),\n })\n}\n\n// ── Branch reference ───────────────────────────────────────────────────────────\n\nexport const BranchRefSchema = z.object({\n branchId: CuidSchema.meta({ description: 'The branch this record belongs to' }),\n})\n\n// ── Inferred types ─────────────────────────────────────────────────────────────\n\nexport type Timestamps = z.infer<typeof TimestampsSchema>\nexport type SoftDelete = z.infer<typeof SoftDeleteSchema>\nexport type PaginationInput = z.infer<typeof PaginationInputSchema>","/**\n * Brite Future Schools — bfs-contracts\n * Auth-related Zod schemas.\n *\n * Phase History:\n * Phase 0.1 (2026-06-05): Initial creation\n * Phase 3 (2026-06-10): Replaced CuidSchema with z.string().uuid() per R-052\n *\n * @module src/schemas/auth\n * @since Phase 0.1\n */\n\nimport * as z from 'zod'\n\n// ── Session user (defined first — referenced by LoginOutputSchema below) ───────\n\nexport const SessionUserRoleSchema = z.object({\n id: z.string().uuid(),\n name: z.string().meta({ description: 'Role name, e.g. PRINCIPAL' }),\n branchId: z.string().uuid(),\n isPrimary: z.boolean(),\n})\n\nexport const SessionUserSubRoleSchema = z.object({\n id: z.string().uuid(),\n name: z.string().meta({ description: 'Sub-role name, e.g. HEAD_PREFECT' }),\n branchId: z.string().uuid(),\n})\n\nexport const SessionUserOutputSchema = z.object({\n id: z.string().uuid(),\n email: z.email(),\n firstName: z.string(),\n lastName: z.string(),\n activeBranchId: z.string().uuid(),\n roles: z.array(SessionUserRoleSchema),\n subRoles: z.array(SessionUserSubRoleSchema),\n isActive: z.boolean(),\n mustChangePassword: z.boolean(),\n})\n\n// ── Login ──────────────────────────────────────────────────────────────────────\n\nexport const LoginInputSchema = z.object({\n email: z.email().meta({ description: 'User email address' }),\n password: z.string().min(1).meta({ description: 'Plain-text password (sent over TLS)' }),\n branchId: z.string().uuid().optional().meta({\n description: 'Branch to activate on login; defaults to user primary branch',\n }),\n})\n\nexport const LoginOutputSchema = z.object({\n accessToken: z.string().meta({ description: 'Short-lived JWT (15 min)' }),\n refreshToken: z.string().meta({ description: 'Long-lived opaque refresh token (7 days)' }),\n expiresIn: z.int().positive().meta({ description: 'Access token TTL in seconds' }),\n user: SessionUserOutputSchema,\n})\n\n// ── Token refresh ──────────────────────────────────────────────────────────────\n\nexport const RefreshTokenInputSchema = z.object({\n refreshToken: z.string().min(1),\n})\n\nexport const RefreshTokenOutputSchema = z.object({\n accessToken: z.string(),\n expiresIn: z.int().positive(),\n})\n\n// ── Logout ─────────────────────────────────────────────────────────────────────\n\nexport const LogoutInputSchema = z.object({\n refreshToken: z.string().min(1).meta({\n description: 'The refresh token to revoke; also invalidated server-side',\n }),\n})\n\n// ── Password change ─────────────────────────────────────────────────────────────\n\nexport const ChangePasswordInputSchema = z\n .object({\n currentPassword: z.string().min(1),\n newPassword: z\n .string()\n .min(8, { error: 'Password must be at least 8 characters' }),\n confirmPassword: z.string().min(1),\n })\n .refine((v) => v.newPassword === v.confirmPassword, {\n error: 'Passwords do not match',\n path: ['confirmPassword'],\n })\n\n// ── Password reset ─────────────────────────────────────────────────────────────\n\nexport const RequestPasswordResetInputSchema = z.object({\n email: z.email(),\n})\n\nexport const ResetPasswordInputSchema = z\n .object({\n token: z.string().min(1).meta({ description: 'One-time reset token from email link' }),\n newPassword: z.string().min(8, { error: 'Password must be at least 8 characters' }),\n confirmPassword: z.string().min(1),\n })\n .refine((v) => v.newPassword === v.confirmPassword, {\n error: 'Passwords do not match',\n path: ['confirmPassword'],\n })\n\n// ── Branch switch ───────────────────────────────────────────────────────────────\n\nexport const SwitchBranchInputSchema = z.object({\n branchId: z.string().uuid().meta({ description: 'Branch to switch the active session to' }),\n})\n\n// ── Inferred types ──────────────────────────────────────────────────────────────\n\nexport type LoginInput = z.infer<typeof LoginInputSchema>\nexport type LoginOutput = z.infer<typeof LoginOutputSchema>\nexport type SessionUserOutput = z.infer<typeof SessionUserOutputSchema>\nexport type RefreshTokenInput = z.infer<typeof RefreshTokenInputSchema>\nexport type RefreshTokenOutput = z.infer<typeof RefreshTokenOutputSchema>\nexport type ChangePasswordInput = z.infer<typeof ChangePasswordInputSchema>\nexport type SwitchBranchInput = z.infer<typeof SwitchBranchInputSchema>","/**\n * Brite Future Schools — bfs-contracts\n * HR domain Zod schemas — staff creation, listing, and profiles.\n *\n * Phase History:\n * Phase 1 (2026-06-07): Initial creation\n * Phase 4.2 (2026-06-13): Removed hardcoded RoleNameSchema — role is now\n * a plain string (DB-driven). Removed salary fields\n * from CreateStaffInput — remuneration module owns\n * salary. Added helbNo, saccoNo statutory fields.\n * Updated StaffProfile to remove salary columns.\n *\n * @module src/schemas/hr\n * @since Phase 1\n */\n\nimport * as z from 'zod'\nimport { UuidSchema, PaginationInputSchema } from './base.js'\n\n// ── Enums ──────────────────────────────────────────────────────────────────────\n\nexport const EmploymentTypeSchema = z.enum([\n 'permanent',\n 'contract',\n 'temporary',\n 'intern',\n])\n\n// ── Create staff ───────────────────────────────────────────────────────────────\n\nexport const CreateStaffInputSchema = z.object({\n // Personal details\n firstName: z.string().min(1).max(100),\n middleName: z.string().max(100).optional(),\n lastName: z.string().min(1).max(100),\n email: z.email(),\n phone: z.string().min(9).max(30),\n nationalId: z.string().min(1).max(20),\n\n // Role assignment — DB-driven, any valid role code accepted\n roleName: z.string().min(1).meta({\n description: 'Role code from the roles table — e.g. TEACHER, PRINCIPAL',\n }),\n isPrimaryRole: z.boolean().default(true),\n\n // Employment details\n departmentId: UuidSchema.optional(),\n designation: z.string().min(1).max(100).meta({\n description: 'Job title, e.g. \"Mathematics Teacher\", \"Head of Finance\"',\n }),\n employmentType: EmploymentTypeSchema,\n contractStart: z.iso.date().meta({ description: 'ISO date, e.g. 2026-01-15' }),\n contractEnd: z.iso.date().optional(),\n\n // Banking (optional at creation — can be completed later)\n bankName: z.string().max(100).optional(),\n bankAccount: z.string().max(30).optional(),\n bankBranch: z.string().max(100).optional(),\n\n // Statutory (optional at creation)\n tscNumber: z.string().max(30).optional(),\n kraPin: z.string().max(20).optional(),\n nhifNo: z.string().max(20).optional(),\n nssfNo: z.string().max(20).optional(),\n helbNo: z.string().max(20).optional(),\n saccoNo: z.string().max(20).optional(),\n})\n\nexport type CreateStaffInput = z.infer<typeof CreateStaffInputSchema>\n\n// ── Staff profile (output) ─────────────────────────────────────────────────────\n\nexport const StaffProfileSchema = z.object({\n id: UuidSchema,\n userId: UuidSchema,\n branchId: UuidSchema,\n firstName: z.string(),\n middleName: z.string().nullable(),\n lastName: z.string(),\n phone: z.string(),\n nationalId: z.string(),\n tscNumber: z.string().nullable(),\n kraPin: z.string().nullable(),\n nhifNo: z.string().nullable(),\n nssfNo: z.string().nullable(),\n helbNo: z.string().nullable(),\n saccoNo: z.string().nullable(),\n designation: z.string(),\n employmentType: EmploymentTypeSchema,\n contractStart: z.string(),\n contractEnd: z.string().nullable(),\n bankName: z.string().nullable(),\n bankAccount: z.string().nullable(),\n bankBranch: z.string().nullable(),\n status: z.string(),\n createdAt: z.string(),\n email: z.string(),\n mustChangePassword: z.boolean(),\n departmentId: UuidSchema.nullable(),\n departmentName: z.string().nullable(),\n // Role — DB-driven code string, not a fixed enum\n roleName: z.string().nullable(),\n roleId: UuidSchema.nullable(),\n})\n\nexport type StaffProfile = z.infer<typeof StaffProfileSchema>\n\n// ── Staff list item ────────────────────────────────────────────────────────────\n\nexport const StaffListItemSchema = z.object({\n id: UuidSchema,\n userId: UuidSchema,\n firstName: z.string(),\n middleName: z.string().nullable(),\n lastName: z.string(),\n email: z.string(),\n phone: z.string(),\n designation: z.string(),\n employmentType: EmploymentTypeSchema,\n status: z.string(),\n departmentName: z.string().nullable(),\n roleName: z.string().nullable(),\n createdAt: z.string(),\n})\n\nexport type StaffListItem = z.infer<typeof StaffListItemSchema>\n\n// ── List staff input ───────────────────────────────────────────────────────────\n\nexport const ListStaffInputSchema = PaginationInputSchema.extend({\n search: z.string().optional().meta({\n description: 'Search by name or email',\n }),\n departmentId: UuidSchema.optional(),\n roleName: z.string().optional(),\n status: z.enum(['active', 'inactive']).optional(),\n})\n\nexport type ListStaffInput = z.infer<typeof ListStaffInputSchema>\n\n// ── Create staff output ────────────────────────────────────────────────────────\n\nexport const CreateStaffOutputSchema = z.object({\n staffId: UuidSchema,\n userId: UuidSchema,\n email: z.string(),\n emailSent: z.boolean(),\n})\n\nexport type CreateStaffOutput = z.infer<typeof CreateStaffOutputSchema>\n\n// ── Department ─────────────────────────────────────────────────────────────────\n\nexport const DepartmentSchema = z.object({\n id: UuidSchema,\n branchId: UuidSchema,\n name: z.string(),\n hodId: UuidSchema.nullable(),\n})\n\nexport type Department = z.infer<typeof DepartmentSchema>\n\nexport const CreateDepartmentInputSchema = z.object({\n name: z.string().min(1).max(100),\n hodId: UuidSchema.optional(),\n})\n\nexport type CreateDepartmentInput = z.infer<typeof CreateDepartmentInputSchema>","/**\n * Brite Future Schools — bfs-contracts\n * Students domain Zod schemas.\n *\n * Phase History:\n * Phase 1 (2026-06-07): Initial creation — student create, list,\n * bulk upload, guardian linkage\n *\n * @module src/schemas/students\n * @since Phase 1\n */\n\nimport * as z from 'zod'\nimport { UuidSchema, PaginationInputSchema } from './base.js'\n\n// ── Enums ──────────────────────────────────────────────────────────────────────\n\nexport const GenderSchema = z.enum(['male', 'female'])\n\nexport const StudentStatusSchema = z.enum([\n 'active',\n 'transferred',\n 'graduated',\n 'suspended',\n 'withdrawn',\n])\n\nexport const GradeLevelSchema = z.enum([\n 'PP1', 'PP2',\n 'G1', 'G2', 'G3', 'G4', 'G5', 'G6', 'G7', 'G8', 'G9',\n])\n\n// ── Create single student ──────────────────────────────────────────────────────\n\nexport const CreateStudentInputSchema = z.object({\n // Identity\n firstName: z.string().min(1).max(100),\n middleName: z.string().max(100).optional(),\n lastName: z.string().min(1).max(100),\n dateOfBirth: z.iso.date().meta({ description: 'ISO date, e.g. 2015-03-22' }),\n gender: GenderSchema,\n admissionNo: z.string().min(1).max(50).meta({\n description: 'School-assigned admission number — must be unique per branch',\n }),\n nemisNo: z.string().max(50).optional(),\n admissionDate: z.iso.date(),\n bloodGroup: z.string().max(10).optional(),\n medicalNotes: z.string().optional(),\n\n // Class placement (optional at creation — can be enrolled later)\n classId: UuidSchema.optional().meta({\n description: 'Class to enrol student in for the current term',\n }),\n termId: UuidSchema.optional().meta({\n description: 'Term for class enrolment — required if classId is provided',\n }),\n\n // Guardian (optional at creation — can be linked later)\n guardian: z.object({\n firstName: z.string().min(1).max(100),\n middleName: z.string().max(100).optional(),\n lastName: z.string().min(1).max(100),\n relationship: z.string().min(1).max(50).meta({\n description: 'e.g. mother, father, uncle, guardian',\n }),\n phone: z.string().min(9).max(30),\n email: z.email().optional(),\n nationalId: z.string().max(20).optional(),\n occupation: z.string().max(100).optional(),\n }).optional(),\n})\n\nexport type CreateStudentInput = z.infer<typeof CreateStudentInputSchema>\n\n// ── Student profile (output) ───────────────────────────────────────────────────\n\nexport const StudentProfileSchema = z.object({\n id: UuidSchema,\n branchId: UuidSchema,\n admissionNo: z.string(),\n nemisNo: z.string().nullable(),\n firstName: z.string(),\n middleName: z.string().nullable(),\n lastName: z.string(),\n dateOfBirth: z.string(),\n gender: GenderSchema,\n photoUrl: z.string().nullable(),\n bloodGroup: z.string().nullable(),\n medicalNotes: z.string().nullable(),\n admissionDate: z.string(),\n status: StudentStatusSchema,\n createdAt: z.string(),\n\n // Current class (from latest enrollment)\n currentClass: z.object({\n classId: UuidSchema,\n className: z.string(),\n gradeLevel: GradeLevelSchema,\n termId: UuidSchema,\n termName: z.string(),\n }).nullable(),\n\n // Guardians\n guardians: z.array(z.object({\n id: UuidSchema,\n firstName: z.string(),\n middleName: z.string().nullable(),\n lastName: z.string(),\n relationship: z.string(),\n phone: z.string(),\n email: z.string().nullable(),\n isPrimary: z.boolean(),\n })),\n})\n\nexport type StudentProfile = z.infer<typeof StudentProfileSchema>\n\n// ── Student list item ──────────────────────────────────────────────────────────\n\nexport const StudentListItemSchema = z.object({\n id: UuidSchema,\n admissionNo: z.string(),\n firstName: z.string(),\n middleName: z.string().nullable(),\n lastName: z.string(),\n gender: GenderSchema,\n status: StudentStatusSchema,\n className: z.string().nullable(),\n gradeLevel: GradeLevelSchema.nullable(),\n primaryGuardianName: z.string().nullable(),\n primaryGuardianPhone: z.string().nullable(),\n createdAt: z.string(),\n})\n\nexport type StudentListItem = z.infer<typeof StudentListItemSchema>\n\n// ── List students input ────────────────────────────────────────────────────────\n\nexport const ListStudentsInputSchema = PaginationInputSchema.extend({\n search: z.string().optional().meta({\n description: 'Search by name or admission number',\n }),\n classId: UuidSchema.optional(),\n gradeLevel: GradeLevelSchema.optional(),\n status: StudentStatusSchema.optional(),\n termId: UuidSchema.optional(),\n})\n\nexport type ListStudentsInput = z.infer<typeof ListStudentsInputSchema>\n\n// ── Bulk upload ────────────────────────────────────────────────────────────────\n\n/**\n * One row from a CSV bulk upload.\n * Column mapping is flexible — the upload endpoint accepts this shape\n * after the CSV parser maps headers to these field names.\n */\nexport const BulkUploadStudentRowSchema = z.object({\n firstName: z.string().min(1),\n middleName: z.string().optional(),\n lastName: z.string().min(1),\n dateOfBirth: z.string().min(1).meta({ description: 'Any parseable date string' }),\n gender: z.string().min(1).meta({ description: 'male | female (case-insensitive)' }),\n admissionNo: z.string().min(1),\n nemisNo: z.string().optional(),\n admissionDate: z.string().optional(),\n bloodGroup: z.string().optional(),\n\n // Guardian columns (all optional in CSV)\n guardianFirstName: z.string().optional(),\n guardianLastName: z.string().optional(),\n guardianRelationship: z.string().optional(),\n guardianPhone: z.string().optional(),\n guardianEmail: z.string().optional(),\n})\n\nexport type BulkUploadStudentRow = z.infer<typeof BulkUploadStudentRowSchema>\n\nexport const BulkUploadStudentsInputSchema = z.object({\n classId: UuidSchema.meta({\n description: 'Class to enrol all uploaded students into',\n }),\n termId: UuidSchema,\n rows: z.array(BulkUploadStudentRowSchema).min(1).max(500),\n})\n\nexport type BulkUploadStudentsInput = z.infer<typeof BulkUploadStudentsInputSchema>\n\nexport const BulkUploadStudentsOutputSchema = z.object({\n created: z.int().nonnegative(),\n skipped: z.int().nonnegative(),\n errors: z.array(z.object({\n row: z.int().positive(),\n admissionNo: z.string().optional(),\n reason: z.string(),\n })),\n})\n\nexport type BulkUploadStudentsOutput = z.infer<typeof BulkUploadStudentsOutputSchema>\n\n// ── Create student output ──────────────────────────────────────────────────────\n\nexport const CreateStudentOutputSchema = z.object({\n studentId: UuidSchema,\n admissionNo: z.string(),\n})\n\nexport type CreateStudentOutput = z.infer<typeof CreateStudentOutputSchema>\n\n// ── Link guardian ──────────────────────────────────────────────────────────────\n\nexport const LinkGuardianInputSchema = z.object({\n studentId: UuidSchema,\n firstName: z.string().min(1).max(100),\n middleName: z.string().max(100).optional(),\n lastName: z.string().min(1).max(100),\n relationship: z.string().min(1).max(50),\n phone: z.string().min(9).max(30),\n email: z.email().optional(),\n nationalId: z.string().max(20).optional(),\n occupation: z.string().max(100).optional(),\n isPrimary: z.boolean().default(false),\n})\n\nexport type LinkGuardianInput = z.infer<typeof LinkGuardianInputSchema>\n\n// ── Classes (for selectors) ────────────────────────────────────────────────────\n\nexport const ClassSummarySchema = z.object({\n id: UuidSchema,\n name: z.string(),\n gradeLevel: GradeLevelSchema,\n gradeName: z.string(),\n capacity: z.number().nullable(),\n enrolledCount: z.number(),\n classTeacherId: UuidSchema.nullable(),\n})\n\nexport type ClassSummary = z.infer<typeof ClassSummarySchema>","/**\n * Brite Future Schools — bfs-contracts\n * Attendance domain Zod schemas.\n *\n * Phase History:\n * Phase 2.1 (2026-06-08): Initial — class attendance mark, getByClass,\n * getByStudent, listTerms\n *\n * @module src/schemas/attendance\n * @since Phase 2.1\n */\n\nimport * as z from 'zod'\nimport { UuidSchema } from './base.js'\n\n// ── Enums ──────────────────────────────────────────────────────────────────────\n\nexport const AttendanceStatusSchema = z.enum([\n 'present',\n 'absent',\n 'late',\n 'excused',\n])\n\nexport type AttendanceStatusEnum = z.infer<typeof AttendanceStatusSchema>\n\n// ── Term ───────────────────────────────────────────────────────────────────────\n\nexport const TermSchema = z.object({\n id: UuidSchema,\n branchId: UuidSchema,\n academicYearId: UuidSchema,\n name: z.string(),\n startDate: z.string(),\n endDate: z.string(),\n isCurrent: z.boolean(),\n})\n\nexport type Term = z.infer<typeof TermSchema>\n\n// ── Mark attendance ────────────────────────────────────────────────────────────\n\nexport const AttendanceRecordInputSchema = z.object({\n studentId: UuidSchema,\n status: AttendanceStatusSchema,\n notes: z.string().max(500).optional(),\n})\n\nexport const MarkAttendanceInputSchema = z.object({\n classId: UuidSchema,\n termId: UuidSchema,\n date: z.iso.date(),\n records: z.array(AttendanceRecordInputSchema).min(1),\n})\n\nexport type MarkAttendanceInput = z.infer<typeof MarkAttendanceInputSchema>\n\nexport const MarkAttendanceOutputSchema = z.object({\n count: z.number(),\n date: z.string(),\n classId: UuidSchema,\n})\n\nexport type MarkAttendanceOutput = z.infer<typeof MarkAttendanceOutputSchema>\n\n// ── Get by class ───────────────────────────────────────────────────────────────\n\nexport const GetByClassInputSchema = z.object({\n classId: UuidSchema,\n date: z.iso.date(),\n})\n\nexport type GetByClassInput = z.infer<typeof GetByClassInputSchema>\n\nexport const ClassAttendanceRowSchema = z.object({\n id: UuidSchema,\n studentId: UuidSchema,\n firstName: z.string(),\n middleName: z.string().nullable(),\n lastName: z.string(),\n admissionNo: z.string(),\n status: AttendanceStatusSchema,\n notes: z.string().nullable(),\n markedBy: UuidSchema,\n updatedAt: z.string(),\n})\n\nexport type ClassAttendanceRow = z.infer<typeof ClassAttendanceRowSchema>\n\n// ── Get by student ─────────────────────────────────────────────────────────────\n\nexport const GetByStudentInputSchema = z.object({\n studentId: UuidSchema,\n termId: UuidSchema,\n})\n\nexport type GetByStudentInput = z.infer<typeof GetByStudentInputSchema>\n\nexport const StudentAttendanceRowSchema = z.object({\n id: UuidSchema,\n date: z.string(),\n status: AttendanceStatusSchema,\n notes: z.string().nullable(),\n classId: UuidSchema,\n className: z.string(),\n})\n\nexport type StudentAttendanceRow = z.infer<typeof StudentAttendanceRowSchema>","/**\n * Brite Future Schools — bfs-contracts\n * Calendar schemas — academic years and terms.\n *\n * Phase History:\n * Phase 4.1 (2026-06-12): Initial creation\n *\n * @module src/schemas/calendar\n * @since Phase 4.1\n */\n\nimport * as z from 'zod'\n\n// ── Academic Year ──────────────────────────────────────────────────────────────\n\nexport const AcademicYearSchema = z.object({\n id: z.string().uuid(),\n branchId: z.string().uuid(),\n name: z.string(),\n startDate: z.string(),\n endDate: z.string(),\n isCurrent: z.boolean(),\n createdAt: z.string(),\n})\n\nexport const CreateYearInputSchema = z.object({\n name: z.string().min(1).max(50),\n startDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'Must be YYYY-MM-DD'),\n endDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'Must be YYYY-MM-DD'),\n})\n\nexport const SetCurrentYearInputSchema = z.object({\n yearId: z.string().uuid(),\n})\n\n// ── Academic Term ──────────────────────────────────────────────────────────────\n// Prefixed with \"Academic\" to avoid clash with attendance.ts TermSchema / Term\n\nexport const AcademicTermSchema = z.object({\n id: z.string().uuid(),\n branchId: z.string().uuid(),\n academicYearId: z.string().uuid(),\n name: z.string(),\n startDate: z.string(),\n endDate: z.string(),\n isCurrent: z.boolean(),\n createdAt: z.string(),\n})\n\nexport const CreateTermInputSchema = z.object({\n academicYearId: z.string().uuid(),\n name: z.string().min(1).max(50),\n startDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'Must be YYYY-MM-DD'),\n endDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'Must be YYYY-MM-DD'),\n})\n\nexport const SetCurrentTermInputSchema = z.object({\n termId: z.string().uuid(),\n})\n\nexport const ListTermsInputSchema = z.object({\n yearId: z.string().uuid().optional(),\n})\n\n// ── Inferred types ─────────────────────────────────────────────────────────────\n\nexport type AcademicYear = z.infer<typeof AcademicYearSchema>\nexport type AcademicTerm = z.infer<typeof AcademicTermSchema>\nexport type CreateYearInput = z.infer<typeof CreateYearInputSchema>\nexport type CreateTermInput = z.infer<typeof CreateTermInputSchema>","/**\n * Brite Future Schools — bfs-contracts\n * Grades schemas.\n *\n * Phase History:\n * Phase 4.1 (2026-06-12): Initial creation\n *\n * @module src/schemas/grades\n * @since Phase 4.1\n */\n\nimport * as z from 'zod'\nimport { GradeLevelSchema } from './students.js'\n\n// Re-export so consumers can import GradeLevel from grades if needed\nexport { GradeLevelSchema }\n\nexport const GRADE_LEVELS = [\n 'PP1', 'PP2',\n 'G1', 'G2', 'G3', 'G4', 'G5', 'G6',\n 'G7', 'G8', 'G9',\n] as const\n\nexport type GradeLevel = typeof GRADE_LEVELS[number]\n\nexport const GradeSchema = z.object({\n id: z.string().uuid(),\n branchId: z.string().uuid(),\n name: z.string(),\n level: GradeLevelSchema,\n description: z.string().nullable(),\n})\n\nexport const CreateGradeInputSchema = z.object({\n name: z.string().min(1).max(50),\n level: GradeLevelSchema,\n description: z.string().max(300).optional(),\n})\n\n// ── Inferred types ─────────────────────────────────────────────────────────────\n\nexport type Grade = z.infer<typeof GradeSchema>\nexport type CreateGradeInput = z.infer<typeof CreateGradeInputSchema>"],"mappings":"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","names":["z","z","z","z","z","z"]}
|
|
1
|
+
{"version":3,"sources":["../../src/schemas/index.ts","../../src/schemas/base.ts","../../src/schemas/auth.ts","../../src/schemas/hr.ts","../../src/schemas/students.ts","../../src/schemas/attendance.ts","../../src/schemas/calendar.ts","../../src/schemas/grades.ts"],"sourcesContent":["/**\n * Brite Future Schools — bfs-contracts\n * Schemas barrel.\n *\n * Phase History:\n * Phase 0.1 (2026-06-05): Initial creation\n * Phase 1 (2026-06-07): Added hr and students schemas\n * Phase 2.1 (2026-06-08): Added attendance schemas\n * Phase 4.1 (2026-06-12): Added calendar and grades schemas\n *\n * @module src/schemas/index\n * @since Phase 0.1\n */\n\nexport * from './base.js'\nexport * from './auth.js'\nexport * from './hr.js'\nexport * from './students.js'\nexport * from './attendance.js'\nexport * from './calendar.js'\nexport * from './grades.js'","/**\n * Brite Future Schools — bfs-contracts\n * Base Zod schemas: reusable primitives shared across all domain schemas.\n *\n * Phase History:\n * Phase 0.1 (2026-06-05): Initial creation\n *\n * @module src/schemas/base\n * @since Phase 0.1\n */\n\nimport * as z from 'zod'\n\n// ── ID ─────────────────────────────────────────────────────────────────────────\n\nexport const CuidSchema = z\n .string()\n .regex(/^[a-z][a-z0-9]{24}$/, 'Invalid cuid2 identifier')\n .meta({ description: 'cuid2 — prefixed, collision-resistant identifier' })\n\n// ── UUID ───────────────────────────────────────────────────────────────────────\n\nexport const UuidSchema = z\n .uuidv4()\n .meta({ description: 'RFC-4122 UUID v4' })\n\n// ── Timestamps ─────────────────────────────────────────────────────────────────\n\nconst IsoDatetime = z.iso.datetime()\n\nexport const TimestampsSchema = z.object({\n createdAt: IsoDatetime.meta({ description: 'ISO-8601 creation time (UTC)' }),\n updatedAt: IsoDatetime.meta({ description: 'ISO-8601 last update time (UTC)' }),\n})\n\n// ── Soft-delete ────────────────────────────────────────────────────────────────\n\nexport const SoftDeleteSchema = z.object({\n deletedAt: IsoDatetime.nullable().meta({\n description: 'Set when the record is soft-deleted; null if active',\n }),\n})\n\n// ── Pagination ─────────────────────────────────────────────────────────────────\n\nexport const PaginationInputSchema = z.object({\n cursor: z.string().optional().meta({\n description: 'Opaque cursor from the previous page response',\n }),\n limit: z\n .int()\n .min(1)\n .max(200)\n .default(20)\n .meta({ description: 'Number of items to return (1–200, default 20)' }),\n})\n\nexport function paginatedOutputSchema<T extends z.ZodTypeAny>(itemSchema: T) {\n return z.object({\n items: z.array(itemSchema),\n nextCursor: z.string().nullable().meta({\n description: 'Pass as `cursor` on the next request; null when no more pages',\n }),\n total: z\n .int()\n .nonnegative()\n .meta({ description: 'Total matching records (before pagination)' }),\n })\n}\n\n// ── Branch reference ───────────────────────────────────────────────────────────\n\nexport const BranchRefSchema = z.object({\n branchId: CuidSchema.meta({ description: 'The branch this record belongs to' }),\n})\n\n// ── Inferred types ─────────────────────────────────────────────────────────────\n\nexport type Timestamps = z.infer<typeof TimestampsSchema>\nexport type SoftDelete = z.infer<typeof SoftDeleteSchema>\nexport type PaginationInput = z.infer<typeof PaginationInputSchema>","/**\n * Brite Future Schools — bfs-contracts\n * Auth-related Zod schemas.\n *\n * Phase History:\n * Phase 0.1 (2026-06-05): Initial creation\n * Phase 3 (2026-06-10): Replaced CuidSchema with z.string().uuid() per R-052\n *\n * @module src/schemas/auth\n * @since Phase 0.1\n */\n\nimport * as z from 'zod'\n\n// ── Session user (defined first — referenced by LoginOutputSchema below) ───────\n\nexport const SessionUserRoleSchema = z.object({\n id: z.string().uuid(),\n name: z.string().meta({ description: 'Role name, e.g. HEAD_TEACHER' }),\n branchId: z.string().uuid(),\n isPrimary: z.boolean(),\n})\n\nexport const SessionUserSubRoleSchema = z.object({\n id: z.string().uuid(),\n name: z.string().meta({ description: 'Sub-role name, e.g. HEAD_PREFECT' }),\n branchId: z.string().uuid(),\n})\n\nexport const SessionUserOutputSchema = z.object({\n id: z.string().uuid(),\n email: z.email(),\n firstName: z.string(),\n lastName: z.string(),\n activeBranchId: z.string().uuid(),\n roles: z.array(SessionUserRoleSchema),\n subRoles: z.array(SessionUserSubRoleSchema),\n isActive: z.boolean(),\n mustChangePassword: z.boolean(),\n})\n\n// ── Login ──────────────────────────────────────────────────────────────────────\n\nexport const LoginInputSchema = z.object({\n email: z.email().meta({ description: 'User email address' }),\n password: z.string().min(1).meta({ description: 'Plain-text password (sent over TLS)' }),\n branchId: z.string().uuid().optional().meta({\n description: 'Branch to activate on login; defaults to user primary branch',\n }),\n})\n\nexport const LoginOutputSchema = z.object({\n accessToken: z.string().meta({ description: 'Short-lived JWT (15 min)' }),\n refreshToken: z.string().meta({ description: 'Long-lived opaque refresh token (7 days)' }),\n expiresIn: z.int().positive().meta({ description: 'Access token TTL in seconds' }),\n user: SessionUserOutputSchema,\n})\n\n// ── Token refresh ──────────────────────────────────────────────────────────────\n\nexport const RefreshTokenInputSchema = z.object({\n refreshToken: z.string().min(1),\n})\n\nexport const RefreshTokenOutputSchema = z.object({\n accessToken: z.string(),\n expiresIn: z.int().positive(),\n})\n\n// ── Logout ─────────────────────────────────────────────────────────────────────\n\nexport const LogoutInputSchema = z.object({\n refreshToken: z.string().min(1).meta({\n description: 'The refresh token to revoke; also invalidated server-side',\n }),\n})\n\n// ── Password change ─────────────────────────────────────────────────────────────\n\nexport const ChangePasswordInputSchema = z\n .object({\n currentPassword: z.string().min(1),\n newPassword: z\n .string()\n .min(8, { error: 'Password must be at least 8 characters' }),\n confirmPassword: z.string().min(1),\n })\n .refine((v) => v.newPassword === v.confirmPassword, {\n error: 'Passwords do not match',\n path: ['confirmPassword'],\n })\n\n// ── Password reset ─────────────────────────────────────────────────────────────\n\nexport const RequestPasswordResetInputSchema = z.object({\n email: z.email(),\n})\n\nexport const ResetPasswordInputSchema = z\n .object({\n token: z.string().min(1).meta({ description: 'One-time reset token from email link' }),\n newPassword: z.string().min(8, { error: 'Password must be at least 8 characters' }),\n confirmPassword: z.string().min(1),\n })\n .refine((v) => v.newPassword === v.confirmPassword, {\n error: 'Passwords do not match',\n path: ['confirmPassword'],\n })\n\n// ── Branch switch ───────────────────────────────────────────────────────────────\n\nexport const SwitchBranchInputSchema = z.object({\n branchId: z.string().uuid().meta({ description: 'Branch to switch the active session to' }),\n})\n\n// ── Inferred types ──────────────────────────────────────────────────────────────\n\nexport type LoginInput = z.infer<typeof LoginInputSchema>\nexport type LoginOutput = z.infer<typeof LoginOutputSchema>\nexport type SessionUserOutput = z.infer<typeof SessionUserOutputSchema>\nexport type RefreshTokenInput = z.infer<typeof RefreshTokenInputSchema>\nexport type RefreshTokenOutput = z.infer<typeof RefreshTokenOutputSchema>\nexport type ChangePasswordInput = z.infer<typeof ChangePasswordInputSchema>\nexport type SwitchBranchInput = z.infer<typeof SwitchBranchInputSchema>","/**\n * Brite Future Schools — bfs-contracts\n * HR domain Zod schemas — staff creation, listing, and profiles.\n *\n * Phase History:\n * Phase 1 (2026-06-07): Initial creation\n * Phase 4.2 (2026-06-13): Removed hardcoded RoleNameSchema — role is now\n * a plain string (DB-driven). Removed salary fields\n * from CreateStaffInput — remuneration module owns\n * salary. Added helbNo, saccoNo statutory fields.\n * Updated StaffProfile to remove salary columns.\n *\n * @module src/schemas/hr\n * @since Phase 1\n */\n\nimport * as z from 'zod'\nimport { UuidSchema, PaginationInputSchema } from './base.js'\n\n// ── Enums ──────────────────────────────────────────────────────────────────────\n\nexport const EmploymentTypeSchema = z.enum([\n 'permanent',\n 'contract',\n 'temporary',\n 'intern',\n])\n\n// ── Create staff ───────────────────────────────────────────────────────────────\n\nexport const CreateStaffInputSchema = z.object({\n // Personal details\n firstName: z.string().min(1).max(100),\n middleName: z.string().max(100).optional(),\n lastName: z.string().min(1).max(100),\n email: z.email(),\n phone: z.string().min(9).max(30),\n nationalId: z.string().min(1).max(20),\n\n // Role assignment — DB-driven, any valid role code accepted\n roleName: z.string().min(1).meta({\n description: 'Role code from the roles table — e.g. TEACHER, HEAD_TEACHER',\n }),\n isPrimaryRole: z.boolean().default(true),\n\n // Employment details\n departmentId: UuidSchema.optional(),\n designation: z.string().min(1).max(100).meta({\n description: 'Job title, e.g. \"Mathematics Teacher\", \"Head of Finance\"',\n }),\n employmentType: EmploymentTypeSchema,\n contractStart: z.iso.date().meta({ description: 'ISO date, e.g. 2026-01-15' }),\n contractEnd: z.iso.date().optional(),\n\n // Banking (optional at creation — can be completed later)\n bankName: z.string().max(100).optional(),\n bankAccount: z.string().max(30).optional(),\n bankBranch: z.string().max(100).optional(),\n\n // Statutory (optional at creation)\n tscNumber: z.string().max(30).optional(),\n kraPin: z.string().max(20).optional(),\n nhifNo: z.string().max(20).optional(),\n nssfNo: z.string().max(20).optional(),\n helbNo: z.string().max(20).optional(),\n saccoNo: z.string().max(20).optional(),\n})\n\nexport type CreateStaffInput = z.infer<typeof CreateStaffInputSchema>\n\n// ── Staff profile (output) ─────────────────────────────────────────────────────\n\nexport const StaffProfileSchema = z.object({\n id: UuidSchema,\n userId: UuidSchema,\n branchId: UuidSchema,\n firstName: z.string(),\n middleName: z.string().nullable(),\n lastName: z.string(),\n phone: z.string(),\n nationalId: z.string(),\n tscNumber: z.string().nullable(),\n kraPin: z.string().nullable(),\n nhifNo: z.string().nullable(),\n nssfNo: z.string().nullable(),\n helbNo: z.string().nullable(),\n saccoNo: z.string().nullable(),\n designation: z.string(),\n employmentType: EmploymentTypeSchema,\n contractStart: z.string(),\n contractEnd: z.string().nullable(),\n bankName: z.string().nullable(),\n bankAccount: z.string().nullable(),\n bankBranch: z.string().nullable(),\n status: z.string(),\n createdAt: z.string(),\n email: z.string(),\n mustChangePassword: z.boolean(),\n departmentId: UuidSchema.nullable(),\n departmentName: z.string().nullable(),\n // Role — DB-driven code string, not a fixed enum\n roleName: z.string().nullable(),\n roleId: UuidSchema.nullable(),\n})\n\nexport type StaffProfile = z.infer<typeof StaffProfileSchema>\n\n// ── Staff list item ────────────────────────────────────────────────────────────\n\nexport const StaffListItemSchema = z.object({\n id: UuidSchema,\n userId: UuidSchema,\n firstName: z.string(),\n middleName: z.string().nullable(),\n lastName: z.string(),\n email: z.string(),\n phone: z.string(),\n designation: z.string(),\n employmentType: EmploymentTypeSchema,\n status: z.string(),\n departmentName: z.string().nullable(),\n roleName: z.string().nullable(),\n createdAt: z.string(),\n})\n\nexport type StaffListItem = z.infer<typeof StaffListItemSchema>\n\n// ── List staff input ───────────────────────────────────────────────────────────\n\nexport const ListStaffInputSchema = PaginationInputSchema.extend({\n search: z.string().optional().meta({\n description: 'Search by name or email',\n }),\n departmentId: UuidSchema.optional(),\n roleName: z.string().optional(),\n status: z.enum(['active', 'inactive']).optional(),\n})\n\nexport type ListStaffInput = z.infer<typeof ListStaffInputSchema>\n\n// ── Create staff output ────────────────────────────────────────────────────────\n\nexport const CreateStaffOutputSchema = z.object({\n staffId: UuidSchema,\n userId: UuidSchema,\n email: z.string(),\n emailSent: z.boolean(),\n})\n\nexport type CreateStaffOutput = z.infer<typeof CreateStaffOutputSchema>\n\n// ── Department ─────────────────────────────────────────────────────────────────\n\nexport const DepartmentSchema = z.object({\n id: UuidSchema,\n branchId: UuidSchema,\n name: z.string(),\n hodId: UuidSchema.nullable(),\n})\n\nexport type Department = z.infer<typeof DepartmentSchema>\n\nexport const CreateDepartmentInputSchema = z.object({\n name: z.string().min(1).max(100),\n hodId: UuidSchema.optional(),\n})\n\nexport type CreateDepartmentInput = z.infer<typeof CreateDepartmentInputSchema>","/**\n * Brite Future Schools — bfs-contracts\n * Students domain Zod schemas.\n *\n * Phase History:\n * Phase 1 (2026-06-07): Initial creation — student create, list,\n * bulk upload, guardian linkage\n *\n * @module src/schemas/students\n * @since Phase 1\n */\n\nimport * as z from 'zod'\nimport { UuidSchema, PaginationInputSchema } from './base.js'\n\n// ── Enums ──────────────────────────────────────────────────────────────────────\n\nexport const GenderSchema = z.enum(['male', 'female'])\n\nexport const StudentStatusSchema = z.enum([\n 'active',\n 'transferred',\n 'graduated',\n 'suspended',\n 'withdrawn',\n])\n\nexport const GradeLevelSchema = z.enum([\n 'PP1', 'PP2',\n 'G1', 'G2', 'G3', 'G4', 'G5', 'G6', 'G7', 'G8', 'G9',\n])\n\n// ── Create single student ──────────────────────────────────────────────────────\n\nexport const CreateStudentInputSchema = z.object({\n // Identity\n firstName: z.string().min(1).max(100),\n middleName: z.string().max(100).optional(),\n lastName: z.string().min(1).max(100),\n dateOfBirth: z.iso.date().meta({ description: 'ISO date, e.g. 2015-03-22' }),\n gender: GenderSchema,\n admissionNo: z.string().max(50).optional().meta({\n description: 'School-assigned admission number — auto-generated if not provided',\n }),\n nemisNo: z.string().max(50).optional(),\n admissionDate: z.iso.date(),\n bloodGroup: z.string().max(10).optional(),\n medicalNotes: z.string().optional(),\n\n // Class placement (optional at creation — can be enrolled later)\n classId: UuidSchema.optional().meta({\n description: 'Class to enrol student in for the current term',\n }),\n termId: UuidSchema.optional().meta({\n description: 'Term for class enrolment — required if classId is provided',\n }),\n\n // Guardian (optional at creation — can be linked later)\n guardian: z.object({\n firstName: z.string().min(1).max(100),\n middleName: z.string().max(100).optional(),\n lastName: z.string().min(1).max(100),\n relationship: z.string().min(1).max(50).meta({\n description: 'e.g. mother, father, uncle, guardian',\n }),\n phone: z.string().min(9).max(30),\n email: z.email().optional(),\n nationalId: z.string().max(20).optional(),\n occupation: z.string().max(100).optional(),\n }).optional(),\n})\n\nexport type CreateStudentInput = z.infer<typeof CreateStudentInputSchema>\n\n// ── Student profile (output) ───────────────────────────────────────────────────\n\nexport const StudentProfileSchema = z.object({\n id: UuidSchema,\n branchId: UuidSchema,\n admissionNo: z.string(),\n nemisNo: z.string().nullable(),\n firstName: z.string(),\n middleName: z.string().nullable(),\n lastName: z.string(),\n dateOfBirth: z.string(),\n gender: GenderSchema,\n photoUrl: z.string().nullable(),\n bloodGroup: z.string().nullable(),\n medicalNotes: z.string().nullable(),\n admissionDate: z.string(),\n status: StudentStatusSchema,\n createdAt: z.string(),\n\n // Current class (from latest enrollment)\n currentClass: z.object({\n classId: UuidSchema,\n className: z.string(),\n gradeLevel: GradeLevelSchema,\n termId: UuidSchema,\n termName: z.string(),\n }).nullable(),\n\n // Guardians\n guardians: z.array(z.object({\n id: UuidSchema,\n firstName: z.string(),\n middleName: z.string().nullable(),\n lastName: z.string(),\n relationship: z.string(),\n phone: z.string(),\n email: z.string().nullable(),\n isPrimary: z.boolean(),\n })),\n})\n\nexport type StudentProfile = z.infer<typeof StudentProfileSchema>\n\n// ── Student list item ──────────────────────────────────────────────────────────\n\nexport const StudentListItemSchema = z.object({\n id: UuidSchema,\n admissionNo: z.string(),\n firstName: z.string(),\n middleName: z.string().nullable(),\n lastName: z.string(),\n gender: GenderSchema,\n status: StudentStatusSchema,\n className: z.string().nullable(),\n gradeLevel: GradeLevelSchema.nullable(),\n primaryGuardianName: z.string().nullable(),\n primaryGuardianPhone: z.string().nullable(),\n createdAt: z.string(),\n})\n\nexport type StudentListItem = z.infer<typeof StudentListItemSchema>\n\n// ── List students input ────────────────────────────────────────────────────────\n\nexport const ListStudentsInputSchema = PaginationInputSchema.extend({\n search: z.string().optional().meta({\n description: 'Search by name or admission number',\n }),\n classId: UuidSchema.optional(),\n gradeLevel: GradeLevelSchema.optional(),\n status: StudentStatusSchema.optional(),\n termId: UuidSchema.optional(),\n})\n\nexport type ListStudentsInput = z.infer<typeof ListStudentsInputSchema>\n\n// ── Bulk upload ────────────────────────────────────────────────────────────────\n\n/**\n * One row from a CSV bulk upload.\n * Column mapping is flexible — the upload endpoint accepts this shape\n * after the CSV parser maps headers to these field names.\n */\nexport const BulkUploadStudentRowSchema = z.object({\n firstName: z.string().min(1),\n middleName: z.string().optional(),\n lastName: z.string().min(1),\n dateOfBirth: z.string().min(1).meta({ description: 'Any parseable date string' }),\n gender: z.string().min(1).meta({ description: 'male | female (case-insensitive)' }),\n admissionNo: z.string().min(1),\n nemisNo: z.string().optional(),\n admissionDate: z.string().optional(),\n bloodGroup: z.string().optional(),\n\n // Guardian columns (all optional in CSV)\n guardianFirstName: z.string().optional(),\n guardianLastName: z.string().optional(),\n guardianRelationship: z.string().optional(),\n guardianPhone: z.string().optional(),\n guardianEmail: z.string().optional(),\n})\n\nexport type BulkUploadStudentRow = z.infer<typeof BulkUploadStudentRowSchema>\n\nexport const BulkUploadStudentsInputSchema = z.object({\n classId: UuidSchema.meta({\n description: 'Class to enrol all uploaded students into',\n }),\n termId: UuidSchema,\n rows: z.array(BulkUploadStudentRowSchema).min(1).max(500),\n})\n\nexport type BulkUploadStudentsInput = z.infer<typeof BulkUploadStudentsInputSchema>\n\nexport const BulkUploadStudentsOutputSchema = z.object({\n created: z.int().nonnegative(),\n skipped: z.int().nonnegative(),\n errors: z.array(z.object({\n row: z.int().positive(),\n admissionNo: z.string().optional(),\n reason: z.string(),\n })),\n})\n\nexport type BulkUploadStudentsOutput = z.infer<typeof BulkUploadStudentsOutputSchema>\n\n// ── Create student output ──────────────────────────────────────────────────────\n\nexport const CreateStudentOutputSchema = z.object({\n studentId: UuidSchema,\n admissionNo: z.string(),\n})\n\nexport type CreateStudentOutput = z.infer<typeof CreateStudentOutputSchema>\n\n// ── Link guardian ──────────────────────────────────────────────────────────────\n\nexport const LinkGuardianInputSchema = z.object({\n studentId: UuidSchema,\n firstName: z.string().min(1).max(100),\n middleName: z.string().max(100).optional(),\n lastName: z.string().min(1).max(100),\n relationship: z.string().min(1).max(50),\n phone: z.string().min(9).max(30),\n email: z.email().optional(),\n nationalId: z.string().max(20).optional(),\n occupation: z.string().max(100).optional(),\n isPrimary: z.boolean().default(false),\n})\n\nexport type LinkGuardianInput = z.infer<typeof LinkGuardianInputSchema>\n\n// ── Classes (for selectors) ────────────────────────────────────────────────────\n\nexport const ClassSummarySchema = z.object({\n id: UuidSchema,\n name: z.string(),\n gradeLevel: GradeLevelSchema,\n gradeName: z.string(),\n capacity: z.number().nullable(),\n enrolledCount: z.number(),\n classTeacherId: UuidSchema.nullable(),\n})\n\nexport type ClassSummary = z.infer<typeof ClassSummarySchema>","/**\n * Brite Future Schools — bfs-contracts\n * Attendance domain Zod schemas.\n *\n * Phase History:\n * Phase 2.1 (2026-06-08): Initial — class attendance mark, getByClass,\n * getByStudent, listTerms\n *\n * @module src/schemas/attendance\n * @since Phase 2.1\n */\n\nimport * as z from 'zod'\nimport { UuidSchema } from './base.js'\n\n// ── Enums ──────────────────────────────────────────────────────────────────────\n\nexport const AttendanceStatusSchema = z.enum([\n 'present',\n 'absent',\n 'late',\n 'excused',\n])\n\nexport type AttendanceStatusEnum = z.infer<typeof AttendanceStatusSchema>\n\n// ── Term ───────────────────────────────────────────────────────────────────────\n\nexport const TermSchema = z.object({\n id: UuidSchema,\n branchId: UuidSchema,\n academicYearId: UuidSchema,\n name: z.string(),\n startDate: z.string(),\n endDate: z.string(),\n isCurrent: z.boolean(),\n})\n\nexport type Term = z.infer<typeof TermSchema>\n\n// ── Mark attendance ────────────────────────────────────────────────────────────\n\nexport const AttendanceRecordInputSchema = z.object({\n studentId: UuidSchema,\n status: AttendanceStatusSchema,\n notes: z.string().max(500).optional(),\n})\n\nexport const MarkAttendanceInputSchema = z.object({\n classId: UuidSchema,\n termId: UuidSchema,\n date: z.iso.date(),\n records: z.array(AttendanceRecordInputSchema).min(1),\n})\n\nexport type MarkAttendanceInput = z.infer<typeof MarkAttendanceInputSchema>\n\nexport const MarkAttendanceOutputSchema = z.object({\n count: z.number(),\n date: z.string(),\n classId: UuidSchema,\n})\n\nexport type MarkAttendanceOutput = z.infer<typeof MarkAttendanceOutputSchema>\n\n// ── Get by class ───────────────────────────────────────────────────────────────\n\nexport const GetByClassInputSchema = z.object({\n classId: UuidSchema,\n date: z.iso.date(),\n})\n\nexport type GetByClassInput = z.infer<typeof GetByClassInputSchema>\n\nexport const ClassAttendanceRowSchema = z.object({\n id: UuidSchema,\n studentId: UuidSchema,\n firstName: z.string(),\n middleName: z.string().nullable(),\n lastName: z.string(),\n admissionNo: z.string(),\n status: AttendanceStatusSchema,\n notes: z.string().nullable(),\n markedBy: UuidSchema,\n updatedAt: z.string(),\n})\n\nexport type ClassAttendanceRow = z.infer<typeof ClassAttendanceRowSchema>\n\n// ── Get by student ─────────────────────────────────────────────────────────────\n\nexport const GetByStudentInputSchema = z.object({\n studentId: UuidSchema,\n termId: UuidSchema,\n})\n\nexport type GetByStudentInput = z.infer<typeof GetByStudentInputSchema>\n\nexport const StudentAttendanceRowSchema = z.object({\n id: UuidSchema,\n date: z.string(),\n status: AttendanceStatusSchema,\n notes: z.string().nullable(),\n classId: UuidSchema,\n className: z.string(),\n})\n\nexport type StudentAttendanceRow = z.infer<typeof StudentAttendanceRowSchema>","/**\n * Brite Future Schools — bfs-contracts\n * Calendar schemas — academic years and terms.\n *\n * Phase History:\n * Phase 4.1 (2026-06-12): Initial creation\n *\n * @module src/schemas/calendar\n * @since Phase 4.1\n */\n\nimport * as z from 'zod'\n\n// ── Academic Year ──────────────────────────────────────────────────────────────\n\nexport const AcademicYearSchema = z.object({\n id: z.string().uuid(),\n branchId: z.string().uuid(),\n name: z.string(),\n startDate: z.string(),\n endDate: z.string(),\n isCurrent: z.boolean(),\n createdAt: z.string(),\n})\n\nexport const CreateYearInputSchema = z.object({\n name: z.string().min(1).max(50),\n startDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'Must be YYYY-MM-DD'),\n endDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'Must be YYYY-MM-DD'),\n})\n\nexport const SetCurrentYearInputSchema = z.object({\n yearId: z.string().uuid(),\n})\n\n// ── Academic Term ──────────────────────────────────────────────────────────────\n// Prefixed with \"Academic\" to avoid clash with attendance.ts TermSchema / Term\n\nexport const AcademicTermSchema = z.object({\n id: z.string().uuid(),\n branchId: z.string().uuid(),\n academicYearId: z.string().uuid(),\n name: z.string(),\n startDate: z.string(),\n endDate: z.string(),\n isCurrent: z.boolean(),\n createdAt: z.string(),\n})\n\nexport const CreateTermInputSchema = z.object({\n academicYearId: z.string().uuid(),\n name: z.string().min(1).max(50),\n startDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'Must be YYYY-MM-DD'),\n endDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'Must be YYYY-MM-DD'),\n})\n\nexport const SetCurrentTermInputSchema = z.object({\n termId: z.string().uuid(),\n})\n\nexport const ListTermsInputSchema = z.object({\n yearId: z.string().uuid().optional(),\n})\n\n// ── Inferred types ─────────────────────────────────────────────────────────────\n\nexport type AcademicYear = z.infer<typeof AcademicYearSchema>\nexport type AcademicTerm = z.infer<typeof AcademicTermSchema>\nexport type CreateYearInput = z.infer<typeof CreateYearInputSchema>\nexport type CreateTermInput = z.infer<typeof CreateTermInputSchema>","/**\n * Brite Future Schools — bfs-contracts\n * Grades schemas.\n *\n * Phase History:\n * Phase 4.1 (2026-06-12): Initial creation\n *\n * @module src/schemas/grades\n * @since Phase 4.1\n */\n\nimport * as z from 'zod'\nimport { GradeLevelSchema } from './students.js'\n\n// Re-export so consumers can import GradeLevel from grades if needed\nexport { GradeLevelSchema }\n\nexport const GRADE_LEVELS = [\n 'PP1', 'PP2',\n 'G1', 'G2', 'G3', 'G4', 'G5', 'G6',\n 'G7', 'G8', 'G9',\n] as const\n\nexport type GradeLevel = typeof GRADE_LEVELS[number]\n\nexport const GradeSchema = z.object({\n id: z.string().uuid(),\n branchId: z.string().uuid(),\n name: z.string(),\n level: GradeLevelSchema,\n description: z.string().nullable(),\n})\n\nexport const CreateGradeInputSchema = z.object({\n name: z.string().min(1).max(50),\n level: GradeLevelSchema,\n description: z.string().max(300).optional(),\n})\n\n// ── Inferred types ─────────────────────────────────────────────────────────────\n\nexport type Grade = z.infer<typeof GradeSchema>\nexport type CreateGradeInput = z.infer<typeof CreateGradeInputSchema>"],"mappings":"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","names":["z","z","z","z","z","z"]}
|