---
id: ATS-ACC-TRX-016
scope: CAP-ACC-TRX-016
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-016-01
    title: Action lists explain lifecycle and protection
    level: unit
    proves:
      - BR-CAP-ACC-TRX-016-01
    preconditions: >-
      Draft, issued, quote and locked documents exist with administrator and
      reader identities.
    steps:
      - do: Inspect each action list.
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/unit/actions/invoice-actions.spec.js#it
          lists issue, void and delete on a draft locked against updates and
          deletes, each with the lock’s refusal as disabled_reason
    expected: >-
      Eligible transitions vary by standing, locks explain disabled actions and
      the reader receives none.
    negative: false
    data_needs: Documents in each relevant state.
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/unit/actions/invoice-actions.spec.js#it
        offers a draft issue, void and delete, none held back
      - >-
        services-accounting:modules/transactions/tests/unit/actions/invoice-actions.spec.js#it
        offers an issued pro forma convert, void and delete
      - >-
        services-accounting:modules/transactions/tests/unit/actions/invoice-actions.spec.js#it
        lists issue, void and delete on a draft locked against updates and
        deletes, each with the lock’s refusal as disabled_reason
      - >-
        services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js#it
        lists no action to a reader who may perform none
      - TST-ACC-TRX-132
      - TST-ACC-TRX-010
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/unit/actions/invoice-actions.spec.js#it
      lists issue, void and delete on a draft locked against updates and
      deletes, each with the lock’s refusal as disabled_reason
    category: permission
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/unit/actions/invoice-actions.spec.js
        assertion: 'it offers a draft issue, void and delete, none held back'
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/unit/actions/invoice-actions.spec.js#it
          offers a draft issue, void and delete, none held back
      - file: >-
          services-accounting:modules/transactions/tests/unit/actions/invoice-actions.spec.js
        assertion: 'it offers an issued pro forma convert, void and delete'
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/unit/actions/invoice-actions.spec.js#it
          offers an issued pro forma convert, void and delete
      - file: >-
          services-accounting:modules/transactions/tests/unit/actions/invoice-actions.spec.js
        assertion: >-
          it lists issue, void and delete on a draft locked against updates and
          deletes, each with the lock’s refusal as disabled_reason
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/unit/actions/invoice-actions.spec.js#it
          lists issue, void and delete on a draft locked against updates and
          deletes, each with the lock’s refusal as disabled_reason
      - file: >-
          services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js
        assertion: it lists no action to a reader who may perform none
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js#it
          lists no action to a reader who may perform none
    binding_review: []
  - id: ATS-ACC-TRX-016-02
    title: Execution checks authority and current standing
    level: api
    proves:
      - BR-CAP-ACC-TRX-016-02
      - INV-DOM-ACC-TRX-006-11
    preconditions: A reader and already issued invoice are available.
    steps:
      - do: Attempt issue as the reader and issue on the real invoice.
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js#it
          answers 409 to the issue action on an issued invoice
    expected: >-
      Authority failure preserves the draft and lifecycle conflict rejects the
      second issue.
    negative: true
    data_needs: Read and mutation personas.
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js#it
        is refused the issue action by a reader without
        accounting.invoices.adjust (403), the draft unchanged
      - >-
        services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js#it
        answers 409 to the issue action on an issued invoice
      - TST-ACC-TRX-010
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js#it
      answers 409 to the issue action on an issued invoice
    category: validation
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js
        assertion: >-
          it is refused the issue action by a reader without
          accounting.invoices.adjust (403), the draft unchanged
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js#it
          is refused the issue action by a reader without
          accounting.invoices.adjust (403), the draft unchanged
      - file: >-
          services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js
        assertion: it answers 409 to the issue action on an issued invoice
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js#it
          answers 409 to the issue action on an issued invoice
    binding_review: []
  - id: ATS-ACC-TRX-016-03
    title: Read-only pages explain restricted money work
    level: browser
    proves:
      - BR-CAP-ACC-TRX-016-03
    preconditions: Staff hold only inspection authority.
    steps:
      - do: 'Open money records and their entry controls, then try writes.'
        provenance: test
        source: >-
          react-console:acceptance/accounting/playwright/journeys/payments/ACT-ACC-0331.spec.ts#ACT-ACC-0331
    expected: Disabled controls explain restrictions and attempted changes fail.
    negative: true
    data_needs: A read-only staff persona.
    bound_to:
      - >-
        react-console:acceptance/accounting/playwright/journeys/payments/ACT-ACC-0331.spec.ts#ACT-ACC-0331
      - >-
        react-console:acceptance/accounting/playwright/journeys/cross-application/ACT-ACC-0804.spec.ts#ACT-ACC-0804
      - TST-ACC-TRX-263
      - TST-ACC-TRX-209
    provenance: test
    source: >-
      react-console:acceptance/accounting/playwright/journeys/payments/ACT-ACC-0331.spec.ts#ACT-ACC-0331
    category: permission
    test_bindings:
      - file: >-
          react-console:acceptance/accounting/playwright/journeys/payments/ACT-ACC-0331.spec.ts
        assertion: ACT-ACC-0331
        provenance: test
        source: >-
          react-console:acceptance/accounting/playwright/journeys/payments/ACT-ACC-0331.spec.ts#ACT-ACC-0331
      - file: >-
          react-console:acceptance/accounting/playwright/journeys/cross-application/ACT-ACC-0804.spec.ts
        assertion: ACT-ACC-0804
        provenance: test
        source: >-
          react-console:acceptance/accounting/playwright/journeys/cross-application/ACT-ACC-0804.spec.ts#ACT-ACC-0804
    binding_review:
      - binding: >-
          react-console:acceptance/accounting/playwright/journeys/payments/ACT-ACC-0331.spec.ts#ACT-ACC-0331
        completeness: not-verified
        provenance: observed
        source: >-
          react-console:acceptance/accounting/playwright/journeys/payments/ACT-ACC-0331.spec.ts#ACT-ACC-0331
        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.
      - binding: >-
          react-console:acceptance/accounting/playwright/journeys/cross-application/ACT-ACC-0804.spec.ts#ACT-ACC-0804
        completeness: not-verified
        provenance: observed
        source: >-
          react-console:acceptance/accounting/playwright/journeys/cross-application/ACT-ACC-0804.spec.ts#ACT-ACC-0804
        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-016-04
    title: Workspace isolation treats foreign records as absent
    level: api
    proves:
      - BR-CAP-ACC-TRX-016-04
      - INV-DOM-ACC-TRX-006-01
    preconditions: Two independent workspaces hold financial records.
    steps:
      - do: >-
          Read and issue foreign invoices and inspect foreign memos and
          write-offs.
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js#it
          answers 404 to issuing the other tenant’s invoice in this tenant, and
          leaves it a draft
    expected: Absence responses retain all original records.
    negative: true
    data_needs: Separate workspace identities.
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js#it
        answers 404 for the other tenant’s invoice read in this tenant, as for
        an invoice that does not exist
      - >-
        services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js#it
        answers 404 to issuing the other tenant’s invoice in this tenant, and
        leaves it a draft
      - >-
        services-accounting:modules/transactions/tests/e2e/change-memos.e2e.spec.js#it
        reads A’s memo 404 not_found in tenant B
      - >-
        react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0206.spec.ts#ACT-ACC-0206
      - TST-ACC-TRX-010
      - TST-ACC-TRX-003
      - TST-ACC-TRX-235
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js#it
      answers 404 to issuing the other tenant’s invoice in this tenant, and
      leaves it a draft
    category: boundary
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js
        assertion: >-
          it answers 404 for the other tenant’s invoice read in this tenant, as
          for an invoice that does not exist
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js#it
          answers 404 for the other tenant’s invoice read in this tenant, as for
          an invoice that does not exist
      - file: >-
          services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js
        assertion: >-
          it answers 404 to issuing the other tenant’s invoice in this tenant,
          and leaves it a draft
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js#it
          answers 404 to issuing the other tenant’s invoice in this tenant, and
          leaves it a draft
      - file: >-
          services-accounting:modules/transactions/tests/e2e/change-memos.e2e.spec.js
        assertion: it reads A’s memo 404 not_found in tenant B
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/e2e/change-memos.e2e.spec.js#it
          reads A’s memo 404 not_found in tenant B
      - file: >-
          react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0206.spec.ts
        assertion: ACT-ACC-0206
        provenance: test
        source: >-
          react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0206.spec.ts#ACT-ACC-0206
    binding_review:
      - binding: >-
          react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0206.spec.ts#ACT-ACC-0206
        completeness: not-verified
        provenance: observed
        source: >-
          react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0206.spec.ts#ACT-ACC-0206
        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-016-05
    title: Transaction display reflects current money
    level: unit
    proves:
      - BR-CAP-ACC-TRX-016-06
    preconditions: 'Credited, partly paid and refund-reserved records exist.'
    steps:
      - do: Query the combined financial dataset.
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/db/transactions-views-d7.integration.spec.js#it
          answers the same invoice as credited in transactions_v, the list of
          every kind
    expected: >-
      Credited billing has zero open value, partial billing has 40.00 and
      receipt value excludes its reservation.
    negative: false
    data_needs: A dataset reader role.
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/integration/db/transactions-views-d7.integration.spec.js#it
        answers the same invoice as credited in transactions_v, the list of
        every kind
      - >-
        services-accounting:modules/transactions/tests/integration/db/transactions-views-d7.integration.spec.js#it
        keeps an invoice still owing its own display status: 6000.00 applied to
        10000.00 reads partially paid, 40.00 open
      - >-
        services-accounting:modules/transactions/tests/integration/db/transactions-views-d7.integration.spec.js#it
        answers the same payment in transactions_v with the same open amount
      - TST-ACC-TRX-029
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/db/transactions-views-d7.integration.spec.js#it
      answers the same invoice as credited in transactions_v, the list of every
      kind
    category: rule
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/integration/db/transactions-views-d7.integration.spec.js
        assertion: >-
          it answers the same invoice as credited in transactions_v, the list of
          every kind
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/db/transactions-views-d7.integration.spec.js#it
          answers the same invoice as credited in transactions_v, the list of
          every kind
      - file: >-
          services-accounting:modules/transactions/tests/integration/db/transactions-views-d7.integration.spec.js
        assertion: >-
          it keeps an invoice still owing its own display status: 6000.00
          applied to 10000.00 reads partially paid, 40.00 open
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/db/transactions-views-d7.integration.spec.js#it
          keeps an invoice still owing its own display status: 6000.00 applied
          to 10000.00 reads partially paid, 40.00 open
      - file: >-
          services-accounting:modules/transactions/tests/integration/db/transactions-views-d7.integration.spec.js
        assertion: >-
          it answers the same payment in transactions_v with the same open
          amount
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/db/transactions-views-d7.integration.spec.js#it
          answers the same payment in transactions_v with the same open amount
    binding_review: []
  - id: ATS-ACC-TRX-016-06
    title: Dataset context restricts visible rows
    level: unit
    proves:
      - BR-CAP-ACC-TRX-016-07
      - INV-DOM-ACC-TRX-006-14
    preconditions: Readers operate in either workspace or no workspace.
    steps:
      - do: Read the transaction datasets in each context.
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/db/transactions-view.integration.spec.js#it
          answers tenant B’s reader its own invoice alone, its customer’s name
          null where CRM has no such contact
    expected: Each workspace exposes its own records and absent context exposes none.
    negative: true
    data_needs: Database query personas.
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/integration/db/transactions-view.integration.spec.js#it
        answers tenant B’s reader its own invoice alone, its customer’s name
        null where CRM has no such contact
      - >-
        services-accounting:modules/transactions/tests/integration/db/transactions-view.integration.spec.js#it
        answers a query reader in no tenant nothing at all
      - TST-ACC-TRX-028
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/db/transactions-view.integration.spec.js#it
      answers tenant B’s reader its own invoice alone, its customer’s name null
      where CRM has no such contact
    category: boundary
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/integration/db/transactions-view.integration.spec.js
        assertion: >-
          it answers tenant B’s reader its own invoice alone, its customer’s
          name null where CRM has no such contact
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/db/transactions-view.integration.spec.js#it
          answers tenant B’s reader its own invoice alone, its customer’s name
          null where CRM has no such contact
      - file: >-
          services-accounting:modules/transactions/tests/integration/db/transactions-view.integration.spec.js
        assertion: it answers a query reader in no tenant nothing at all
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/db/transactions-view.integration.spec.js#it
          answers a query reader in no tenant nothing at all
    binding_review: []
  - id: ATS-ACC-TRX-016-07
    title: Internal history keeps document boundaries
    level: api
    proves:
      - BR-CAP-ACC-TRX-016-08
    preconditions: 'An invoice was created, issued and credited.'
    steps:
      - do: Read its retained document events.
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/persistence/document-events.queries.integration.spec.js#it
          lists the invoice’s three events oldest first, not the credit memo’s
          of the same id nor another tenant’s
    expected: >-
      Three ordered events carry attribution and omit unrelated kind or
      workspace events.
    negative: false
    data_needs: A transaction with adjustment history.
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/integration/services/persistence/document-events.queries.integration.spec.js#it
        lists the invoice’s three events oldest first, not the credit memo’s of
        the same id nor another tenant’s
      - >-
        services-accounting:modules/transactions/tests/integration/services/persistence/document-events.queries.integration.spec.js#it
        records the reason given and no payload when none is given
      - TST-ACC-TRX-091
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/persistence/document-events.queries.integration.spec.js#it
      lists the invoice’s three events oldest first, not the credit memo’s of
      the same id nor another tenant’s
    category: invariant
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/persistence/document-events.queries.integration.spec.js
        assertion: >-
          it lists the invoice’s three events oldest first, not the credit
          memo’s of the same id nor another tenant’s
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/persistence/document-events.queries.integration.spec.js#it
          lists the invoice’s three events oldest first, not the credit memo’s
          of the same id nor another tenant’s
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/persistence/document-events.queries.integration.spec.js
        assertion: it records the reason given and no payload when none is given
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/persistence/document-events.queries.integration.spec.js#it
          records the reason given and no payload when none is given
    binding_review: []
  - id: ATS-ACC-TRX-016-08
    title: Discovery stays consistent with later correction and service work
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-TRX-016-01
      - BR-CAP-ACC-TRX-016-02
      - BR-CAP-ACC-TRX-016-06
      - BR-CAP-ACC-TRX-015-03
      - BR-CAP-ACC-TRX-015-04
      - BR-CAP-ACC-TRX-017-01
      - BR-CAP-ACC-TRX-020-02
      - BR-CAP-ACC-TRX-020-06
    exercises:
      - CAP-ACC-TRX-016
      - CAP-ACC-TRX-015
      - CAP-ACC-TRX-017
      - 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: >-
          Read financial standing and transaction rows after a service-created
          bill and receipt. Move the receipt to another batch, reload available
          actions, then change eligibility before executing an earlier action.
        provenance: proposed
        source: >-
          services-accounting:modules/transactions/tests/unit/actions/invoice-actions.spec.js#it
          lists issue, void and delete on a draft locked against updates and
          deletes, each with the lock’s refusal as disabled_reason;
          services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js#it
          answers 409 to the issue action on an issued invoice;
          services-accounting:modules/transactions/tests/integration/db/transactions-views-d7.integration.spec.js#it
          answers the same invoice as credited in transactions_v, the list of
          every kind;
          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-016-find-transactions-and-see-what-can-be-done-next.md#BR-CAP-ACC-TRX-016-06;
          rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-015-move-a-transaction-to-another-batch-and-correct-its-details.md#BR-CAP-ACC-TRX-015-03;
          rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-015-move-a-transaction-to-another-batch-and-correct-its-details.md#BR-CAP-ACC-TRX-015-04;
          rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-017-know-where-a-customer-stands.md#BR-CAP-ACC-TRX-017-01;
          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-06
    expected: >-
      Displayed position still agrees with the financial records after movement;
      the changed action is rechecked and refused; the original service
      attribution remains retained.
    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/unit/actions/invoice-actions.spec.js#it
      lists issue, void and delete on a draft locked against updates and
      deletes, each with the lock’s refusal as disabled_reason;
      services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js#it
      answers 409 to the issue action on an issued invoice;
      services-accounting:modules/transactions/tests/integration/db/transactions-views-d7.integration.spec.js#it
      answers the same invoice as credited in transactions_v, the list of every
      kind;
      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-016-find-transactions-and-see-what-can-be-done-next.md#BR-CAP-ACC-TRX-016-06;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-015-move-a-transaction-to-another-batch-and-correct-its-details.md#BR-CAP-ACC-TRX-015-03;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-015-move-a-transaction-to-another-batch-and-correct-its-details.md#BR-CAP-ACC-TRX-015-04;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-017-know-where-a-customer-stands.md#BR-CAP-ACC-TRX-017-01;
      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-06
    test_bindings: []
    binding_review: []
