---
id: ATS-ACC-TRX-001
scope: CAP-ACC-TRX-001
product_area: accounting
module: transactions
revision: 1
status: proposed
approved_by: null
approved_at: null
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-ACC-TRX-001-01
    title: Obsolete draft saves preserve the newer state
    level: api
    proves:
      - BR-CAP-ACC-TRX-001-01
      - INV-DOM-ACC-TRX-001-01
    preconditions: Version two already supersedes the editor’s version one.
    steps:
      - do: Submit a replacement using the first version.
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it
          refuses an update at a version the draft has moved past (stale)
    expected: The stale refusal retains version two unchanged.
    negative: true
    data_needs: 'A contact, sellable product and unit.'
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it
        refuses an update at a version the draft has moved past (stale)
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it
        keeps it a draft, unnumbered, at the next version
      - TST-ACC-TRX-065
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it
      refuses an update at a version the draft has moved past (stale)
    category: validation
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js
        assertion: it refuses an update at a version the draft has moved past (stale)
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it
          refuses an update at a version the draft has moved past (stale)
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js
        assertion: 'it keeps it a draft, unnumbered, at the next version'
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it
          keeps it a draft, unnumbered, at the next version
    binding_review: []
  - id: ATS-ACC-TRX-001-02
    title: Draft context cannot switch units
    level: api
    proves:
      - BR-CAP-ACC-TRX-001-02
      - INV-DOM-ACC-TRX-001-02
    preconditions: The draft belongs to Alpha.
    steps:
      - do: Save it against Beta instead.
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it
          refuses a change of business unit: a draft keeps its unit
          (business_unit_mismatch)
    expected: Unit mismatch retains the Alpha draft.
    negative: true
    data_needs: Two configured business units.
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it
        refuses a change of business unit: a draft keeps its unit
        (business_unit_mismatch)
      - TST-ACC-TRX-065
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it
      refuses a change of business unit: a draft keeps its unit
      (business_unit_mismatch)
    category: boundary
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js
        assertion: >-
          it refuses a change of business unit: a draft keeps its unit
          (business_unit_mismatch)
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it
          refuses a change of business unit: a draft keeps its unit
          (business_unit_mismatch)
    binding_review: []
  - id: ATS-ACC-TRX-001-03
    title: Invalid product choices create no draft
    level: api
    proves:
      - BR-CAP-ACC-TRX-001-03
    preconditions: >-
      A USD invoice faces inactive, foreign-unit, unsellable and EUR-priced
      products.
    steps:
      - do: Attempt creation separately with each invalid product.
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js#it
          refuses an inactive product (product_not_sellable)
    expected: Each refusal identifies the problem and leaves no draft.
    negative: true
    data_needs: Sellable and invalid products across two units.
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js#it
        refuses an inactive product (product_not_sellable)
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js#it
        refuses another unit’s product (business_unit_mismatch)
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js#it
        refuses a product of a type that is not sold (product_not_sellable)
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js#it
        refuses a line priced in another currency than the invoice’s
        (currency_mismatch)
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js#it
        writes nothing for a refused draft
      - >-
        react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0184.spec.ts#ACT-ACC-0184
      - TST-ACC-TRX-046
      - TST-ACC-TRX-222
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js#it
      refuses an inactive product (product_not_sellable)
    category: validation
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js
        assertion: it refuses an inactive product (product_not_sellable)
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js#it
          refuses an inactive product (product_not_sellable)
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js
        assertion: it refuses another unit’s product (business_unit_mismatch)
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js#it
          refuses another unit’s product (business_unit_mismatch)
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js
        assertion: it refuses a product of a type that is not sold (product_not_sellable)
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js#it
          refuses a product of a type that is not sold (product_not_sellable)
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js
        assertion: >-
          it refuses a line priced in another currency than the invoice’s
          (currency_mismatch)
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js#it
          refuses a line priced in another currency than the invoice’s
          (currency_mismatch)
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js
        assertion: it writes nothing for a refused draft
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js#it
          writes nothing for a refused draft
      - file: >-
          react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0184.spec.ts
        assertion: ACT-ACC-0184
        provenance: test
        source: >-
          react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0184.spec.ts#ACT-ACC-0184
    binding_review:
      - binding: >-
          react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0184.spec.ts#ACT-ACC-0184
        completeness: not-verified
        provenance: observed
        source: >-
          react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0184.spec.ts#ACT-ACC-0184
        note: >-
          This citation remains component evidence. A browser request driven
          through an API helper does not establish direct database checks or
          every branch of the combined scenario.
  - id: ATS-ACC-TRX-001-04
    title: Rounded lines reconcile with their document
    level: api
    proves:
      - BR-CAP-ACC-TRX-001-04
      - INV-DOM-ACC-TRX-001-03
    preconditions: JPY and KWD pricing support fractional extensions.
    steps:
      - do: >-
          Issue half-unit extensions, then submit noninteger money and excessive
          discount.
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/rounding.integration.spec.js#it
          totals the rounded lines (3422), not a rounding of the unrounded sum
          (3421)
    expected: >-
      Extensions round away from zero once and sum exactly; invalid money and
      discount fail.
    negative: false
    data_needs: Yen and dinar financial contexts.
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/rounding.integration.spec.js#it
        rounds each line’s extension once, half away from zero: 832.5 to 833 and
        50.5 to 51
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/rounding.integration.spec.js#it
        totals the rounded lines (3422), not a rounding of the unrounded sum
        (3421)
      - >-
        services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js#it
        answers 400 to an amount that is not a whole number of minor units
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js#it
        refuses a discount above the line’s extended amount (over_application)
      - TST-ACC-TRX-061
      - TST-ACC-TRX-010
      - TST-ACC-TRX-046
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/rounding.integration.spec.js#it
      totals the rounded lines (3422), not a rounding of the unrounded sum
      (3421)
    category: boundary
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/rounding.integration.spec.js
        assertion: >-
          it rounds each line’s extension once, half away from zero: 832.5 to
          833 and 50.5 to 51
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/rounding.integration.spec.js#it
          rounds each line’s extension once, half away from zero: 832.5 to 833
          and 50.5 to 51
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/rounding.integration.spec.js
        assertion: >-
          it totals the rounded lines (3422), not a rounding of the unrounded
          sum (3421)
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/rounding.integration.spec.js#it
          totals the rounded lines (3422), not a rounding of the unrounded sum
          (3421)
      - file: >-
          services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js
        assertion: it answers 400 to an amount that is not a whole number of minor units
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js#it
          answers 400 to an amount that is not a whole number of minor units
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js
        assertion: >-
          it refuses a discount above the line’s extended amount
          (over_application)
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js#it
          refuses a discount above the line’s extended amount (over_application)
    binding_review: []
  - id: ATS-ACC-TRX-001-05
    title: Due-date precedence is explicit
    level: api
    proves:
      - BR-CAP-ACC-TRX-001-05
    preconditions: Thirty-day terms exist and one customer defaults to forty-five days.
    steps:
      - do: >-
          Create requested-terms, customer-default, explicit-date and
          earlier-date drafts.
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/customer-terms-precedence.integration.spec.js#it
          takes the bill-to’s default terms when the request names none, the due
          date 45 days after the invoice date
    expected: Dates follow the selected precedence and the earlier date is rejected.
    negative: false
    data_needs: Two term definitions and a customer override.
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js#it
        takes the due date from the terms: thirty days after the invoice date
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/customer-terms-precedence.integration.spec.js#it
        takes the bill-to’s default terms when the request names none, the due
        date 45 days after the invoice date
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js#it
        keeps the due date the request states over the terms’
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js#it
        REGRESSION — refuses a due date before the invoice date with a 400, not
        the database’s CHECK
      - TST-ACC-TRX-046
      - TST-ACC-TRX-047
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/customer-terms-precedence.integration.spec.js#it
      takes the bill-to’s default terms when the request names none, the due
      date 45 days after the invoice date
    category: rule
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js
        assertion: >-
          it takes the due date from the terms: thirty days after the invoice
          date
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js#it
          takes the due date from the terms: thirty days after the invoice date
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/customer-terms-precedence.integration.spec.js
        assertion: >-
          it takes the bill-to’s default terms when the request names none, the
          due date 45 days after the invoice date
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/customer-terms-precedence.integration.spec.js#it
          takes the bill-to’s default terms when the request names none, the due
          date 45 days after the invoice date
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js
        assertion: it keeps the due date the request states over the terms’
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js#it
          keeps the due date the request states over the terms’
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js
        assertion: >-
          it REGRESSION — refuses a due date before the invoice date with a 400,
          not the database’s CHECK
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js#it
          REGRESSION — refuses a due date before the invoice date with a 400,
          not the database’s CHECK
    binding_review: []
  - id: ATS-ACC-TRX-001-06
    title: Incomplete or reversed service dates fail
    level: api
    proves:
      - BR-CAP-ACC-TRX-001-06
    preconditions: A dues line can carry service dates.
    steps:
      - do: 'Submit an end before its start, then omit the end.'
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/service-period-order.integration.spec.js#it
          refuses a period ending before it starts with a 400 naming the service
          period
    expected: Neither draft is retained and each refusal identifies its period.
    negative: true
    data_needs: A configured dues product and unit.
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/service-period-order.integration.spec.js#it
        refuses a period ending before it starts with a 400 naming the service
        period
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/service-period-order.integration.spec.js#it
        refuses a period with only a start
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/service-period-order.integration.spec.js#it
        writes no invoice for the refused draft
      - TST-ACC-TRX-062
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/service-period-order.integration.spec.js#it
      refuses a period ending before it starts with a 400 naming the service
      period
    category: validation
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/service-period-order.integration.spec.js
        assertion: >-
          it refuses a period ending before it starts with a 400 naming the
          service period
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/service-period-order.integration.spec.js#it
          refuses a period ending before it starts with a 400 naming the service
          period
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/service-period-order.integration.spec.js
        assertion: it refuses a period with only a start
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/service-period-order.integration.spec.js#it
          refuses a period with only a start
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/service-period-order.integration.spec.js
        assertion: it writes no invoice for the refused draft
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/service-period-order.integration.spec.js#it
          writes no invoice for the refused draft
    binding_review: []
  - id: ATS-ACC-TRX-001-07
    title: Ineligible posting context blocks issue
    level: api
    proves:
      - BR-CAP-ACC-TRX-001-07
      - INV-DOM-ACC-TRX-001-04
    preconditions: >-
      Available cases include closed and foreign batches, uncovered dates and no
      assignment rule.
    steps:
      - do: Attempt issue in each invalid context.
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
          refuses the issue when the unit has no assignment rules
          (batch_required), the draft unchanged
    expected: Batch and period refusals preserve draft status without numbering.
    negative: true
    data_needs: Invalid batches and fiscal dates.
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
        refuses a closed batch (batch_not_open)
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
        refuses another unit’s batch (batch_not_open)
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
        refuses the issue (period_not_open), the draft unchanged
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
        refuses the issue when the unit has no assignment rules
        (batch_required), the draft unchanged
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
        issues in the active batch of the recurring batch the rules choose
      - TST-ACC-TRX-056
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
      refuses the issue when the unit has no assignment rules (batch_required),
      the draft unchanged
    category: failure
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js
        assertion: it refuses a closed batch (batch_not_open)
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
          refuses a closed batch (batch_not_open)
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js
        assertion: it refuses another unit’s batch (batch_not_open)
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
          refuses another unit’s batch (batch_not_open)
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js
        assertion: 'it refuses the issue (period_not_open), the draft unchanged'
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
          refuses the issue (period_not_open), the draft unchanged
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js
        assertion: >-
          it refuses the issue when the unit has no assignment rules
          (batch_required), the draft unchanged
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
          refuses the issue when the unit has no assignment rules
          (batch_required), the draft unchanged
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js
        assertion: it issues in the active batch of the recurring batch the rules choose
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
          issues in the active batch of the recurring batch the rules choose
    binding_review: []
  - id: ATS-ACC-TRX-001-08
    title: Workspace invoice numbering advances independently
    level: api
    proves:
      - BR-CAP-ACC-TRX-001-08
      - INV-DOM-ACC-TRX-001-05
    preconditions: The workspace has issued no invoices.
    steps:
      - do: Issue two separate bills.
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
          numbers the tenant’s first invoice 1,000,000
    expected: Their references are one million and one million plus one.
    negative: false
    data_needs: A newly provisioned workspace.
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
        numbers the tenant’s first invoice 1,000,000
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
        numbers the next invoice 1,000,001
      - TST-ACC-TRX-056
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
      numbers the tenant’s first invoice 1,000,000
    category: rule
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js
        assertion: 'it numbers the tenant’s first invoice 1,000,000'
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
          numbers the tenant’s first invoice 1,000,000
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js
        assertion: 'it numbers the next invoice 1,000,001'
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
          numbers the next invoice 1,000,001
    binding_review: []
  - id: ATS-ACC-TRX-001-09
    title: Account selection waits for posting
    level: api
    proves:
      - BR-CAP-ACC-TRX-001-09
    preconditions: One product has account setup and another lacks it.
    steps:
      - do: Issue both as lines of the same invoice.
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
          resolves no account on a line of a product with no setup either (the
          unit’s defaults are the posting’s to read)
    expected: Neither line receives ledger accounts during issue.
    negative: false
    data_needs: Configured and unconfigured products.
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
        resolves no account on a line, even of a product with an accounting
        setup: the setup’s tax class alone is settled
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
        resolves no account on a line of a product with no setup either (the
        unit’s defaults are the posting’s to read)
      - >-
        react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0198.spec.ts#ACT-ACC-0198
      - TST-ACC-TRX-056
      - TST-ACC-TRX-231
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
      resolves no account on a line of a product with no setup either (the
      unit’s defaults are the posting’s to read)
    category: rule
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js
        assertion: >-
          it resolves no account on a line, even of a product with an accounting
          setup: the setup’s tax class alone is settled
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
          resolves no account on a line, even of a product with an accounting
          setup: the setup’s tax class alone is settled
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js
        assertion: >-
          it resolves no account on a line of a product with no setup either
          (the unit’s defaults are the posting’s to read)
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
          resolves no account on a line of a product with no setup either (the
          unit’s defaults are the posting’s to read)
      - file: >-
          react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0198.spec.ts
        assertion: ACT-ACC-0198
        provenance: test
        source: >-
          react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0198.spec.ts#ACT-ACC-0198
    binding_review:
      - binding: >-
          react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0198.spec.ts#ACT-ACC-0198
        completeness: not-verified
        provenance: observed
        source: >-
          react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0198.spec.ts#ACT-ACC-0198
        note: >-
          This citation remains component evidence. A browser request driven
          through an API helper does not establish direct database checks or
          every branch of the combined scenario.
  - id: ATS-ACC-TRX-001-10
    title: Direct mutation cannot alter issued content
    level: unit
    proves:
      - BR-CAP-ACC-TRX-001-10
      - INV-DOM-ACC-TRX-001-06
    preconditions: A real invoice has been issued.
    steps:
      - do: >-
          Attempt application-role changes to product, amounts and tax class,
          then delete its line and header.
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js#it
          refuses a change of an issued line’s amounts (RHA04)
    expected: Database protection rejects each direct mutation.
    negative: true
    data_needs: Application-role database access.
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js#it
        refuses a change of an issued line’s product (RHA04)
      - >-
        services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js#it
        refuses a change of an issued line’s amounts (RHA04)
      - >-
        services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js#it
        refuses the delete of an issued invoice (RHA04)
      - >-
        services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js#it
        refuses a change of an issued line’s tax class (RHA04)
      - >-
        services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js#it
        refuses the delete of an issued line (RHA04)
      - TST-ACC-TRX-022
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js#it
      refuses a change of an issued line’s amounts (RHA04)
    category: invariant
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js
        assertion: it refuses a change of an issued line’s product (RHA04)
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js#it
          refuses a change of an issued line’s product (RHA04)
      - file: >-
          services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js
        assertion: it refuses a change of an issued line’s amounts (RHA04)
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js#it
          refuses a change of an issued line’s amounts (RHA04)
      - file: >-
          services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js
        assertion: it refuses the delete of an issued invoice (RHA04)
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js#it
          refuses the delete of an issued invoice (RHA04)
      - file: >-
          services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js
        assertion: it refuses a change of an issued line’s tax class (RHA04)
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js#it
          refuses a change of an issued line’s tax class (RHA04)
      - file: >-
          services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js
        assertion: it refuses the delete of an issued line (RHA04)
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js#it
          refuses the delete of an issued line (RHA04)
    binding_review: []
  - id: ATS-ACC-TRX-001-11
    title: Monetary position determines standing
    level: api
    proves:
      - BR-CAP-ACC-TRX-001-11
      - INV-DOM-ACC-TRX-001-07
    preconditions: >-
      Separate invoices are unpaid, partly settled, fully settled and
      zero-total.
    steps:
      - do: Read each after the relevant financial action.
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
          is paid at once, its line with it
    expected: The first two remain open and the latter two are paid.
    negative: false
    data_needs: Receipts and zero-value billing fixtures.
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/status-derivation.integration.spec.js#it
        is open with nothing applied
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
        is paid at once, its line with it
      - >-
        react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0214.spec.ts#ACT-ACC-0214
      - TST-ACC-TRX-063
      - TST-ACC-TRX-056
      - TST-ACC-TRX-236
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
      is paid at once, its line with it
    category: transition
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/status-derivation.integration.spec.js
        assertion: it is open with nothing applied
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/status-derivation.integration.spec.js#it
          is open with nothing applied
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js
        assertion: 'it is paid at once, its line with it'
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
          is paid at once, its line with it
      - file: >-
          react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0214.spec.ts
        assertion: ACT-ACC-0214
        provenance: test
        source: >-
          react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0214.spec.ts#ACT-ACC-0214
    binding_review:
      - binding: >-
          react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0214.spec.ts#ACT-ACC-0214
        completeness: not-verified
        provenance: observed
        source: >-
          react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0214.spec.ts#ACT-ACC-0214
        note: >-
          This citation remains component evidence. A browser request driven
          through an API helper does not establish direct database checks or
          every branch of the combined scenario.
  - id: ATS-ACC-TRX-001-12
    title: Quote recognition retains document identity
    level: api
    proves:
      - BR-CAP-ACC-TRX-001-12
      - INV-DOM-ACC-TRX-001-08
    preconditions: A draft is marked pro forma.
    steps:
      - do: >-
          Issue and convert it, retry conversion, and compare deletion of an
          unconverted quote and real bill.
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
          gives it no batch, no accounting date and no recognition (FC-06)
    expected: >-
      Quote issue creates no debt; conversion keeps the number; repeat
      conversion and real-bill deletion fail.
    negative: false
    data_needs: An eligible open posting batch.
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
        gives it no batch, no accounting date and no recognition (FC-06)
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
        makes it a real invoice in the batch, its receivable recognized, its
        number kept
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
        refuses converting it again (invoice_not_pro_forma)
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/delete-draft.integration.spec.js#it
        answers the numbered pro forma as it was
      - >-
        react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0182.spec.ts#ACT-ACC-0182
      - TST-ACC-TRX-056
      - TST-ACC-TRX-048
      - TST-ACC-TRX-220
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
      gives it no batch, no accounting date and no recognition (FC-06)
    category: transition
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js
        assertion: 'it gives it no batch, no accounting date and no recognition (FC-06)'
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
          gives it no batch, no accounting date and no recognition (FC-06)
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js
        assertion: >-
          it makes it a real invoice in the batch, its receivable recognized,
          its number kept
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
          makes it a real invoice in the batch, its receivable recognized, its
          number kept
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js
        assertion: it refuses converting it again (invoice_not_pro_forma)
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
          refuses converting it again (invoice_not_pro_forma)
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/delete-draft.integration.spec.js
        assertion: it answers the numbered pro forma as it was
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/delete-draft.integration.spec.js#it
          answers the numbered pro forma as it was
      - file: >-
          react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0182.spec.ts
        assertion: ACT-ACC-0182
        provenance: test
        source: >-
          react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0182.spec.ts#ACT-ACC-0182
    binding_review:
      - binding: >-
          react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0182.spec.ts#ACT-ACC-0182
        completeness: not-verified
        provenance: observed
        source: >-
          react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0182.spec.ts#ACT-ACC-0182
        note: >-
          This citation remains component evidence. A browser request driven
          through an API helper does not establish direct database checks or
          every branch of the combined scenario.
  - id: ATS-ACC-TRX-001-13
    title: Issue freezes applicable tax treatment
    level: api
    proves:
      - BR-CAP-ACC-TRX-001-13
      - INV-DOM-ACC-TRX-001-16
    preconditions: 'New York tax rules, an exempt organization and an addressless party exist.'
    steps:
      - do: 'Issue ordinary, shipped, exempt and addressless staff charges.'
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue-tax.integration.spec.js#it
          writes one tax line per rate on the dues line, naming the zone and the
          rate and no account
    expected: >-
      Frozen per-rate tax follows the applicable address, exemption produces no
      tax and the addressless taxable case fails.
    negative: false
    data_needs: Tax classes and geographical rules.
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/issue-tax.integration.spec.js#it
        writes one tax line per rate on the dues line, naming the zone and the
        rate and no account
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/issue-tax.integration.spec.js#it
        freezes the tax lines with the invoice: the application role can neither
        change nor delete one
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/issue-tax-ship-to.integration.spec.js#it
        taxes the shipped line at the ship-to address: the Westchester zone’s
        County tax
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/issue-tax.integration.spec.js#it
        carries the exemption of an organization CRM says is tax exempt: no tax
        lines, is_tax_exempt true
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/issue-tax.integration.spec.js#it
        refuses the issue of a staff invoice to a party with no address (D-T4),
        naming the code, and writes nothing
      - >-
        react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0200.spec.ts#ACT-ACC-0200
      - TST-ACC-TRX-055
      - TST-ACC-TRX-054
      - TST-ACC-TRX-232
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/issue-tax.integration.spec.js#it
      writes one tax line per rate on the dues line, naming the zone and the
      rate and no account
    category: invariant
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue-tax.integration.spec.js
        assertion: >-
          it writes one tax line per rate on the dues line, naming the zone and
          the rate and no account
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue-tax.integration.spec.js#it
          writes one tax line per rate on the dues line, naming the zone and the
          rate and no account
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue-tax.integration.spec.js
        assertion: >-
          it freezes the tax lines with the invoice: the application role can
          neither change nor delete one
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue-tax.integration.spec.js#it
          freezes the tax lines with the invoice: the application role can
          neither change nor delete one
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue-tax-ship-to.integration.spec.js
        assertion: >-
          it taxes the shipped line at the ship-to address: the Westchester
          zone’s County tax
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue-tax-ship-to.integration.spec.js#it
          taxes the shipped line at the ship-to address: the Westchester zone’s
          County tax
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue-tax.integration.spec.js
        assertion: >-
          it carries the exemption of an organization CRM says is tax exempt: no
          tax lines, is_tax_exempt true
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue-tax.integration.spec.js#it
          carries the exemption of an organization CRM says is tax exempt: no
          tax lines, is_tax_exempt true
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue-tax.integration.spec.js
        assertion: >-
          it refuses the issue of a staff invoice to a party with no address
          (D-T4), naming the code, and writes nothing
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/issue-tax.integration.spec.js#it
          refuses the issue of a staff invoice to a party with no address
          (D-T4), naming the code, and writes nothing
      - file: >-
          react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0200.spec.ts
        assertion: ACT-ACC-0200
        provenance: test
        source: >-
          react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0200.spec.ts#ACT-ACC-0200
    binding_review:
      - binding: >-
          react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0200.spec.ts#ACT-ACC-0200
        completeness: not-verified
        provenance: observed
        source: >-
          react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0200.spec.ts#ACT-ACC-0200
        note: >-
          This citation remains component evidence. A browser request driven
          through an API helper does not establish direct database checks or
          every branch of the combined scenario.
  - id: ATS-ACC-TRX-001-14
    title: Creation selects a valid fee policy
    level: api
    proves:
      - BR-CAP-ACC-TRX-001-14
    preconditions: The unit defaults to optional processing fees.
    steps:
      - do: >-
          Create required-policy, unspecified-policy and invalid-policy
          invoices.
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/e2e/card-fees.e2e.spec.js#it
          stamps the body’s policy on the invoice, and the unit’s default
          (optional) when the body names none
    expected: 'The first retains required, the next optional, and invalid policy fails.'
    negative: false
    data_needs: A business unit with fee configuration.
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/e2e/card-fees.e2e.spec.js#it
        stamps the body’s policy on the invoice, and the unit’s default
        (optional) when the body names none
      - >-
        services-accounting:modules/transactions/tests/e2e/card-fees.e2e.spec.js#it
        refuses a policy that is not none, required or optional (400, the
        contract’s own refusal naming the field)
      - TST-ACC-TRX-002
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/e2e/card-fees.e2e.spec.js#it
      stamps the body’s policy on the invoice, and the unit’s default (optional)
      when the body names none
    category: rule
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/e2e/card-fees.e2e.spec.js
        assertion: >-
          it stamps the body’s policy on the invoice, and the unit’s default
          (optional) when the body names none
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/e2e/card-fees.e2e.spec.js#it
          stamps the body’s policy on the invoice, and the unit’s default
          (optional) when the body names none
      - file: >-
          services-accounting:modules/transactions/tests/e2e/card-fees.e2e.spec.js
        assertion: >-
          it refuses a policy that is not none, required or optional (400, the
          contract’s own refusal naming the field)
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/e2e/card-fees.e2e.spec.js#it
          refuses a policy that is not none, required or optional (400, the
          contract’s own refusal naming the field)
    binding_review: []
  - id: ATS-ACC-TRX-001-15
    title: Automatic deferral can require a complete period
    level: api
    proves:
      - BR-CAP-ACC-TRX-001-15
    preconditions: >-
      An automatically deferred line lacks dates and mandatory periods are
      enabled.
    steps:
      - do: 'Attempt issue, supply both dates and issue again.'
        provenance: proposed
        source: >-
          services-accounting:modules/transactions/services/invoices/invoice-service-periods.ts:requireServicePeriods
    expected: >-
      The first attempt remains unnumbered and the complete period permits
      issue.
    negative: true
    data_needs: Automatic deferral setup and an eligible period and batch.
    bound_to: []
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/services/invoices/invoice-service-periods.ts:requireServicePeriods
    category: validation
    test_bindings: []
    binding_review: []
  - id: ATS-ACC-TRX-001-16
    title: Issue preserves or selects the conversion rate
    level: api
    proves:
      - BR-CAP-ACC-TRX-001-16
    preconditions: A foreign-currency draft can use a stored or configured dated rate.
    steps:
      - do: 'Issue separate drafts with both, configured only and neither.'
        provenance: proposed
        source: >-
          services-accounting:modules/transactions/services/invoices/invoice-issue.ts:exchangeRateOf
    expected: >-
      Stored rate wins, inverse configured rate follows, and no available rate
      leaves none stored.
    negative: false
    data_needs: Foreign-currency configuration and dated rates.
    bound_to: []
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/services/invoices/invoice-issue.ts:exchangeRateOf
    category: rule
    test_bindings: []
    binding_review: []
  - id: ATS-ACC-TRX-001-17
    title: A revised service bill reaches the customer
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-TRX-001-01
      - BR-CAP-ACC-TRX-001-07
      - BR-CAP-ACC-TRX-001-10
      - BR-CAP-ACC-TRX-001-12
      - BR-CAP-ACC-TRX-002-01
      - BR-CAP-ACC-TRX-002-03
      - BR-CAP-ACC-TRX-005-02
      - BR-CAP-ACC-TRX-005-06
      - BR-CAP-ACC-TRX-016-01
      - BR-CAP-ACC-TRX-016-02
      - BR-CAP-ACC-TRX-020-02
      - BR-CAP-ACC-TRX-020-03
    exercises:
      - CAP-ACC-TRX-001
      - CAP-ACC-TRX-002
      - CAP-ACC-TRX-005
      - CAP-ACC-TRX-016
      - CAP-ACC-TRX-020
    preconditions: >-
      An isolated workspace has eligible customers, products, matching accounts,
      an open period and two open batches. Each branch owns separate financial
      records.
    steps:
      - do: >-
          Commerce creates an 80.00 bill. Staff add an eligible 20.00 charge
          before posting, inspect available actions, render the revised bill and
          submit it for delivery.
        provenance: proposed
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it
          refuses an update at a version the draft has moved past (stale);
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
          refuses the issue when the unit has no assignment rules
          (batch_required), the draft unchanged;
          services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js#it
          refuses a change of an issued line’s amounts (RHA04);
          services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
          gives it no batch, no accounting date and no recognition (FC-06);
          rhythm-v2-docs:specs/accounting/transactions/design/workflows/WF-ACC-TRX-001-create-and-issue-an-invoice.md#WF-ACC-TRX-001;
          rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-01;
          rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-07;
          rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-10;
          rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-12;
          rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-002-correct-or-cancel-an-issued-invoice-before-its-batch-posts.md#BR-CAP-ACC-TRX-002-01;
          rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-002-correct-or-cancel-an-issued-invoice-before-its-batch-posts.md#BR-CAP-ACC-TRX-002-03;
          rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-005-send-a-customer-their-invoice.md#BR-CAP-ACC-TRX-005-02;
          rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-005-send-a-customer-their-invoice.md#BR-CAP-ACC-TRX-005-06;
          rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-016-find-transactions-and-see-what-can-be-done-next.md#BR-CAP-ACC-TRX-016-01;
          rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-016-find-transactions-and-see-what-can-be-done-next.md#BR-CAP-ACC-TRX-016-02;
          rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-020-let-commerce-and-the-processor-work-with-accounting-safely.md#BR-CAP-ACC-TRX-020-02;
          rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-020-let-commerce-and-the-processor-work-with-accounting-safely.md#BR-CAP-ACC-TRX-020-03
    expected: >-
      The customer document shows 100.00 and the revised content; the action
      list reflects the issued bill; the service retry creates no second bill.
    negative: false
    data_needs: >-
      Separate command keys, two customers, invoice lines, receipts and credit;
      controlled processor outcomes and a fixed calendar where the branch
      requires them.
    bound_to: []
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it
      refuses an update at a version the draft has moved past (stale);
      services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
      refuses the issue when the unit has no assignment rules (batch_required),
      the draft unchanged;
      services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js#it
      refuses a change of an issued line’s amounts (RHA04);
      services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
      gives it no batch, no accounting date and no recognition (FC-06);
      rhythm-v2-docs:specs/accounting/transactions/design/workflows/WF-ACC-TRX-001-create-and-issue-an-invoice.md#WF-ACC-TRX-001;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-01;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-07;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-10;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-12;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-002-correct-or-cancel-an-issued-invoice-before-its-batch-posts.md#BR-CAP-ACC-TRX-002-01;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-002-correct-or-cancel-an-issued-invoice-before-its-batch-posts.md#BR-CAP-ACC-TRX-002-03;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-005-send-a-customer-their-invoice.md#BR-CAP-ACC-TRX-005-02;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-005-send-a-customer-their-invoice.md#BR-CAP-ACC-TRX-005-06;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-016-find-transactions-and-see-what-can-be-done-next.md#BR-CAP-ACC-TRX-016-01;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-016-find-transactions-and-see-what-can-be-done-next.md#BR-CAP-ACC-TRX-016-02;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-020-let-commerce-and-the-processor-work-with-accounting-safely.md#BR-CAP-ACC-TRX-020-02;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-020-let-commerce-and-the-processor-work-with-accounting-safely.md#BR-CAP-ACC-TRX-020-03
    test_bindings: []
    binding_review: []
  - id: ATS-ACC-TRX-001-18
    title: Competing issues retain one invoice effect
    category: concurrency
    level: api
    proves:
      - BR-CAP-ACC-TRX-001-08
      - INV-DOM-ACC-TRX-006-06
    preconditions: >-
      Two callers hold the same eligible draft and submit the same issue key at
      once.
    steps:
      - do: >-
          Race the two issue requests and inspect the invoice’s issue events and
          receivable facts.
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/idempotency.integration.spec.js#it
          issues the invoice once and refuses the other issue invoice_not_draft;
          services-accounting:modules/transactions/tests/integration/services/invoices/idempotency.integration.spec.js#it
          appends one set of facts
    expected: >-
      One request issues the invoice and the other is refused because the draft
      has already moved; only one set of financial facts remains.
    negative: false
    data_needs: >-
      Branch-owned records in one configured workspace, valid accounting context
      and controlled requests at the stated boundary.
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/idempotency.integration.spec.js#it
        issues the invoice once and refuses the other issue invoice_not_draft
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/idempotency.integration.spec.js#it
        appends one set of facts
      - TST-ACC-TRX-052
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/idempotency.integration.spec.js#it
      issues the invoice once and refuses the other issue invoice_not_draft;
      services-accounting:modules/transactions/tests/integration/services/invoices/idempotency.integration.spec.js#it
      appends one set of facts
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/idempotency.integration.spec.js
        assertion: >-
          it issues the invoice once and refuses the other issue
          invoice_not_draft
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/idempotency.integration.spec.js#it
          issues the invoice once and refuses the other issue invoice_not_draft
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/idempotency.integration.spec.js
        assertion: it appends one set of facts
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/invoices/idempotency.integration.spec.js#it
          appends one set of facts
    binding_review: []
