Build Plan v2.0

Frontend — School Admin Dashboard Build Plan

Full-Stack Delivery Plan for the School Administration Console — v2.0

Date
2026-04-14
Status
Planning
Engines
30+
Endpoints
1,772
Tests
3,607 ✓
Frontend
1 / 30+
401 models 327 enums 285 .tsx files 31 routes ~282 new pages needed 257 Swagger tags

1. Executive Summary

Management has requested a fully functional school administration dashboard — one that a school administrator can use to completely run a school, backed by real data, and working across all ISCED levels (primary through doctoral).

The backend is ready. 30+ engines delivering 1,772 REST endpoints across 401 Prisma models handle every aspect of school operations: admissions, student lifecycle, programmes, courses, grading, attendance, assignments, fees, wallets, staff, scheduling, timetabling, library, health, behavior, early warning, hostel, transport, canteen, documents, notifications, messaging, scholarships, oversight, and more. All endpoints are Swagger-documented across 257 tags. All 3,607 tests pass across 142 test files.

The frontend is not. Today, only the UADE landing dashboard (1 of 30+ engines) is connected to real API data. The remaining engines have zero frontend representation. The app has 31 page routes — mostly scaffold/demo pages. None are wired to the school management API.

The gap is pure frontend engineering. No new backend endpoints are needed. The work is:

  1. Build a tenant-scoped shell (/dashboard/school/[tenantId]/...) with RBAC-filtered navigation
  2. Build ~25 frontend feature modules, each consuming 1–3 backend engines
  3. Make every module ISCED-aware (conditional labels, fields, features based on iscedLevels[])
  4. Ensure real data flows end-to-end: CRUD operations, pagination, search, filters, bulk actions
  5. Build a separate Organisation Dashboard context for multi-school management (OrgPE)

2. Problem Case

2.1 What Was Asked

"Build the school admin dashboard with real data and full functionalities to completely run a school and across different ISCED levels."

2.2 What "Completely Run a School" Means

A school administrator needs to perform 25+ distinct functional domains. Every domain, its backend engine, and endpoint count:

DomainWhat They DoEngineEndpoints
Admit studentsOpen windows, review apps, score merit, extend offers, enrollADME62
Manage studentsIdentity, guardians, docs, groups, class placement, transfers, clearance, ID cards, pastoral, re-enrollmentStuLCE66
Set up programmesLifecycles, levels, progression rules, specializations, graduationPME46
Manage coursesCatalogue, offerings, syllabi, curriculum maps, outcomes, materials, contentCME77
Master syllabusBrowse national syllabi, adopt/fork, custom builder, review pipelineMaSyE50
Grade studentsAssessment creation, score entry, grade computation, GPA/CGPA, report gen, sequences, templates, graduationGME103
Online examsQuestion bank, exam papers, online exam delivery, proctoring, auto-gradingQBE + GME/OEE45
Track attendanceMark attendance (6 event types), configure devices, set alerts, bridge gradesATME28
Manage assignmentsCreate assignments, track submissions, grade, contestation, bulk scoringASME21
Collect feesStructures, billing, payments, installments, waivers, discounts, debt, revenue share, taxACCTE/FME98
Student walletsClosed-loop cashless campus: wallets, parent funding, merchant POS, catalogue, fee bridgeACCTE/WME53
SubscriptionsFeature gates, subscription tiers, tenant subscriptions, overrides, enforcementACCTE/SBE37
Manage staffOnboard, contracts, qualifications, CPD, appraisals, transfers, exit, reportingStaME60
Schedule & timetableAcademic calendars, class timetables, exam timetables, staff leave, facilities, eventsSCIE160
Run the libraryCatalogue, circulation, holds, fines, textbooks, digital resources, reading lists, inventoryLME95
Manage healthRecords, allergies, dietary, immunizations, clinic visits, sickbay, medications, pharmacy, growthSHME72
Track behaviorEvents, at-risk detection, counseling, escalation hearings, contracts, rewards, EWSSBME88
Run hostelsRoom allocation, exeat permits, inspections, visitors, fees, staff, operationsHME57
Run canteenMeal plans, sessions, check-in, tables, menu schedule, dietary alertsRCM32
Manage transportRoutes, stops, vehicles, drivers, enrollment, trip tracking, attendance, incidentsTME62
Generate documentsReport cards, transcripts, certificates, custom templates, verification QRDTGE38
Send notificationsMulti-channel (email, SMS, WhatsApp, push, in-app), templates, inbox, preferencesNSE30
MessagingTwo-way chat (direct + group), topics, auto-post, moderation, broadcastMSGE33
Handle scholarshipsProgrammes, applications, committee review, awards, disbursement, donors, marketplaceSCME91
Oversee schoolsJurisdictions, compliance, inspections, analytics, alerts, transfers, auditOvME82
Provision schoolsAcademic structure setup, calendar, course proposals, facilities, grading configSAPE109
Multi-school orgsOrganisation management, KYC, command center, school access, transfersOrgPE25

2.3 What "Across Different ISCED Levels" Means

ConceptNursery (ISCED 0)Primary (1–2)Secondary (3)University (5–8)
Class unit"Nursery 1" / "KG 2""Class 3" / "Form 2""Form 5" / "Terminale""Year 1" / "Semester 2"
ProgressionAge-based promotionAuto-promote by age/scoreExam-gated (GCE, BEPC)Credit-accumulation
GradingDevelopmental milestones / narrativeMarks /10 or /20Marks + GCE gradesGPA 0.0–4.0, CGPA
Course selectionActivity-based (no formal courses)Fixed curriculumFixed + optional tracksElectives, minors, credits
FeesFlat annual/termlyFlat annual/termlyFlat + exam feesPer-credit differential
TimetableActivity schedule (simple blocks)Simple (1:1)Subject rotationMulti-section + labs
HostelN/A (day school only)RareCommon (boarding)Universal (residential)
LibraryStory corner / read-aloudBasic lendingLending + textbook schemeFull circulation + digital + reserves
AssessmentObservation-based / portfolioContinuous onlyCA + end-of-term + nationalCA + midterm + finals + thesis
TransportEssential (very young children)Essential (young children)CommonRare (campus-based)
CanteenSnack/lunch (supervised)Day school lunchBoarding 3 meals/dayCampus dining, wallet
Guardian mgmtCritical (primary contact)ProminentVisibleMinimal
HealthCritical (immunization gate, growth)ImportantStandardSelf-managed

3. Current Platform Inventory

3.1 Backend Engine Matrix 30+ engines

#EngineCodeGETPOSTPUTPATCHDELTotal
1Scheduling & CalendarSCIE60761509160
2Fee ManagementACCTE56761306151
3Auto-ProvisioningSAPE483021010109
4GradingGME36521104103
5LibraryLME4035190195
6ScholarshipsSCME374860091
7Student BehaviorSBME3144130088
8OversightOvME452367182
9CoursesCME2735110477
10Student HealthSHME293092272
11Student LifecycleStuLCE2328100566
12AdmissionsADME193760062
13TransportTME281584762
14StaffStaME2224140060
15HostelHME2513140557
16Master SyllabusMaSyE172062550
17ProgrammesPME162130646
18DocumentsDTGE122050138
19SubscriptionsSBE21637037
20PlatformPlatform19860235
21MessagingMSGE111450333
22CanteenRCM13818232
23NotificationsNSE131120430
24AttendanceATME121230128
25Org PortalOrgPE91330025
26AssignmentsASME61220121
27Question BankQBE8920120
28RBACRBAC9320115
29UADEUADE800008
30AuthAUTH310015
TOTALS71372422330821,772

3.2 Prisma Schema & Tests

401 models 327 enums 50+ education systems 75 feature gates 142 spec files 3,607 test cases All green ✓

4. ISCED Level Strategy

The backend does not have separate codepaths for primary vs. university. Tenant.iscedLevels: Int[] declares which levels the school operates at. The frontend reads this and conditionally renders. See the ISCED Rendering Map (Section 18) for the complete per-component decision matrix.

LevelNameAgeExamples
0Early childhood0–5Nursery, kindergarten
1Primary6–11Primary school (Class 1–6)
2Lower secondary12–14Junior secondary (Form 1–5, 6e–3e)
3Upper secondary15–17Senior secondary (Sixth Form, Terminale)
4Post-secondary non-tertiary18–19Vocational diploma, trade school
5Short-cycle tertiary18–20HND, associate degree
6Bachelor's18–22University undergraduate
7Master's22–24Postgraduate
8Doctoral24+PhD programmes

5. Action Plan

5.1 Build Phases Overview

P1Shell & Navigation
UADE, RBAC, AUTH — ~5 pages
CriticalTenant contextRBAC navSchool overview
P2Core School Operations
StuLCE (66), ADME (62), StaME (60) — ~40 pages
CriticalStudentsAdmissionsStaff
P3Academic Engines
PME (46), CME (77), MaSyE (50), GME (103), ATME (28), ASME (21), QBE (20) — ~55 pages
CriticalProgrammesCoursesGradingAttendanceAssignmentsOnline Exams
P4Financial & Administrative
ACCTE/FME (98), WME (53), SCIE (160), DTGE (38) — ~50 pages
HighFeesWalletSchedulingTimetableDocuments
P5Student Welfare & Operations
SHME (72), SBME (88), LME (95), HME (57), RCM (32), TME (62) — ~65 pages
HighHealthBehavior & EWSLibraryHostelCanteenTransport
P6Communication & Collaboration
NSE (30), MSGE (33) — ~12 pages
HighNotificationsMessagingWebSocket
P7Advanced & Cross-Engine
SCME (91), OvME (82), SAPE (109), OrgPE (25) — ~40 pages
MediumScholarshipsOversightProvisioningOrg Portal
P8Platform Infrastructure & Settings
Platform (35), SBE (37), RBAC (15) — ~15 pages
MediumAuditPrivacyWebhooksSubscriptionsRBAC

