T3-W02 Domain Map
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
- CLASS_LINK UI gap: ~~classroom not sent~~ → fixed: per-row
batch_id (pending runtime matrix).
- Create path: no dedicated
/students/create Product API; create = import endpoint (single or bulk) — accepted.
- Import policy dualism: BE default
strict_mode=True; FE strict_mode=false → Product freeze ROW_ATOMIC — documented.
- Account boundary: import default skip accounts; ORM/SPMB may auto-create — W02 onboard does not require login.
- Update atomicity:
students_save flat fields only — parent via parent APIs.
- Route capability drift: create/import were
students.list.view vs API students.manage → fixed to students.manage.
- Parent NIK global unique + partner lookup scope — open residuals G-010/G-011.
- 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