evidence:
  - >-
    services-accounting at f47cb263875bbc0c5640fba7dae6785ec32695f8: the test
    files named in bound_to.
  - >-
    react-console at baf6dae382d6f41dce976c7f848667ccc37e076f: the Playwright
    journeys ACT-ACC-0182, 0184, 0198, 0200, 0214.
  - >-
    rhythm-v2-docs:specs/accounting/transactions/design: related workflows,
    domain invariants and state transitions examined for the back-fill.
coverage:
  rule: covered
  transition: 'gap: FND-ACC-TRX-066'
  validation: covered
  permission: 'gap: FND-ACC-TRX-066'
  edge: 'gap: FND-ACC-TRX-066'
  failure: covered
  boundary: covered
  concurrency: covered
  invariant: covered
  interaction: covered
coverage_notes:
  permission: >-
    No dedicated permission scenario covers the applicable conditions; the
    finding identifies the remaining specification work.
  edge: >-
    No dedicated edge scenario covers the applicable conditions; the finding
    identifies the remaining specification work.
  transition: >-
    Selected transition scenarios exist, but the listed state paths still need
    explicit guard, effect and actor mappings.
interaction_coverage:
  - to: CAP-ACC-TRX-002
    scenarios:
      - ATS-ACC-TRX-001-17
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it
      refuses an update at a version the draft has moved past (stale);
      services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
      refuses the issue when the unit has no assignment rules (batch_required),
      the draft unchanged;
      services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js#it
      refuses a change of an issued line’s amounts (RHA04);
      services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
      gives it no batch, no accounting date and no recognition (FC-06);
      rhythm-v2-docs:specs/accounting/transactions/design/workflows/WF-ACC-TRX-001-create-and-issue-an-invoice.md#WF-ACC-TRX-001;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-01;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-07;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-10;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-12;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-002-correct-or-cancel-an-issued-invoice-before-its-batch-posts.md#BR-CAP-ACC-TRX-002-01;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-002-correct-or-cancel-an-issued-invoice-before-its-batch-posts.md#BR-CAP-ACC-TRX-002-03;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-005-send-a-customer-their-invoice.md#BR-CAP-ACC-TRX-005-02;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-005-send-a-customer-their-invoice.md#BR-CAP-ACC-TRX-005-06;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-016-find-transactions-and-see-what-can-be-done-next.md#BR-CAP-ACC-TRX-016-01;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-016-find-transactions-and-see-what-can-be-done-next.md#BR-CAP-ACC-TRX-016-02;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-020-let-commerce-and-the-processor-work-with-accounting-safely.md#BR-CAP-ACC-TRX-020-02;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-020-let-commerce-and-the-processor-work-with-accounting-safely.md#BR-CAP-ACC-TRX-020-03
  - to: CAP-ACC-TRX-005
    scenarios:
      - ATS-ACC-TRX-001-17
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it
      refuses an update at a version the draft has moved past (stale);
      services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
      refuses the issue when the unit has no assignment rules (batch_required),
      the draft unchanged;
      services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js#it
      refuses a change of an issued line’s amounts (RHA04);
      services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
      gives it no batch, no accounting date and no recognition (FC-06);
      rhythm-v2-docs:specs/accounting/transactions/design/workflows/WF-ACC-TRX-001-create-and-issue-an-invoice.md#WF-ACC-TRX-001;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-01;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-07;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-10;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-12;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-002-correct-or-cancel-an-issued-invoice-before-its-batch-posts.md#BR-CAP-ACC-TRX-002-01;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-002-correct-or-cancel-an-issued-invoice-before-its-batch-posts.md#BR-CAP-ACC-TRX-002-03;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-005-send-a-customer-their-invoice.md#BR-CAP-ACC-TRX-005-02;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-005-send-a-customer-their-invoice.md#BR-CAP-ACC-TRX-005-06;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-016-find-transactions-and-see-what-can-be-done-next.md#BR-CAP-ACC-TRX-016-01;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-016-find-transactions-and-see-what-can-be-done-next.md#BR-CAP-ACC-TRX-016-02;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-020-let-commerce-and-the-processor-work-with-accounting-safely.md#BR-CAP-ACC-TRX-020-02;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-020-let-commerce-and-the-processor-work-with-accounting-safely.md#BR-CAP-ACC-TRX-020-03
  - to: CAP-ACC-TRX-016
    scenarios:
      - ATS-ACC-TRX-001-17
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it
      refuses an update at a version the draft has moved past (stale);
      services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
      refuses the issue when the unit has no assignment rules (batch_required),
      the draft unchanged;
      services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js#it
      refuses a change of an issued line’s amounts (RHA04);
      services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
      gives it no batch, no accounting date and no recognition (FC-06);
      rhythm-v2-docs:specs/accounting/transactions/design/workflows/WF-ACC-TRX-001-create-and-issue-an-invoice.md#WF-ACC-TRX-001;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-01;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-07;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-10;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-12;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-002-correct-or-cancel-an-issued-invoice-before-its-batch-posts.md#BR-CAP-ACC-TRX-002-01;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-002-correct-or-cancel-an-issued-invoice-before-its-batch-posts.md#BR-CAP-ACC-TRX-002-03;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-005-send-a-customer-their-invoice.md#BR-CAP-ACC-TRX-005-02;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-005-send-a-customer-their-invoice.md#BR-CAP-ACC-TRX-005-06;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-016-find-transactions-and-see-what-can-be-done-next.md#BR-CAP-ACC-TRX-016-01;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-016-find-transactions-and-see-what-can-be-done-next.md#BR-CAP-ACC-TRX-016-02;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-020-let-commerce-and-the-processor-work-with-accounting-safely.md#BR-CAP-ACC-TRX-020-02;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-020-let-commerce-and-the-processor-work-with-accounting-safely.md#BR-CAP-ACC-TRX-020-03
  - to: CAP-ACC-TRX-020
    scenarios:
      - ATS-ACC-TRX-001-17
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it
      refuses an update at a version the draft has moved past (stale);
      services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
      refuses the issue when the unit has no assignment rules (batch_required),
      the draft unchanged;
      services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js#it
      refuses a change of an issued line’s amounts (RHA04);
      services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
      gives it no batch, no accounting date and no recognition (FC-06);
      rhythm-v2-docs:specs/accounting/transactions/design/workflows/WF-ACC-TRX-001-create-and-issue-an-invoice.md#WF-ACC-TRX-001;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-01;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-07;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-10;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-12;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-002-correct-or-cancel-an-issued-invoice-before-its-batch-posts.md#BR-CAP-ACC-TRX-002-01;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-002-correct-or-cancel-an-issued-invoice-before-its-batch-posts.md#BR-CAP-ACC-TRX-002-03;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-005-send-a-customer-their-invoice.md#BR-CAP-ACC-TRX-005-02;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-005-send-a-customer-their-invoice.md#BR-CAP-ACC-TRX-005-06;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-016-find-transactions-and-see-what-can-be-done-next.md#BR-CAP-ACC-TRX-016-01;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-016-find-transactions-and-see-what-can-be-done-next.md#BR-CAP-ACC-TRX-016-02;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-020-let-commerce-and-the-processor-work-with-accounting-safely.md#BR-CAP-ACC-TRX-020-02;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-020-let-commerce-and-the-processor-work-with-accounting-safely.md#BR-CAP-ACC-TRX-020-03
