---
id: CAP-ACC-TRX-004
title: Abandon and restore uncollectable debt
feature: FEAT-ACC-TRX-02
product_area: accounting
module: transactions
revision: 1
status: draft
product_intent: proposed
implementation_evidence: partially-observed
supersedes:
  - CAP-ACC-INV-018
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#M1-6'
  - 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-2'
  - 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#D-5'
  - 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#D-7'
  - 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D6'
purpose: Finance records debt it no longer expects to collect and can restore it if circumstances change.
outcomes:
  - Finance records debt it no longer expects to collect and can restore it if circumstances change.
  - >-
    The records retain both the abandonment and its reversal. The product should add the deferred independent
    approval step.
concepts:
  - CON-ACC-TRX-001
actors:
  - ACT-ACC-012
surfaces:
  - console
  - api
permissions:
  - key: accounting.write-offs.create
    where_checked: api
    scope: tenant
  - key: accounting.write-offs.read
    where_checked: api
    scope: tenant
  - key: accounting.write-offs.update
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-ACC-TRX-004-01
    proved_by: [ATS-ACC-TRX-004-01, ATS-ACC-TRX-004-07, TST-ACC-TRX-131]
    statement: >-
      Write-offs apply only to an issued real invoice’s own outstanding lines, and an excessive or ineligible
      write-off leaves every record unchanged.
    kind: validation
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/write-offs/write-offs.integration.spec.js#it
      writes nothing: no write-off, no ledger line, no fact, no event
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#M1-6'
  - id: BR-CAP-ACC-TRX-004-02
    proved_by: [ATS-ACC-TRX-004-02, TST-ACC-TRX-131]
    statement: >-
      Partial write-offs leave outstanding lines open, fully abandoned lines become written off, and an unpaid
      invoice with a write-off and no balance becomes written off.
    kind: calculation
    enforced_at:
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/write-offs/write-offs.integration.spec.js#it
      makes the whole line written_off and keeps the partly written-off line and the invoice open
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#M1-6'
  - id: BR-CAP-ACC-TRX-004-03
    proved_by: [ATS-ACC-TRX-004-03, TST-ACC-TRX-131]
    statement: >-
      The requested direct or allowance method overrides the unit default; only allowance treatment can name
      an allowance account belonging to that unit.
    kind: policy
    enforced_at:
      - api
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/write-offs/write-offs.integration.spec.js#it
      takes the unit’s default_write_off_method (direct) when the request names none
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-2'
  - id: BR-CAP-ACC-TRX-004-04
    proved_by: [ATS-ACC-TRX-004-03, TST-ACC-TRX-131]
    statement: >-
      Write-off creation does not require resolved ledger accounts because posting selects the applicable
      accounts.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/write-offs/write-offs.integration.spec.js#it
      accepts an allowance write-off naming no account: the unit’s allowance default serves when it posts
      (gl-at-posting)
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-1'
  - id: BR-CAP-ACC-TRX-004-05
    proved_by: [ATS-ACC-TRX-004-04, ATS-ACC-TRX-004-07, TST-ACC-TRX-020, TST-ACC-TRX-131]
    statement: >-
      Reversal creates a new numbered write-off dated today with opposite lines, restores the invoice and
      marks the original reversed; neither document can be reversed again.
    kind: lifecycle
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/write-offs/write-offs.integration.spec.js#it
      answers the reversal: a second write-off, numbered next, its lines negating the first’s
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#M1-6'
  - id: BR-CAP-ACC-TRX-004-06
    proved_by: []
    statement: >-
      Payment arriving for abandoned debt requires reversal of the write-off before application to the
      restored invoice.
    kind: policy
    enforced_at:
      - service
    must_prove: false
    provenance: documented
    source: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#D-7'
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#D-7'
  - id: BR-CAP-ACC-TRX-004-07
    proved_by: [ATS-ACC-TRX-004-05]
    statement: >-
      The product should require another person’s approval above unit thresholds, initially zero; this
      recorded requirement remains deferred.
    kind: permission
    enforced_at:
      - service
    must_prove: true
    provenance: unknown
    source: FND-ACC-TRX-008
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#D-5'
  - id: BR-CAP-ACC-TRX-004-08
    proved_by: [ATS-ACC-TRX-004-06, TST-ACC-TRX-020]
    statement: >-
      Creation requires write-off create authority and reversal requires update authority; readers receive no
      mutation actions.
    kind: permission
    enforced_at:
      - api
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/e2e/write-offs.e2e.spec.js#it is refused the create and
      the reverse 403 permission_missing
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D12'
scenarios:
  - id: SC-CAP-ACC-TRX-004-01
    given: The unit uses allowance treatment and the invoice is uncollectable.
    when: Write off the outstanding invoice through its record page.
    then: Written-off standing is retained while the adjustment awaits allowance posting.
    provenance: test
    source: 'react-console:acceptance/accounting/playwright/journeys/invoices/ACT-ACC-0195.spec.ts#ACT-ACC-0195'
  - id: SC-CAP-ACC-TRX-004-02
    given: The customer can now pay debt previously written off.
    when: Reverse the original write-off.
    then: The new opposite document restores the debt and marks its predecessor reversed.
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/write-offs/write-offs.integration.spec.js#it
      restores the invoice exactly
edge_cases: []
depends_on:
  - CAP-ACC-TRX-001
related:
  - CAP-ACC-TRX-008
  - CAP-ACC-TRX-015
journeys: []
evidence:
  - >-
    services-accounting at f47cb263875bbc0c5640fba7dae6785ec32695f8:
    modules/transactions/aws/api/write-offs.routes.ts (createWriteOff, getWriteOff, listWriteOffs,
    reverseWriteOff, listWriteOffActions, performWriteOffAction); services/write-offs/write-off-commands.ts,
    write-off-reads.ts; services/actions/write-off-actions.ts; db/write-offs.table.ts,
    write-off-lines.table.ts; docs/accounting/write-offs.md;
    docs/debt/write-off-second-person-approval-deferred.md; tests e2e/write-offs.e2e.spec.js,
    integration/services/write-offs/write-offs.integration.spec.js.
  - >-
    react-console at baf6dae382d6f41dce976c7f848667ccc37e076f:
    app/(console)/console/[tenantId]/accounting/writeOffs/**;
    components/accounting/write-offs/write-off-detail-screen.tsx; journey ACT-ACC-0195; inventory rules
    RUL-ACC-INV-022, 023, 043.
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-LOG-004, TC-PI-001, TC-PI-003, TC-PI-005, TC-AI-005, TC-PRV-001, TC-PRV-002]
exercised_by: [FAS-ACC-TRX-02-01, FAS-ACC-TRX-02-03, FAS-ACC-TRX-02-04]
suites: [TST-ACC-TRX-020, TST-ACC-TRX-131]
---

# Abandon and restore uncollectable debt

## Purpose

Finance records debt it no longer expects to collect and can restore it if circumstances change.

## How It Works

Staff choose the outstanding invoice lines and the amount to abandon. The unit’s policy supplies direct or allowance treatment unless an allowed override is selected. A partial write-off retains the remaining debt. A complete write-off changes the applicable line standing. Later payment requires a reversing document before settlement. The records retain both the abandonment and its reversal. The product should add the deferred independent approval step.

## Relationships

- Issue customer bills and numbered quotes supplies or continues the related financial work.
- Allocate and relocate received money supplies or continues the related financial work.
- Keep transaction batches and details correct supplies or continues the related financial work.