5.2 Delivery Sequence

  1. Phase 1 must come first — without the shell, nothing else has a home.
  2. Phase 2 before Phase 3 — you need students and staff before you can grade or schedule them.
  3. Phase 3 before Phase 4 — academic structure must exist before fees and timetables.
  4. Phase 4 and Phase 5 can run in parallel — independent domains.
  5. Phase 6 can run in parallel with Phase 5 — messaging is independent.
  6. Phase 7 after Phase 4 — scholarships need fee engine, oversight needs school data.
  7. Phase 8 last — admin/platform features.

6. Phase 1 — Shell & Navigation

Goal: A logged-in school admin clicks a school card on UADE and lands in a functional school dashboard shell with RBAC-filtered sidebar navigation and a school overview page.

6.1 Deliverables

#DeliverableDescription
1.1Tenant Context ProviderReact context wrapping all school routes. Sets X-Tenant-Id header on every API call. Exposes tenantId, iscedLevels, educationSystemCodes, boardingType, permissions[], featureGates[].
1.2School Dashboard Layout/dashboard/school/[tenantId]/ — sidebar + top bar + content area. Sidebar collapses on mobile.
1.3RBAC-Filtered NavigationSidebar menu items generated from the permission set returned by GET /uade/permissions/:tenantId. Menu items hidden when the user lacks the required permission. Feature-gated items hidden when the gate is not active.
1.4School Overview Page/dashboard/school/[tenantId]/overview — consumes GET /uade/dashboard/school/:tenantId. Stat cards: student count, staff count, programme count, pending fees, upcoming events, notifications.
1.5Wire UADE enterRouteClicking a school card on the UADE landing navigates to /dashboard/school/<tenantId>.
1.6Tenant SwitcherDropdown in top bar for users with multiple school roles (fused buckets from Role Card Registry).

6.2 API Endpoints Consumed

EndpointPurpose
GET /uade/dashboardRole cards with enterRoute for school navigation
GET /uade/permissions/:tenantIdPermission set for RBAC filtering
GET /uade/dashboard/school/:tenantIdSchool overview stats

6.3 Navigation Menu Structure (Complete — All 257 Tags Covered)

Total sidebar items: ~280+ pages covering all 257 Swagger tags and 1,772 endpoints.

Organisation Dashboard (separate context — accessed from UADE):

7. Phase 2 — Core School Operations

7.1 Students Module StuLCE — 66 endpoints

PageAPI EndpointsUI Components
Student ListGET /stulce/students (query: page, limit, levelId, programmeId, status, search)TanStack Table, Select filters, SearchInput, Badge (status), bulk action toolbar
Student ProfileGET /stulce/students/:idTabs (identity, guardian, documents, groups, pastoral notes, achievements, appointments), Card
Add StudentPOST /stulce/studentsMulti-step Form (react-hook-form + Zod), Dialog for guardian add
Guardian ManagementGET /stulce/guardians, POST /stulce/guardians, POST /stulce/guardian-relationshipsTanStack Table, Sheet (add guardian), Select (relationship type)
Class PlacementGET /stulce/class-placements, POST /stulce/class-placements, PUT /stulce/class-placements/:idDnD (dnd-kit) or TanStack Table, Select (level/class)
Student GroupsGET/POST/PUT/DELETE /stulce/student-groupsCard grid, Sheet (add members), Badge (group type)
TransfersGET/POST/PUT /stulce/transfersTanStack Table, Dialog (transfer wizard), Badge (status)
ID CardsGET/POST /stulce/id-cards, POST /stulce/id-cards/batchCard grid, Button (generate), batch action toolbar
ImportPOST /stulce/importDropzone (react-dropzone), Preview Table, progress bar
ClearanceGET /stulce/clearance/:studentIdChecklist Card per department, Badge (cleared/pending)
Custom FieldsGET/POST/PUT/DELETE /stulce/custom-fieldsTanStack Table, Dialog (field builder), Select (field type)
Re-enrollmentPOST /stulce/re-enrollment, GET /stulce/re-enrollment/statusWizard Form, Card (status display)
AchievementsGET/POST/PUT/DELETE /stulce/achievementsTanStack Table, Sheet (add achievement)
AppointmentsGET/POST/PUT/DELETE /stulce/appointmentsCalendar view or TanStack Table, Dialog (schedule)
Pastoral NotesGET/POST/PUT/DELETE /stulce/pastoral-notesTimeline view, Sheet (add note), Badge (severity)
DocumentsGET/POST/PUT/DELETE /stulce/documentsTanStack Table, Dropzone (upload), Badge (type)
Status ManagementGET /stulce/student-status/:studentId, PUT /stulce/student-status/:id, POST .../transitionSelect (status), Dialog (confirm transition), Timeline (history)
SettingsGET/PUT /stulce/configForm (react-hook-form), Switch toggles, Card sections

7.2 Admissions Module ADME — 62 endpoints

PageAPI EndpointsUI Components
Admission DashboardGET /adme/admissions (query: status, page, limit)Recharts funnel, stat Cards, Badge (status)
Admission SessionsPOST /adme/admissions, PUT /adme/admissions/:id, GET /adme/admissions/:idTanStack Table, Sheet (create/edit), DatePicker (window)
Application ConfigGET/POST /adme/application-config/templates, POST .../adoptForm builder, Accordion (sections), Switch (toggle sections)
Application ListGET /adme/applications (query: page, limit, status, admissionId, search)TanStack Table, Badge (status), bulk action toolbar
Application ReviewGET /adme/applications/:id, PUT /adme/applications/:id/reviewTabs (form data, documents, scores), Textarea (notes), Select (decision)
Merit ScoringPOST /adme/merit/trigger, POST /adme/merit/cutoff, GET /adme/merit/rankingsTanStack Table (ranked), Input (scores), Button (trigger/cutoff)
OffersGET /adme/offers, POST .../accept, POST .../decline, POST .../revokeTanStack Table, Badge (status), Dialog (revoke confirm)
EnrollmentPOST /adme/enrollment/confirm, GET /adme/enrollment/placementsWizard Form, TanStack Table (placements), Badge (status)
Manual AdmissionPOST/GET /adme/manual-admission, PUT .../approveTanStack Table, Sheet (create), Select (reason), Dialog (approve)
Dismissal & AppealPOST /adme/appeals, PUT /adme/appeals/:id/reviewTanStack Table, Sheet (submit appeal), Textarea (decision note)
Transfer AdmissionsPOST/GET /adme/transfers, PUT .../approveTanStack Table, Sheet (create), Dropzone (documents), Dialog (approve)

7.3 Staff Module StaME — 60 endpoints

PageAPI EndpointsUI Components
Staff DirectoryGET /stame/staff (query: page, limit, departmentId, status, search)TanStack Table, Badge (role/status), Avatar, SearchInput
Staff ProfileGET /stame/staff/:idTabs (identity, contracts, qualifications, CPD, appraisals, documents), Card
OnboardingPOST /stame/staff, POST /stame/staff/:id/contractsMulti-step Form, DatePicker, Select (employment type, rank)
Contracts & CompensationGET /stame/staff/:id/contracts, POST .../contracts, PUT /stame/contracts/:idTanStack Table (history), Sheet (add contract), Input (salary)
Qualifications & CPDGET/POST /stame/staff/:id/qualifications, POST .../cpdTanStack Table, Sheet (add), Dropzone (certificate upload)
AppraisalsGET/POST/PUT /stame/appraisalsTanStack Table, Form (scoring rubric), Badge (cycle status)
DocumentsGET/POST /stame/staff/:id/documentsTanStack Table, Dropzone (upload), Badge (type)
Status ManagementPUT /stame/staff/:id/status, GET .../status-historySelect (status), Dialog (confirm), Timeline (history)
ConfigurationGET/POST /stame/config/ranks, GET /stame/configTanStack Table (ranks), Form (config), Card sections
ReportsGET /stame/reports/demographics, GET /stame/reports/attritionRecharts (bar, pie), Card (stat summaries)

8. Phase 3 — Academic Engine Modules

8.1 Programmes PME — 46 endpoints

PageAPI EndpointsUI Components
Programme ListGET /pme/templates (query: educationSystemCode, iscedLevel)Card grid or TanStack Table, Badge (ISCED level), Select (filter)
Programme DetailGET /pme/lifecycles/:programmeId, GET .../level-configsTabs (levels, progression, curriculum), Card, Accordion
Programme BuilderPOST /pme/lifecycles, POST .../level-configsMulti-step Form, Select (ISCED, progression mode), Switch
CalendarGET/POST /pme/calendars, POST .../term-calendars, POST /pme/cohortsTanStack Table, DatePicker (term dates), Card (cohort)
EnrollmentPOST /pme/enrollment/admit, POST .../bulk, GET /pme/students/:id/pathWizard Form, TanStack Table, Badge (path status)
ProgressionPOST /pme/progression/evaluate, POST .../process, GET .../history/:pathIdCard (evaluation result), Dialog (confirm decision), Timeline
GraduationPOST /pme/graduation/check-eligibility, POST .../process, POST .../revoke, GET /pme/graduationCard (eligibility), TanStack Table (records), Dialog (confirm)
SpecializationsGET/POST /pme/specializations, POST .../declare, .../complete, .../withdrawTanStack Table, Sheet (declare), Badge (status)

8.2 Courses CME — 77 endpoints

PageAPI EndpointsUI Components
Course CatalogueGET /cme/courses, PUT .../version, .../approve, .../deactivateTanStack Table, Badge (status), SearchInput, Dialog (confirm)
Course OfferingsGET/POST/PUT /cme/offerings, POST .../submit, .../approve, .../openTanStack Table, Sheet (create/edit), Badge (state machine), Select (term)
SyllabusGET/POST/PUT /cme/syllabi, POST .../submit, .../approve, .../publishTabs (topics, LOs, materials, scheme), Badge (state), rich text Editor
Curriculum MapGET/POST/PUT /cme/curriculum-map, POST .../adoptVisual tree (programme > level > course), Sheet (add entry), Badge (type)
Course RegistrationPOST /cme/registration/auto-enroll, GET .../available, POST .../select-electivesCard (credit tracker), Checkbox group (electives), Badge (status) — [ISCED 5+]
Minor SelectionGET /cme/minors/available, POST .../select, POST .../changeCard grid (available minors), Select, Dialog (change confirm) — [ISCED 5+]
WaitlistPOST /cme/waitlist/join, .../leave, .../accept, .../processTanStack Table, Badge (position), Button (process) — [ISCED 5+]
Credit RecognitionPOST/GET /cme/credit-recognition, POST .../reviewTanStack Table, Sheet (submit), Dialog (review decision) — [ISCED 5+]
SubstitutionsPOST/GET /cme/substitution-rules, POST .../apply, POST .../approveTanStack Table, Sheet (create rule), Dialog (approve)
Content & MaterialsGET /cme/content/.../materials, POST/GET /cme/materials, POST .../log-accessCard grid (materials), Dropzone (upload), Badge (type)