transition_coverage:
  - state_model: STATE-ACC-TRX-001
    transition: 1
    gap: FND-ACC-TRX-066
    provenance: unknown
    source: FND-ACC-TRX-066
    note: >-
      Existing scenarios establish selected paths; this exact guard, side-effect
      and actor combination still needs an explicit scenario mapping.
    evidence:
      - >-
        services-accounting:modules/transactions/services/invoices/invoice-drafts.ts;
        services-accounting:modules/transactions/services/invoices/invoice-issue.ts;
        services-accounting:modules/transactions/services/invoices/invoice-changes.ts;
        services-accounting:modules/transactions/services/invoices/invoice-amendments.ts;
        services-accounting:modules/transactions/db/invoices.table.ts;
        services-accounting:modules/transactions/db/invoice-lines.table.ts;
        services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js#it
        refuses an inactive product (product_not_sellable)
  - state_model: STATE-ACC-TRX-001
    transition: 2
    gap: FND-ACC-TRX-066
    provenance: unknown
    source: FND-ACC-TRX-066
    note: >-
      Existing scenarios establish selected paths; this exact guard, side-effect
      and actor combination still needs an explicit scenario mapping.
    evidence:
      - >-
        services-accounting:modules/transactions/services/invoices/invoice-drafts.ts;
        services-accounting:modules/transactions/services/invoices/invoice-issue.ts;
        services-accounting:modules/transactions/services/invoices/invoice-changes.ts;
        services-accounting:modules/transactions/services/invoices/invoice-amendments.ts;
        services-accounting:modules/transactions/db/invoices.table.ts;
        services-accounting:modules/transactions/db/invoice-lines.table.ts;
        services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it
        refuses an update at a version the draft has moved past (stale)
  - state_model: STATE-ACC-TRX-001
    transition: 3
    gap: FND-ACC-TRX-066
    provenance: unknown
    source: FND-ACC-TRX-066
    note: >-
      Existing scenarios establish selected paths; this exact guard, side-effect
      and actor combination still needs an explicit scenario mapping.
    evidence:
      - >-
        services-accounting:modules/transactions/services/invoices/invoice-drafts.ts;
        services-accounting:modules/transactions/services/invoices/invoice-issue.ts;
        services-accounting:modules/transactions/services/invoices/invoice-changes.ts;
        services-accounting:modules/transactions/services/invoices/invoice-amendments.ts;
        services-accounting:modules/transactions/db/invoices.table.ts;
        services-accounting:modules/transactions/db/invoice-lines.table.ts;
        services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
        gives it no batch, no accounting date and no recognition (FC-06)
  - state_model: STATE-ACC-TRX-001
    transition: 4
    gap: FND-ACC-TRX-066
    provenance: unknown
    source: FND-ACC-TRX-066
    note: >-
      Existing scenarios establish selected paths; this exact guard, side-effect
      and actor combination still needs an explicit scenario mapping.
    evidence:
      - >-
        services-accounting:modules/transactions/services/invoices/invoice-drafts.ts;
        services-accounting:modules/transactions/services/invoices/invoice-issue.ts;
        services-accounting:modules/transactions/services/invoices/invoice-changes.ts;
        services-accounting:modules/transactions/services/invoices/invoice-amendments.ts;
        services-accounting:modules/transactions/db/invoices.table.ts;
        services-accounting:modules/transactions/db/invoice-lines.table.ts;
        services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
        refuses the issue when the unit has no assignment rules
        (batch_required), the draft unchanged
  - state_model: STATE-ACC-TRX-001
    transition: 5
    gap: FND-ACC-TRX-066
    provenance: unknown
    source: FND-ACC-TRX-066
    note: >-
      Existing scenarios establish selected paths; this exact guard, side-effect
      and actor combination still needs an explicit scenario mapping.
    evidence:
      - >-
        services-accounting:modules/transactions/services/invoices/invoice-drafts.ts;
        services-accounting:modules/transactions/services/invoices/invoice-issue.ts;
        services-accounting:modules/transactions/services/invoices/invoice-changes.ts;
        services-accounting:modules/transactions/services/invoices/invoice-amendments.ts;
        services-accounting:modules/transactions/db/invoices.table.ts;
        services-accounting:modules/transactions/db/invoice-lines.table.ts;
        services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
        is paid at once, its line with it
  - state_model: STATE-ACC-TRX-001
    transition: 6
    gap: FND-ACC-TRX-066
    provenance: unknown
    source: FND-ACC-TRX-066
    note: >-
      Existing scenarios establish selected paths; this exact guard, side-effect
      and actor combination still needs an explicit scenario mapping.
    evidence:
      - >-
        services-accounting:docs/architecture/accounting-2.0/05-lifecycles.md#1.
        The invoice
  - state_model: STATE-ACC-TRX-001
    transition: 7
    gap: FND-ACC-TRX-066
    provenance: unknown
    source: FND-ACC-TRX-066
    note: >-
      Existing scenarios establish selected paths; this exact guard, side-effect
      and actor combination still needs an explicit scenario mapping.
    evidence:
      - >-
        services-accounting:modules/transactions/services/invoices/invoice-drafts.ts;
        services-accounting:modules/transactions/services/invoices/invoice-issue.ts;
        services-accounting:modules/transactions/services/invoices/invoice-changes.ts;
        services-accounting:modules/transactions/services/invoices/invoice-amendments.ts;
        services-accounting:modules/transactions/db/invoices.table.ts;
        services-accounting:modules/transactions/db/invoice-lines.table.ts;
        services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
        gives it no batch, no accounting date and no recognition (FC-06)
  - state_model: STATE-ACC-TRX-001
    transition: 8
    gap: FND-ACC-TRX-066
    provenance: unknown
    source: FND-ACC-TRX-066
    note: >-
      Existing scenarios establish selected paths; this exact guard, side-effect
      and actor combination still needs an explicit scenario mapping.
    evidence:
      - >-
        services-accounting:modules/transactions/services/invoices/invoice-drafts.ts;
        services-accounting:modules/transactions/services/invoices/invoice-issue.ts;
        services-accounting:modules/transactions/services/invoices/invoice-changes.ts;
        services-accounting:modules/transactions/services/invoices/invoice-amendments.ts;
        services-accounting:modules/transactions/db/invoices.table.ts;
        services-accounting:modules/transactions/db/invoice-lines.table.ts;
        services-accounting:modules/transactions/tests/integration/services/payments/receive-offline.integration.spec.js#it
        converts an unconverted pro forma the first payment names, in the
        payment’s batch, and pays it (Commerce’s first payment makes it real)
  - state_model: STATE-ACC-TRX-001
    transition: 9
    gap: FND-ACC-TRX-066
    provenance: unknown
    source: FND-ACC-TRX-066
    note: >-
      Existing scenarios establish selected paths; this exact guard, side-effect
      and actor combination still needs an explicit scenario mapping.
    evidence:
      - >-
        services-accounting:modules/transactions/services/invoices/invoice-drafts.ts;
        services-accounting:modules/transactions/services/invoices/invoice-issue.ts;
        services-accounting:modules/transactions/services/invoices/invoice-changes.ts;
        services-accounting:modules/transactions/services/invoices/invoice-amendments.ts;
        services-accounting:modules/transactions/db/invoices.table.ts;
        services-accounting:modules/transactions/db/invoice-lines.table.ts;
        services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
        gives it no batch, no accounting date and no recognition (FC-06)
  - state_model: STATE-ACC-TRX-001
    transition: 10
    gap: FND-ACC-TRX-066
    provenance: unknown
    source: FND-ACC-TRX-066
    note: >-
      Existing scenarios establish selected paths; this exact guard, side-effect
      and actor combination still needs an explicit scenario mapping.
    evidence:
      - >-
        services-accounting:modules/transactions/services/invoices/invoice-drafts.ts;
        services-accounting:modules/transactions/services/invoices/invoice-issue.ts;
        services-accounting:modules/transactions/services/invoices/invoice-changes.ts;
        services-accounting:modules/transactions/services/invoices/invoice-amendments.ts;
        services-accounting:modules/transactions/db/invoices.table.ts;
        services-accounting:modules/transactions/db/invoice-lines.table.ts;
        services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
        answers the invoice at revision 2 with the line added after the last,
        the line repriced and the totals re-derived
  - state_model: STATE-ACC-TRX-001
    transition: 11
    gap: FND-ACC-TRX-066
    provenance: unknown
    source: FND-ACC-TRX-066
    note: >-
      Existing scenarios establish selected paths; this exact guard, side-effect
      and actor combination still needs an explicit scenario mapping.
    evidence:
      - >-
        services-accounting:modules/transactions/services/invoices/invoice-drafts.ts;
        services-accounting:modules/transactions/services/invoices/invoice-issue.ts;
        services-accounting:modules/transactions/services/invoices/invoice-changes.ts;
        services-accounting:modules/transactions/services/invoices/invoice-amendments.ts;
        services-accounting:modules/transactions/db/invoices.table.ts;
        services-accounting:modules/transactions/db/invoice-lines.table.ts;
        services-accounting:modules/transactions/tests/integration/services/credits/credits.integration.spec.js#it
        raises the line’s amount_paid: a line settled by store credit reads open
        until fully paid, then paid
  - state_model: STATE-ACC-TRX-001
    transition: 12
    gap: FND-ACC-TRX-066
    provenance: unknown
    source: FND-ACC-TRX-066
    note: >-
      Existing scenarios establish selected paths; this exact guard, side-effect
      and actor combination still needs an explicit scenario mapping.
    evidence:
      - >-
        services-accounting:modules/transactions/services/invoices/invoice-drafts.ts;
        services-accounting:modules/transactions/services/invoices/invoice-issue.ts;
        services-accounting:modules/transactions/services/invoices/invoice-changes.ts;
        services-accounting:modules/transactions/services/invoices/invoice-amendments.ts;
        services-accounting:modules/transactions/db/invoices.table.ts;
        services-accounting:modules/transactions/db/invoice-lines.table.ts;
        services-accounting:modules/transactions/tests/integration/services/payments/payment-reversals.integration.spec.js#it
        reverses the live allocation so the line owes again, and the payment
        item’s facts sum to zero (FC-16)
  - state_model: STATE-ACC-TRX-001
    transition: 13
    gap: FND-ACC-TRX-066
    provenance: unknown
    source: FND-ACC-TRX-066
    note: >-
      Existing scenarios establish selected paths; this exact guard, side-effect
      and actor combination still needs an explicit scenario mapping.
    evidence:
      - >-
        services-accounting:modules/transactions/services/invoices/invoice-drafts.ts;
        services-accounting:modules/transactions/services/invoices/invoice-issue.ts;
        services-accounting:modules/transactions/services/invoices/invoice-changes.ts;
        services-accounting:modules/transactions/services/invoices/invoice-amendments.ts;
        services-accounting:modules/transactions/db/invoices.table.ts;
        services-accounting:modules/transactions/db/invoice-lines.table.ts;
        services-accounting:modules/transactions/tests/integration/services/change-memos/credit-memos.integration.spec.js#it
        makes the credited line cancelled and leaves the invoice open with the
        other line’s 80.00
  - state_model: STATE-ACC-TRX-001
    transition: 14
    gap: FND-ACC-TRX-066
    provenance: unknown
    source: FND-ACC-TRX-066
    note: >-
      Existing scenarios establish selected paths; this exact guard, side-effect
      and actor combination still needs an explicit scenario mapping.
    evidence:
      - >-
        services-accounting:modules/transactions/services/invoices/invoice-drafts.ts;
        services-accounting:modules/transactions/services/invoices/invoice-issue.ts;
        services-accounting:modules/transactions/services/invoices/invoice-changes.ts;
        services-accounting:modules/transactions/services/invoices/invoice-amendments.ts;
        services-accounting:modules/transactions/db/invoices.table.ts;
        services-accounting:modules/transactions/db/invoice-lines.table.ts;
        services-accounting:modules/transactions/tests/integration/services/change-memos/credit-memos.integration.spec.js#it
        returns the invoice’s balances to what they were before the memo
  - state_model: STATE-ACC-TRX-001
    transition: 15
    gap: FND-ACC-TRX-066
    provenance: unknown
    source: FND-ACC-TRX-066
    note: >-
      Existing scenarios establish selected paths; this exact guard, side-effect
      and actor combination still needs an explicit scenario mapping.
    evidence:
      - >-
        services-accounting:modules/transactions/services/invoices/invoice-drafts.ts;
        services-accounting:modules/transactions/services/invoices/invoice-issue.ts;
        services-accounting:modules/transactions/services/invoices/invoice-changes.ts;
        services-accounting:modules/transactions/services/invoices/invoice-amendments.ts;
        services-accounting:modules/transactions/db/invoices.table.ts;
        services-accounting:modules/transactions/db/invoice-lines.table.ts;
        services-accounting:modules/transactions/tests/integration/services/write-offs/write-offs.integration.spec.js#it
        makes the whole line written_off and keeps the partly written-off line
        and the invoice open
  - state_model: STATE-ACC-TRX-001
    transition: 16
    gap: FND-ACC-TRX-066
    provenance: unknown
    source: FND-ACC-TRX-066
    note: >-
      Existing scenarios establish selected paths; this exact guard, side-effect
      and actor combination still needs an explicit scenario mapping.
    evidence:
      - >-
        services-accounting:modules/transactions/services/invoices/invoice-drafts.ts;
        services-accounting:modules/transactions/services/invoices/invoice-issue.ts;
        services-accounting:modules/transactions/services/invoices/invoice-changes.ts;
        services-accounting:modules/transactions/services/invoices/invoice-amendments.ts;
        services-accounting:modules/transactions/db/invoices.table.ts;
        services-accounting:modules/transactions/db/invoice-lines.table.ts;
        services-accounting:modules/transactions/tests/integration/services/write-offs/write-offs.integration.spec.js#it
        answers the reversal: a second write-off, numbered next, its lines
        negating the first’s
  - state_model: STATE-ACC-TRX-001
    transition: 17
    gap: FND-ACC-TRX-066
    provenance: unknown
    source: FND-ACC-TRX-066
    note: >-
      Existing scenarios establish selected paths; this exact guard, side-effect
      and actor combination still needs an explicit scenario mapping.
    evidence:
      - >-
        services-accounting:modules/transactions/services/invoices/invoice-drafts.ts;
        services-accounting:modules/transactions/services/invoices/invoice-issue.ts;
        services-accounting:modules/transactions/services/invoices/invoice-changes.ts;
        services-accounting:modules/transactions/services/invoices/invoice-amendments.ts;
        services-accounting:modules/transactions/db/invoices.table.ts;
        services-accounting:modules/transactions/db/invoice-lines.table.ts;
        services-accounting:modules/transactions/tests/integration/services/invoices/void.integration.spec.js#it
        appends an invoice_voided fact per line for minus the line’s balance,
        dated today