evidence:
  - >-
    services-accounting at f47cb263875bbc0c5640fba7dae6785ec32695f8: the test
    files named in bound_to.
  - >-
    react-console at baf6dae382d6f41dce976c7f848667ccc37e076f: the Playwright
    journeys ACT-ACC-0206, 0331, 0804.
  - >-
    rhythm-v2-docs:specs/accounting/transactions/design: related workflows,
    domain invariants and state transitions examined for the back-fill.
coverage:
  rule: covered
  transition: not-applicable
  validation: covered
  permission: covered
  edge: 'gap: FND-ACC-TRX-081'
  failure: 'gap: FND-ACC-TRX-081'
  boundary: covered
  concurrency: 'gap: FND-ACC-TRX-081'
  invariant: covered
  interaction: covered
coverage_notes:
  transition: >-
    Discovery and action description are read operations; transitions belong to
    the commands they expose.
  edge: >-
    No dedicated edge scenario covers the applicable conditions; the finding
    identifies the remaining specification work.
  failure: >-
    No dedicated failure scenario covers the applicable conditions; the finding
    identifies the remaining specification work.
  concurrency: >-
    No dedicated concurrency scenario covers the applicable conditions; the
    finding identifies the remaining specification work.
interaction_coverage:
  - to: CAP-ACC-TRX-015
    scenarios:
      - ATS-ACC-TRX-016-08
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/unit/actions/invoice-actions.spec.js#it
      lists issue, void and delete on a draft locked against updates and
      deletes, each with the lock’s refusal as disabled_reason;
      services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js#it
      answers 409 to the issue action on an issued invoice;
      services-accounting:modules/transactions/tests/integration/db/transactions-views-d7.integration.spec.js#it
      answers the same invoice as credited in transactions_v, the list of every
      kind;
      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-016-find-transactions-and-see-what-can-be-done-next.md#BR-CAP-ACC-TRX-016-06;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-015-move-a-transaction-to-another-batch-and-correct-its-details.md#BR-CAP-ACC-TRX-015-03;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-015-move-a-transaction-to-another-batch-and-correct-its-details.md#BR-CAP-ACC-TRX-015-04;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-017-know-where-a-customer-stands.md#BR-CAP-ACC-TRX-017-01;
      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-06
  - to: CAP-ACC-TRX-017
    scenarios:
      - ATS-ACC-TRX-016-08
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/unit/actions/invoice-actions.spec.js#it
      lists issue, void and delete on a draft locked against updates and
      deletes, each with the lock’s refusal as disabled_reason;
      services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js#it
      answers 409 to the issue action on an issued invoice;
      services-accounting:modules/transactions/tests/integration/db/transactions-views-d7.integration.spec.js#it
      answers the same invoice as credited in transactions_v, the list of every
      kind;
      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-016-find-transactions-and-see-what-can-be-done-next.md#BR-CAP-ACC-TRX-016-06;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-015-move-a-transaction-to-another-batch-and-correct-its-details.md#BR-CAP-ACC-TRX-015-03;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-015-move-a-transaction-to-another-batch-and-correct-its-details.md#BR-CAP-ACC-TRX-015-04;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-017-know-where-a-customer-stands.md#BR-CAP-ACC-TRX-017-01;
      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-06
  - to: CAP-ACC-TRX-020
    scenarios:
      - ATS-ACC-TRX-016-08
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/unit/actions/invoice-actions.spec.js#it
      lists issue, void and delete on a draft locked against updates and
      deletes, each with the lock’s refusal as disabled_reason;
      services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js#it
      answers 409 to the issue action on an issued invoice;
      services-accounting:modules/transactions/tests/integration/db/transactions-views-d7.integration.spec.js#it
      answers the same invoice as credited in transactions_v, the list of every
      kind;
      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-016-find-transactions-and-see-what-can-be-done-next.md#BR-CAP-ACC-TRX-016-06;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-015-move-a-transaction-to-another-batch-and-correct-its-details.md#BR-CAP-ACC-TRX-015-03;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-015-move-a-transaction-to-another-batch-and-correct-its-details.md#BR-CAP-ACC-TRX-015-04;
      rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-017-know-where-a-customer-stands.md#BR-CAP-ACC-TRX-017-01;
      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-06