8.3 Master Syllabus MaSyE — 50 endpoints

PageAPI EndpointsUI Components
Master Syllabus BrowserGET /masye/master (query: countryCode, educationSystemCode, subjectCode, iscedLevel, status, search)TanStack Table, Select filters (country, system, subject), Badge (status)
Syllabus DetailGET /masye/master/:idTabs (papers, topics, objectives, weights), Accordion (topic tree)
School AdoptionGET /masye/adoption/available, POST .../adopt, GET .../status/:courseId, POST .../sync, POST .../detachCard (adoption status), Button (adopt/sync/detach), Badge (stale/current)
Custom BuilderPOST /masye/builder/custom, POST .../submit, POST .../import-csv, GET .../quality-score/:idMulti-step Form, Dropzone (CSV), Progress (quality score)
Review PipelineGET /masye/review/queue, POST .../approve, .../reject, .../promoteTanStack Table, Dialog (approve/reject), Textarea (feedback)

8.4 Grading GME — 103 endpoints

PageAPI EndpointsUI Components
Assessment ManagerGET/POST/PUT /gme/assessments, POST .../activateTanStack Table, Sheet (create), Badge (state: DRAFT→ACTIVE→SCORING→RELEASED→FINALIZED)
Score EntryPOST /gme/scores/bulk, PUT /gme/scores/:id, POST /gme/scores/importSpreadsheet-style TanStack Table (editable cells), Input (score), bulk paste
Grade ComputationPOST /gme/compute/term-grade, .../batch-term-grades, .../year-grades, .../student-summary, .../class-rankingButton (trigger computation), Card (results), TanStack Table (rankings)
GPA / CGPAPOST /gme/compute/cumulative-gpa, GET .../academic-standing/:studentIdCard (GPA display), Badge (honors: Summa/Magna/Cum Laude) — [ISCED 5+]
SequencesGET/POST/PUT /gme/sequencesTanStack Table, Form — [ISCED 2-3 only]
Report CardsPOST /gme/reports/report-card, .../batch-report-cards, GET .../report-cards, POST .../publishTanStack Table, Button (generate/batch), Badge (published), Dialog (publish)
Grading ConfigGET/PUT /gme/school-grading-config, GET/POST /gme/grade-scales, POST .../grade-scale-entries, GET .../assessment-categoriesForm (config), TanStack Table (scales, entries), Sheet (add)
GraduationPOST /gme/graduation/check-eligibility, .../batch-check, .../finalize-promotion, .../progress-cohort, .../dismissCard (eligibility), TanStack Table (batch), Dialog (confirm), Select (decision)
Online Exams (OEE)POST /gme/oee/sessions, .../activate, .../close, .../start, .../submit, GET .../results, .../analyticsCard (session), Timer, Radio/Checkbox (MCQ), Textarea (essay), TanStack Table (results), Recharts (analytics)

8.5 Question Bank QBE — 20 endpoints