permission_coverage:
  - key: accounting.invoices.create
    where_checked: api
    gap: FND-ACC-TRX-066
    provenance: unknown
    source: FND-ACC-TRX-066
    note: >-
      Existing permission scenarios are retained; assertion-level coverage of
      this grant at every declared surface remains unverified.
    evidence:
      - >-
        rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#CAP-ACC-TRX-001
  - key: accounting.invoices.adjust
    where_checked: api
    gap: FND-ACC-TRX-066
    provenance: unknown
    source: FND-ACC-TRX-066
    note: >-
      Existing permission scenarios are retained; assertion-level coverage of
      this grant at every declared surface remains unverified.
    evidence:
      - >-
        rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#CAP-ACC-TRX-001
  - key: accounting.invoices.delete
    where_checked: api
    gap: FND-ACC-TRX-066
    provenance: unknown
    source: FND-ACC-TRX-066
    note: >-
      Existing permission scenarios are retained; assertion-level coverage of
      this grant at every declared surface remains unverified.
    evidence:
      - >-
        rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#CAP-ACC-TRX-001
  - key: accounting.invoices.read
    where_checked: api
    gap: FND-ACC-TRX-066
    provenance: unknown
    source: FND-ACC-TRX-066
    note: >-
      Existing permission scenarios are retained; assertion-level coverage of
      this grant at every declared surface remains unverified.
    evidence:
      - >-
        rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#CAP-ACC-TRX-001
  - key: accounting.tax.calculate
    where_checked: api
    gap: FND-ACC-TRX-066
    provenance: unknown
    source: FND-ACC-TRX-066
    note: >-
      Existing permission scenarios are retained; assertion-level coverage of
      this grant at every declared surface remains unverified.
    evidence:
      - >-
        rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#CAP-ACC-TRX-001
