---
id: ATS-ACC-TRX-015
scope: CAP-ACC-TRX-015
product_area: accounting
module: transactions
revision: 1
status: proposed
approved_by: null
approved_at: null
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
scenarios:
  - id: ATS-ACC-TRX-015-01
    title: Batch eligibility distinguishes transaction destinations
    level: api
    proves:
      - BR-CAP-ACC-TRX-015-01
      - INV-DOM-ACC-TRX-006-07
    preconditions: >-
      Batches span open, error, closed, posted, period-close and foreign-unit
      cases.
    steps:
      - do: 'Check invoice, memo and write-off destinations.'
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
          refuses a system batch, which is period close’s: a transaction batch
          only (batch_not_open)
    expected: Only open and error transaction destinations qualify.
    negative: false
    data_needs: Batches representing each lifecycle and purpose.
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
        accepts an open transaction batch of the unit
      - >-
        services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
        accepts a batch of the unit in error, as Rhythm 1.0 did
      - >-
        services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
        refuses a closed batch (batch_not_open), in 1.0’s sentence
      - >-
        services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
        refuses a posted batch (batch_not_open)
      - >-
        services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
        refuses a system batch, which is period close’s: a transaction batch
        only (batch_not_open)
      - >-
        services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
        refuses an open batch of another business unit (batch_not_open)
      - TST-ACC-TRX-030
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
      refuses a system batch, which is period close’s: a transaction batch only
      (batch_not_open)
    category: validation
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js
        assertion: it accepts an open transaction batch of the unit
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
          accepts an open transaction batch of the unit
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js
        assertion: 'it accepts a batch of the unit in error, as Rhythm 1.0 did'
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
          accepts a batch of the unit in error, as Rhythm 1.0 did
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js
        assertion: 'it refuses a closed batch (batch_not_open), in 1.0’s sentence'
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
          refuses a closed batch (batch_not_open), in 1.0’s sentence
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js
        assertion: it refuses a posted batch (batch_not_open)
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
          refuses a posted batch (batch_not_open)
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js
        assertion: >-
          it refuses a system batch, which is period close’s: a transaction
          batch only (batch_not_open)
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
          refuses a system batch, which is period close’s: a transaction batch
          only (batch_not_open)
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js
        assertion: it refuses an open batch of another business unit (batch_not_open)
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
          refuses an open batch of another business unit (batch_not_open)
    binding_review: []
  - id: ATS-ACC-TRX-015-02
    title: Assignment resolves each document kind
    level: api
    proves:
      - BR-CAP-ACC-TRX-015-02
    preconditions: Default and memo-specific recurring rules exist.
    steps:
      - do: >-
          Create without explicit batches, close the selected memo batch and
          create again.
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
          is refused batch_required once the chosen recurring batch’s active
          batch is closed (BA-12), naming the reason
    expected: >-
      Default and kind-specific choices apply, then the closed assignment fails
      with explanation.
    negative: false
    data_needs: Recurring batch assignments.
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
        gives an invoice, which no rule matches, the active batch of the default
        recurring batch
      - >-
        services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
        gives a credit memo the active batch of the recurring batch its rule
        chooses
      - >-
        services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
        is refused batch_required once the chosen recurring batch’s active batch
        is closed (BA-12), naming the reason
      - TST-ACC-TRX-030
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
      is refused batch_required once the chosen recurring batch’s active batch
      is closed (BA-12), naming the reason
    category: rule
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js
        assertion: >-
          it gives an invoice, which no rule matches, the active batch of the
          default recurring batch
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
          gives an invoice, which no rule matches, the active batch of the
          default recurring batch
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js
        assertion: >-
          it gives a credit memo the active batch of the recurring batch its
          rule chooses
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
          gives a credit memo the active batch of the recurring batch its rule
          chooses
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js
        assertion: >-
          it is refused batch_required once the chosen recurring batch’s active
          batch is closed (BA-12), naming the reason
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
          is refused batch_required once the chosen recurring batch’s active
          batch is closed (BA-12), naming the reason
    binding_review: []
  - id: ATS-ACC-TRX-015-03
    title: Movement preserves the posting boundary
    level: api
    proves:
      - BR-CAP-ACC-TRX-015-03
      - INV-DOM-ACC-TRX-006-08
    preconditions: Supported records exist in open and posted batches.
    steps:
      - do: >-
          Move eligible records, move into and out of posted context and
          reselect the current batch.
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
          is refused batch_not_open on a reassignment out of the batch
    expected: >-
      Eligible moves retain events, posted moves fail and current-batch
      selection changes nothing.
    negative: false
    data_needs: Open and posted contexts.
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
        moves an invoice to alpha-2026-03 and writes its event
      - >-
        services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
        moves a credit application to alpha-2026-03 and writes its event
      - >-
        services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
        is refused batch_not_open on a reassignment out of the batch
      - >-
        services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
        is refused batch_not_open as a target of a reassignment
      - >-
        services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
        answers the payment unchanged when the batch named is its own
      - TST-ACC-TRX-039
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
      is refused batch_not_open on a reassignment out of the batch
    category: transition
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js
        assertion: it moves an invoice to alpha-2026-03 and writes its event
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
          moves an invoice to alpha-2026-03 and writes its event
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js
        assertion: it moves a credit application to alpha-2026-03 and writes its event
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
          moves a credit application to alpha-2026-03 and writes its event
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js
        assertion: it is refused batch_not_open on a reassignment out of the batch
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
          is refused batch_not_open on a reassignment out of the batch
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js
        assertion: it is refused batch_not_open as a target of a reassignment
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
          is refused batch_not_open as a target of a reassignment
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js
        assertion: it answers the payment unchanged when the batch named is its own
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
          answers the payment unchanged when the batch named is its own
    binding_review: []
  - id: ATS-ACC-TRX-015-04
    title: Receipt movement includes its original applications
    level: api
    proves:
      - BR-CAP-ACC-TRX-015-04
    preconditions: Payment and allocations share a batch.
    steps:
      - do: Move the payment and replay its request.
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
          moves the allocation rows batched with it
    expected: >-
      Applications move with one event and no receivable difference; replay adds
      nothing.
    negative: false
    data_needs: A payment with batched allocation rows.
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
        moves the allocation rows batched with it
      - >-
        services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
        writes the reassign event with both batches and the rows moved, and no
        fact
      - >-
        services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
        replays the same key without moving again
      - TST-ACC-TRX-039
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
      moves the allocation rows batched with it
    category: invariant
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js
        assertion: it moves the allocation rows batched with it
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
          moves the allocation rows batched with it
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js
        assertion: >-
          it writes the reassign event with both batches and the rows moved, and
          no fact
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
          writes the reassign event with both batches and the rows moved, and no
          fact
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js
        assertion: it replays the same key without moving again
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
          replays the same key without moving again
    binding_review: []
  - id: ATS-ACC-TRX-015-05
    title: Inactive money cannot change batch
    level: api
    proves:
      - BR-CAP-ACC-TRX-015-05
    preconditions: The receipt is voided.
    steps:
      - do: Select another batch.
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
          refuses a void payment
    expected: The move is refused.
    negative: true
    data_needs: A retained void receipt.
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
        refuses a void payment
      - TST-ACC-TRX-039
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
      refuses a void payment
    category: validation
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js
        assertion: it refuses a void payment
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
          refuses a void payment
    binding_review: []
  - id: ATS-ACC-TRX-015-06
    title: Descriptive correction cannot erase required explanation
    level: api
    proves:
      - BR-CAP-ACC-TRX-015-06
      - INV-DOM-ACC-TRX-006-10
    preconditions: Payment and credit records exist.
    steps:
      - do: >-
          Change reference and notes, clear optional memo and attempt to clear
          the credit reason while editing its memo.
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
          never clears a required field (a credit’s reason), and changes its
          memo
    expected: >-
      Payment text changes without money movement; the required reason survives
      and valid memo changes remain.
    negative: false
    data_needs: Editable financial records.
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
        changes the reference number and notes, clears the memo, and leaves the
        money
      - >-
        services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
        never clears a required field (a credit’s reason), and changes its memo
      - >-
        services-accounting:modules/transactions/tests/e2e/payments.e2e.spec.js#it
        sets, then clears, the memo and notes of a succeeded payment when the
        console sends them blank (PUT .../details)
      - TST-ACC-TRX-039
      - TST-ACC-TRX-012
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
      never clears a required field (a credit’s reason), and changes its memo
    category: edge
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js
        assertion: >-
          it changes the reference number and notes, clears the memo, and leaves
          the money
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
          changes the reference number and notes, clears the memo, and leaves
          the money
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js
        assertion: >-
          it never clears a required field (a credit’s reason), and changes its
          memo
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
          never clears a required field (a credit’s reason), and changes its
          memo
      - file: >-
          services-accounting:modules/transactions/tests/e2e/payments.e2e.spec.js
        assertion: >-
          it sets, then clears, the memo and notes of a succeeded payment when
          the console sends them blank (PUT .../details)
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/e2e/payments.e2e.spec.js#it
          sets, then clears, the memo and notes of a succeeded payment when the
          console sends them blank (PUT .../details)
    binding_review: []
  - id: ATS-ACC-TRX-015-07
    title: Date correction restates history in an eligible period
    level: api
    proves:
      - BR-CAP-ACC-TRX-015-07
      - INV-DOM-ACC-TRX-006-09
    preconditions: An unposted payment and memo face open and uncovered dates.
    steps:
      - do: >-
          Move their dates and read historical positions, then select the
          uncovered period.
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
          negates the facts on the old accounting date and restates them on the
          new one, the originals untouched
    expected: Opposing entries relocate the position; invalid period selection fails.
    negative: false
    data_needs: Fiscal dates spanning open and absent periods.
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
        negates the facts on the old accounting date and restates them on the
        new one, the originals untouched
      - >-
        services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
        is read as of the new date and no longer as of the old one
      - >-
        services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
        moves a credit memo’s accounting date, re-dating its facts
      - >-
        services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
        refuses an accounting date no fiscal period covers (period_not_open)
      - TST-ACC-TRX-039
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
      negates the facts on the old accounting date and restates them on the new
      one, the originals untouched
    category: transition
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js
        assertion: >-
          it negates the facts on the old accounting date and restates them on
          the new one, the originals untouched
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
          negates the facts on the old accounting date and restates them on the
          new one, the originals untouched
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js
        assertion: it is read as of the new date and no longer as of the old one
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
          is read as of the new date and no longer as of the old one
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js
        assertion: 'it moves a credit memo’s accounting date, re-dating its facts'
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
          moves a credit memo’s accounting date, re-dating its facts
      - file: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js
        assertion: >-
          it refuses an accounting date no fiscal period covers
          (period_not_open)
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
          refuses an accounting date no fiscal period covers (period_not_open)
    binding_review: []
  - id: ATS-ACC-TRX-015-08
    title: Update access controls movement and details
    level: api
    proves:
      - BR-CAP-ACC-TRX-015-08
    preconditions: The caller can inspect payments and memos.
    steps:
      - do: Request batch and descriptive corrections.
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/e2e/payments.e2e.spec.js#it
          is refused the batch and details routes without
          accounting.payments.update (403)
    expected: Each write is denied.
    negative: true
    data_needs: A transaction reader.
    bound_to:
      - >-
        services-accounting:modules/transactions/tests/e2e/payments.e2e.spec.js#it
        is refused the batch and details routes without
        accounting.payments.update (403)
      - >-
        services-accounting:modules/transactions/tests/e2e/change-memos.e2e.spec.js#it
        is refused the create, the void, the details and the batch routes 403
        permission_missing
      - TST-ACC-TRX-012
      - TST-ACC-TRX-003
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/e2e/payments.e2e.spec.js#it
      is refused the batch and details routes without accounting.payments.update
      (403)
    category: permission
    test_bindings:
      - file: >-
          services-accounting:modules/transactions/tests/e2e/payments.e2e.spec.js
        assertion: >-
          it is refused the batch and details routes without
          accounting.payments.update (403)
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/e2e/payments.e2e.spec.js#it
          is refused the batch and details routes without
          accounting.payments.update (403)
      - file: >-
          services-accounting:modules/transactions/tests/e2e/change-memos.e2e.spec.js
        assertion: >-
          it is refused the create, the void, the details and the batch routes
          403 permission_missing
        provenance: test
        source: >-
          services-accounting:modules/transactions/tests/e2e/change-memos.e2e.spec.js#it
          is refused the create, the void, the details and the batch routes 403
          permission_missing
    binding_review: []
  - id: ATS-ACC-TRX-015-09
    title: Batch state changes the work a reader can execute
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-TRX-015-01
      - BR-CAP-ACC-TRX-015-03
      - BR-CAP-ACC-TRX-015-04
      - BR-CAP-ACC-TRX-002-04
      - BR-CAP-ACC-TRX-016-01
      - BR-CAP-ACC-TRX-016-02
    exercises:
      - CAP-ACC-TRX-015
      - CAP-ACC-TRX-002
      - CAP-ACC-TRX-016
    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: >-
          Move an unposted invoice and receipt to another eligible batch,
          inspect actions, then post the destination and attempt invoice
          amendment and another move.
        provenance: proposed
        source: >-
          services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
          refuses a system batch, which is period close’s: a transaction batch
          only (batch_not_open);
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
          is refused batch_not_open on a reassignment out of the batch;
          services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
          moves the allocation rows batched with it;
          rhythm-v2-docs:specs/accounting/transactions/design/workflows/WF-ACC-TRX-002-amend-re-date-or-void-an-issued-invoice.md#WF-ACC-TRX-002;
          rhythm-v2-docs:specs/accounting/transactions/design/workflows/WF-ACC-TRX-017-move-a-document-to-another-batch-and-correct-its-details.md#WF-ACC-TRX-017;
          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-01;
          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-002-correct-or-cancel-an-issued-invoice-before-its-batch-posts.md#BR-CAP-ACC-TRX-002-04;
          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
    expected: >-
      The earlier moves retain financial value; current eligibility refuses
      amendment and movement after posting even if a previously read action was
      enabled.
    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/batches-for-documents.integration.spec.js#it
      refuses a system batch, which is period close’s: a transaction batch only
      (batch_not_open);
      services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
      is refused batch_not_open on a reassignment out of the batch;
      services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
      moves the allocation rows batched with it;
      rhythm-v2-docs:specs/accounting/transactions/design/workflows/WF-ACC-TRX-002-amend-re-date-or-void-an-issued-invoice.md#WF-ACC-TRX-002;
      rhythm-v2-docs:specs/accounting/transactions/design/workflows/WF-ACC-TRX-017-move-a-document-to-another-batch-and-correct-its-details.md#WF-ACC-TRX-017;
      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-01;
      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-002-correct-or-cancel-an-issued-invoice-before-its-batch-posts.md#BR-CAP-ACC-TRX-002-04;
      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
    test_bindings: []
    binding_review: []
