T6B.2 Admission→Fees Path Inventory¶
Mode: server · workspace /home/scola/odoo
Classifications: canonical bridge | migrate | fail-close | explicit residual | excluded legacy
| ID | Trigger | Entitlement | Actor | Tenant | Elevation | Mutation | Financial owner | Idempotency | Recovery | Class |
|---|---|---|---|---|---|---|---|---|---|---|
| P-001 | op.admission.enroll_student → _commit_admission_fees_handoff |
both flags at admission company | Enrollment Officer | same-company assert | none (.sudo() forbidden) |
create scola.admission.fees.handoff |
none yet | unique source_key + (company,admission,student) |
savepoint on unique race | canonical bridge |
| P-002 | _process_admission_fees_handoff_safe / cron |
re-evaluated on handoff company | system processor SUPERUSER_ID + t6b2_bridge_processor |
same-company | with_user(SUPERUSER_ID) only |
W10 pending enrollment via create_pending_from_bridge |
SC-FEES | adm-fees:… + W10 idempotency op bridge.pending_enrollment |
line recovery_required; W03 remains enrolled |
canonical bridge |
| P-003 | action_w03_enroll early path (student already exists) |
same as P-001 | Enrollment Officer | same-company | none | same handoff | SC-FEES pending only | same keys | same | canonical bridge |
| P-004 | Register fee_template_ids write |
both flags | Admissions Manager | template.company == register.company | none | M2M only | none | n/a | UserError | canonical bridge |
| P-005 | /api/v1/admissions/registers/update fee_template_ids |
write ACL + P-004 | Admissions Manager | controller FK + bridge write | _elevated_env browse for FK check only |
M2M | none | period mutation store | ValidationError lintas tenant | canonical bridge |
| P-006 | W10 /api/v1/fees/w10/enrollments/transition pending→billed |
scola_fees |
Billing Manager ≠ enrollment creator | company scope | none | scola.w10.bill |
SC-FEES | W10 enrollment.bill |
W10 recovery | canonical W10 (not bridge-owned) |
| P-007 | W10 payment/receipt | scola_fees |
cashier / treasurer / payer | W10 scope | none | payment/receipt | SC-FEES | W10 keys | W10 | canonical W10 |
| P-008 | _create_fee_enrollment alias |
both flags | Enrollment Officer | same | processor | delegates to P-001/P-002 | SC-FEES pending | same | same | migrate (compat alias, no paid bill) |
| P-009 | _create_registration_invoice / _create_formulir_invoice |
n/a | any | n/a | none | returns None | none | n/a | n/a | fail-close |
| P-010 | action_create_invoice / action_create_formulir_invoice |
n/a | any | n/a | none | UserError accounting_excluded |
none | n/a | n/a | fail-close |
| P-011 | /api/SPMB/payment/* |
fees OFF → feature_disabled; ON → accounting_excluded |
any | n/a | none | none | none | n/a | n/a | fail-close |
| P-012 | /api/SPMB/my/admission/*invoice* / payment proof/status |
same as P-011 | applicant | n/a | none | none | none | n/a | n/a | fail-close |
| P-013 | /api/SPMB/account/check-discount / discounts/apply |
listed alternate paths | any | n/a | none | denied by leftover W03 containment | none | n/a | n/a | fail-close |
| P-014 | /api/v1/finance/accounting/* |
W10 XMD | finance actor | n/a | none | accounting_excluded |
SC-FIN excluded | n/a | n/a | excluded legacy |
| P-015 | /api/v1/payment/create, /payment/callback/* |
W10 XMD | any | n/a | none | gateway_excluded |
T6B.3 | n/a | n/a | excluded legacy |
| P-016 | /web/dataset write on W10 models |
session | any | n/a | none | denied | none | n/a | n/a | fail-close |
| P-017 | Native OpenEduCat / Odoo account.move from admission |
n/a | any | n/a | none | not called from T6B.2 bridge | none | n/a | n/a | fail-close |
| P-018 | Website /my/child/.../upload |
T6B.1 residual | parent | n/a | n/a | not a T6B.2 lifecycle | n/a | n/a | n/a | explicit residual (T6B-R001 native path) |
| P-019 | Admission detail fees array copying W10 amounts |
n/a | staff | n/a | previously elevated search | removed; handoff projection only | W10 via billing_path |
n/a | n/a | migrate |
| P-020 | Optional _run_optional_enrollment_step(..., 'fee_enrollment') swallow |
n/a | n/a | n/a | n/a | removed | n/a | n/a | n/a | migrate |
| P-021 | Global FeeTemplate.search batch/course fallback |
n/a | n/a | n/a | n/a | removed | n/a | n/a | n/a | migrate |
| P-022 | Scholarship percentage / affirmation copy into enrollment amount | n/a | n/a | n/a | n/a | removed; informational field only | W10 rule amount | n/a | n/a | migrate / downstream decision |
| P-023 | W03 enrolled → withdrawn |
W03 contract: enrolled is terminal | Enrollment Officer | n/a | none | transition denied | W10 unchanged | n/a | operator cancel_if_unbilled if unbilled |
explicit residual — no W03 reversal route |
| P-024 | Register formulir_fee / registration_fee UI |
W03 register config + T6C override | Admissions Manager | company | none | stored on register; if formulir_fee > 0 submit creates W10 spmb_formulir and verify gate applies |
SC-FEES W10 (formulir) | period mutation store | n/a | canonical bridge (T6C) — supersedes prior “informational only” note |
| P-025 | Odoo backend Fee Templates page when entitlements off | module installed | backend user | write guarded | none | write UserError | none | n/a | n/a | explicit residual S2 — XML page visible if module installed |
| P-026 | Direct create_pending_from_bridge without context |
context flag | any | company | none | capability_denied |
none | n/a | n/a | fail-close |
| P-027 | Enrollment Officer /api/v1/fees/w10/* mutate |
fees entitlement + W10 capability | head_admin enroller | company | none | denied (no billing_manage) | none | n/a | n/a | fail-close |
No path in this inventory is permitted to create an approved/paid bill during W03 enrollment.