rule_coverage:
  - rule: BR-CAP-ACC-TRX-001-01
    scenarios:
      - ATS-ACC-TRX-001-01
      - ATS-ACC-TRX-001-17
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it
      refuses an update at a version the draft has moved past (stale)
  - rule: BR-CAP-ACC-TRX-001-02
    scenarios:
      - ATS-ACC-TRX-001-02
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it
      refuses a change of business unit: a draft keeps its unit
      (business_unit_mismatch)
  - rule: BR-CAP-ACC-TRX-001-03
    scenarios:
      - ATS-ACC-TRX-001-03
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js#it
      refuses an inactive product (product_not_sellable)
  - rule: BR-CAP-ACC-TRX-001-04
    scenarios:
      - ATS-ACC-TRX-001-04
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/rounding.integration.spec.js#it
      totals the rounded lines (3422), not a rounding of the unrounded sum
      (3421)
  - rule: BR-CAP-ACC-TRX-001-05
    scenarios:
      - ATS-ACC-TRX-001-05
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/customer-terms-precedence.integration.spec.js#it
      takes the bill-to’s default terms when the request names none, the due
      date 45 days after the invoice date
  - rule: BR-CAP-ACC-TRX-001-06
    scenarios:
      - ATS-ACC-TRX-001-06
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/service-period-order.integration.spec.js#it
      refuses a period ending before it starts with a 400 naming the service
      period
  - rule: BR-CAP-ACC-TRX-001-07
    scenarios:
      - ATS-ACC-TRX-001-07
      - ATS-ACC-TRX-001-17
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
      refuses the issue when the unit has no assignment rules (batch_required),
      the draft unchanged
  - rule: BR-CAP-ACC-TRX-001-08
    scenarios:
      - ATS-ACC-TRX-001-08
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
      numbers the tenant’s first invoice 1,000,000
  - rule: BR-CAP-ACC-TRX-001-09
    scenarios:
      - ATS-ACC-TRX-001-09
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
      resolves no account on a line of a product with no setup either (the
      unit’s defaults are the posting’s to read)
  - rule: BR-CAP-ACC-TRX-001-10
    scenarios:
      - ATS-ACC-TRX-001-10
      - ATS-ACC-TRX-001-17
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js#it
      refuses a change of an issued line’s amounts (RHA04)
  - rule: BR-CAP-ACC-TRX-001-11
    scenarios:
      - ATS-ACC-TRX-001-11
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
      is paid at once, its line with it
  - rule: BR-CAP-ACC-TRX-001-12
    scenarios:
      - ATS-ACC-TRX-001-12
      - ATS-ACC-TRX-001-17
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
      gives it no batch, no accounting date and no recognition (FC-06)
  - rule: BR-CAP-ACC-TRX-001-13
    scenarios:
      - ATS-ACC-TRX-001-13
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/issue-tax.integration.spec.js#it
      writes one tax line per rate on the dues line, naming the zone and the
      rate and no account
  - rule: BR-CAP-ACC-TRX-001-14
    scenarios:
      - ATS-ACC-TRX-001-14
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/e2e/card-fees.e2e.spec.js#it
      stamps the body’s policy on the invoice, and the unit’s default (optional)
      when the body names none
  - rule: BR-CAP-ACC-TRX-001-15
    scenarios:
      - ATS-ACC-TRX-001-15
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/services/invoices/invoice-service-periods.ts:requireServicePeriods
  - rule: BR-CAP-ACC-TRX-001-16
    scenarios:
      - ATS-ACC-TRX-001-16
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/services/invoices/invoice-issue.ts:exchangeRateOf
executable_gaps:
  - scenario: ATS-ACC-TRX-001-15
    gap: FND-ACC-TRX-066
    provenance: unknown
    source: FND-ACC-TRX-066
    evidence:
      - >-
        services-accounting:modules/transactions/services/invoices/invoice-service-periods.ts:requireServicePeriods
  - scenario: ATS-ACC-TRX-001-16
    gap: FND-ACC-TRX-066
    provenance: unknown
    source: FND-ACC-TRX-066
    evidence:
      - >-
        services-accounting:modules/transactions/services/invoices/invoice-issue.ts:exchangeRateOf
  - scenario: ATS-ACC-TRX-001-17
    gap: FND-ACC-TRX-066
    provenance: unknown
    source: FND-ACC-TRX-066
    evidence:
      - >-
        services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it
        refuses an update at a version the draft has moved past (stale);
        services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
        refuses the issue when the unit has no assignment rules
        (batch_required), the draft unchanged;
        services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js#it
        refuses a change of an issued line’s amounts (RHA04);
        services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
        gives it no batch, no accounting date and no recognition (FC-06);
        rhythm-v2-docs:specs/accounting/transactions/design/workflows/WF-ACC-TRX-001-create-and-issue-an-invoice.md#WF-ACC-TRX-001