evidence:
  - >-
    services-accounting at f47cb263875bbc0c5640fba7dae6785ec32695f8: the test
    files named in bound_to.
  - >-
    rhythm-v2-docs:specs/accounting/transactions/design: related workflows,
    domain invariants and state transitions examined for the back-fill.
coverage:
  rule: covered
  transition: covered
  validation: covered
  permission: covered
  edge: covered
  failure: 'gap: FND-ACC-TRX-080'
  boundary: 'gap: FND-ACC-TRX-080'
  concurrency: 'gap: FND-ACC-TRX-080'
  invariant: covered
  interaction: covered
coverage_notes:
  failure: >-
    No dedicated failure scenario covers the applicable conditions; the finding
    identifies the remaining specification work.
  boundary: >-
    No dedicated boundary 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-002
    scenarios:
      - ATS-ACC-TRX-015-09
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
      refuses a system batch, which is period close’s: a transaction batch only
      (batch_not_open);
      services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
      is refused batch_not_open on a reassignment out of the batch;
      services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
      moves the allocation rows batched with it;
      rhythm-v2-docs:specs/accounting/transactions/design/workflows/WF-ACC-TRX-002-amend-re-date-or-void-an-issued-invoice.md#WF-ACC-TRX-002;
      rhythm-v2-docs:specs/accounting/transactions/design/workflows/WF-ACC-TRX-017-move-a-document-to-another-batch-and-correct-its-details.md#WF-ACC-TRX-017;
      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-01;
      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-002-correct-or-cancel-an-issued-invoice-before-its-batch-posts.md#BR-CAP-ACC-TRX-002-04;
      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
  - to: CAP-ACC-TRX-016
    scenarios:
      - ATS-ACC-TRX-015-09
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
      refuses a system batch, which is period close’s: a transaction batch only
      (batch_not_open);
      services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
      is refused batch_not_open on a reassignment out of the batch;
      services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
      moves the allocation rows batched with it;
      rhythm-v2-docs:specs/accounting/transactions/design/workflows/WF-ACC-TRX-002-amend-re-date-or-void-an-issued-invoice.md#WF-ACC-TRX-002;
      rhythm-v2-docs:specs/accounting/transactions/design/workflows/WF-ACC-TRX-017-move-a-document-to-another-batch-and-correct-its-details.md#WF-ACC-TRX-017;
      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-01;
      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-002-correct-or-cancel-an-issued-invoice-before-its-batch-posts.md#BR-CAP-ACC-TRX-002-04;
      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
