T6C — SPMB Fees / Rombel / MPLS Approved Product Contract¶
Decision date: 2026-08-29
Approver: requesting user (explicit plan approval A.1 + T6C)
Status: IMMUTABLE T6C IMPLEMENTATION CONTRACT
Scope: Uang formulir, uang pangkal/gedung (cash/transfer), assign rombel siswa diterima, rombel sementara MPLS
Does not: payment gateway (T6B.3), CBT (T6D), waitlist/ranking, full enrolled reversal, SC-FIN journals, demo/prod promotion
Amends residual T6B2-R002 (pre-enrollment applicant billing). Does not rewrite the T6B.2 post-enrollment handoff contract — that path remains CLOSED for accepted→enrolled → W10 pending enrollments.
Canonical flow¶
Applicant submit
→ if register.formulir_fee > 0: create W10 bill kind=spmb_formulir (admission-scoped)
→ payer cash/transfer + proof → treasurer verify (or waive + reason)
→ committee may verify admission only when formulir settled/waived/not-required
→ accepted → enrolled (W03 terminal) + T6B.2 handoff unchanged
→ pangkal via W10 template on register → pending→billed→pay→verify (or waive)
→ assign rombel (regular | mpls_temporary) only if pangkal settled/waived/not-required
→ after MPLS: promote mpls_temporary → regular batch; archive MPLS batch
Decisions¶
| # | Contract |
|---|---|
| 1 | Channel V1 = cash / bank_transfer only. Gateway deferred T6B.3. |
| 2 | Ledger owner = SC-FEES (scola.w10.bill / payment / receipt). No account.move. |
| 3 | Formulir bill is admission-scoped: bill_kind=spmb_formulir, admission_id required, student_id/enrollment_id optional. |
| 4 | Formulir source_ref / business key: spmb-formulir:<company_id>:<admission_id>. Idempotent create. |
| 5 | If formulir_fee > 0, transition to verified requires formulir payment verified or approved waive. |
| 6 | Waive requires distinct capability, reason, and audit; does not delete the bill/obligation. |
| 7 | Legacy /api/SPMB/payment/*, formulir invoice Odoo paths remain fail-closed (accounting_excluded). New path = /api/v1/fees/w10/* + admission projection. |
| 8 | Pangkal/gedung = W10 bill_kind=spmb_pangkal (or template tagged on register) after enroll via existing T6B.2 handoff. |
| 9 | Assign rombel allowed only for w03_state=enrolled, same company, and pangkal settled/waived/not-required. |
| 10 | Rombel SSOT = op.batch. Add batch_kind: regular | mpls_temporary (default regular). |
| 11 | MPLS temporary batches may link to academic calendar entry type orientation. |
| 12 | Promote MPLS→regular moves student enrollment, audits actor/reason, archives MPLS batch (no hard-delete). |
| 13 | T6B.2 XINT-H (deny legacy SPMB invoice) remains PASS. |
| 14 | W03 enrolled remains terminal; no post-enrollment reversal. |
Authority¶
| Action | Actor |
|---|---|
| Pay formulir / pangkal (submit proof) | Applicant payer or linked parent with finance.billing.self.pay |
| Verify payment | Treasurer (finance.billing.verify) — not self |
| Waive | Named admin capability (configure/manage) + reason |
| Enroll | Enrollment officer (existing W03) |
| Assign / promote rombel | Academic/admissions staff with academic.schedule or admissions enroll capability |
Non-claims¶
Payment gateway, CBT, scholarship amount override, pre-enrollment accounting journals, demo/production promotion.