Skip to content

2.2.0

Released: TBD

Highlights

  • Tax-rate GL accounts can now be seeded onto the unified rates. The EXPAND migration created the ITBMS rate rows with NULL GL accounts (a migration can't create accounts); this adds the service + mutation that wires them, so ITBMS posting books the full output/input legs and the withholding-asset retention leg instead of falling back. Part of the Unify Tax-Rate Models rollout (MIGRATE phase, step 1).

Added

  • seedItbmsTaxRateGlAccounts mutation (TAX_FILINGS-gated) → TaxRateService.ensure_itbms_sale_gl_accounts(). Idempotent; for each effective ITBMS sale rate (ITBMS_EXEMPT/7/10/15) it fills any NULL GL account via get_or_create_account — output / withholding-payable → TAX_PAYABLE, input / withholding-asset → OTHER_CURRENT_ASSET. Returns the number of rates updated.

Changed

  • None (read paths unchanged).

Fixed

  • None.

Migrations

  • None (data-only; run the seedItbmsTaxRateGlAccounts mutation per tenant to populate GL accounts on the rate rows seeded by the EXPAND migration).

Frontend impact

  • New optional accountant mutation seedItbmsTaxRateGlAccounts. No required frontend changes; an accountant can run it once per tenant to wire the rate GL accounts (or it can be triggered from settings). Until run, ITBMS still posts via the client/supplier fallback as before — no regression.

Versioning notes

  • Bumped with uv run python scripts/bump_version.py 2.2.0 --changelog-stub. MINOR — additive mutation, no breaking change. This is the safe, self-contained first step of the MIGRATE phase; the behavioral read-flip (items/invoicing reading the unified rate, with the rate_percent fraction-vs-percent guards) is a separate later change.