transition_coverage: []
permission_coverage:
  - key: accounting.invoices.update
    where_checked: api
    gap: FND-ACC-TRX-080
    provenance: unknown
    source: FND-ACC-TRX-080
    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-015-move-a-transaction-to-another-batch-and-correct-its-details.md#CAP-ACC-TRX-015
  - key: accounting.credit-memos.update
    where_checked: api
    gap: FND-ACC-TRX-080
    provenance: unknown
    source: FND-ACC-TRX-080
    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-015-move-a-transaction-to-another-batch-and-correct-its-details.md#CAP-ACC-TRX-015
  - key: accounting.debit-memos.update
    where_checked: api
    gap: FND-ACC-TRX-080
    provenance: unknown
    source: FND-ACC-TRX-080
    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-015-move-a-transaction-to-another-batch-and-correct-its-details.md#CAP-ACC-TRX-015
  - key: accounting.write-offs.update
    where_checked: api
    gap: FND-ACC-TRX-080
    provenance: unknown
    source: FND-ACC-TRX-080
    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-015-move-a-transaction-to-another-batch-and-correct-its-details.md#CAP-ACC-TRX-015
  - key: accounting.payments.update
    where_checked: api
    gap: FND-ACC-TRX-080
    provenance: unknown
    source: FND-ACC-TRX-080
    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-015-move-a-transaction-to-another-batch-and-correct-its-details.md#CAP-ACC-TRX-015
  - key: accounting.credits.update
    where_checked: api
    gap: FND-ACC-TRX-080
    provenance: unknown
    source: FND-ACC-TRX-080
    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-015-move-a-transaction-to-another-batch-and-correct-its-details.md#CAP-ACC-TRX-015
  - key: accounting.credit-applications.update
    where_checked: api
    gap: FND-ACC-TRX-080
    provenance: unknown
    source: FND-ACC-TRX-080
    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-015-move-a-transaction-to-another-batch-and-correct-its-details.md#CAP-ACC-TRX-015
