---
id: CAP-ACC-TRX-015
title: Keep transaction batches and details correct
feature: FEAT-ACC-TRX-06
product_area: accounting
module: transactions
revision: 1
status: draft
product_intent: proposed
implementation_evidence: observed
supersedes:
  - CAP-ACC-INV-010
  - CAP-ACC-PAY-021
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-6'
  - 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-7'
  - 'services-accounting:docs/milestones/plans/ACCT-M2-plan.md#D9'
  - 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D12'
purpose: Staff maintain posting placement and descriptive information without rewriting money history.
outcomes:
  - Staff maintain posting placement and descriptive information without rewriting money history.
  - >-
    Posting prevents financial placement and date changes while permitted text corrections remain available.
    Unsupported lifecycle or batch choices are refused.
concepts:
  - CON-ACC-TRX-006
actors:
  - ACT-ACC-012
surfaces:
  - console
  - api
permissions:
  - key: accounting.invoices.update
    where_checked: api
    scope: tenant
  - key: accounting.credit-memos.update
    where_checked: api
    scope: tenant
  - key: accounting.debit-memos.update
    where_checked: api
    scope: tenant
  - key: accounting.write-offs.update
    where_checked: api
    scope: tenant
  - key: accounting.payments.update
    where_checked: api
    scope: tenant
  - key: accounting.credits.update
    where_checked: api
    scope: tenant
  - key: accounting.credit-applications.update
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-ACC-TRX-015-01
    proved_by: [ATS-ACC-TRX-002-11, ATS-ACC-TRX-003-12, ATS-ACC-TRX-004-07, ATS-ACC-TRX-015-01, ATS-ACC-TRX-015-09, TST-ACC-TRX-030]
    statement: >-
      A destination must be an open or in-error transaction batch in the record’s unit; closed, posted,
      period-close and foreign-unit destinations are refused.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    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)
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D12'
  - id: BR-CAP-ACC-TRX-015-02
    proved_by: [ATS-ACC-TRX-015-02, TST-ACC-TRX-030]
    statement: >-
      Without explicit batch selection, the unit’s assignment rules choose an active recurring batch for the
      record kind, and unusable or absent assignment is refused.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    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
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D12'
  - id: BR-CAP-ACC-TRX-015-03
    proved_by: [ATS-ACC-TRX-002-11, ATS-ACC-TRX-003-12, ATS-ACC-TRX-004-07, ATS-ACC-TRX-006-10, ATS-ACC-TRX-015-03, ATS-ACC-TRX-015-09, ATS-ACC-TRX-016-08, TST-ACC-TRX-039]
    statement: >-
      Eligible records move only between unposted batches of the same unit; posting, posted and downloaded
      batches block movement, while selecting the current batch is a no-op.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    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
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-6'
  - id: BR-CAP-ACC-TRX-015-04
    proved_by: [ATS-ACC-TRX-006-10, ATS-ACC-TRX-015-04, ATS-ACC-TRX-015-09, ATS-ACC-TRX-016-08, TST-ACC-TRX-039]
    statement: >-
      Moving a receipt also moves allocations sharing its batch and records an audit event without changing
      receivable value.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    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
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-6'
  - id: BR-CAP-ACC-TRX-015-05
    proved_by: [ATS-ACC-TRX-015-05, TST-ACC-TRX-039]
    statement: 'Drafts and void records cannot move, and quotes receive no batch until conversion.'
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
      refuses a void payment
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-6'
  - id: BR-CAP-ACC-TRX-015-06
    proved_by: [ATS-ACC-TRX-015-06, TST-ACC-TRX-012, TST-ACC-TRX-039]
    statement: >-
      Supported reference, memo and note fields remain editable and can be cleared, but required reasons
      cannot become blank.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    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
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-7'
  - id: BR-CAP-ACC-TRX-015-07
    proved_by: [ATS-ACC-TRX-015-07, TST-ACC-TRX-039]
    statement: >-
      Unposted date corrections require an open period and append opposing old-date and replacement new-date
      receivable entries.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    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
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-7'
  - id: BR-CAP-ACC-TRX-015-08
    proved_by: [ATS-ACC-TRX-015-08, TST-ACC-TRX-003, TST-ACC-TRX-012]
    statement: >-
      Each record kind’s update authority governs movement and details, and payment Edit Details is connected
      in the console.
    kind: permission
    enforced_at:
      - api
      - console
    must_prove: true
    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)
    origin: none
    note: >-
      The cited build recommendation does not establish Product approval; the authority gap remains open in
      FND-ACC-TRX-035.
