feat: institutional + support + training admin sections (backend + frontend)

Ship three fully-wired admin areas end-to-end with APIs, seeds, tests and docs.

Backend (new `encoach_lms_api` addon + existing addons):
- Institutional: academic years/terms, departments, admission registers & admissions,
  courses/batches, lessons, fees (terms + student fees + invoicing with income-account
  auto-wiring), gradebook (assignments/grades), library, facilities (encoach.asset),
  student leave, result templates + marksheets (incl. delete-with-cascade).
- Support: `encoach.ticket` model + CRUD/assignee routes; payment records derived
  from `op.student.fees.details` and `account.move`; platform settings backed by
  `encoach.code` and `ir.config_parameter` (packages + grading config).
- Training: `encoach.vocab.item` + `encoach.grammar.rule` (plus progress models)
  with CRUD, pagination, search/level filters, and upsert-style progress endpoints.
  Odoo 19 compatibility: `_sql_constraints` replaced with `@api.constrains`;
  `ValidationError`/`UserError` mapped to HTTP 400.

Frontend:
- Rewire institutional admin pages (Academic Year Manager, Admissions, Courses,
  Lessons, Fees, Gradebook, Library, Facilities, Student Leave, Marksheets,
  Taxonomy, Resources) to real APIs with React Query invalidation and dialogs.
- New typed services: `payments.service.ts`, `platformSettings.service.ts`,
  `training.service.ts`. Updated `fees/gradebook/lms/courseware/taxonomy/
  resources/student-progress/generation` services + related types.
- Rewrite `VocabularyPage`, `GrammarPage`, `PaymentRecordPage`, `SettingsPage`,
  `TicketsPage` to consume live data with search/filter/progress/CRUD flows.
- New shared components: `TaxonomyCascade`, `MaterialViewer`, `teacher/TeacherLibrary`.
- Favicons/branding assets and misc. UX polish across teacher/student pages.

Tooling & QA:
- Seeders: `seed_demo.py`, `seed_demo_data.py`, `seed_institutional.py` (idempotent,
  covers institutional + support + training fixtures incl. income-account wiring).
- API write-flow test suites: `test_write_flows.py` (institutional),
  `test_support_flows.py` (support), `test_training_flows.py` (training),
  `test_ai_full.py`. All suites pass end-to-end.
- Docs: add `docs/PROJECT_SUMMARY.md` with per-section scope, artifacts and QA.
- `.gitignore`: ignore `pgdata_bak_*/`, `frontend/.vite/`, `frontend/dist/`,
  `frontend/node_modules/`.

Made-with: Cursor
This commit is contained in:
Yamen Ahmad
2026-04-19 03:13:23 +04:00
parent 74d83af57f
commit 6ec68160c8
59 changed files with 9076 additions and 143 deletions

View File