rule_coverage:
  - rule: BR-CAP-ACC-TRX-015-01
    scenarios:
      - ATS-ACC-TRX-015-01
      - ATS-ACC-TRX-015-09
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
      refuses a system batch, which is period close’s: a transaction batch only
      (batch_not_open)
  - rule: BR-CAP-ACC-TRX-015-02
    scenarios:
      - ATS-ACC-TRX-015-02
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
      is refused batch_required once the chosen recurring batch’s active batch
      is closed (BA-12), naming the reason
  - rule: BR-CAP-ACC-TRX-015-03
    scenarios:
      - ATS-ACC-TRX-015-03
      - ATS-ACC-TRX-015-09
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
      is refused batch_not_open on a reassignment out of the batch
  - rule: BR-CAP-ACC-TRX-015-04
    scenarios:
      - ATS-ACC-TRX-015-04
      - ATS-ACC-TRX-015-09
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
      moves the allocation rows batched with it
  - rule: BR-CAP-ACC-TRX-015-05
    scenarios:
      - ATS-ACC-TRX-015-05
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
      refuses a void payment
  - rule: BR-CAP-ACC-TRX-015-06
    scenarios:
      - ATS-ACC-TRX-015-06
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
      never clears a required field (a credit’s reason), and changes its memo
  - rule: BR-CAP-ACC-TRX-015-07
    scenarios:
      - ATS-ACC-TRX-015-07
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
      negates the facts on the old accounting date and restates them on the new
      one, the originals untouched
  - rule: BR-CAP-ACC-TRX-015-08
    scenarios:
      - ATS-ACC-TRX-015-08
    provenance: proposed
    source: >-
      services-accounting:modules/transactions/tests/e2e/payments.e2e.spec.js#it
      is refused the batch and details routes without accounting.payments.update
      (403)
