---
id: CAP-ACC-BKS-013
title: Maintain tax payable mapping during the Commerce transition
feature: FEAT-ACC-BKS-04
product_area: accounting
module: books
revision: 1
status: draft
product_intent: proposed
implementation_evidence: inconsistent
supersedes:
  - CAP-ACC-CFG-010
  - CAP-ACC-CFG-011
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#R-1'
  - >-
    services-accounting:docs/architecture/realignment-2026-10-22/ownership.md#3.
    Capability ownership matrix
  - 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D1'
  - 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D16'
purpose: >-
  Accounting keeps collected tax directed to payable accounts while tax
  ownership is transferred.
outcomes:
  - Tax posting uses rate-specific payable mapping or the unit’s fallback.
  - Issued tax snapshots survive configuration changes.
  - >-
    Transitional tax setup retains referential protection while ownership is
    moved.
concepts:
  - CON-ACC-BKS-006
  - CON-ACC-BKS-002
actors:
  - ACT-ACC-001
  - ACT-ACC-002
  - ACT-ACC-004
surfaces:
  - console
  - api
preconditions: []
postconditions: []
permissions:
  - key: accounting.tax-classes.read
    where_checked: api
    scope: tenant
  - key: accounting.tax-classes.create
    where_checked: api
    scope: tenant
  - key: accounting.tax-classes.update
    where_checked: api
    scope: tenant
  - key: accounting.tax-classes.delete
    where_checked: api
    scope: tenant
  - key: accounting.tax-zones.read
    where_checked: api
    scope: tenant
  - key: accounting.tax-zones.create
    where_checked: api
    scope: tenant
  - key: accounting.tax-zones.update
    where_checked: api
    scope: tenant
  - key: accounting.tax-zones.delete
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-ACC-BKS-013-01
    proved_by: []
    statement: >-
      The decided ownership places tax classes, zones, rates and determination
      in Commerce’s shared tax service while Accounting retains payable mapping
      and recorded document tax.
    kind: policy
    enforced_at: []
    must_prove: false
    provenance: documented
    source: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#R-1'
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#R-1'
  - id: BR-CAP-ACC-BKS-013-02
    proved_by: [ATS-ACC-BKS-005-11, ATS-ACC-BKS-006-07, ATS-ACC-BKS-013-01, ATS-ACC-BKS-013-09, TST-ACC-BKS-009, TST-ACC-BKS-014, TST-ACC-BKS-017]
    statement: >-
      Rate payable mappings use accounts of the mapped unit; posting chooses the
      rate’s account or the unit’s sales-tax default and refuses the document
      when neither is available.
    kind: calculation
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0022.spec.ts#ACT-ACC-0022
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#R-1'
  - id: BR-CAP-ACC-BKS-013-03
    proved_by: [ATS-ACC-BKS-013-02, TST-ACC-BKS-015, TST-ACC-BKS-175]
    statement: >-
      Zone criteria match their postal-range, region, country or rest-of-world
      kind, normalize and deduplicate codes, limit lists to 100 entries and
      require equal-length ordered postal-range endpoints.
    kind: validation
    enforced_at:
      - api
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/books/tests/unit/rules/tax-zone-rules.spec.js#refuses
      the criteria of another kind, and any criteria on the rest of the world
    origin: none
  - id: BR-CAP-ACC-BKS-013-04
    proved_by: [ATS-ACC-BKS-013-03, TST-ACC-BKS-175]
    statement: >-
      A zone holds at most twenty named rates, each with at most 100 classes,
      percentages from 0 to 100 as decimal text with six places and no repeated
      class or unit mapping.
    kind: validation
    enforced_at:
      - api
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/books/tests/unit/rules/tax-zone-rules.spec.js#refuses
      more than twenty rates, a blank name, a class or a unit named twice, and a
      bad percentage, each by position
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D4'
  - id: BR-CAP-ACC-BKS-013-05
    proved_by: [ATS-ACC-BKS-013-04, TST-ACC-BKS-016, TST-ACC-BKS-060]
    statement: >-
      Replacing a zone replaces its rates with new identities while issued
      document tax retains its original rate references.
    kind: lifecycle
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/tax-zones.e2e.spec.js#answers
      200 with the version moved on and the rates rewritten whole, the first
      under a new id
    origin: none
  - id: BR-CAP-ACC-BKS-013-06
    proved_by: [ATS-ACC-BKS-013-05, TST-ACC-BKS-060, TST-ACC-BKS-175]
    statement: >-
      Zone matching follows priority and name, selects the first match, reserves
      rest-of-world for fallback and treats an omitted country as the United
      States.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/books/tests/unit/rules/tax-zone-rules.spec.js#taxes
      an address with no country as the United States, as Rhythm 1.0 did
    origin: 'services-accounting:docs/milestones/plans/ACCT-M1-plan.md#D12'
  - id: BR-CAP-ACC-BKS-013-07
    proved_by: [ATS-ACC-BKS-013-06, TST-ACC-BKS-100, TST-ACC-BKS-102]
    statement: >-
      Product setups, product-type defaults, rates and recorded tax lines
      protect a referenced tax class from deletion with dependents identified;
      deactivation retains existing references.
    kind: invariant
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/tax-classes.integration.spec.js#translates
      the refusal of each restrict foreign key to a tax class into a 409 naming
      it, the invoice lines among them
    origin: none
  - id: BR-CAP-ACC-BKS-013-08
    proved_by: []
    statement: >-
      Tax classes are shared workspace definitions without a business unit,
      ordered by name and allowed to have matching names under different
      identifiers.
    kind: policy
    enforced_at:
      - api
      - service
    must_prove: false
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/tax-classes.e2e.spec.js#answers
      400 to a business unit, which tax classes do not carry
    origin: none