scenarios:
  - id: SC-CAP-ACC-TRX-015-01
    given: A payment’s batch is closed but not posted.
    when: Select another eligible batch in the same unit.
    then: The receipt and associated applications move together with an event identifying both batches.
    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
  - id: SC-CAP-ACC-TRX-015-02
    given: The check reference and business date were entered incorrectly.
    when: Correct both before posting.
    then: The new reference is retained and correcting entries move its receivable effect to the selected date.
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
      moves the payment date and the accounting date while the payment is unposted
edge_cases: []
depends_on: []
related:
  - CAP-ACC-TRX-002
  - CAP-ACC-TRX-016
journeys: []
evidence:
  - >-
    services-accounting at f47cb263875bbc0c5640fba7dae6785ec32695f8:
    modules/transactions/aws/api/document-edits.routes.ts (reassignInvoiceBatch, reassignCreditMemoBatch,
    reassignDebitMemoBatch, reassignWriteOffBatch, reassignPaymentBatch, reassignCreditBatch,
    reassignCreditApplicationBatch, updateCreditMemoDetails, updateDebitMemoDetails, updateWriteOffDetails,
    updatePaymentDetails, updateCreditDetails, updateCreditApplicationDetails); services/document-edits/*;
    services/batches-for-documents.ts; docs/migrations reassign-and-edit as cited by
    docs/accounting/payments.md and credits.md; tests integration/services/document-edits/reassign-and-edit,
    integration/services/batches-for-documents, e2e/payments.e2e.spec.js, e2e/change-memos.e2e.spec.js.
  - >-
    react-console at baf6dae382d6f41dce976c7f848667ccc37e076f:
    components/accounting/payments/payment-detail-screen.tsx (Edit Details, Move to Another Batch); journeys
    ACT-ACC-0191, 0325, 0326, 0348; inventory rules RUL-ACC-INV-026, 027, RUL-ACC-PAY-054, 055.
controls: [TC-IAM-001, TC-IAM-002, TC-IAM-004, TC-IAM-005, TC-AZ-001, TC-AZ-002, TC-AZ-003, TC-AZ-004, TC-AZ-006, TC-TEN-001, TC-TEN-002, TC-TEN-003, TC-TEN-004, TC-DAT-001, TC-DAT-002, TC-DAT-003, TC-LOG-002, TC-LOG-003, TC-LOG-004, TC-LOG-005, TC-PI-001, TC-PI-003, TC-PI-005, TC-PRV-001, TC-PRV-002]
exercised_by: [FAS-ACC-TRX-06-01, FAS-ACC-TRX-06-02, FAS-ACC-TRX-06-03, FAS-ACC-TRX-06-04]
suites: [TST-ACC-TRX-003, TST-ACC-TRX-012, TST-ACC-TRX-030, TST-ACC-TRX-039]
---

# Keep transaction batches and details correct

## Purpose

Staff maintain posting placement and descriptive information without rewriting money history.

## How It Works

Staff open a transaction to correct its reference, memo or notes. Required explanations cannot be cleared. Before posting, they can select another eligible batch in the same unit. Moving a receipt also moves the applications originally batched with it. Eligible date corrections append opposite old-date entries and new-date entries. Posting prevents financial placement and date changes while permitted text corrections remain available. Unsupported lifecycle or batch choices are refused.

## Relationships

- Correct issued bills before posting supplies or continues the related financial work.
- Find money records and understand available work supplies or continues the related financial work.