@@ -0,0 +1,25 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_encoach_lesson_all,encoach.lesson.all,model_encoach_lesson,base.group_user,1,1,1,1
access_encoach_student_leave_type_all,encoach.student.leave.type.all,model_encoach_student_leave_type,base.group_user,1,1,1,1
access_encoach_student_leave_all,encoach.student.leave.all,model_encoach_student_leave,base.group_user,1,1,1,1
access_encoach_gradebook_all,encoach.gradebook.all,model_encoach_gradebook,base.group_user,1,1,1,1
access_encoach_gradebook_line_all,encoach.gradebook.line.all,model_encoach_gradebook_line,base.group_user,1,1,1,1
access_encoach_discussion_board_all,encoach.discussion.board.all,model_encoach_discussion_board,base.group_user,1,1,1,1
access_encoach_discussion_post_all,encoach.discussion.post.all,model_encoach_discussion_post,base.group_user,1,1,1,1
access_encoach_announcement_all,encoach.announcement.all,model_encoach_announcement,base.group_user,1,1,1,1
access_encoach_message_all,encoach.message.all,model_encoach_message,base.group_user,1,1,1,1
access_encoach_course_chapter_all,encoach.course.chapter.all,model_encoach_course_chapter,base.group_user,1,1,1,1
access_encoach_chapter_material_all,encoach.chapter.material.all,model_encoach_chapter_material,base.group_user,1,1,1,1
access_encoach_chapter_progress_all,encoach.chapter.progress.all,model_encoach_chapter_progress,base.group_user,1,1,1,1
access_encoach_notification_all,encoach.notification.all,model_encoach_notification,base.group_user,1,1,1,1
access_encoach_notification_rule_all,encoach.notification.rule.all,model_encoach_notification_rule,base.group_user,1,1,1,1
access_encoach_notification_pref_all,encoach.notification.preference.all,model_encoach_notification_preference,base.group_user,1,1,1,1
access_encoach_faq_category_all,encoach.faq.category.all,model_encoach_faq_category,base.group_user,1,1,1,1
access_encoach_faq_item_all,encoach.faq.item.all,model_encoach_faq_item,base.group_user,1,1,1,1
access_encoach_course_completion_all,encoach.course.completion.all,model_encoach_course_completion,base.group_user,1,1,1,1
access_encoach_asset_all,encoach.asset.all,model_encoach_asset,base.group_user,1,1,1,1
access_encoach_ticket_all,encoach.ticket.all,model_encoach_ticket,base.group_user,1,1,1,1
access_encoach_vocab_item_all,encoach.vocab.item.all,model_encoach_vocab_item,base.group_user,1,1,1,1
access_encoach_vocab_progress_all,encoach.vocab.progress.all,model_encoach_vocab_progress,base.group_user,1,1,1,1
access_encoach_grammar_rule_all,encoach.grammar.rule.all,model_encoach_grammar_rule,base.group_user,1,1,1,1
access_encoach_grammar_progress_all,encoach.grammar.progress.all,model_encoach_grammar_progress,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_encoach_lesson_all encoach.lesson.all model_encoach_lesson base.group_user 1 1 1 1
3 access_encoach_student_leave_type_all encoach.student.leave.type.all model_encoach_student_leave_type base.group_user 1 1 1 1
4 access_encoach_student_leave_all encoach.student.leave.all model_encoach_student_leave base.group_user 1 1 1 1
5 access_encoach_gradebook_all encoach.gradebook.all model_encoach_gradebook base.group_user 1 1 1 1
6 access_encoach_gradebook_line_all encoach.gradebook.line.all model_encoach_gradebook_line base.group_user 1 1 1 1
7 access_encoach_discussion_board_all encoach.discussion.board.all model_encoach_discussion_board base.group_user 1 1 1 1
8 access_encoach_discussion_post_all encoach.discussion.post.all model_encoach_discussion_post base.group_user 1 1 1 1
9 access_encoach_announcement_all encoach.announcement.all model_encoach_announcement base.group_user 1 1 1 1
10 access_encoach_message_all encoach.message.all model_encoach_message base.group_user 1 1 1 1
11 access_encoach_course_chapter_all encoach.course.chapter.all model_encoach_course_chapter base.group_user 1 1 1 1
12 access_encoach_chapter_material_all encoach.chapter.material.all model_encoach_chapter_material base.group_user 1 1 1 1
13 access_encoach_chapter_progress_all encoach.chapter.progress.all model_encoach_chapter_progress base.group_user 1 1 1 1
14 access_encoach_notification_all encoach.notification.all model_encoach_notification base.group_user 1 1 1 1
15 access_encoach_notification_rule_all encoach.notification.rule.all model_encoach_notification_rule base.group_user 1 1 1 1
16 access_encoach_notification_pref_all encoach.notification.preference.all model_encoach_notification_preference base.group_user 1 1 1 1
17 access_encoach_faq_category_all encoach.faq.category.all model_encoach_faq_category base.group_user 1 1 1 1
18 access_encoach_faq_item_all encoach.faq.item.all model_encoach_faq_item base.group_user 1 1 1 1
19 access_encoach_course_completion_all encoach.course.completion.all model_encoach_course_completion base.group_user 1 1 1 1
20 access_encoach_asset_all encoach.asset.all model_encoach_asset base.group_user 1 1 1 1
21 access_encoach_ticket_all encoach.ticket.all model_encoach_ticket base.group_user 1 1 1 1
22 access_encoach_vocab_item_all encoach.vocab.item.all model_encoach_vocab_item base.group_user 1 1 1 1
23 access_encoach_vocab_progress_all encoach.vocab.progress.all model_encoach_vocab_progress base.group_user 1 1 1 1
24 access_encoach_grammar_rule_all encoach.grammar.rule.all model_encoach_grammar_rule base.group_user 1 1 1 1
25 access_encoach_grammar_progress_all encoach.grammar.progress.all model_encoach_grammar_progress base.group_user 1 1 1 1