transition_coverage: []
permission_coverage:
  - key: accounting.invoices.read
    where_checked: api
    gap: FND-ACC-TRX-081
    provenance: unknown
    source: FND-ACC-TRX-081
    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-016-find-transactions-and-see-what-can-be-done-next.md#CAP-ACC-TRX-016
  - key: accounting.transactions.query
    where_checked: service
    gap: FND-ACC-TRX-081
    provenance: unknown
    source: FND-ACC-TRX-081
    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-016-find-transactions-and-see-what-can-be-done-next.md#CAP-ACC-TRX-016
  - key: accounting.invoices.query
    where_checked: service
    gap: FND-ACC-TRX-081
    provenance: unknown
    source: FND-ACC-TRX-081
    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-016-find-transactions-and-see-what-can-be-done-next.md#CAP-ACC-TRX-016
  - key: accounting.payments.query
    where_checked: service
    gap: FND-ACC-TRX-081
    provenance: unknown
    source: FND-ACC-TRX-081
    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-016-find-transactions-and-see-what-can-be-done-next.md#CAP-ACC-TRX-016
  - key: accounting.credits.query
    where_checked: service
    gap: FND-ACC-TRX-081
    provenance: unknown
    source: FND-ACC-TRX-081
    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-016-find-transactions-and-see-what-can-be-done-next.md#CAP-ACC-TRX-016
  - key: accounting.credit-applications.query
    where_checked: service
    gap: FND-ACC-TRX-081
    provenance: unknown
    source: FND-ACC-TRX-081
    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-016-find-transactions-and-see-what-can-be-done-next.md#CAP-ACC-TRX-016
  - key: accounting.credit-memos.query
    where_checked: service
    gap: FND-ACC-TRX-081
    provenance: unknown
    source: FND-ACC-TRX-081
    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-016-find-transactions-and-see-what-can-be-done-next.md#CAP-ACC-TRX-016
  - key: accounting.debit-memos.query
    where_checked: service
    gap: FND-ACC-TRX-081
    provenance: unknown
    source: FND-ACC-TRX-081
    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-016-find-transactions-and-see-what-can-be-done-next.md#CAP-ACC-TRX-016
  - key: accounting.write-offs.query
    where_checked: service
    gap: FND-ACC-TRX-081
    provenance: unknown
    source: FND-ACC-TRX-081
    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-016-find-transactions-and-see-what-can-be-done-next.md#CAP-ACC-TRX-016
  - key: accounting.refunds.query
    where_checked: service
    gap: FND-ACC-TRX-081
    provenance: unknown
    source: FND-ACC-TRX-081
    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-016-find-transactions-and-see-what-can-be-done-next.md#CAP-ACC-TRX-016