executable_gaps:
  - scenario: ATS-ACC-TRX-015-09
    gap: FND-ACC-TRX-080
    provenance: unknown
    source: FND-ACC-TRX-080
    evidence:
      - >-
        services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
        refuses a system batch, which is period close’s: a transaction batch
        only (batch_not_open);
        services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
        is refused batch_not_open on a reassignment out of the batch;
        services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
        moves the allocation rows batched with it;
        rhythm-v2-docs:specs/accounting/transactions/design/workflows/WF-ACC-TRX-002-amend-re-date-or-void-an-issued-invoice.md#WF-ACC-TRX-002;
        rhythm-v2-docs:specs/accounting/transactions/design/workflows/WF-ACC-TRX-017-move-a-document-to-another-batch-and-correct-its-details.md#WF-ACC-TRX-017
invariant_coverage:
  - invariant: INV-DOM-ACC-TRX-006-07
    scenarios:
      - ATS-ACC-TRX-015-01
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/batches-for-documents.integration.spec.js#it
      refuses a system batch, which is period close’s: a transaction batch only
      (batch_not_open)
    note: >-
      The cited scenario and its constituent test assertions are the proof
      boundary.
  - invariant: INV-DOM-ACC-TRX-006-08
    scenarios:
      - ATS-ACC-TRX-015-03
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
      is refused batch_not_open on a reassignment out of the batch
    note: >-
      The cited scenario and its constituent test assertions are the proof
      boundary.
  - invariant: INV-DOM-ACC-TRX-006-09
    scenarios:
      - ATS-ACC-TRX-015-07
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
      negates the facts on the old accounting date and restates them on the new
      one, the originals untouched
    note: >-
      The cited scenario and its constituent test assertions are the proof
      boundary.
  - invariant: INV-DOM-ACC-TRX-006-10
    scenarios:
      - ATS-ACC-TRX-015-06
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
      never clears a required field (a credit’s reason), and changes its memo
    note: >-
      The cited scenario and its constituent test assertions are the proof
      boundary.
  - invariant: INV-DOM-ACC-TRX-006-16
    gap: FND-ACC-TRX-080
    provenance: unknown
    source: FND-ACC-TRX-080
    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.