invariant_coverage:
  - invariant: INV-DOM-ACC-TRX-001-01
    scenarios:
      - ATS-ACC-TRX-001-01
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it
      refuses an update at a version the draft has moved past (stale)
    note: >-
      The cited scenario and its constituent test assertions are the proof
      boundary.
  - invariant: INV-DOM-ACC-TRX-001-02
    scenarios:
      - ATS-ACC-TRX-001-02
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it
      refuses a change of business unit: a draft keeps its unit
      (business_unit_mismatch)
    note: >-
      The cited scenario and its constituent test assertions are the proof
      boundary.
  - invariant: INV-DOM-ACC-TRX-001-03
    scenarios:
      - ATS-ACC-TRX-001-04
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/rounding.integration.spec.js#it
      totals the rounded lines (3422), not a rounding of the unrounded sum
      (3421)
    note: >-
      The cited scenario and its constituent test assertions are the proof
      boundary.
  - invariant: INV-DOM-ACC-TRX-001-04
    scenarios:
      - ATS-ACC-TRX-001-07
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
      refuses the issue when the unit has no assignment rules (batch_required),
      the draft unchanged
    note: >-
      The cited scenario and its constituent test assertions are the proof
      boundary.
  - invariant: INV-DOM-ACC-TRX-001-05
    scenarios:
      - ATS-ACC-TRX-001-08
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
      numbers the tenant’s first invoice 1,000,000
    note: >-
      The cited scenario and its constituent test assertions are the proof
      boundary.
  - invariant: INV-DOM-ACC-TRX-001-06
    scenarios:
      - ATS-ACC-TRX-001-10
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js#it
      refuses a change of an issued line’s amounts (RHA04)
    note: >-
      The cited scenario and its constituent test assertions are the proof
      boundary.
  - invariant: INV-DOM-ACC-TRX-001-07
    scenarios:
      - ATS-ACC-TRX-001-11
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
      is paid at once, its line with it
    note: >-
      The cited scenario and its constituent test assertions are the proof
      boundary.
  - invariant: INV-DOM-ACC-TRX-001-08
    scenarios:
      - ATS-ACC-TRX-001-12
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it
      gives it no batch, no accounting date and no recognition (FC-06)
    note: >-
      The cited scenario and its constituent test assertions are the proof
      boundary.
  - invariant: INV-DOM-ACC-TRX-001-16
    scenarios:
      - ATS-ACC-TRX-001-13
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/issue-tax.integration.spec.js#it
      writes one tax line per rate on the dues line, naming the zone and the
      rate and no account
    note: >-
      The cited scenario and its constituent test assertions are the proof
      boundary.
  - invariant: INV-DOM-ACC-TRX-001-17
    gap: FND-ACC-TRX-066
    provenance: unknown
    source: FND-ACC-TRX-066
    evidence:
      - >-
        services-accounting:db/migrations/20261019013149_invoice_ship_to_address.sql:refuse_frozen_invoice_changes;
        services-accounting:modules/transactions/services/invoices/invoice-drafts.ts
    note: >-
      The complete invariant has no exact assertion binding in this
      specification; component evidence does not close the gap.
  - invariant: INV-DOM-ACC-TRX-001-19
    gap: FND-ACC-TRX-066
    provenance: unknown
    source: FND-ACC-TRX-066
    evidence:
      - >-
        services-accounting:docs/milestones/plans/ACCT-M2-plan.md#7a. Entity
        capabilities (R2-ARCH-001)
    note: >-
      The complete invariant has no exact assertion binding in this
      specification; component evidence does not close the gap.
