feat: add OpenEduCat institutional LMS features + Odoo 19 Backend SRS

- Update ENCOACH_UNIFIED_SRS.md with 6 new feature sections:
  Academic Year/Term, Departments, Admission/Enrollment,
  Subject Registration, Institutional Exams, Assignment Submissions
- Add TypeScript types: academic.ts, admission.ts, institutional-exam.ts
- Add API services: academic, admission, institutional-exam
- Add TanStack Query hooks: useAcademic, useAdmissions, useInstitutionalExams
- Add 9 new pages: AcademicYearManager, DepartmentManager, AdmissionList,
  AdmissionDetail, AdmissionRegisterPage, AdmissionApplication,
  SubjectRegistrationPage, InstitutionalExamSessions, MarksheetManager
- Update App.tsx routes, AdminLmsLayout sidebar (Institutional group),
  StudentLayout sidebar (Subject Registration)
- Generate ENCOACH_ODOO19_BACKEND_SRS.md: complete Odoo 19 backend spec
  covering 200+ REST API endpoints, 31 modules, all OpenEduCat models

Made-with: Cursor
This commit is contained in:
Talal Sharabi
2026-03-26 23:42:06 +04:00
parent 3fbbfd9348
commit 19d7e01be1
27 changed files with 4691 additions and 27 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -53,11 +53,19 @@
28. [Subscriptions and Payments](#28-subscriptions-and-payments)
29. [Training Content](#29-training-content)
**Part VIII -- Technical Specifications**
30. [Data Models](#30-data-models)
31. [REST API Specification](#31-rest-api-specification)
32. [Frontend Page Inventory](#32-frontend-page-inventory)
33. [Non-Functional Requirements](#33-non-functional-requirements)
**Part VIII -- Institutional LMS (OpenEduCat)**
30. [Academic Year and Term Management](#30-academic-year-and-term-management)
31. [Department Management](#31-department-management)
32. [Admission and Enrollment](#32-admission-and-enrollment)
33. [Subject Registration](#33-subject-registration)
34. [Institutional Exam Sessions](#34-institutional-exam-sessions)
35. [Assignment File Submissions](#35-assignment-file-submissions)
**Part IX -- Technical Specifications**
36. [Data Models](#36-data-models)
37. [REST API Specification](#37-rest-api-specification)
38. [Frontend Page Inventory](#38-frontend-page-inventory)
39. [Non-Functional Requirements](#39-non-functional-requirements)
---
@@ -344,7 +352,7 @@ The current permission model is IELTS-hardcoded (`generate_reading`, `createWrit
| FR-SIDE-03 | Logout ends session and clears state |
| FR-SIDE-04 | Ticket badge shows assigned count |
**Student sidebar:** Dashboard, Subjects, Courses, Assignments, Grades, Attendance, Timetable, Profile
**Student sidebar:** Dashboard, Subjects, Courses, Subject Registration, Assignments, Grades, Attendance, Timetable, Profile
**Teacher sidebar:** Dashboard, Courses, Assignments, Attendance, Students, Timetable, Profile
@@ -354,6 +362,7 @@ The current permission model is IELTS-hardcoded (`generate_reading`, `createWrit
|-------|-------|
| **LMS** | Dashboard, Courses, Students, Teachers, Batches, Timetable, Reports, Settings |
| **Platform** | Platform Dashboard |
| **Institutional** | Academic Years, Departments, Admissions, Exam Sessions, Marksheets |
| **Academic** | Assignments, Exams List, Exam Structures, Rubrics, Generation, Approval Workflows |
| **Management** | Users, Entities, Classrooms, Taxonomy Manager, Resource Manager |
| **Reports** | Student Performance, Stats Corporate, Record |
@@ -962,11 +971,469 @@ Each simulated AI component in the new frontend maps to a real backend service:
---
# Part VIII -- Technical Specifications
# Part VIII -- Institutional LMS (OpenEduCat)
## 30. Data Models
All LMS features in this part are backed by OpenEduCat community modules (ported to Odoo 19). The `encoach_lms_api` module extends these models and exposes them via REST API to the React frontend.
### 30.1 Existing Models (from `ielts-be-v0`)
---
## 30. Academic Year and Term Management
### 30.1 Overview
Academic years define the institutional calendar. Each year contains terms (semesters, quarters) that govern course scheduling, batch periods, and exam sessions.
### 30.2 Data Models (OpenEduCat)
**`op.academic.year`**
| Field | Type | Description |
|-------|------|-------------|
| `name` | Char | Academic year name (e.g., "2026-2027") |
| `start_date` | Date | Year start |
| `end_date` | Date | Year end |
| `term_structure` | Selection | `two_sem`, `two_sem_qua`, `three_sem`, `four_Quarter`, `final_year`, `others` |
| `academic_term_ids` | One2many | Terms within this year |
**`op.academic.term`**
| Field | Type | Description |
|-------|------|-------------|
| `name` | Char | Term name (e.g., "Semester 1") |
| `term_start_date` | Date | Term start |
| `term_end_date` | Date | Term end |
| `academic_year_id` | Many2one | Parent academic year |
| `parent_term` | Many2one | Parent term (for quarters within semesters) |
### 30.3 Functional Requirements
| ID | Requirement | Route | Role |
|----|-------------|-------|------|
| FR-AY-01 | List academic years with terms | `/admin/academic-years` | Admin |
| FR-AY-02 | Create academic year with term structure selection | `/admin/academic-years` | Admin |
| FR-AY-03 | Auto-generate terms based on selected structure | `/admin/academic-years` | Admin |
| FR-AY-04 | Edit/delete academic years and terms | `/admin/academic-years` | Admin |
| FR-AY-05 | Link batches and courses to academic terms | Related pages | Admin |
### 30.4 API Endpoints
| Method | Path | Description |
|--------|------|-------------|
| `GET` | `/api/academic-years` | List academic years |
| `POST` | `/api/academic-years` | Create academic year |
| `GET` | `/api/academic-years/{id}` | Get year with terms |
| `PATCH` | `/api/academic-years/{id}` | Update year |
| `DELETE` | `/api/academic-years/{id}` | Delete year |
| `POST` | `/api/academic-years/{id}/generate-terms` | Auto-generate terms from structure |
| `GET` | `/api/academic-terms` | List terms (filter by year) |
| `POST` | `/api/academic-terms` | Create term |
| `PATCH` | `/api/academic-terms/{id}` | Update term |
| `DELETE` | `/api/academic-terms/{id}` | Delete term |
---
## 31. Department Management
### 31.1 Overview
Departments organize faculty, courses, and subjects into academic units (e.g., "Department of Mathematics", "Department of IT").
### 31.2 Data Model (OpenEduCat)
**`op.department`**
| Field | Type | Description |
|-------|------|-------------|
| `name` | Char | Department name |
| `code` | Char | Department code |
| `parent_id` | Many2one | Parent department (for hierarchy) |
### 31.3 Functional Requirements
| ID | Requirement | Route | Role |
|----|-------------|-------|------|
| FR-DEPT-01 | List departments | `/admin/departments` | Admin |
| FR-DEPT-02 | Create/edit department | `/admin/departments` | Admin |
| FR-DEPT-03 | Delete department | `/admin/departments` | Admin |
| FR-DEPT-04 | Assign department to courses and faculty | Related pages | Admin |
### 31.4 API Endpoints
| Method | Path | Description |
|--------|------|-------------|
| `GET` | `/api/departments` | List departments |
| `POST` | `/api/departments` | Create department |
| `PATCH` | `/api/departments/{id}` | Update department |
| `DELETE` | `/api/departments/{id}` | Delete department |
---
## 32. Admission and Enrollment
### 32.1 Overview
The admission workflow manages student applications from submission through confirmation to enrollment. Admission registers define open enrollment windows.
### 32.2 Data Models (OpenEduCat)
**`op.admission.register`**
| Field | Type | Description |
|-------|------|-------------|
| `name` | Char | Register name (e.g., "Fall 2026 Admissions") |
| `course_id` | Many2one | Target course |
| `start_date` | Date | Application window start |
| `end_date` | Date | Application window end |
| `min_count` | Integer | Minimum applications to proceed |
| `max_count` | Integer | Maximum applications accepted |
| `state` | Selection | `draft`, `confirm`, `cancel`, `done` |
| `product_id` | Many2one | Fee product for admission |
**`op.admission`**
| Field | Type | Description |
|-------|------|-------------|
| `name` | Char | Applicant name |
| `application_number` | Char | Auto-generated application number |
| `register_id` | Many2one | Admission register |
| `course_id` | Many2one | Applied course |
| `batch_id` | Many2one | Target batch |
| `first_name` | Char | First name |
| `middle_name` | Char | Middle name |
| `last_name` | Char | Last name |
| `email` | Char | Email |
| `phone` | Char | Phone |
| `birth_date` | Date | Date of birth |
| `gender` | Selection | `m`, `f`, `o` |
| `nationality` | Many2one | Country |
| `state` | Selection | `draft`, `submit`, `confirm`, `admission`, `reject`, `cancel`, `done` |
| `fees` | Float | Admission fee amount |
| `image` | Binary | Applicant photo |
| `student_id` | Many2one | Created student record (after admission) |
### 32.3 Functional Requirements
| ID | Requirement | Route | Role |
|----|-------------|-------|------|
| FR-ADM-01 | List admission registers with status | `/admin/admission-register` | Admin |
| FR-ADM-02 | Create/edit admission register (course, dates, capacity) | `/admin/admission-register` | Admin |
| FR-ADM-03 | Open/close admission register | `/admin/admission-register` | Admin |
| FR-ADM-04 | List admissions with filters (status, course, register) | `/admin/admissions` | Admin |
| FR-ADM-05 | View admission detail | `/admin/admissions/:id` | Admin |
| FR-ADM-06 | Transition admission status (submit, confirm, admit, reject) | `/admin/admissions/:id` | Admin |
| FR-ADM-07 | On admit: auto-create `op.student` and `op.student.course` records | Backend | System |
| FR-ADM-08 | Public admission application form | `/apply` | Public/Student |
| FR-ADM-09 | Applicant status tracking | `/apply/status` | Public |
### 32.4 API Endpoints
| Method | Path | Description |
|--------|------|-------------|
| `GET` | `/api/admission-registers` | List registers |
| `POST` | `/api/admission-registers` | Create register |
| `PATCH` | `/api/admission-registers/{id}` | Update register |
| `POST` | `/api/admission-registers/{id}/confirm` | Confirm register |
| `POST` | `/api/admission-registers/{id}/close` | Close register |
| `GET` | `/api/admissions` | List admissions |
| `GET` | `/api/admissions/{id}` | Get admission detail |
| `POST` | `/api/admissions` | Submit admission application |
| `POST` | `/api/admissions/{id}/submit` | Submit for review |
| `POST` | `/api/admissions/{id}/confirm` | Confirm admission |
| `POST` | `/api/admissions/{id}/admit` | Admit applicant (creates student) |
| `POST` | `/api/admissions/{id}/reject` | Reject admission |
---
## 33. Subject Registration
### 33.1 Overview
Within enrolled courses, students register for specific subjects. This is required for timetable, attendance, and exam eligibility.
### 33.2 Data Model (OpenEduCat)
**`op.subject.registration`**
| Field | Type | Description |
|-------|------|-------------|
| `student_id` | Many2one | Student |
| `course_id` | Many2one | Course |
| `batch_id` | Many2one | Batch |
| `subject_ids` | Many2many | Selected subjects |
| `min_unit_load` | Float | Minimum units from course config |
| `max_unit_load` | Float | Maximum units from course config |
| `state` | Selection | `draft`, `confirm`, `reject`, `done` |
### 33.3 Functional Requirements
| ID | Requirement | Route | Role |
|----|-------------|-------|------|
| FR-SR-01 | Students view available subjects for enrolled courses | `/student/subject-registration` | Student |
| FR-SR-02 | Students select subjects within unit load limits | `/student/subject-registration` | Student |
| FR-SR-03 | Submit registration for approval | `/student/subject-registration` | Student |
| FR-SR-04 | Admin/teacher view and approve/reject registrations | `/admin/students` | Admin |
| FR-SR-05 | Confirmed registration updates `op.student.course.subject_ids` | Backend | System |
### 33.4 API Endpoints
| Method | Path | Description |
|--------|------|-------------|
| `GET` | `/api/subject-registrations` | List registrations (filter by student, course, status) |
| `POST` | `/api/subject-registrations` | Create registration |
| `PATCH` | `/api/subject-registrations/{id}` | Update subjects |
| `POST` | `/api/subject-registrations/{id}/confirm` | Confirm registration |
| `POST` | `/api/subject-registrations/{id}/reject` | Reject registration |
| `GET` | `/api/subject-registrations/available` | Get available subjects for current student |
---
## 34. Institutional Exam Sessions
### 34.1 Overview
Institutional exam sessions group traditional exams (midterms, finals) for a course/batch. These are separate from EnCoach AI-powered exams. They use the OpenEduCat exam, marksheet, and grading system.
### 34.2 Data Models (OpenEduCat)
**`op.exam.session`**
| Field | Type | Description |
|-------|------|-------------|
| `name` | Char | Session name (e.g., "Fall 2026 Midterms") |
| `course_id` | Many2one | Course |
| `batch_id` | Many2one | Batch |
| `exam_code` | Char | Session code |
| `start_date` | Date | Session start |
| `end_date` | Date | Session end |
| `exam_type` | Many2one | Exam type (midterm, final, quiz) |
| `evaluation_type` | Selection | `normal` or `grade` |
| `venue` | Many2one | Venue partner |
| `state` | Selection | `draft`, `schedule`, `held`, `cancel`, `done` |
| `exam_ids` | One2many | Exams in this session |
**`op.exam` (institutional)**
| Field | Type | Description |
|-------|------|-------------|
| `name` | Char | Exam name |
| `session_id` | Many2one | Parent session |
| `subject_id` | Many2one | Subject being examined |
| `exam_code` | Char | Exam code |
| `start_time` | Datetime | Exam start |
| `end_time` | Datetime | Exam end |
| `total_marks` | Integer | Maximum marks |
| `min_marks` | Integer | Passing marks |
| `state` | Selection | `draft`, `schedule`, `held`, `result_updated`, `cancel`, `done` |
| `responsible_id` | Many2many | Responsible faculty |
| `attendees_line` | One2many | Exam attendees with marks |
**`op.exam.type`**
| Field | Type | Description |
|-------|------|-------------|
| `name` | Char | Type name (Midterm, Final, Quiz, Lab) |
**`op.exam.room`**
| Field | Type | Description |
|-------|------|-------------|
| `name` | Char | Room name |
| `classroom_id` | Many2one | Linked classroom |
| `capacity` | Integer | Room capacity |
**`op.exam.attendees`**
| Field | Type | Description |
|-------|------|-------------|
| `exam_id` | Many2one | Exam |
| `student_id` | Many2one | Student |
| `room_id` | Many2one | Assigned room |
| `marks` | Integer | Obtained marks |
| `status` | Selection | `pass`, `fail` (computed from marks vs min_marks) |
**`op.marksheet.register`**
| Field | Type | Description |
|-------|------|-------------|
| `name` | Char | Register name |
| `exam_session_id` | Many2one | Exam session |
| `marksheet_line` | One2many | Marksheet lines per student |
| `result_template_id` | Many2one | Result template |
| `state` | Selection | `draft`, `validated`, `cancelled` |
| `total_pass` | Integer | Computed pass count |
| `total_failed` | Integer | Computed fail count |
**`op.marksheet.line`**
| Field | Type | Description |
|-------|------|-------------|
| `student_id` | Many2one | Student |
| `marksheet_reg_id` | Many2one | Parent register |
| `result_line` | One2many | Per-exam results |
| `total_marks` | Integer | Computed total |
| `percentage` | Float | Computed percentage |
| `grade` | Char | Computed grade (if grade evaluation) |
| `status` | Selection | `pass`, `fail` (computed) |
**`op.result.line`**
| Field | Type | Description |
|-------|------|-------------|
| `marksheet_line_id` | Many2one | Parent marksheet line |
| `exam_id` | Many2one | Exam |
| `student_id` | Many2one | Student |
| `marks` | Integer | Marks obtained |
| `grade` | Char | Computed grade |
| `status` | Selection | `pass`, `fail` (computed from marks vs min_marks) |
**`op.result.template`**
| Field | Type | Description |
|-------|------|-------------|
| `name` | Char | Template name |
| `exam_session_id` | Many2one | Exam session |
| `grade_ids` | Many2many | Grade configuration rules |
| `result_date` | Date | Result publication date |
| `state` | Selection | `draft`, `result_generated` |
**`op.grade.configuration`**
| Field | Type | Description |
|-------|------|-------------|
| `min_per` | Integer | Minimum percentage |
| `max_per` | Integer | Maximum percentage |
| `result` | Char | Grade display (e.g., "A", "B+", "Pass") |
### 34.3 Functional Requirements
| ID | Requirement | Route | Role |
|----|-------------|-------|------|
| FR-IEX-01 | List exam sessions with status filters | `/admin/exam-sessions` | Admin |
| FR-IEX-02 | Create exam session (course, batch, dates, type) | `/admin/exam-sessions` | Admin |
| FR-IEX-03 | Add exams to session (subject, time, marks) | `/admin/exam-sessions` | Admin |
| FR-IEX-04 | Schedule and manage session state transitions | `/admin/exam-sessions` | Admin |
| FR-IEX-05 | Enter marks for exam attendees | `/admin/exam-sessions` | Admin/Teacher |
| FR-IEX-06 | Configure grade scales | `/admin/marksheets` | Admin |
| FR-IEX-07 | Create result templates and generate marksheets | `/admin/marksheets` | Admin |
| FR-IEX-08 | View marksheet results (pass/fail, grades, percentages) | `/admin/marksheets` | Admin |
| FR-IEX-09 | Students view institutional exam results | `/student/grades` | Student |
### 34.4 API Endpoints
| Method | Path | Description |
|--------|------|-------------|
| `GET` | `/api/inst-exam-sessions` | List exam sessions |
| `POST` | `/api/inst-exam-sessions` | Create session |
| `GET` | `/api/inst-exam-sessions/{id}` | Get session with exams |
| `PATCH` | `/api/inst-exam-sessions/{id}` | Update session |
| `DELETE` | `/api/inst-exam-sessions/{id}` | Delete session |
| `POST` | `/api/inst-exam-sessions/{id}/schedule` | Schedule session |
| `POST` | `/api/inst-exam-sessions/{id}/done` | Mark session done |
| `POST` | `/api/inst-exams` | Add exam to session |
| `PATCH` | `/api/inst-exams/{id}` | Update exam |
| `POST` | `/api/inst-exams/{id}/attendees` | Add attendees |
| `PATCH` | `/api/inst-exams/{id}/marks` | Enter marks |
| `GET` | `/api/exam-types` | List exam types |
| `POST` | `/api/exam-types` | Create exam type |
| `GET` | `/api/grade-config` | List grade configurations |
| `POST` | `/api/grade-config` | Create grade config |
| `GET` | `/api/result-templates` | List result templates |
| `POST` | `/api/result-templates` | Create result template |
| `POST` | `/api/result-templates/{id}/generate` | Generate marksheets |
| `GET` | `/api/marksheets` | List marksheets |
| `GET` | `/api/marksheets/{id}` | Get marksheet with results |
| `POST` | `/api/marksheets/{id}/validate` | Validate marksheet |
---
## 35. Assignment File Submissions
### 35.1 Overview
Traditional course assignments where students submit files and teachers grade them. Coexists with EnCoach exam-wrapper assignments (`encoach.assignment`).
### 35.2 Data Models (OpenEduCat)
**`grading.assignment.type`**
| Field | Type | Description |
|-------|------|-------------|
| `name` | Char | Type name (Homework, Project, Lab Report, Presentation) |
**`grading.assignment`**
| Field | Type | Description |
|-------|------|-------------|
| `name` | Char | Assignment title |
| `course_id` | Many2one | Course |
| `subject_id` | Many2one | Subject |
| `issued_date` | Datetime | Issue date |
| `assignment_type` | Many2one | Assignment type |
| `faculty_id` | Many2one | Issuing faculty |
| `point` | Float | Maximum points |
**`op.assignment` (extends `grading.assignment`)**
| Field | Type | Description |
|-------|------|-------------|
| `batch_id` | Many2one | Batch |
| `marks` | Float | Maximum marks |
| `description` | Text | Assignment description |
| `state` | Selection | `draft`, `publish`, `finish`, `cancel` |
| `submission_date` | Datetime | Submission deadline |
| `allocation_ids` | Many2many | Allocated students |
| `assignment_sub_line` | One2many | Student submissions |
| `reviewer` | Many2one | Reviewing faculty |
**`op.assignment.sub.line`**
| Field | Type | Description |
|-------|------|-------------|
| `assignment_id` | Many2one | Parent assignment |
| `student_id` | Many2one | Submitting student |
| `description` | Text | Submission notes |
| `submission_date` | Datetime | Actual submission time |
| `attachment_ids` | Many2many | Uploaded files |
| `marks` | Float | Awarded marks |
| `state` | Selection | `draft`, `submit`, `accept`, `reject`, `change_req` |
| `faculty_id` | Many2one | Grading faculty |
| `note` | Text | Faculty feedback |
### 35.3 Functional Requirements
| ID | Requirement | Route | Role |
|----|-------------|-------|------|
| FR-SUB-01 | Teacher creates course assignment with description, deadline, files | `/teacher/assignments` | Teacher |
| FR-SUB-02 | Teacher publishes assignment (visible to allocated students) | `/teacher/assignments` | Teacher |
| FR-SUB-03 | Student views assigned course assignments with deadlines | `/student/assignments` | Student |
| FR-SUB-04 | Student uploads files as submission | `/student/assignments` | Student |
| FR-SUB-05 | Teacher views submissions per assignment | `/teacher/assignments/:id` | Teacher |
| FR-SUB-06 | Teacher grades submission (marks, feedback, accept/reject/change request) | `/teacher/assignments/:id` | Teacher |
| FR-SUB-07 | Admin views all course assignments across batches | `/admin/assignments` | Admin |
### 35.4 API Endpoints
| Method | Path | Description |
|--------|------|-------------|
| `GET` | `/api/course-assignments` | List course assignments |
| `POST` | `/api/course-assignments` | Create assignment |
| `GET` | `/api/course-assignments/{id}` | Get assignment with submissions |
| `PATCH` | `/api/course-assignments/{id}` | Update assignment |
| `POST` | `/api/course-assignments/{id}/publish` | Publish assignment |
| `POST` | `/api/course-assignments/{id}/finish` | Close assignment |
| `GET` | `/api/course-assignments/{id}/submissions` | List submissions |
| `POST` | `/api/course-assignments/{id}/submit` | Student submits (multipart file upload) |
| `PATCH` | `/api/submissions/{id}` | Grade submission (marks, feedback, status) |
| `GET` | `/api/assignment-types` | List assignment types |
| `POST` | `/api/assignment-types` | Create assignment type |
---
# Part IX -- Technical Specifications
## 36. Data Models
### 36.1 Existing Models (from `ielts-be-v0`)
| Model | Module | Purpose |
|-------|--------|---------|
@@ -994,7 +1461,7 @@ Each simulated AI component in the new frontend maps to a real backend service:
| `encoach.elai.avatar` | `encoach_ai_media` | ELAI avatar profiles |
| `encoach.registration` | `encoach_registration` | Batch registration mixin |
### 30.2 New Models (Adaptive Learning Engine)
### 36.2 New Models (Adaptive Learning Engine)
| Model | Module | Purpose | Key Fields |
|-------|--------|---------|------------|
@@ -1009,14 +1476,14 @@ Each simulated AI component in the new frontend maps to a real backend service:
| `encoach.resource.completion` | `encoach_adaptive` | Resource viewing tracking | `student_id`, `resource_id`, `viewed`, `time_spent_minutes`, `rating` |
| `encoach.ai.content.cache` | `encoach_adaptive` | Cached AI-generated content | `topic_id`, `content_type`, `difficulty_level`, `content`, `model_used`, `review_status` |
### 30.3 New Models (SIS Integration)
### 36.3 New Models (SIS Integration)
| Model | Module | Purpose |
|-------|--------|---------|
| `encoach.sis.sync` | `encoach_sis` | SIS sync job tracking |
| `encoach.sis.mapping` | `encoach_sis` | Field mapping between SIS and EnCoach |
### 30.4 New Models (Branding)
### 36.4 New Models (Branding)
| Model | Module | Purpose |
|-------|--------|---------|
@@ -1024,9 +1491,9 @@ Each simulated AI component in the new frontend maps to a real backend service:
---
## 31. REST API Specification
## 37. REST API Specification
### 31.1 Existing Endpoints (81+)
### 37.1 Existing Endpoints (81+)
All existing endpoints from the Odoo 19 backend remain. Key groups:
@@ -1049,7 +1516,7 @@ All existing endpoints from the Odoo 19 backend remain. Key groups:
| Storage | `/api/storage` | 2 |
| Approvals | `/api/approval-workflows` | 3 |
### 31.2 New Endpoints (Adaptive Learning Engine, 40+)
### 37.2 New Endpoints (Adaptive Learning Engine, 40+)
| Group | Method | Path | Description |
|-------|--------|------|-------------|
@@ -1101,7 +1568,7 @@ All existing endpoints from the Odoo 19 backend remain. Key groups:
| | `GET` | `/api/analytics/subject` | Subject analytics |
| | `GET` | `/api/analytics/content-gaps` | Content gap report |
### 31.3 New Endpoints (LMS API Bridge)
### 37.3 New Endpoints (LMS API Bridge)
| Method | Path | Description |
|--------|------|-------------|
@@ -1114,7 +1581,7 @@ All existing endpoints from the Odoo 19 backend remain. Key groups:
| `GET/POST` | `/api/attendance` | Attendance records |
| `GET` | `/api/grades` | Gradebook |
### 31.4 New Endpoints (SIS Integration)
### 37.4 New Endpoints (SIS Integration)
| Method | Path | Description |
|--------|------|-------------|
@@ -1123,11 +1590,61 @@ All existing endpoints from the Odoo 19 backend remain. Key groups:
| `GET` | `/api/sis/mappings` | Field mappings |
| `PATCH` | `/api/sis/mappings` | Update mappings |
### 37.5 New Endpoints (OpenEduCat Institutional LMS, 60+)
| Group | Method | Path | Description |
|-------|--------|------|-------------|
| **Academic Years** | `GET/POST` | `/api/academic-years` | List/create years |
| | `GET/PATCH/DELETE` | `/api/academic-years/{id}` | Year CRUD |
| | `POST` | `/api/academic-years/{id}/generate-terms` | Auto-generate terms |
| | `GET/POST` | `/api/academic-terms` | List/create terms |
| | `PATCH/DELETE` | `/api/academic-terms/{id}` | Term CRUD |
| **Departments** | `GET/POST` | `/api/departments` | List/create |
| | `PATCH/DELETE` | `/api/departments/{id}` | CRUD |
| **Admissions** | `GET/POST` | `/api/admission-registers` | List/create registers |
| | `PATCH` | `/api/admission-registers/{id}` | Update |
| | `POST` | `/api/admission-registers/{id}/confirm` | Confirm register |
| | `POST` | `/api/admission-registers/{id}/close` | Close register |
| | `GET/POST` | `/api/admissions` | List/create admissions |
| | `GET` | `/api/admissions/{id}` | Admission detail |
| | `POST` | `/api/admissions/{id}/submit` | Submit for review |
| | `POST` | `/api/admissions/{id}/confirm` | Confirm |
| | `POST` | `/api/admissions/{id}/admit` | Admit (creates student) |
| | `POST` | `/api/admissions/{id}/reject` | Reject |
| **Subject Registration** | `GET/POST` | `/api/subject-registrations` | List/create |
| | `PATCH` | `/api/subject-registrations/{id}` | Update subjects |
| | `POST` | `/api/subject-registrations/{id}/confirm` | Confirm |
| | `POST` | `/api/subject-registrations/{id}/reject` | Reject |
| | `GET` | `/api/subject-registrations/available` | Available subjects |
| **Inst. Exam Sessions** | `GET/POST` | `/api/inst-exam-sessions` | List/create |
| | `GET/PATCH/DELETE` | `/api/inst-exam-sessions/{id}` | CRUD |
| | `POST` | `/api/inst-exam-sessions/{id}/schedule` | Schedule |
| | `POST` | `/api/inst-exam-sessions/{id}/done` | Mark done |
| | `POST` | `/api/inst-exams` | Add exam |
| | `PATCH` | `/api/inst-exams/{id}` | Update exam |
| | `POST` | `/api/inst-exams/{id}/attendees` | Add attendees |
| | `PATCH` | `/api/inst-exams/{id}/marks` | Enter marks |
| | `GET/POST` | `/api/exam-types` | List/create types |
| | `GET/POST` | `/api/grade-config` | Grade configuration |
| | `GET/POST` | `/api/result-templates` | Result templates |
| | `POST` | `/api/result-templates/{id}/generate` | Generate marksheets |
| | `GET` | `/api/marksheets` | List marksheets |
| | `GET` | `/api/marksheets/{id}` | Marksheet detail |
| | `POST` | `/api/marksheets/{id}/validate` | Validate |
| **Course Assignments** | `GET/POST` | `/api/course-assignments` | List/create |
| | `GET/PATCH` | `/api/course-assignments/{id}` | CRUD |
| | `POST` | `/api/course-assignments/{id}/publish` | Publish |
| | `POST` | `/api/course-assignments/{id}/finish` | Close |
| | `GET` | `/api/course-assignments/{id}/submissions` | List submissions |
| | `POST` | `/api/course-assignments/{id}/submit` | Student submits |
| | `PATCH` | `/api/submissions/{id}` | Grade submission |
| | `GET/POST` | `/api/assignment-types` | Assignment types |
---
## 32. Frontend Page Inventory
## 38. Frontend Page Inventory
### 32.1 Auth Pages (3)
### 38.1 Auth Pages (3)
| Route | Page | API Dependencies |
|-------|------|-----------------|
@@ -1135,7 +1652,7 @@ All existing endpoints from the Odoo 19 backend remain. Key groups:
| `/register` | Register | `POST /api/register` |
| `/forgot-password` | Forgot Password | `POST /api/reset/sendVerification` |
### 32.2 Student Pages (10+)
### 38.2 Student Pages (12+)
| Route | Page | Key APIs | AI Components |
|-------|------|----------|---------------|
@@ -1152,8 +1669,9 @@ All existing endpoints from the Odoo 19 backend remain. Key groups:
| `/student/attendance` | Attendance | `/api/attendance` | -- |
| `/student/timetable` | Timetable | `/api/timetable` | -- |
| `/student/profile` | Profile | `/api/user` | -- |
| `/student/subject-registration` | **NEW:** Subject Registration | `/api/subject-registrations/available`, `/api/subject-registrations` | -- |
### 32.3 Teacher Pages (10)
### 38.3 Teacher Pages (10)
| Route | Page | Key APIs | AI Components |
|-------|------|----------|---------------|
@@ -1168,7 +1686,14 @@ All existing endpoints from the Odoo 19 backend remain. Key groups:
| `/teacher/timetable` | Timetable | `/api/timetable` | -- |
| `/teacher/profile` | Profile | `/api/user` | -- |
### 32.4 Admin Pages (30+)
### 38.4 Public Pages (2)
| Route | Page | Key APIs | AI Components |
|-------|------|----------|---------------|
| `/apply` | **NEW:** Admission Application | `/api/admissions`, `/api/admission-registers` | -- |
| `/apply/status` | **NEW:** Application Status | `/api/admissions/{id}` | -- |
### 38.5 Admin Pages (38+)
| Route | Page | Key APIs | AI Components |
|-------|------|----------|---------------|
@@ -1204,10 +1729,17 @@ All existing endpoints from the Odoo 19 backend remain. Key groups:
| `/admin/settings-platform` | Platform Settings | Settings APIs | -- |
| `/admin/exam` | Exam Runner | `/api/exam`, `/api/sessions` | -- |
| `/admin/profile` | Admin Profile | `/api/user` | -- |
| `/admin/academic-years` | **NEW:** Academic Year Manager | `/api/academic-years`, `/api/academic-terms` | -- |
| `/admin/departments` | **NEW:** Department Manager | `/api/departments` | -- |
| `/admin/admissions` | **NEW:** Admission List | `/api/admissions` | -- |
| `/admin/admissions/:id` | **NEW:** Admission Detail | `/api/admissions/{id}` | -- |
| `/admin/admission-register` | **NEW:** Admission Register | `/api/admission-registers` | -- |
| `/admin/exam-sessions` | **NEW:** Institutional Exam Sessions | `/api/inst-exam-sessions`, `/api/inst-exams` | -- |
| `/admin/marksheets` | **NEW:** Marksheet Manager | `/api/marksheets`, `/api/result-templates`, `/api/grade-config` | -- |
---
## 33. Non-Functional Requirements
## 39. Non-Functional Requirements
| ID | Requirement |
|----|-------------|
@@ -1258,11 +1790,19 @@ All existing endpoints from the Odoo 19 backend remain. Key groups:
| 18 | `encoach_adaptive` | **NEW** | Proficiency, learning plans, progress tracking, content cache |
| 19 | `encoach_adaptive_api` | **NEW** | REST controllers for adaptive learning |
| 20 | `encoach_adaptive_ai` | **NEW** | AI services for diagnostics, plans, coaching, content |
| 21 | `encoach_lms_api` | **NEW** | REST API bridge for OpenEduCat models |
| 21 | `encoach_lms_api` | **NEW** | REST API bridge for OpenEduCat models (extends `op.course`, `op.batch`, adds missing fields) |
| 22 | `encoach_sis` | **NEW** | UTAS SIS integration (sync, mapping) |
| 23 | `encoach_branding` | **NEW** | Whitelabeling configuration |
| 24 | `openeducat_core` | **OpenEduCat (port to v19)** | `op.course`, `op.batch`, `op.student`, `op.faculty`, `op.subject`, `op.department`, `op.category`, `op.academic.year`, `op.academic.term`, `op.student.course`, `op.subject.registration` |
| 25 | `openeducat_timetable` | **OpenEduCat (port to v19)** | `op.session`, `op.timing` |
| 26 | `openeducat_attendance` | **OpenEduCat (port to v19)** | `op.attendance.register`, `op.attendance.sheet`, `op.attendance.line`, `op.attendance.type` |
| 27 | `openeducat_classroom` | **OpenEduCat (port to v19)** | `op.classroom` (physical rooms) |
| 28 | `openeducat_exam` | **OpenEduCat (port to v19)** | `op.exam.session`, `op.exam`, `op.exam.type`, `op.exam.attendees`, `op.exam.room`, `op.marksheet.register`, `op.marksheet.line`, `op.result.line`, `op.result.template`, `op.grade.configuration` |
| 29 | `openeducat_assignment` | **OpenEduCat (port to v19)** | `op.assignment`, `op.assignment.sub.line`, `grading.assignment`, `grading.assignment.type` |
| 30 | `openeducat_admission` | **OpenEduCat (port to v19)** | `op.admission`, `op.admission.register` |
| 31 | `openeducat_facility` | **OpenEduCat (port to v19)** | `op.facility`, `op.facility.line` (dependency of classroom) |
**Total: 15 existing + 8 new = 23 modules**
**Total: 15 existing EnCoach + 8 new EnCoach + 8 OpenEduCat = 31 modules**
---
@@ -1273,11 +1813,14 @@ All existing endpoints from the Odoo 19 backend remain. Key groups:
| **P0** | Auth, core user management, taxonomy models, resource model | Platform foundation; blocks everything |
| **P1** | Diagnostic engine, proficiency profile, learning plan generation | Core adaptive learning loop |
| **P1** | Exam engine with multi-subject support | Exam generation and delivery |
| **P2** | LMS API bridge (OpenEduCat), course/batch/timetable/attendance | LMS functionality |
| **P2** | OpenEduCat porting (v17→v19), LMS API bridge, course/batch/timetable/attendance | LMS functionality |
| **P2** | Academic years/terms, departments, admission workflow | Institutional operations |
| **P2** | Content delivery (hybrid), practice questions, mastery quizzes | Learning content consumption |
| **P2** | AI components wiring (all 15 frontend components to real backend) | AI integration |
| **P3** | AI coaching (hints, explanations, study suggestions) | Learning enhancement |
| **P3** | Spaced repetition, analytics dashboards | Progress optimization |
| **P3** | Institutional exam sessions, marksheets, subject registration | Institutional assessment |
| **P3** | Course assignment submissions (file upload, grading) | Homework workflow |
| **P3** | SIS integration, whitelabeling | University integration |
| **P4** | Content gap detection, FAISS tips per subject, batch optimizer | Operational efficiency |
| **P4** | Payment system, subscription management | Commercial features |