Lewati ke isi

T3-W02 Domain Map

Item Value
Mode Server · /home/scola/odoo
Source date 2026-08-11
Machine JSON T3-W02-domain-map.json

Canonical flow (actual Product)

Admin UI (TambahSiswa | UploadSiswa)
  → POST /api/v1/admin/import/students-with-parents  (± job enqueue)
  → op.student (+ res.partner projection)
  → optional op.parent + M2M student_ids
  → optional res.users (create_accounts / auto_create_user / model create hook)
  → optional op.student.course enrollment via options.assign_to_batch_id
Admin detail/edit
  → POST /api/v1/admin/students/save  (UPDATE only)
Parent admin
  → /api/v1/admin/parents/* (list/detail/partner save/relation save|delete)

SPMB/Admissions is not on this path (scola_admission optional; flag OFF on Golden W01 tip).

Entity table

Concept Canonical model Company field Required parent Core/optional FE route API Capability Record scope Downstream
Student business op.student (scola_core inherit) company_id Core /students, /students/create, /students/:id import + /api/v1/admin/students/* students.manage / students.list.view company_id ∈ allowed W01 roster, W05 later
Student contact res.partner partner company linked from student Core projection (via student/parent forms) via student/parent APIs students.contact.full (field gate) company mail/login
Student login res.users company_id op.student.user_id Core optional at onboard account generation UI /api/v1/admin/... account gen + model _create_student_user user mgmt company portal
Parent business op.parent via name.company_id + linked students name → partner Core parent admin routes /api/v1/admin/parents/* parent admin caps student company ∪ partner company portal children
Parent contact res.partner (op.parent.name) company_id Core projection parent forms partner/save parents.contact.full company
Parent login res.users company op.parent.user_id Optional (auto_create_user / import create_accounts) parent model _auto_create_user company portal
Class / rombel op.batch company_id course/year (W01) Core upstream W01 classroom pickers academic APIs + import assign_to_batch_id academics.* / students.manage company enrollment
Enrollment op.student.course via student/batch student + batch Core (W02 owns assign-on-import) create/import options _assign_student_enrollment students.manage company match enforced attendance later
Import job scola.student.import.job company actor Core UploadSiswa /api/v1/admin/import/students-with-parents/job* students.manage company + user async import

SSOT classification

Model Class
op.student CANONICAL student business record
res.partner (student) IDENTITY_PROJECTION
res.users (student) AUTH_ACCOUNT (not mandatory at onboard)
op.parent CANONICAL parent/guardian relation aggregate
res.partner (parent name) IDENTITY_PROJECTION
res.users (parent) AUTH_ACCOUNT (optional)
op.student.course DERIVED enrollment link
scola.admission.* OPTIONAL — not W02 Core path
OpenEduCat native RPC to op.student LEGACY / bypass risk — must remain fail-closed vs Product API

Identifiers (company-unique)

From scola_core/models/student.py SQL constraints:

Field Meaning Uniqueness
nsn NISN unique per company_id (empty→NULL)
nid NIK/NID unique per company_id
sic student internal code / NIS-like unique per company_id

Material gaps discovered in reconstruction

  1. CLASS_LINK UI gap: ~~classroom not sent~~ → fixed: per-row batch_id (pending runtime matrix).
  2. Create path: no dedicated /students/create Product API; create = import endpoint (single or bulk) — accepted.
  3. Import policy dualism: BE default strict_mode=True; FE strict_mode=false → Product freeze ROW_ATOMIC — documented.
  4. Account boundary: import default skip accounts; ORM/SPMB may auto-create — W02 onboard does not require login.
  5. Update atomicity: students_save flat fields only — parent via parent APIs.
  6. Route capability drift: create/import were students.list.view vs API students.managefixed to students.manage.
  7. Parent NIK global unique + partner lookup scope — open residuals G-010/G-011.
  8. SPMB writes same op.student SSOT but is optional package, not W02 Core UI dependency.

Key paths

  • BE: scola_core/controllers/{student_admin_api,parent_admin_api,admin_import_api,account_generation_api}.py
  • BE: scola_core/models/student.py, scola_parent/models/parent.py, scola_core/models/student_import_job.py
  • FE: src/views/AdminViews/StudentDatabase/{TambahSiswa,UploadSiswa,DetailSiswa,StudentList}.vue
  • FE: src/services/admin/student.service.js, src/router/studentDataAdminRoutes.js