---
id: CAP-ACC-TRX-002
title: Correct issued bills before posting
feature: FEAT-ACC-TRX-01
product_area: accounting
module: transactions
revision: 1
status: draft
product_intent: proposed
implementation_evidence: observed
supersedes:
  - CAP-ACC-INV-006
  - CAP-ACC-INV-007
  - CAP-ACC-INV-008
  - CAP-ACC-INV-009
  - CAP-ACC-INV-028
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-4'
  - 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-7'
  - 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-14'
  - 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D9'
  - 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D3'
purpose: Staff correct billing mistakes while preserving the customer’s document and financial trail.
outcomes:
  - Staff correct billing mistakes while preserving the customer’s document and financial trail.
  - >-
    Voiding removes an eligible bill’s debt while retaining the document and explanation. Posting closes the
    amendment path and directs staff toward correcting documents.
concepts:
  - CON-ACC-TRX-001
  - CON-ACC-TRX-006
actors:
  - ACT-ACC-012
surfaces:
  - console
  - api
permissions:
  - key: accounting.invoices.adjust
    where_checked: api
    scope: tenant
  - key: accounting.invoices.update
    where_checked: api
    scope: tenant
  - key: accounting.invoices.void
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-ACC-TRX-002-01
    proved_by: [ATS-ACC-TRX-001-17, ATS-ACC-TRX-002-01, ATS-ACC-TRX-002-11, ATS-ACC-TRX-005-07, TST-ACC-TRX-010, TST-ACC-TRX-039, TST-ACC-TRX-224]
    statement: >-
      Staff can amend a live issued invoice before posting by adding lines, changing unapplied lines and
      correcting its commercial details.
    kind: lifecycle
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
      answers the invoice at revision 2 with the line added after the last, the line repriced and the totals
      re-derived
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-14'
  - id: BR-CAP-ACC-TRX-002-02
    proved_by: [ATS-ACC-TRX-002-02, TST-ACC-TRX-039]
    statement: 'A line carrying a payment, credit, memo or write-off cannot be removed or repriced through an amendment.'
    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
      removes a line with nothing applied at the next revision, and refuses removing or repricing the paid
      line
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-14'
  - id: BR-CAP-ACC-TRX-002-03
    proved_by: [ATS-ACC-TRX-001-17, ATS-ACC-TRX-002-01, ATS-ACC-TRX-005-07, TST-ACC-TRX-010, TST-ACC-TRX-039, TST-ACC-TRX-224]
    statement: >-
      Amendment advances the revision, records the receivable difference and change event, and recalculates
      tax only on added or repriced lines; rendered revisions appear from the second onward.
    kind: calculation
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/document-edits/reassign-and-edit.integration.spec.js#it
      writes the amended facts for the delta, the originals untouched, and the amend event with the delta
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-14'
  - id: BR-CAP-ACC-TRX-002-04
    proved_by: [ATS-ACC-TRX-002-03, ATS-ACC-TRX-002-04, ATS-ACC-TRX-002-11, ATS-ACC-TRX-015-09, TST-ACC-TRX-039]
    statement: >-
      A posting, posted or downloaded batch prevents invoice amendment, date changes and voiding, leaving a
      correcting memo as the remedy.
    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 once the batch is posted
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-4'
  - id: BR-CAP-ACC-TRX-002-05
    proved_by: [ATS-ACC-TRX-002-05, TST-ACC-TRX-049]
    statement: >-
      Changing terms derives a due date from the invoice date unless the request supplies one, and no
      permitted due date precedes the invoice date.
    kind: calculation
    enforced_at:
      - api
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/details-terms-due-date.integration.spec.js#it
      answers the memo, the terms and the explicit due date, which wins over the terms’ own
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D3'
  - id: BR-CAP-ACC-TRX-002-06
    proved_by: [ATS-ACC-TRX-002-06, TST-ACC-TRX-049, TST-ACC-TRX-050]
    statement: >-
      Before voiding, descriptive details and terms can change together, with any invalid part rejecting the
      whole request.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/details-terms-due-date.integration.spec.js#it
      leaves the memo, the terms, the due date and the version as they were
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-7'
  - id: BR-CAP-ACC-TRX-002-07
    proved_by: [ATS-ACC-TRX-002-07, TST-ACC-TRX-010, TST-ACC-TRX-039]
    statement: >-
      An issued invoice can move its dates into an open period before posting, with correcting receivable
      entries; the console provides no date-change control.
    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
      moves the invoice date of an issued, unposted invoice, re-dating its facts; refuses a date after its due
      date
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D9'
  - id: BR-CAP-ACC-TRX-002-08
    proved_by: [ATS-ACC-TRX-002-08, TST-ACC-TRX-066, TST-ACC-TRX-221]
    statement: >-
      Voiding requires a reason and an invoice with no payment, credit, memo or write-off applied, whether
      draft or issued.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/void.integration.spec.js#it
      is refused invoice_has_money_applied, the invoice unchanged
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-4'
  - id: BR-CAP-ACC-TRX-002-09
    proved_by: [ATS-ACC-TRX-002-08, TST-ACC-TRX-066, TST-ACC-TRX-221]
    statement: >-
      An issued invoice’s void preserves its commercial amounts, voids its lines and offsets the remaining
      receivable on today’s date; the void cannot be undone.
    kind: lifecycle
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/void.integration.spec.js#it
      appends an invoice_voided fact per line for minus the line’s balance, dated today
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D12'
  - id: BR-CAP-ACC-TRX-002-10
    proved_by: [ATS-ACC-TRX-002-09, TST-ACC-TRX-058]
    statement: 'An update lock prevents invoice mutations, while a deletion lock prevents removal alone.'
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/locked-invoice.integration.spec.js#it
      refuses the void of the issued invoice, which stays open
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D12'
  - id: BR-CAP-ACC-TRX-002-11
    proved_by: [ATS-ACC-TRX-002-10, TST-ACC-TRX-010, TST-ACC-TRX-234]
    statement: >-
      Issue and amendment require adjust authority, details and terms require update authority, and voiding
      requires the separate void authority.
    kind: permission
    enforced_at:
      - api
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js#it is refused POST
      /invoices/{tenantId}/{id}/void without accounting.invoices.void (403)
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D12'
scenarios:
  - id: SC-CAP-ACC-TRX-002-01
    given: The issued invoice remains unposted.
    when: Add a missing charge and change an eligible line price.
    then: Revision two contains recalculated totals and its e-mail identifies the revision.
    provenance: test
    source: 'react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0190.spec.ts#ACT-ACC-0190'
  - id: SC-CAP-ACC-TRX-002-02
    given: No value has been applied to an issued invoice.
    when: Provide a reason and void the document.
    then: Void status and today’s offsetting receivable entries preserve the record.
    provenance: test
    source: 'react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0183.spec.ts#ACT-ACC-0183'
  - id: SC-CAP-ACC-TRX-002-03
    given: A check has settled part of the invoice.
    when: Attempt to void the invoice.
    then: Applied money prevents voiding and the invoice remains open.
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/invoices/void.integration.spec.js#it
      is refused invoice_has_money_applied, the invoice unchanged