---

# Keep transaction batches and details correct: 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-015-01` | `ATS-ACC-TRX-015-01`, `ATS-ACC-TRX-015-09` |
| `BR-CAP-ACC-TRX-015-02` | `ATS-ACC-TRX-015-02` |
| `BR-CAP-ACC-TRX-015-03` | `ATS-ACC-TRX-015-03`, `ATS-ACC-TRX-015-09` |
| `BR-CAP-ACC-TRX-015-04` | `ATS-ACC-TRX-015-04`, `ATS-ACC-TRX-015-09` |
| `BR-CAP-ACC-TRX-015-05` | `ATS-ACC-TRX-015-05` |
| `BR-CAP-ACC-TRX-015-06` | `ATS-ACC-TRX-015-06` |
| `BR-CAP-ACC-TRX-015-07` | `ATS-ACC-TRX-015-07` |
| `BR-CAP-ACC-TRX-015-08` | `ATS-ACC-TRX-015-08` |

## Interactions With Related Capabilities

Move an unposted invoice and receipt to another eligible batch, inspect actions, then post the destination and attempt invoice amendment and another move.

The earlier moves retain financial value; current eligibility refuses amendment and movement after posting even if a previously read action was enabled. The complete chain remains proposed until one executable run proves its combined outcomes.
