T6G Fees→Finance Bridge Contract¶
Decision date: 2026-08-31
Status: IMMUTABLE T6G IMPLEMENTATION CONTRACT
Scope: SC-FEES ↔ SC-FIN accounting surface at /api/v1/finance/accounting/* only when both SKUs entitled
Does not: certify gateway (T6B.3), admission bridge (T6B.2), BOS/RKAS, or native W10 bill/payment lifecycle.
Canonical surface¶
When scola_fees_finance_bridge is installed and both parent entitlements are ON, these routes dispatch to the bridge service instead of T6B fail-close stubs:
| Route | Action | Capability |
|---|---|---|
/api/v1/finance/accounting/invoices/bulk-create |
create/post student invoices | finance.billing.manage |
/api/v1/finance/accounting/invoices/detail |
invoice detail | finance.billing.view |
/api/v1/finance/accounting/invoices/approve |
admin approve | finance.billing.manage |
/api/v1/finance/accounting/payment/wizard-init |
payment wizard | finance.billing.manage |
/api/v1/finance/accounting/payment/method-lines |
journal method lines | finance.billing.manage |
/api/v1/finance/accounting/payment/submit |
register payment | finance.billing.manage |
scola_fees retains route registration and dispatch hook only. Implementations live in scola_fees_finance_bridge.services.accounting_bridge_api.
Installation vs entitlement¶
| Fees module | Account module | SC-FEES | SC-FIN | Bridge behavior |
|---|---|---|---|---|
| absent | any | n/a | n/a | module absent |
| any | absent | n/a | n/a | module absent |
| installed | installed | OFF | OFF | feature_disabled on fees flag |
| installed | installed | ON | OFF | accounting_excluded |
| installed | installed | OFF | ON | feature_disabled on fees flag |
| installed | installed | ON | ON | bridge may execute |
auto_install=True when both parent modules coexist. Installation never substitutes for entitlement. Each HTTP attempt re-evaluates both flags.
Authority¶
- Treasurer (or actor with
finance.billing.manage) may bulk-create/post invoices and register payments through the bridge. - SC-FIN canonical accounting admin APIs (
/api/v1/accounting/*) remain the authoritative finance surface for journals/moves outside this fees-owned prefix. - Bridge must not elevate beyond catalog env helpers inherited from
scola_feespayment accounting controller.
Financial owner¶
- SC-FEES owns route prefix and student/product selection UX contract.
- SC-FIN owns
account.moveposting semantics once bridge entitlements pass. - W10 canonical bill/payment/receipt lifecycle is unchanged; this bridge is an explicit accounting overlay, not a replacement for W10 bills.
Runtime certification¶
Harness: scripts/golden/fees_finance_bridge_certify.py
Disposable DB prefix: scola_t6g_ff_bridge_*
HTTP port: 8103 (config/odoo-t6g.conf)
| Case | Class | Expectation |
|---|---|---|
RT-FFBR-XMD-01 |
XMD | SC-FEES only → accounting_excluded |
RT-FFBR-POS-01 |
POS | SC-FEES + SC-FIN → bulk-create posts one invoice |
RT-FFBR-DET-01 |
POS | detail returns posted invoice |
RT-FFBR-XMD-02 |
XMD | SC-FIN only → feature_disabled (scola_fees) |
Evidence (2026-08-31): T6G-evidence/T6G-FF-BRIDGE-20260831T062240Z.json and T6G-FF-BRIDGE-20260831T062410Z.json — 4/4 PASS ×2.