Context
#1460 (fixing #1458 and Sentry FAMILIARISE_WEB-28) made the BOOKING ledger posting balance on the INVOICE rail when a programme sets overageSurchargeBps > 0: the surcharge is the one funding amount outside Payment.originalAmount, so createEarningsFromPayment now credits it to PLATFORM_FEE (it is a markup the platform charges the organisation for exceeding its own cap, not consultant income).
That credit is booked gross. Payment.taxAmount, which is what the posting credits to GST_PAYABLE, is computed on the nominal price and is not re-derived for an overage. Under the Principal model (ADR 26) the surcharge is consideration for the same taxable supply, so 18% of it belongs in GST_PAYABLE and on the organisation's tax invoice.
What to check and align
- How
lib/payments/billing/invoice-rollup.ts taxes an OVERAGE_INVOICE_ACCRUAL line: whether GST is applied on the line subtotal (then the invoice carries GST on the surcharge and the journal understates GST_PAYABLE by 18/118 or 18/100 of it, depending on whether the surcharge is tax-inclusive), or not at all (then the invoice is short).
- Decide whether
surchargePaise is tax-inclusive or tax-exclusive at computeOverageForBooking, and make the journal split it into PLATFORM_FEE + GST_PAYABLE accordingly, matching the invoice.
- The nightly ledger reconciler should compare invoice tax totals against
GST_PAYABLE credits per period so a drift of this class is caught.
No programme configures a surcharge today (both overageSurchargeBps writers default to 0), so this is dormant. It becomes launch-relevant the first time an operator sets a surcharge. CA question for the ADR 26 list: confirm the surcharge is part of the taxable value of the consultation supply rather than a separate service.
Context
#1460 (fixing #1458 and Sentry FAMILIARISE_WEB-28) made the BOOKING ledger posting balance on the INVOICE rail when a programme sets
overageSurchargeBps > 0: the surcharge is the one funding amount outsidePayment.originalAmount, socreateEarningsFromPaymentnow credits it toPLATFORM_FEE(it is a markup the platform charges the organisation for exceeding its own cap, not consultant income).That credit is booked gross.
Payment.taxAmount, which is what the posting credits toGST_PAYABLE, is computed on the nominal price and is not re-derived for an overage. Under the Principal model (ADR 26) the surcharge is consideration for the same taxable supply, so 18% of it belongs inGST_PAYABLEand on the organisation's tax invoice.What to check and align
lib/payments/billing/invoice-rollup.tstaxes anOVERAGE_INVOICE_ACCRUALline: whether GST is applied on the line subtotal (then the invoice carries GST on the surcharge and the journal understatesGST_PAYABLEby 18/118 or 18/100 of it, depending on whether the surcharge is tax-inclusive), or not at all (then the invoice is short).surchargePaiseis tax-inclusive or tax-exclusive atcomputeOverageForBooking, and make the journal split it intoPLATFORM_FEE+GST_PAYABLEaccordingly, matching the invoice.GST_PAYABLEcredits per period so a drift of this class is caught.No programme configures a surcharge today (both
overageSurchargeBpswriters default to 0), so this is dormant. It becomes launch-relevant the first time an operator sets a surcharge. CA question for the ADR 26 list: confirm the surcharge is part of the taxable value of the consultation supply rather than a separate service.