scenarios:
  - id: SC-CAP-ACC-BKS-013-01
    given: A New York zone includes state and city rates.
    when: >-
      The controller configures their payable destinations and posts an issued
      taxed invoice.
    then: Each tax liability is directed to the account mapped for that rate.
    provenance: test
    source: >-
      react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0019.spec.ts#ACT-ACC-0019
  - id: SC-CAP-ACC-BKS-013-02
    given: An invoice already contains yesterday’s tax calculation.
    when: The controller changes today’s zone rates.
    then: The invoice retains the earlier rate references and tax snapshot.
    provenance: test
    source: >-
      react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0021.spec.ts#ACT-ACC-0021
edge_cases: []
constraints: []
depends_on:
  - CAP-ACC-BKS-005
related:
  - CAP-ACC-BKS-006
journeys: []
open_questions:
  - OQ-ACC-BKS-001
evidence:
  - >-
    Verified source file:
    react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0019.spec.ts
  - >-
    Verified source file:
    react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0021.spec.ts
  - >-
    Verified source file:
    react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0022.spec.ts
  - 'Verified source file: services-accounting:aws/accounting.service.ts'
  - >-
    Verified source file:
    services-accounting:docs/architecture/accounting-2.0/02-decisions.md
  - >-
    Verified source file:
    services-accounting:docs/architecture/realignment-2026-10-22/ownership.md
  - >-
    Verified source file:
    services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md
  - >-
    Verified source file:
    services-accounting:docs/milestones/plans/ACCT-M1-plan.md
  - >-
    Verified source file:
    services-accounting:modules/books/db/tax-classes.table.ts
  - >-
    Verified source file:
    services-accounting:modules/books/db/tax-zone-rates.table.ts
  - >-
    Verified source file:
    services-accounting:modules/books/db/tax-zones.table.ts
  - >-
    Verified source file:
    services-accounting:modules/books/tests/e2e/tax-classes.e2e.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/e2e/tax-zones.e2e.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/services/persistence/tax-classes.integration.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/services/persistence/tax-classes.queries.integration.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/services/persistence/tax-zones.integration.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/services/persistence/tax-zones.queries.integration.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/unit/rules/tax-zone-rules.spec.js
controls: [TC-IAM-001, TC-IAM-002, TC-IAM-004, TC-IAM-005, TC-AZ-001, TC-AZ-002, TC-AZ-003, TC-AZ-004, TC-AZ-005, TC-AZ-006, TC-TEN-001, TC-TEN-002, TC-TEN-003, TC-TEN-004, TC-DAT-001, TC-DAT-004, TC-LOG-001, TC-LOG-002, TC-LOG-003, TC-LOG-004, TC-LOG-005, TC-PI-001, TC-PI-002, TC-PI-003, TC-PI-005]
exercised_by: [FAS-ACC-BKS-02-02, FAS-ACC-BKS-04-01, FAS-ACC-BKS-04-04]
suites: [TST-ACC-BKS-009, TST-ACC-BKS-014, TST-ACC-BKS-015, TST-ACC-BKS-016, TST-ACC-BKS-017, TST-ACC-BKS-060, TST-ACC-BKS-100, TST-ACC-BKS-102, TST-ACC-BKS-175]
---

# Maintain tax payable mapping during the Commerce transition

## Purpose

Accounting keeps collected tax directed to payable accounts while tax ownership is transferred.

## How It Works

The controller reviews the tax configuration still hosted in Accounting. They choose the zones and classes that describe the applicable treatment and map rate liabilities to unit accounts. Editing a zone updates its configured rates rather than changing an issued invoice’s tax snapshot. Posting resolves the financial destination when it processes the document. The current implementation keeps tax setup in Accounting despite the decided ownership transfer. The product should settle the transition before treating these editable copies as the long-term design. Missing payable configuration remains a posting problem rather than a reason to refuse invoice issue.

## Relationships

Commerce owns the intended tax service; the chart supplies Accounting’s payable destinations.