---

# Issue customer bills and numbered quotes: Capability Test Specification

## Coverage

The category map separates specified examples from recorded gaps. The table lists a scenario or finding for each rule requiring proof; a listed scenario may still be proposed. Executable bindings cover their cited assertions, while the transition, permission and invariant registers identify combinations that need further proof.

| Required rule | Scenario or finding |
|---|---|
| `BR-CAP-ACC-TRX-001-01` | `ATS-ACC-TRX-001-01`, `ATS-ACC-TRX-001-17` |
| `BR-CAP-ACC-TRX-001-02` | `ATS-ACC-TRX-001-02` |
| `BR-CAP-ACC-TRX-001-03` | `ATS-ACC-TRX-001-03` |
| `BR-CAP-ACC-TRX-001-04` | `ATS-ACC-TRX-001-04` |
| `BR-CAP-ACC-TRX-001-05` | `ATS-ACC-TRX-001-05` |
| `BR-CAP-ACC-TRX-001-06` | `ATS-ACC-TRX-001-06` |
| `BR-CAP-ACC-TRX-001-07` | `ATS-ACC-TRX-001-07`, `ATS-ACC-TRX-001-17` |
| `BR-CAP-ACC-TRX-001-08` | `ATS-ACC-TRX-001-08`, `ATS-ACC-TRX-001-18` |
| `BR-CAP-ACC-TRX-001-09` | `ATS-ACC-TRX-001-09` |
| `BR-CAP-ACC-TRX-001-10` | `ATS-ACC-TRX-001-10`, `ATS-ACC-TRX-001-17` |
| `BR-CAP-ACC-TRX-001-11` | `ATS-ACC-TRX-001-11` |
| `BR-CAP-ACC-TRX-001-12` | `ATS-ACC-TRX-001-12`, `ATS-ACC-TRX-001-17` |
| `BR-CAP-ACC-TRX-001-13` | `ATS-ACC-TRX-001-13` |
| `BR-CAP-ACC-TRX-001-14` | `ATS-ACC-TRX-001-14` |
| `BR-CAP-ACC-TRX-001-15` | `ATS-ACC-TRX-001-15` |
| `BR-CAP-ACC-TRX-001-16` | `ATS-ACC-TRX-001-16` |

## Interactions With Related Capabilities

Commerce creates an 80.00 bill. Staff add an eligible 20.00 charge before posting, inspect available actions, render the revised bill and submit it for delivery.

The customer document shows 100.00 and the revised content; the action list reflects the issued bill; the service retry creates no second bill. The complete chain remains proposed until one executable run proves its combined outcomes.