edge_cases: []
depends_on:
  - CAP-ACC-TRX-001
related:
  - CAP-ACC-TRX-003
  - CAP-ACC-TRX-015
journeys: []
evidence:
  - >-
    services-accounting at f47cb263875bbc0c5640fba7dae6785ec32695f8:
    modules/transactions/aws/api/invoices.routes.ts (amendInvoice, changeInvoiceDueDate, changeInvoiceTerms,
    updateInvoiceDetails, voidInvoice); services/invoices/invoice-amendments.ts, invoice-changes.ts,
    invoice-commands.ts; services/document-edits/editable-documents.ts; db/invoices.table.ts;
    docs/accounting/invoices.md; tests integration/services/document-edits/reassign-and-edit,
    invoices/details, details-terms-due-date, void, locked-invoice; e2e/invoices.e2e.spec.js.
  - >-
    react-console at baf6dae382d6f41dce976c7f848667ccc37e076f:
    components/accounting/invoices/invoice-detail-screen.tsx (Edit Details, Void); journeys ACT-ACC-0183,
    0188, 0189, 0190, 0199, 0207, 0226; inventory rules RUL-ACC-INV-013, 025, 027, 028, 041.
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-DAT-001, TC-DAT-002, TC-DAT-003, TC-DAT-004, 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-01-01, FAS-ACC-TRX-01-02, FAS-ACC-TRX-01-03, FAS-ACC-TRX-01-04, FAS-ACC-TRX-01-05]
suites: [TST-ACC-TRX-010, TST-ACC-TRX-039, TST-ACC-TRX-049, TST-ACC-TRX-050, TST-ACC-TRX-058, TST-ACC-TRX-066, TST-ACC-TRX-221, TST-ACC-TRX-224, TST-ACC-TRX-234]
---

# Correct issued bills before posting

## Purpose

Staff correct billing mistakes while preserving the customer’s document and financial trail.

## How It Works

Staff start from the issued invoice and choose amendment, details or void according to the intended correction. Eligible unposted lines can change through amendment, which advances the visible revision. Money already applied protects a line from removal or repricing. Descriptive changes use the separate details path. Voiding removes an eligible bill’s debt while retaining the document and explanation. Posting closes the amendment path and directs staff toward correcting documents.

## Relationships

- Issue customer bills and numbered quotes supplies or continues the related financial work.
- Adjust billed value with memos supplies or continues the related financial work.
- Keep transaction batches and details correct supplies or continues the related financial work.