rule_coverage:
  - rule: BR-CAP-ACC-TRX-016-01
    scenarios:
      - ATS-ACC-TRX-016-01
      - ATS-ACC-TRX-016-08
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/unit/actions/invoice-actions.spec.js#it
      lists issue, void and delete on a draft locked against updates and
      deletes, each with the lock’s refusal as disabled_reason
  - rule: BR-CAP-ACC-TRX-016-02
    scenarios:
      - ATS-ACC-TRX-016-02
      - ATS-ACC-TRX-016-08
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js#it
      answers 409 to the issue action on an issued invoice
  - rule: BR-CAP-ACC-TRX-016-03
    scenarios:
      - ATS-ACC-TRX-016-03
    provenance: proposed
    source: >-
      react-console:acceptance/accounting/playwright/journeys/payments/ACT-ACC-0331.spec.ts#ACT-ACC-0331
  - rule: BR-CAP-ACC-TRX-016-04
    scenarios:
      - ATS-ACC-TRX-016-04
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js#it
      answers 404 to issuing the other tenant’s invoice in this tenant, and
      leaves it a draft
  - rule: BR-CAP-ACC-TRX-016-06
    scenarios:
      - ATS-ACC-TRX-016-05
      - ATS-ACC-TRX-016-08
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/db/transactions-views-d7.integration.spec.js#it
      answers the same invoice as credited in transactions_v, the list of every
      kind
  - rule: BR-CAP-ACC-TRX-016-07
    scenarios:
      - ATS-ACC-TRX-016-06
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/db/transactions-view.integration.spec.js#it
      answers tenant B’s reader its own invoice alone, its customer’s name null
      where CRM has no such contact
  - rule: BR-CAP-ACC-TRX-016-08
    scenarios:
      - ATS-ACC-TRX-016-07
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/services/persistence/document-events.queries.integration.spec.js#it
      lists the invoice’s three events oldest first, not the credit memo’s of
      the same id nor another tenant’s
