2.3.0¶
Released: TBD
Highlights¶
- Unify Tax-Rate Models — MIGRATE guards. A tax rate referenced by items or invoice lines can no longer be hard-deleted (it's retired via
valid_toinstead), the unified rate list is now readable by non-accountant pickers, and purchase orders read the rate from the unifiedTaxRate. Part of the Unify Tax-Rate Models rollout.
Added¶
- Ungated
taxRatesquery (Q4). The unified rate list is no longerTAX_FILINGS-gated, so non-accountant item/invoice pickers can read it (display name, percent, etc.). The single-ratetaxRateget stays gated.
Changed¶
purchaseOrderlines read the unified rate. The supplier-quote→PO factory now reads the operational percent fromItem.taxRate(ratePercentbridges the0.0700fraction →7.00), falling back to the legacy ITBMS rate until the CONTRACT phase. Same tax amount — just sourced from the unified model.
Fixed¶
deleteTaxRateno longer raw-errors on a referenced rate. It now refuses with a clear "in use by N items/invoice lines" message when the rate is referenced byitems.tax_rate_id,invoice_details.tax_rate_id, orsupplier_invoice_details.tax_rate_id(Q3 pin policy — retire viavalid_toinstead of deleting).
Migrations¶
- None.
Frontend impact¶
taxRatesis now ungated — pickers can read the unified rate list without theTAX_FILINGSpermission. ⚠️ This list exposes theTaxRatetype's GL-account and code fields to any authenticated user (the Q4 trade-off); avoid surfacing those fields in non-accountant UI.deleteTaxRatecan now return an "in use" error — surface it instead of treating delete as always-succeeding.
Versioning notes¶
- Bumped with
uv run python scripts/bump_version.py 2.3.0 --changelog-stub. MINOR — additive query exposure + a delete-safety fix; no breaking schema change. The behavioral read-flip of the items value-match repo ontoTaxRate(therate_percentfail-loud rewrite) and the removal ofITBMSTaxRateremain for the CONTRACT phase.