PageAPI EndpointsUI Components
Question BankGET/POST/PUT /qbe/questions, POST .../retire, .../clone, .../bulk-importTanStack Table, Sheet (create/edit), Select (type, difficulty, Bloom's), Badge (status)
Exam PapersGET/POST /qbe/papers, POST .../questions, .../auto-generate, .../publish, GET .../printable, .../marking-guideTanStack Table, DnD (question ordering), Form (auto-generate rules), Badge (status), Button (print/marking guide)
Audit LogsGET /qbe/audit-logs (query: paperId)TanStack Table (read-only), Badge (action type)

8.6 Attendance ATME — 28 endpoints

PageAPI EndpointsUI Components
Mark AttendancePOST /atme/lesson, /school-day, /hostel, /staff, /activity, /refectoryCheckbox grid (per student), Select (event type, status), DatePicker
Reports & StatsGET /atme/records, GET /atme/stats/:studentIdRecharts (attendance rate), TanStack Table, Card (per-student stats)
AlertsPOST/GET/PUT/DELETE /atme/alert-rulesTanStack Table, Sheet (create rule), Select (trigger condition)
DevicesPOST/GET/PUT /atme/devices, GET .../vendors, .../device-models, POST .../ingestTanStack Table, Sheet (register device), Select (vendor/model), Badge (status)
Grading BridgePOST /atme/grading/compute, GET .../bridges, POST .../exam-gate-override, GET .../exam-eligibility/:studentIdTanStack Table, Button (compute), Dialog (override), Badge (eligible/blocked)
ConfigPOST /atme/event-definitions/seed, GET .../event-definitions, GET/PUT /atme/configForm (config), TanStack Table (event defs), Switch toggles

8.7 Assignments ASME — 21 endpoints

PageAPI EndpointsUI Components
Assignment ListGET/POST/PUT/DELETE /asme/assignmentsTanStack Table, Badge (state: DRAFT→PUBLISHED→CLOSED→RELEASED→FINALIZED→GRADED)
Assignment DetailGET /asme/assignments/:id, POST .../transition, .../release, .../finalize, GET .../statsTabs (detail, submissions, stats), Card (stats), Badge (state)
Create AssignmentPOST /asme/assignmentsForm (react-hook-form + Zod), Textarea (description), Dropzone (files), Input (points, MCQ answer key), DatePicker
SubmissionsPOST .../submit, GET .../submissions, GET /asme/my-submission/:assignmentIdTanStack Table, Dropzone (submit), Badge (late/on-time)
ScoringPOST /asme/submissions/:id/score, POST .../bulk-score, POST .../auto-scoreSpreadsheet-style TanStack Table (editable), Input (score, feedback), Button (auto-score MCQ)
ContestationPOST .../contest, POST .../resolve-contestationDialog (contest form), Badge (status), Textarea (reason), Select (resolution)

9. Phase 4 — Financial & Administrative

9.1 Fees & Billing ACCTE/FME — 98 endpoints

PageAPI EndpointsUI Components
Finance DashboardGET /accte/dashboard, GET /accte/finance/revenue, GET /accte/finance/transactionsRecharts (revenue/collection), stat Cards, TanStack Table (transactions)
Fee StructurePOST /accte/fee-categories, GET /accte/fee-categories, POST /accte/fee-schedules, GET /accte/fee-schedules, POST .../publishTanStack Table, Sheet (create category/schedule), Badge (DRAFT/PUBLISHED)
BillingPOST /accte/invoices/generate, POST .../custom, GET /accte/invoices, GET .../:id, POST .../cancelTanStack Table, Button (batch generate), Sheet (custom invoice), Badge (status)
PaymentsPOST /accte/payments/initiate, .../manual, .../bank-deposit, GET /accte/payments, GET .../receipt, POST /accte/pay-links, POST .../pay/:tokenTanStack Table, Sheet (record payment), Dialog (receipt), Badge (method)
InstallmentsPOST /accte/installments, GET /accte/installments, POST .../pay, POST .../cancelTanStack Table, Sheet (create plan), Progress (payment progress)
WaiversPOST /accte/waivers, GET /accte/waivers, POST .../revokeTanStack Table, Sheet (create waiver), Badge (active/revoked)
DiscountsPOST/GET/PUT/DELETE /accte/discount-configTanStack Table, Sheet (create rule), Select (type: sibling/staff-child)
Debt ManagementPUT /accte/debt/config, GET .../config, GET .../clearance/:studentId, POST .../write-off, GET /accte/debtTanStack Table, Form (config), Badge (hold type), Dialog (write-off confirm)
Revenue ShareGET /accte/admin/rev-share/ledger, POST .../platform-invoices/generate, GET .../platform-invoices, GET .../standingTanStack Table, Recharts (revenue split), Badge (standing)
Tax ConfigPOST/GET/PUT /accte/tax-configTanStack Table, Sheet (create), Select (inclusive/exclusive)
Auto-EnrollPOST/GET/PUT /accte/auto-enroll-configTanStack Table, Sheet (create rule), Select (fee category → service)

9.2 Student Wallet ACCTE/WME — 53 endpoints

PageAPI EndpointsUI Components
Wallet DashboardGET /accte/wallet (query: page, limit, status), GET .../balanceStat Cards (balance/hold/available), TanStack Table (wallets)
Student WalletsPOST /accte/wallet, GET .../:studentId, POST .../freeze, POST .../unfreeze, PUT .../limitsTanStack Table, Sheet (create), Badge (active/frozen/suspended), Dialog (freeze)
Parent FundingPOST /accte/wallet/funding/top-up, .../bank-deposit, .../verify, .../parent-accountTanStack Table (deposits), Sheet (top-up), Badge (pending/verified)
Merchant PointsPOST/GET/PUT /accte/wallet/merchants, POST .../operatorsTanStack Table, Sheet (create merchant), Badge (type)
CataloguePOST/GET /accte/wallet/merchants/:merchantId/catalogueTanStack Table, Sheet (add item), Input (price)
POS TransactionsPOST /accte/wallet/pos/purchase, POST .../refund, GET .../merchant/:idTanStack Table, Sheet (purchase), Dialog (refund)
Fee BridgePOST /accte/wallet/fee-bridge/pay, GET .../checkCard (pre-check), Button (pay from wallet), Badge (sufficient/insufficient)
ReportsGET /accte/wallet/reports/spending, .../top-ups, .../merchant-revenue, .../wallet-summaryRecharts (spending analysis), Card (summary), TanStack Table
ConfigGET/PUT /accte/wallet/configForm (react-hook-form), Input (exchange rate, points label)

9.3 Scheduling & Timetable SCIE — 160 endpoints

PageAPI EndpointsUI Components
Academic CalendarGET /scie/calendar (query: startDate, endDate, audienceScope), POST /scie/events, POST .../publish, POST /scie/closures, GET /scie/public-holidaysCalendar view (month/week), Card (event), Badge (type), DatePicker
Event RSVPPOST /scie/rsvp/invite, POST .../respond, GET .../attendees/:eventId, GET .../my/:eventIdTanStack Table (attendees), Badge (accepted/declined/tentative), Button (respond)
Class TimetableGET /scie/timetable/slots (query: gridId, levelId, termId), POST .../slots, PUT .../slots/:id, POST .../submit, .../approve, .../publishGrid view (day x period), DnD (dnd-kit), Badge (DRAFT→SUBMITTED→APPROVED→PUBLISHED), Select (level/term)
My ScheduleGET /scie/timetable/my/lecturer, .../student, .../availabilityWeekly grid (read-only), Card (slot detail), Badge (course)
Timetable ConflictsGET /scie/timetable/conflicts, POST .../resolve, POST .../dismissTanStack Table, Badge (severity: hard/soft), Dialog (resolve/dismiss)
SubstitutionsGET /scie/timetable/substitutions/needed, POST .../assign, POST .../approveTanStack Table, Sheet (assign substitute), Badge (covered/uncovered)
Slot Swap BoardPOST /scie/timetable/swaps, GET .../swaps, POST .../approve, POST .../rejectTanStack Table, Sheet (request swap), Badge (pending/approved), Select (one-off/permanent)
Auto-GeneratePOST /scie/timetable/generate/algorithmic, POST .../ai, GET .../logsForm (constraints), Button (generate), Progress, TanStack Table (logs)
ExportPOST /scie/timetable/export/pdf, POST .../ical, POST .../shareButton (download PDF/iCal), Dialog (share link), Input (share URL)
Exam TimetableGET/POST/PUT /scie/exams, POST .../publish, POST .../invigilatorsTanStack Table, Sheet (create slot), Select (room/invigilator), Badge (published)
Staff LeavePOST /scie/staff-leave, GET .../staff-leave, POST .../approve, POST .../rejectTanStack Table, Sheet (submit request), Badge (status), Calendar view
FacilitiesGET/POST /scie/facilities, GET .../availability, POST .../bookingsTanStack Table, Calendar (availability), Sheet (book), Badge (type)
DeadlinesPOST /scie/deadlines, POST .../extend, POST .../cancel, POST .../mark-passedTanStack Table, DatePicker, Badge (active/passed/cancelled)

9.4 Documents DTGE — 38 endpoints

PageAPI EndpointsUI Components
Template ManagerGET/POST/PUT /dtge/templates, POST .../clone/:idTanStack Table, Sheet (create/edit), CodeEditor (HTML), Badge (system/custom)
Report Card TemplatesPOST /dtge/report-templates/seed, POST/PUT/GET /dtge/report-templates, GET .../previewTanStack Table, Form (zones/config), Dialog (preview), Badge (active)
Generate DocumentsPOST /dtge/generate, GET /dtge/documents, GET .../:id, POST .../bulk, POST .../publish, POST .../previewTanStack Table, Button (generate/batch), Dialog (preview), Badge (pending/ready), Select (type)
VerificationGET /dtge/verify/:documentId/:shortHash (@Public), POST .../initiate, POST .../authorize, GET .../logCard (verification result), TanStack Table (log), Badge (status)
ConfigGET/PUT /dtge/config, GET/PUT .../report, POST .../pricing, POST .../signatoriesForm (school config), TanStack Table (signatories/pricing), Dropzone (logo)

10. Phase 5 — Student Welfare & Operations

10.1 Health SHME — 72 endpoints

PageAPI EndpointsUI Components
Health RecordsGET /shme/health-records (query: studentId, page, limit), POST .../health-records, GET .../:id, PUT .../:idTanStack Table, Sheet (create/edit), Tabs (conditions, contacts, blood type)
Clinic VisitsGET /shme/clinic-visits (query: date, page, limit), POST .../clinic-visits, PUT .../:idTanStack Table, Sheet (log visit), Select (triage, disposition), Badge (severity)
SickbayGET /shme/sickbay, POST .../admit, POST .../discharge, GET .../bedsCard grid (beds), Badge (occupied/available), Dialog (admit/discharge)
ImmunizationsGET /shme/immunizations (query: studentId), POST .../immunizations, PUT .../:idTanStack Table, Sheet (record), Badge (complete/due/overdue), DatePicker
AllergiesGET/POST/PUT/DELETE /shme/allergiesTanStack Table, Sheet (add), Select (type: food/environmental/medical), Badge (severity)
Dietary RestrictionsGET/POST/PUT /shme/dietaryTanStack Table, Sheet (add), Select (type: halal/vegetarian/etc.)
MedicationsGET/POST/PUT /shme/medicationsTanStack Table, Sheet (add), Input (dosage, frequency)
PharmacyGET /shme/pharmacy/inventory, POST .../dispense, POST .../restock, GET .../logTanStack Table (inventory), Sheet (dispense), Badge (stock level), Input (quantity)
Growth & ScreeningGET /shme/growth/:studentId, POST .../growth, GET .../enrollment-gate/:studentIdRecharts (growth chart), Card (BMI), Badge (gate: pass/fail)
ConfigGET/PUT /shme/configForm (react-hook-form), Input (capacity, hours), Switch toggles

10.2 Behavior & EWS SBME — 88 endpoints

PageAPI EndpointsUI Components
Behavior DashboardGET /sbme/events/summary/:studentId, GET /sbme/analyticsRecharts (trends, category breakdown), stat Cards, TanStack Table (recent events)
EventsPOST /sbme/events, POST .../bulk, GET .../events (query: studentId, termId, page, limit), POST .../voidTanStack Table, Sheet (record event), Select (category, polarity), Badge (positive/negative)
CategoriesGET/POST/PUT /sbme/categories, POST .../seedTanStack Table, Sheet (create), Switch (active), Badge (polarity)
EWS DashboardGET /sbme/ews/dashboard, GET .../trends, POST .../run-detectionRecharts (signal trends), stat Cards (by severity), Badge (WATCH/CONCERN/CRITICAL)
At-Risk AlertsGET /sbme/at-risk, POST .../acknowledge, POST .../resolve, POST .../evaluate/:studentIdTanStack Table, Badge (severity), Dialog (acknowledge/resolve)
CounselingPOST /sbme/counseling, GET .../counseling, PUT .../accept, PUT .../closeTanStack Table, Sheet (create referral), Badge (state: PENDING→ACCEPTED→IN_PROGRESS→COMPLETED)
Escalation & HearingsPOST /sbme/escalations/pathways, POST .../escalate, POST .../resolve, POST .../hearing, POST .../outcomeTanStack Table, Sheet (escalate), Dialog (hearing outcome), Badge (status), Textarea (defense/notes)
ContractsPOST /sbme/contracts, GET .../contracts, POST .../sign, POST .../reviewTanStack Table, Sheet (create), Badge (unsigned/active/completed), Checkbox (conditions)
RewardsGET /sbme/rewards, POST .../rewards, POST .../award, GET .../recognition-boardCard grid (recognition board), Sheet (award), Badge (milestone)
ConfigGET/PUT /sbme/config, GET/POST /sbme/houses, POST /sbme/templates/applyForm (config), TanStack Table (houses, groups), Select (template)

10.3 Library LME — 95 endpoints

PageAPI EndpointsUI Components
Library DashboardGET /lme/reports/dashboardRecharts (circulation), stat Cards (in-circulation, overdue, holds)
CatalogueGET /lme/catalogue (query: search, page, limit), POST .../catalogue, PUT .../:id, POST .../import, GET .../search (@Public OPAC)TanStack Table, Sheet (add), SearchInput, Dropzone (bulk import), Badge (type)
CirculationPOST /lme/circulation/checkout, .../return, .../renew/:id, .../bulk-checkout, GET .../patron-status/:studentIdTanStack Table, Sheet (checkout: scan barcode), Badge (status), Card (patron summary)
HoldsPOST /lme/holds, GET .../patron/:studentId, POST .../cancel, .../fulfill, .../process-expiredTanStack Table, Badge (WAITING/READY/FULFILLED), Button (fulfill/cancel)
CardsPOST /lme/cards, GET .../cards, POST .../suspend, .../lift-block, .../replace, .../renew, .../revokeTanStack Table, Sheet (issue card), Badge (ACTIVE/SUSPENDED/REVOKED)
TextbooksPOST /lme/textbooks, GET .../textbooks, POST .../assign, .../bulk-assign, .../return, .../report-lostTanStack Table, Sheet (assign), Badge (DISTRIBUTING/COMPLETED), Dialog (report lost)
FinesPOST /lme/fines, GET .../patron/:studentId, POST .../waive, .../reconcile, GET .../summaryTanStack Table, Sheet (manual fine), Button (waive), Badge (PENDING/PAID/WAIVED)
Stock-TakePOST /lme/stock-take, POST .../scan, .../bulk-scan, .../reconcile, .../completeProgress (scanned/expected), TanStack Table (entries), Input (barcode scan), Badge (status)
ConfigGET/POST/PUT /lme/configForm, Switch (feature toggles), Input (loan days, max items)

10.4 Hostel HME — 57 endpoints

PageAPI EndpointsUI Components
InfrastructurePOST /hme/hostels, GET .../hostels, POST .../rooms, POST .../beds, GET .../occupancyAccordion (hostel > room > bed tree), Badge (occupancy %), Sheet (add)
AllocationPOST /hme/allocations, POST .../auto, PUT .../reassign, POST .../endTanStack Table, Sheet (allocate), Select (hostel/room/bed), Badge (ACTIVE/VACATED), Switch (dryRun)
ExeatPOST /hme/exeat, GET .../exeat, POST .../approve, POST .../confirm-return, GET .../overdueTanStack Table, Sheet (submit), DatePicker, Badge (PENDING→APPROVED→RETURNED), Badge (overdue)
InspectionsPOST /hme/inspections, POST .../findings, POST .../cancelTanStack Table, Sheet (schedule), Form (findings), Badge (PASS/FAIL), Select (rating)
VisitorsPOST /hme/visitors/sign-in, POST .../sign-out, GET .../active/:hostelIdTanStack Table, Sheet (sign-in), Badge (signed-in/signed-out)
StaffPOST /hme/staff/managers, POST .../captains, GET .../managers, POST .../removeTanStack Table, Sheet (assign), Select (hostel/room), Badge (role)
FeesGET/POST/PUT /hme/feesTanStack Table, Sheet (set fee), Select (cascade level: bed/room/hostel)

10.5 Canteen RCM — 32 endpoints

PageAPI EndpointsUI Components
Meal PlansPOST /rcm/meal-plans, GET .../meal-plans, PATCH .../:id, DELETE .../:id, POST .../assignTanStack Table, Sheet (create), Select (meal types, days), Input (price)
Student PlansGET /rcm/students/:id/meal-plans, POST /rcm/bulk-assign, PATCH .../suspend, PATCH .../resumeTanStack Table, Button (bulk assign boarders), Badge (ACTIVE/SUSPENDED)
Meal SessionsPOST /rcm/sessions, GET .../sessions (query: date, mealType, page, limit), PATCH .../open, PATCH .../closeTanStack Table, Badge (SCHEDULED→OPEN→CLOSED), Button (open/close)
Check-InPOST /rcm/sessions/:id/check-in, GET .../check-insTanStack Table (check-ins), Input (student scan), Badge (entitlement/wallet/complimentary), Alert (dietary)
TablesPOST /rcm/tables, GET .../tables, PATCH .../:id, POST .../assignTanStack Table, Sheet (create), Input (capacity)
ReportsGET /rcm/reports/meal-attendance, .../plan-uptake, .../dietary-summaryRecharts (consumption), Card (stats), TanStack Table
ConfigGET/PUT /rcm/configForm (react-hook-form), Select (charge source)

10.6 Transport TME — 62 endpoints

PageAPI EndpointsUI Components
Routes & StopsGET/POST/PUT /tme/routes, POST .../stops, DELETE .../stops/:stopIdTanStack Table, Sheet (create route), DnD (stop ordering), Badge (active)
VehiclesGET/POST/PUT/DELETE /tme/vehiclesTanStack Table, Sheet (register), Badge (status), Input (capacity, registration)
DriversGET/POST/PUT /tme/drivers, POST .../assignTanStack Table, Sheet (create), Dropzone (license upload), Select (route assignment)
EnrollmentPOST/GET/PUT/DELETE /tme/enrollmentTanStack Table, Sheet (enroll student), Select (route/stop)
TripsPOST/GET/PUT /tme/tripsTanStack Table, Sheet (log trip), DatePicker, Badge (status)
IncidentsPOST/GET/PUT /tme/incidentsTanStack Table, Sheet (report), Textarea (description), Badge (severity)
MaintenancePOST/GET/PUT /tme/maintenanceTanStack Table, Sheet (schedule), DatePicker, Badge (due/overdue)
AnalyticsGET /tme/analytics/routes, .../enrollment, .../fleetRecharts (route usage, enrollment trends), Card (stats)

11. Phase 6 — Communication & Collaboration

11.1 Notifications NSE — 30 endpoints

PageAPI EndpointsUI Components
InboxGET /nse/inbox (query: page, limit), POST .../:id/read, POST .../read-all, GET .../unread-countTanStack Table, Badge (unread), Button (mark all read)
TemplatesGET/POST/PUT /nse/templates, POST .../previewTanStack Table, Sheet (create/edit), Tabs (email/sms/push/inApp preview)
ChannelsPOST/GET/PUT /nse/channels, POST .../testTanStack Table, Sheet (configure), Select (type: email/SMS/WhatsApp/push), Badge (active)
ProvidersGET /nse/providersCard grid (available providers), Badge (configured/not)
PreferencesGET/PUT /nse/preferencesForm (per-channel switches), Note (email/inApp cannot be disabled)
AnalyticsGET /nse/logs (query: channel, status, startDate, endDate), GET /nse/analytics, GET .../sms-costRecharts (delivery matrix), TanStack Table (logs), Card (cost report)

11.2 Messaging MSGE — 33 endpoints

PageAPI EndpointsUI Components
ConversationsGET /msge/conversations, POST .../conversations, GET .../:idList sidebar + chat panel (resizable-panels), Avatar, Badge (unread), Input (compose)
MessagesPOST /msge/messages, GET .../messages (query: conversationId, cursor, limit), PUT .../edit, POST .../readMessage list (cursor pagination), Textarea (compose), Button (send), WebSocket (real-time)
TopicsPOST /msge/topics, GET .../:conversationId, PUT .../:idTabs (per topic), Badge (write permission), Select (permission level)
ParticipantsPOST/PUT/DELETE /msge/participantsTanStack Table, Sheet (add), Select (role: OWNER/ADMIN/MEMBER/READONLY)
Auto-Post ConfigGET /msge/auto-post, PUT .../:id, POST .../seed, POST .../resetTanStack Table, Switch (enable/disable per event), Badge (event source)
Admin ModerationPOST /msge/admin/pin/:messageId, DELETE .../:messageId, GET .../search, GET .../stats, POST .../broadcastSearchInput (admin search), TanStack Table, Button (pin/delete), stat Cards

12. Phase 7 — Advanced & Cross-Engine

12.1 Scholarships SCME — 91 endpoints

PageAPI EndpointsUI Components
Programs & PoolsGET/POST/PUT /scme/programs, POST .../poolsTanStack Table, Sheet (create), Form (eligibility criteria), Badge (active/closed)
ApplicationsPOST /scme/applications, GET .../applications (query: programId, status, page, limit), POST .../shortlistTanStack Table, Badge (status), Button (bulk shortlist)
Committee ReviewPOST /scme/committees, POST .../reviewers, POST .../reviews, POST .../consensusTanStack Table (reviewers), Form (scoring), Badge (quorum met/not), Dialog (consensus)
AwardsPOST /scme/awards/reserve, POST .../confirm, .../activate, .../revoke, .../renewTanStack Table, Badge (state: RESERVED→CONFIRMED→ACTIVE→COMPLETED), Dialog (revoke/renew)
DisbursementPOST /scme/disbursements/schedule, POST .../record, POST .../failTanStack Table, Progress (installments paid), Badge (status), Button (record)
Donors & FundsGET/POST/PUT /scme/funds, POST .../contributeTanStack Table, Sheet (create), Input (amount), Badge (type: endowment/annual)
MarketplacePOST /scme/marketplace/proposals, PUT .../submit, POST .../review, GET .../matchmakingTanStack Table, Sheet (submit proposal), Dialog (review), Card (matchmaking suggestions)
SponsorshipPOST /scme/sponsorships/consent, POST .../profiles, POST .../publish, GET .../matchTanStack Table, Form (consent), Card (profile), Badge (published/private)
Academic HonorsPOST /scme/honors/types, POST .../compute, POST .../certificateTanStack Table, Form (threshold criteria), Button (compute), Badge (honor type)
ReportsPOST /scme/reporting/donor-report, GET .../program-analytics/:programIdRecharts (funnel, disbursement), Card (impact summary), Button (generate PDF)

12.2 Oversight OvME — 82 endpoints

PageAPI EndpointsUI Components
JurisdictionPOST /ovme/jurisdiction, GET .../subtree, .../country-tree, POST .../assign-schools, GET .../statsTree view (iterative BFS), TanStack Table (schools), stat Cards, DnD (school assignment)
Oversight BodiesPOST /ovme/bodies, POST .../officers, POST /ovme/access/grant, POST .../revokeTanStack Table, Sheet (create), Select (access level: VIEWER/ADMIN), Badge (active)
DashboardGET /ovme/dashboard/overview/:jurisdictionId, .../attendance, .../academic, .../enrollment, .../financeTabs (9 views), Recharts (per-school comparison), stat Cards, TanStack Table
CompliancePOST /ovme/compliance/frameworks, POST .../categories, POST .../itemsAccordion (framework > category > items), Sheet (create), Input (maxScore), Switch (isRequired)
InspectionsPOST/PUT /ovme/inspections, POST .../advance-status, POST .../findings, POST .../corrective-actionsTanStack Table, Sheet (schedule), Form (findings), Badge (SCHEDULED→IN_PROGRESS→CLOSED), Timeline (actions)
AnalyticsGET /ovme/analytics/compare-schools, .../gender-analysis, .../rankings, .../outliersRecharts (comparison bar, GPI), TanStack Table (rankings), Badge (outlier)
AlertsGET /ovme/alerts, POST .../acknowledge, POST .../escalate, POST .../thresholdTanStack Table, Badge (severity), Dialog (acknowledge/escalate), Form (threshold config)

12.3 School Provisioning SAPE — 109 endpoints

PageAPI EndpointsUI Components
Provisioning StatusPOST /sape/provision, GET .../statusCard (route 1/2/3 status), Progress (steps completed), Badge (complete/pending)
Academic StructurePOST /sape/academic/faculties, GET .../faculties, POST .../departments, .../subjects, .../programmes, .../levels, .../courses, .../assign-dean, .../assign-hod, .../subject-teachersAccordion (faculty > dept > subject > course tree), Sheet (create each level), Select (dean/HOD/teacher), TanStack Table
Calendar & TermsPOST /sape/calendar/years, GET .../years, POST .../terms, POST .../term-enrolmentsTanStack Table, Sheet (create year/term), DatePicker (start/end), Badge (current)
Grading & AssessmentPOST /sape/grading/grade-scales, GET .../grade-scales, POST .../assessment-categoriesTanStack Table, Sheet (create), Input (grade entries: letter, min, max, points)
FacilitiesPOST /sape/facilities/bell-schedules, .../hostels, PUT .../report-config, POST .../document-templates, .../verification-pricingTanStack Table, Sheet (create), Form (bell schedule times), Dropzone (logo)
Course ProposalGET /sape/course-proposal, POST .../confirm, GET .../additionalCard grid (grouped by programme > level), Checkbox (select subjects), Button (confirm)
Template BanksGET /sape/banks/subjects, POST .../import, GET .../grading, POST .../adopt, GET .../report-cards, POST .../clone, GET .../calendars, POST .../importTanStack Table (browse), Button (adopt/import/clone), Badge (adopted), Dialog (confirm)
Platform SeedPOST /sape/seed/subjects, POST .../profiles, POST .../gradingButton (seed), TanStack Table (results), Badge (seeded) — platform admin only

12.4 Organisation Portal OrgPE — 25 endpoints

NOTE: This is a SEPARATE dashboard context from the school dashboard, accessed from UADE via /dashboard/org/[orgId]/.

PageAPI EndpointsUI Components
Access DashboardGET /org/access-dashboardCard grid (schools + orgs), stat Cards (school count, member count)
Context SwitchPOST /org/switch-contextSelect (school/org), Badge (role in each)
Org OverviewGET /org/organizations/:id, GET .../dashboardstat Cards, TanStack Table (schools), Badge (KYC status)
Organisation CRUDPOST/GET/PUT /org/organizationsTanStack Table, Sheet (create), Form (name, slug, settings)
School ListGET /org/organizations/:id/schools, POST .../schoolsTanStack Table, Sheet (add school), Badge (status)
School AccessPOST /org/school-access/grant, .../revoke, GET .../school-access, PUT .../roleTanStack Table, Sheet (grant), Select (role), Dialog (revoke confirm)
CC MembersPOST /org/cc-access/invite, .../request, .../approve/:id, .../revoke/:id, GET .../:orgIdTanStack Table, Sheet (invite), Badge (PENDING/ACTIVE), Dialog (approve/revoke)
KYCPOST /org/kyc/submit, GET .../status/:orgId, POST .../review/:orgIdForm (document upload), Badge (UNDER_REVIEW/APPROVED/REJECTED), Dropzone (documents)
School TransfersPOST /org/schools/:tenantId/detach, POST .../attachDialog (confirm detach/attach), Badge (independent/attached)
OnboardingPOST /org/onboard (@Public), GET /org/status/:orgIdMulti-step wizard Form (6 steps), Progress, Badge (status)

13. Phase 8 — Platform Infrastructure & Settings

13.1 Audit Trail Platform — 8 endpoints

PageAPI EndpointsUI Components
Audit LogGET /audit/entries (query: userId, entityType, engine, action, startDate, endDate, page, limit), GET .../:idTanStack Table, Select filters (engine, action, date range), Badge (action type), DatePicker
Audit StatsGET /audit/statsRecharts (by engine, by action), stat Cards (total today)
Audit ConfigGET/PUT /audit/configForm (retention days, excluded engines), Note (platform minimum enforced)
Platform AuditGET/PUT /audit/platform-config, GET /audit/platform/entriesSame as above but cross-tenant (super admin only)

13.2 Data Privacy & Compliance Platform — 15 endpoints

PageAPI EndpointsUI Components
Consent PoliciesGET/POST/PUT /privacy/policies, POST .../seedTanStack Table, Sheet (create), Badge (mandatory/optional), Switch (active)
Consent RecordsPOST /privacy/consent, GET .../student/:studentId, GET .../statusTanStack Table, Badge (granted/declined/needs re-consent), Switch (grant/revoke)
Deletion RequestsPOST /privacy/deletion-request, GET .../deletion-requests, PUT .../approve, PUT .../rejectTanStack Table, Badge (PENDING/PROCESSING/COMPLETED/REJECTED), Dialog (approve — shows blockers)
Data ExportPOST /privacy/export-request, GET .../export-requests, GET .../downloadTanStack Table, Button (request export), Badge (PROCESSING/READY/EXPIRED), Link (download)
Compliance DashboardGET /privacy/dashboard, GET .../compliance-reportstat Cards (consent rate, pending deletions), Recharts (per-policy rates), Card (avg deletion response time)

13.3 Outbound Webhooks Platform — 12 endpoints

PageAPI EndpointsUI Components
SubscriptionsPOST/GET/PUT/DELETE /webhooks/subscriptions, GET .../:id, POST .../testTanStack Table, Sheet (create — HTTPS URL, events), Button (test), Badge (active/paused), Switch (enable)
Delivery LogsGET /webhooks/subscriptions/:id/logs (query: success, page, limit), POST .../retryTanStack Table, Badge (success/failed), Button (retry), Badge (attempt count)
Event CatalogueGET /webhooks/eventsCard grid (15 event types + wildcard), Badge (category)
API KeysPOST /webhooks/api-keys, GET .../api-keys, POST .../revokeTanStack Table, Button (generate — show once dialog), Badge (active/revoked)

13.4 RBAC & Role Management RBAC — 15 endpoints

PageAPI EndpointsUI Components
PermissionsGET /rbac/permissions, GET .../me, POST .../checkAccordion (grouped by module), Badge (permission key), SearchInput
RolesGET/POST/PUT/DELETE /rbac/rolesTanStack Table, Sheet (create), Checkbox group (permissions), Badge (system/custom)
AssignmentPUT /rbac/users/:userId/role, POST /rbac/roles/bulk-assignSelect (role), Button (assign), TanStack Table (user list), Dialog (bulk assign)

13.5 Subscription & Billing SBE — 37 endpoints

PageAPI EndpointsUI Components
Current PlanGET /sbe/tenant-subscriptions, POST .../change-tierCard (current plan details), Badge (active), Button (change tier)
Feature GatesGET /sbe/feature-gates, POST .../seed-status, PUT .../toggleTanStack Table, Switch (toggle), Badge (active/inactive), stat Cards (seed status)
TiersGET/POST /sbe/subscription-tiersCard grid (tier comparison), Badge (current), Button (upgrade)
OverridesGET/POST /sbe/feature-overridesTanStack Table, Sheet (create override), Select (GRANT/REVOKE), Badge (override type)
School Self-ServiceGET /sbe/school/gates, POST .../request-upgrade, POST .../change-tierCard grid (available gates), Button (request), Badge (enabled/locked)
DashboardGET /sbe/dashboard/overview, GET .../mrrRecharts (MRR, gate adoption), stat Cards (subscribers, revenue)
EnforcementPOST /sbe/enforcement/check, POST .../invalidate-cacheButton (check gate), Badge (result), Button (invalidate cache)

14. Module-to-Engine Mapping (Full Data)

Frontend ModuleEngineEndpointsTagsPermission NamespaceISCED FilterFeature Gate
StudentsStuLCE6616student:*AllCore (carve-outs: student_id_cards, student_clearance)
AdmissionsADME629admission:*Alladmission_management
StaffStaME609staff:*AllCore
ProgrammesPME467programme:*AllCore
CoursesCME7716course:*All (registration: 5+)Core
SyllabusMaSyE5011syllabus:*Allsyllabus_management
GradingGME1039grading:*All (GPA: 5+)grading_management
Online ExamsQBE + GME/OEE454exam:*, qbank:*Allonline_examination + question_bank
AttendanceATME285attendance:*Allattendance_management
AssignmentsASME212assignment:*Allassignment_management
Fees & BillingACCTE/FME9813fee:*, finance:*Allfee_management
Student WalletACCTE/WME539wallet:*All (essential: 5+)student_wallet
SchedulingSCIE16017schedule:*Allscheduling
LibraryLME9514library:*Alllibrary_management
HealthSHME7212health:*Allstudent_health
Behavior & EWSSBME8812behavior:*Allstudent_behavior
CanteenRCM321rcm:*Boarding/mixedrefectory
HostelHME578hostel:*Boarding onlyhostel_management
TransportTME6210transport:*All (more relevant 0-3)transport_management
DocumentsDTGE385document:*Alldocument_generation
NotificationsNSE307notification:*AllCore
MessagingMSGE336messaging:*Allmessaging
ScholarshipsSCME9110scholarship:*Allscholarships
OversightOvME8212oversight:*AllCore
ProvisioningSAPE1098admin:*AllCore
Org PortalOrgPE257org-level RBACAllCore (CC gated by KYC)
SubscriptionsSBE377platform:*AllCore
AuditPlatform81audit:*AllCore
PrivacyPlatform151privacy:*AllCore
WebhooksPlatform121webhook:*Alloutbound_webhooks
RBACRBAC151core:*AllCore

15. RBAC & Permission Surface

15.1 Permission Files (21 files, 511 lines)

Top files by line count: programme.permissions.ts (96), grading.permissions.ts (60), messaging.permissions.ts (45), admission.permissions.ts (34), fee.permissions.ts (30), exam.permissions.ts (26), partner.permissions.ts (17), behavior.permissions.ts (15), core.permissions.ts (14), scheduling.permissions.ts (13), scholarship.permissions.ts (12), plus 10 more.

15.2 4-Scope RBAC Architecture

ScopeMechanismGuardDecorator
SchoolUserSchoolProfile → Role → permissions[]RbacGuard@RequirePermission()
PlatformUser.platformRole string fieldPlatformRbacGuard@RequirePlatformRole()
PartnerPartnerAccess → static PARTNER_ROLE_PERMISSIONSPartnerRbacGuard@RequirePartnerPermission()
OrganisationOrgAccess → role (hierarchy: viewer < admin < owner)OrgRbacGuard@RequireOrgRole()

15.3 Permission Inheritance

module.manage grants all actions. create/edit/approve imply view. submit implies view+create. publish implies view+approve.

15.4 How RBAC Drives Navigation

User clicks school card → GET /uade/permissions/:tenantId → returns { role: "Principal", permissions: ["grading:*", "student:*", "fee:*", ...] } → frontend filters sidebar items: if permissions.some(p => p.startsWith("grading:")) → show Grading menu if permissions.some(p => p.startsWith("fee:")) → show Finance menu if permissions.includes("*") → show everything (super admin)

15.5 System Roles (20 pre-defined)

6 system roles: Super Admin, School Admin, Teacher, Accountant, Student, Parent

14 suggested roles: Principal, Vice Principal, Dean of Studies, Head of Department, Registrar, Admissions Manager, Bursar, Counselor, IT Administrator, Librarian, Hostel Warden, Canteen Manager, Nurse/Health Officer, Sports Master

16. Feature Gate Matrix

Feature gates are enforced by the FEATURE_MAP in src/rbac/constants/feature-map.ts. If a school's subscription tier does not include the gate, the API returns 403 and the frontend should hide the module.

16.1 Top-Level Gates (30)

Gate CodeFeatureEngines AffectedCategory
grading_managementGrading & report cardsGMEAcademic
assignment_managementAssignmentsASMEAcademic
online_examinationOnline exam deliveryGME/OEEAcademic
question_bankQuestion bankQBEAcademic
attendance_managementAttendance trackingATMEAcademic
syllabus_managementSyllabus managementMaSyEAcademic
fee_managementFee & billingACCTE/FMEFinance
student_walletStudent wallet & micropaymentsWMEFinance
scholarshipsScholarship managementSCMEFinance
student_behaviorBehavior managementSBMEOperations
admission_managementFull admission managementADMEOperations
schedulingTimetable & calendarSCIEOperations
document_generationDocument generationDTGEPlatform
hostel_managementHostel operationsHMEOperations
transport_managementTransport managementTMEOperations
library_managementLibrary managementLMEOperations
student_healthGeneral student healthSHMEOperations
refectoryCanteen managementRCMOperations
messagingTwo-way messagingMSGECommunication
outbound_webhooksWebhook integrationsPlatformPlatform
student_id_cardsID card generationStuLCEPlatform
student_clearanceStudent clearanceStuLCEPlatform

16.2 Sub-Gates (within top-level gates)

Sub-Gate CodeParent GateFeature
admission_portaladmission_managementOnline application portal
admission_meritadmission_managementMerit scoring
admission_transfersadmission_managementTransfer admissions
clinic_managementstudent_healthSchool clinic
pharmacy_managementstudent_healthSchool pharmacy
health_screeningstudent_healthHealth screening
messaging_broadcastmessagingBroadcast channels (premium)

16.3 Frontend Implementation

const { featureGates } = useSchoolContext(); // Hide entire sidebar module {featureGates.includes("library_management") && <LibraryNavItem />} // Hide sub-feature within a module {featureGates.includes("admission_merit") && <MeritScoringTab />} // Premium sub-gate {featureGates.includes("messaging_broadcast") && <BroadcastButton />}

17. Frontend Architecture Decisions

17.1 Technology Stack (Already Established)

LayerTechnologyNotes
FrameworkNext.js 14+ (App Router)Server components for initial loads, client components for interactivity
UI Libraryshadcn/ui + Tailwind CSSConsistent with existing UADE dashboard
State ManagementTanStack Query v5Already wired for UADE. Server state only — no Redux.
FormsReact Hook Form + ZodAlready used in existing form components
TablesTanStack TableFor all data tables
AuthNextAuth.js + AuthentikJWT bearer token flow, already working
API ClientCustom apiClient() / serverApiClient()Already built in src/lib/api-client.ts. Injects Bearer + X-Tenant-Id.
RoutingNext.js App Router[tenantId] dynamic segment for tenant scoping
URL Statenuqs (NuqsAdapter)For filter/pagination/search state in URL
Command PaletteKBarAlready wired
Real-timeWebSocket (Socket.io)For messaging (MSGE gateway at /messaging namespace)

17.2 Key Architectural Patterns

Tenant Context Provider

/dashboard/school/[tenantId]/layout.tsx → TenantProvider (fetches permissions, iscedLevels, features) → SchoolSidebar (RBAC-filtered + feature-gated) → SchoolTopBar (tenant switcher) → {children}

Feature Module Pattern (per engine)

src/features/<engine>/ api/ queries.ts ← TanStack Query options (queryKey, queryFn, staleTime) mutations.ts ← useMutation hooks for POST/PUT/DELETE types.ts ← TypeScript interfaces matching backend DTOs service.ts ← apiClient() calls (raw fetch wrappers) components/ <engine>-list.tsx ← Data table with filters, search, pagination <engine>-detail.tsx ← Detail/edit view <engine>-form.tsx ← Create/edit form <engine>-dashboard.tsx ← Module overview/stats hooks/ use-<engine>.ts ← Custom hooks combining queries + mutations constants/ columns.tsx ← Table column definitions schemas/ <engine>.schema.ts ← Zod validation schemas

ISCED-Aware Rendering

const { iscedLevels } = useSchoolContext(); const isTertiary = iscedLevels.some(l => l >= 5); const isSecondary = iscedLevels.some(l => l >= 2 && l <= 4); // Conditional field {isTertiary && <GpaDisplay studentId={id} />} // Conditional label <Label>{isTertiary ? "Semester" : "Term"}</Label> // Conditional column in table const columns = [ ...baseColumns, ...(isTertiary ? [creditHoursColumn, gpaColumn] : []), ];

18. ISCED-Conditional Rendering Map

Complete map of every UI element that changes based on ISCED level:

ModuleComponentISCED 0-2 (Primary)ISCED 3-4 (Secondary)ISCED 5-8 (Tertiary)
ProgrammesLevel label"Class" / "Grade""Form" / "Year""Year" / "Level"
ProgrammesProgression modeAuto-promoteExam-gatedCredit-accumulation
ProgrammesSpecializationsHiddenHiddenVisible (major/minor)
CoursesCredit hours columnHiddenHiddenVisible
CoursesCourse registrationHiddenHiddenFull self-service
CoursesWaitlist / Minor / Credit recognitionHiddenHiddenVisible
GradingGrade displayMarks /10 or /20Marks + letter (A-E)GPA 0.0–4.0
GradingCGPA panelHiddenHiddenVisible
GradingSequences tabHiddenVisible (1st, 2nd, 3rd)Hidden
GradingGraduation checkAge/completionNational exam resultsCGPA + credit threshold
Score EntryScore formatNumeric (0-10/20)Numeric (0-20)Numeric + letter grade
Report CardsFormatSimple marks sheetMarks + class rank + conductTranscript + GPA + credits
AttendanceGranularityPer-day (full class)Per-period (per-subject)Per-lecture (optional)
FeesStructureFlat annual/termlyFlat + exam feesPer-credit differential
TimetableComplexitySimple grid (1:1)Subject rotationMulti-section + labs
Student ListGuardian columnProminentVisibleMinimal/hidden
Student ListGPA columnHiddenHiddenVisible
LibraryFeaturesBasic lending+ textbooks+ digital + reserves
HostelVisibilityHidden (unless boarding)Visible (if boarding)Visible
TransportVisibilityProminentVisibleHidden
Term labelLabel"Term 1, 2, 3""Term 1, 2, 3""Semester 1, 2"
EWS signalsAcademic signalsMinimal8 rules (ISCED 3-4)11 rules (ISCED 5-8)

19. Route Map

Complete Next.js App Router route structure (~190 page.tsx files):

Total new routes: ~190 page.tsx files across 22 top-level sections + 1 org context + public routes.

20. Delivery Approach Options

Option A — Full Manual Build (Claude + Developer)

Method: Build every module by hand — feature module, API layer, components, forms, tables, ISCED logic.

~25 modules ~185 pages ~500+ components Enterprise-grade, full control over every line

Best for: When quality and customization matter more than speed.

Option B — Lovable-Generated + Manual Wiring

Method: Use Lovable to rapidly generate page shells and components from mockups/descriptions, then manually wire them to the real API.

Best for: When speed of visual delivery matters most. Governance rules already in place.

Option C — Hybrid (Recommended)

  1. Phase 1 (Shell) — built manually. The tenant context provider, RBAC navigation, and school layout are architectural foundation. Must be built right.
  2. Phases 2-8 (Feature modules) — Lovable generates, developer wires. Feed Lovable the Swagger spec + mockup. Lovable generates layouts, table columns, form fields. Developer wires to real API, adds ISCED/RBAC/gate logic, QAs against live data.

Best for: Delivering a demoable product quickly while maintaining enterprise-grade API integration.

21. Risk Register

R01Feature gate enforcement missing
Schools see modules their subscription doesn't include.
@RequireFeature() guard decorator needs to be written and deployed before frontend launches.
R02ISCED rendering untested
No real university tenant exists to test ISCED 5+ features.
Create test tenants at different ISCED levels with representative data.
R03Performance at scale
Data tables with 1,000+ rows may lag.
All list endpoints support ?page=&limit= — use server-side pagination.
R04Multi-tenant data leaks
Bug in tenant context causes cross-school exposure.
X-Tenant-Id header enforced on every backend endpoint. Frontend must always set it.

22. Success Criteria

01School admin can enter dashboard — UADE enterRoute works, school overview renders with real data
02RBAC-filtered navigation — Users only see what their role permits
03Feature-gate filtered modules — Disabled gates hide modules
04Student CRUD end-to-end — Create, read, update, search, filter, paginate
05Admission pipeline flows — Apply → review → score → offer → accept → enroll
06Grading for ISCED 2 + ISCED 6 — Score entry, computation, report cards for secondary; GPA/CGPA for university
07Fee collection works — Structure → invoice → payment → receipt
08ISCED-conditional rendering — Same dashboard renders differently for primary vs. university
09Mobile-responsive — Works on tablet (1024px) and mobile (375px)
10All data tables handle scale — Server-side pagination, no client-side lag

23. Internationalization (i18n)

All user-facing text in the frontend MUST use next-intl translation functions. No hardcoded English strings in components.

23.1 Reference Document

See frontend/planning/TRANSLATION_PROTOCOL.md v1.0: next-intl + Zustand locale persistence, ICU message format for plurals/interpolation, EN + FR launch languages.

23.2 Implementation (Proof of Concept Complete)

UADE proof of concept deployed: src/i18n/config.ts, src/i18n/messages/en.json + fr.json, src/stores/locale-store.ts, src/components/language-switcher.tsx. All UADE components use useTranslations() — zero hardcoded strings.

23.3 Rules for New Modules

  1. Add translation keys to en.json and fr.json under its namespace
  2. Import useTranslations from next-intl in every component that renders text
  3. Use t('key') for all labels, buttons, headings, placeholders, tooltips
  4. Use useFormatter() for dates, numbers, currencies — never hardcode locale strings
  5. Use ICU format for plurals: {count, plural, one {# item} other {# items}}
// Pattern for every component: import { useTranslations, useFormatter } from 'next-intl'; export function StudentList() { const t = useTranslations('students'); const tc = useTranslations('common'); const format = useFormatter(); return ( <div> <h1>{t('title')}</h1> <Button>{tc('actions.add')}</Button> <span>{format.dateTime(date, { dateStyle: 'long' })}</span> </div> ); }

24. API Client Configuration

24.1 File Location

src/lib/api-client.ts — custom fetch wrapper used by all TanStack Query hooks.

24.2 How It Works

// Every request automatically includes: // 1. Authorization: Bearer {accessToken} — from NextAuth session // 2. X-Tenant-Id: {tenantId} — from TenantProvider context (Zustand) // 3. Accept-Language: {locale} — from locale store (for backend i18n) // 4. Content-Type: application/json const apiClient = async (path: string, options?: RequestInit) => { const session = await getSession(); const { tenantId } = useTenantStore.getState(); const { locale } = useLocaleStore.getState(); const res = await fetch(`${NEXT_PUBLIC_API_URL}${path}`, { ...options, headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${session?.accessToken}`, 'X-Tenant-Id': tenantId ?? '', 'Accept-Language': locale, ...options?.headers, }, }); if (res.status === 401) { signIn('authentik'); throw new Error('Session expired'); } if (!res.ok) { const error = await res.json().catch(() => ({})); throw new Error(error.message || `API error: ${res.status}`); } return res.json(); };

24.3 Environment Variables

VariableValuePurpose
NEXT_PUBLIC_API_URLhttps://api.academia.vivabox.netBackend API base URL
NEXTAUTH_URLhttps://app.academia.vivabox.netFrontend URL for NextAuth callbacks
AUTH_SECRET(secret)NextAuth encryption key

25. Feature Gate Frontend Implementation

25.1 Gate Check in Sidebar Navigation

const navItems = [ { label: t('nav.students'), href: '/students', icon: Icons.student, gate: null }, // core — always shown { label: t('nav.library'), href: '/library', icon: Icons.library, gate: 'library_management' }, { label: t('nav.health'), href: '/health', icon: Icons.health, gate: 'student_health' }, // ... ].filter(item => !item.gate || featureGates.includes(item.gate));

25.2 Gate Check on Page Load

export default function LibraryPage() { const { featureGates } = useSchoolContext(); if (!featureGates.includes('library_management')) { return <FeatureLockedPage gate="library_management" />; } return <LibraryDashboard />; }

25.3 Sub-Gate Check for Features Within a Module

// Show merit scoring only if the sub-gate is active: {featureGates.includes('admission_merit') && ( <TabsTrigger value="merit">{t('admissions.meritScoring')}</TabsTrigger> )} // Premium messaging broadcast: {featureGates.includes('messaging_broadcast') && ( <Button onClick={sendBroadcast}>{t('messaging.broadcast')}</Button> )}

25.4 FeatureLockedPage Component

function FeatureLockedPage({ gate }: { gate: string }) { const t = useTranslations('settings'); return ( <div className="flex flex-col items-center justify-center py-20 text-center space-y-4"> <Icons.lock className="size-12 text-muted-foreground" /> <h2 className="text-xl font-semibold">{t('featureGates')}</h2> <p className="text-muted-foreground max-w-md"> This feature requires the <Badge>{gate}</Badge> subscription gate. </p> <Button variant="outline" asChild> <Link href="/settings/subscription">View Subscription</Link> </Button> </div> ); }

26. State Handling Patterns

26.1 Loading State (Skeleton)

function StudentListSkeleton() { return ( <div className="space-y-4"> <Skeleton className="h-10 w-64" /> {/* search bar */} <Skeleton className="h-8 w-full" /> {/* table header */} {Array.from({ length: 5 }).map((_, i) => ( <Skeleton key={i} className="h-12 w-full" /> ))} </div> ); }

26.2 Error State

function ErrorBanner({ error }: { error: Error }) { const t = useTranslations('common'); return ( <Alert variant="destructive"> <AlertTitle>{t('error.title')}</AlertTitle> <AlertDescription>{error.message}</AlertDescription> <Button variant="outline" onClick={() => window.location.reload()}> {t('actions.refresh')} </Button> </Alert> ); }

26.3 Empty State

function EmptyState({ title, description, action }) { return ( <div className="flex flex-col items-center justify-center py-16 text-center space-y-3"> <div className="bg-muted rounded-full p-4"> <Icons.inbox className="size-8 text-muted-foreground" /> </div> <h3 className="text-lg font-semibold">{title}</h3> <p className="text-muted-foreground text-sm max-w-md">{description}</p> {action && <Button onClick={action.onClick}>{action.label}</Button>} </div> ); }

26.4 Permission Denied

function PermissionDenied() { const t = useTranslations('common'); return ( <div className="flex flex-col items-center justify-center py-16 text-center space-y-3"> <Icons.shield className="size-12 text-muted-foreground" /> <h3>{t('error.permissionDenied')}</h3> <p>{t('error.permissionDeniedDescription')}</p> </div> ); }

27. Data Table Column Specifications (Top 10 Pages)

27.1 Student List (/students)

ColumnSortableFilterableDefault Visible
Name (givenName + familyName)YesSearchYes
Student IDNoNoYes
ProgrammeYesSelect dropdownYes
LevelYesSelect dropdownYes
StatusYesSelect dropdownYes
GenderNoSelect dropdownYes
GuardianNoNoYes (ISCED 0-4), Hidden (ISCED 5+)
GPAYesNoHidden (ISCED 0-4), Yes (ISCED 5+)
Enrollment DateYesDate rangeNo (column toggle)

Default sort: givenName ASC | Bulk actions: Export CSV, Change Status, Assign Group

27.2 Staff Directory (/staff)

ColumnSortableFilterableDefault Visible
NameYesSearchYes
Employee IDNoNoYes
RoleYesSelectYes
DepartmentYesSelectYes
StatusYesSelectYes
PhoneNoNoYes
Hire DateYesDate rangeNo

Default sort: givenName ASC | Bulk actions: Export CSV

27.3 Application List (/admissions/applications)

ColumnSortableFilterableDefault Visible
Applicant NameYesSearchYes
ProgrammeYesSelectYes
LevelYesSelectYes
StatusYesSelect (AS_DRAFT, AS_SUBMITTED, AS_SHORTLISTED, etc.)Yes
Merit RankYesNoYes
Submitted AtYesDate rangeYes
ReviewerNoSelectNo

Default sort: createdAt DESC | Bulk actions: Shortlist, Reject, Export

27.4 Invoice List (/finance/billing)

ColumnSortableFilterableDefault Visible
Invoice #YesSearchYes
StudentYesSearchYes
AmountYesNoYes
BalanceYesNoYes
StatusYesSelect (DRAFT, SENT, PARTIALLY_PAID, PAID, CANCELLED)Yes
Due DateYesDate rangeYes
ProgrammeNoSelectNo

Default sort: createdAt DESC | Bulk actions: Send reminders, Export, Cancel

27.5 Assessment List (/grading/assessments)

ColumnSortableFilterableDefault Visible
TitleYesSearchYes
CourseYesSelectYes
TypeYesSelect (CA, MIDTERM, FINAL)Yes
StatusYesSelect (DRAFT→FINALIZED)Yes
Max ScoreNoNoYes
Scores EnteredNoNoYes (progress bar)
Created AtYesNoNo

Default sort: createdAt DESC | Bulk actions: Activate, Release, Finalize

27.6 Timetable Slots (/timetable/slots)

ColumnSortableFilterableDefault Visible
DayYesSelectYes
PeriodYesSelectYes
CourseYesSelectYes
LecturerYesSelectYes
RoomYesSelectYes
Level/ClassYesSelectYes
StatusYesSelect (DRAFT/APPROVED/PUBLISHED)Yes

Default sort: dayOfWeek ASC, periodIndex ASC | Bulk actions: Submit, Approve, Publish

27.7 Attendance Records (/attendance)

ColumnSortableFilterableDefault Visible
StudentYesSearchYes
DateYesDate rangeYes
Event TypeYesSelect (LESSON, SCHOOL_DAY, etc.)Yes
StatusYesSelect (PRESENT, ABSENT, LATE, EXCUSED)Yes
Course/PeriodNoSelectYes
Marked ByNoNoNo

Default sort: date DESC | Bulk actions: Export

27.8 Library Catalogue (/library/catalogue)

ColumnSortableFilterableDefault Visible
TitleYesSearchYes
ISBNNoSearchYes
Author(s)YesNoYes
TypeYesSelect (BOOK, JOURNAL, DIGITAL)Yes
Copies (Total/Available)YesNoYes
StatusYesSelect (ACTIVE, WITHDRAWN)Yes

Default sort: title ASC | Bulk actions: Import, Withdraw

27.9 Behavior Events (/behavior/events)

ColumnSortableFilterableDefault Visible
StudentYesSearchYes
CategoryYesSelectYes
PolarityYesSelect (POSITIVE/NEGATIVE)Yes
PointsYesNoYes
DateYesDate rangeYes
Recorded ByNoSelectNo
VoidedNoSelectNo

Default sort: createdAt DESC | Bulk actions: Void, Export

27.10 Scholarship Applications (/scholarships/applications)

ColumnSortableFilterableDefault Visible
ApplicantYesSearchYes
ProgrammeYesSelectYes
StatusYesSelect (SUBMITTED, SHORTLISTED, AWARDED, REJECTED)Yes
Applied AtYesDate rangeYes
GPAYesNoYes
Committee ScoreYesNoNo

Default sort: createdAt DESC | Bulk actions: Shortlist, Reject


Generated: 2026-04-15 | Academia V2.1 | School Admin Dashboard Build Plan v2.1
Source of truth: demofox VPS (77.237.247.146)
Backend: 30+ engines, 1,772 endpoints, 401 models, 327 enums, 257 Swagger tags, 3,607 tests — all green
Frontend: 285 files, 31 routes, 1 engine connected — build starts from here
Supersedes: v1.0 (2026-04-10) which was written against 1,548 endpoints and missed 7 entire modules

Build Status Tracker

Track screen-by-screen progress across all 8 phases — Last updated: 2026-04-15

0% Overall
Screens Done
0 / 0
Endpoints Consumed
0 / 1,772
In Progress
0
Blocked
0

Phase Progress Map

Screen Tracker

Phase Module Screen Engine Endpoints Status