executable_gaps:
  - scenario: ATS-ACC-TRX-016-08
    gap: FND-ACC-TRX-081
    provenance: unknown
    source: FND-ACC-TRX-081
    evidence:
      - >-
        services-accounting:modules/transactions/tests/unit/actions/invoice-actions.spec.js#it
        lists issue, void and delete on a draft locked against updates and
        deletes, each with the lock’s refusal as disabled_reason;
        services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js#it
        answers 409 to the issue action on an issued invoice;
        services-accounting:modules/transactions/tests/integration/db/transactions-views-d7.integration.spec.js#it
        answers the same invoice as credited in transactions_v, the list of
        every kind
invariant_coverage:
  - invariant: INV-DOM-ACC-TRX-006-01
    scenarios:
      - ATS-ACC-TRX-016-04
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js#it
      answers 404 to issuing the other tenant’s invoice in this tenant, and
      leaves it a draft
    note: >-
      The cited scenario and its constituent test assertions are the proof
      boundary.
  - invariant: INV-DOM-ACC-TRX-006-11
    scenarios:
      - ATS-ACC-TRX-016-02
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js#it
      answers 409 to the issue action on an issued invoice
    note: >-
      The cited scenario and its constituent test assertions are the proof
      boundary.
  - invariant: INV-DOM-ACC-TRX-006-14
    scenarios:
      - ATS-ACC-TRX-016-06
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/db/transactions-view.integration.spec.js#it
      answers tenant B’s reader its own invoice alone, its customer’s name null
      where CRM has no such contact
    note: >-
      The cited scenario and its constituent test assertions are the proof
      boundary.
---

# Find money records and understand available work: 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-016-01` | `ATS-ACC-TRX-016-01`, `ATS-ACC-TRX-016-08` |
| `BR-CAP-ACC-TRX-016-02` | `ATS-ACC-TRX-016-02`, `ATS-ACC-TRX-016-08` |
| `BR-CAP-ACC-TRX-016-03` | `ATS-ACC-TRX-016-03` |
| `BR-CAP-ACC-TRX-016-04` | `ATS-ACC-TRX-016-04` |
| `BR-CAP-ACC-TRX-016-06` | `ATS-ACC-TRX-016-05`, `ATS-ACC-TRX-016-08` |
| `BR-CAP-ACC-TRX-016-07` | `ATS-ACC-TRX-016-06` |
| `BR-CAP-ACC-TRX-016-08` | `ATS-ACC-TRX-016-07` |

## Interactions With Related Capabilities

Read financial standing and transaction rows after a service-created bill and receipt. Move the receipt to another batch, reload available actions, then change eligibility before executing an earlier action.

Displayed position still agrees with the financial records after movement; the changed action is rechecked and refused; the original service attribution remains retained. The complete chain remains proposed until one executable run proves its combined outcomes.
