---
id: CAP-ACC-BAT-014
title: Resolve posting accounts and retain their snapshots
feature: FEAT-ACC-BAT-03
product_area: accounting
module: batches
revision: 1
status: draft
product_intent: proposed
implementation_evidence: observed
supersedes:
- inventory CAP-ACC-BAT-011
- inventory CAP-ACC-BAT-020
- inventory RUL-ACC-BAT-028
- inventory RUL-ACC-BAT-033
- inventory RUL-ACC-BAT-034
- inventory RUL-ACC-BAT-036
- inventory RUL-ACC-BAT-037
- inventory RUL-ACC-BAT-038
- inventory RUL-ACC-BAT-070
- journey ACT-ACC-0523
- journey ACT-ACC-0549
- journey ACT-ACC-0551
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
- services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-1
- services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-2
- services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-3
purpose: Posting chooses the financial destinations that apply now and preserves the choices used for later correction.
outcomes:
- Account choices reflect applicable configuration and remain traceable through stored snapshots.
concepts:
- CON-ACC-BAT-003
actors:
- ACT-ACC-012
- ACT-ACC-006
surfaces:
- console
- job
permissions: []
rules:
- id: BR-CAP-ACC-BAT-014-01
  proved_by: [ATS-ACC-BAT-014-01, TST-ACC-BAT-012, TST-ACC-BAT-102]
  statement: Posting resolves accounts rather than issuance, allowing invoices, memos and write-offs to issue before
    financial configuration exists.
  kind: policy
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: services-accounting:modules/batches/tests/integration/services/posting/gl-resolution-at-posting.integration.spec.js#issues
    the invoice and creates the memos and the write-off with no GL account, default or setup anywhere
  origin: services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-1
- id: BR-CAP-ACC-BAT-014-02
  proved_by: [ATS-ACC-BAT-014-01, ATS-ACC-BAT-014-10, ATS-ACC-BAT-015-12, TST-ACC-BAT-012, TST-ACC-BAT-102]
  statement: Resolution uses the product setup and then unit defaults for the account purpose, with missing-product
    revenue handled by the unit’s fallback account.
  kind: calculation
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: 'services-accounting:modules/batches/tests/integration/services/posting/gl-resolution-at-posting.integration.spec.js#posts
    the invoice to the resolved accounts: the receivable from the unit’s default, the revenue from the product’s
    setup, the discounted line net of its discount'
  origin: services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-1
- id: BR-CAP-ACC-BAT-014-03
  proved_by: [ATS-ACC-BAT-012-05, ATS-ACC-BAT-013-22, ATS-ACC-BAT-014-02, ATS-ACC-BAT-014-08, ATS-ACC-BAT-014-09, TST-ACC-BAT-011, TST-ACC-BAT-102]
  statement: If no account resolves, the batch fails without entries and identifies the affected document, line,
    purpose and relevant configuration choices.
  kind: validation
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: services-accounting:modules/batches/tests/integration/services/posting/gl-resolution-at-posting.integration.spec.js#fails
    the batch’s validation with an error naming the invoice, the missing accounts receivable account, the product’s
    setup and the unit’s default
  origin: services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-1
- id: BR-CAP-ACC-BAT-014-04
  proved_by: [ATS-ACC-BAT-014-03, TST-ACC-BAT-102]
  statement: Posting writes account, method and time snapshots to posted lines, and later corrections reuse the
    original line’s accounting destinations.
  kind: invariant
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: services-accounting:modules/batches/tests/integration/services/posting/gl-resolution-at-posting.integration.spec.js#posts
    the credit memo and the write-off to the accounts the invoice’s entry used, the write-off’s debit to the product’s
    write-off account
  origin: services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-1
- id: BR-CAP-ACC-BAT-014-05
  proved_by: [ATS-ACC-BAT-014-03, TST-ACC-BAT-102]
  statement: Later configuration changes preserve existing entries and snapshots and affect the next posting’s resolution.
  kind: invariant
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: services-accounting:modules/batches/tests/integration/services/posting/gl-resolution-at-posting.integration.spec.js#alters
    neither October’s posted entries nor its snapshot
  origin: services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-1
- id: BR-CAP-ACC-BAT-014-06
  proved_by: [ATS-ACC-BAT-014-04, TST-ACC-BAT-013, TST-ACC-BAT-115]
  statement: At posting, the unit’s write-off policy chooses bad-debt expense, the invoice’s original revenue account
    or an allowance account, with a missing required allowance preventing the batch from posting.
  kind: calculation
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: services-accounting:modules/batches/tests/integration/services/posting/write-off-policy.integration.spec.js#fails
    the batch naming the write-off, the allowance purpose and the unit; nothing posts, not even the invoice
  origin: services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-2
- id: BR-CAP-ACC-BAT-014-07
  proved_by: [ATS-ACC-BAT-014-04, TST-ACC-BAT-013, TST-ACC-BAT-115]
  statement: A write-off reversal mirrors that write-off’s recorded entry regardless of subsequent policy changes.
  kind: invariant
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: 'services-accounting:modules/batches/tests/integration/services/posting/write-off-policy.integration.spec.js#posts
    the reversal as the mirror of the write-off’s entry: the write-off expense account credited, the receivable
    debited'
  origin: services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-2
- id: BR-CAP-ACC-BAT-014-08
  proved_by: [ATS-ACC-BAT-014-05, TST-ACC-BAT-102]
  statement: The current discount method credits revenue net of discount without a separate discount entry and retains
    gross, discount, net and the discount-product account in the snapshot.
  kind: calculation
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: 'services-accounting:modules/batches/tests/integration/services/posting/gl-resolution-at-posting.integration.spec.js#preserves
    the discount in the posted snapshot: the gross, the discount and the net on the line, the discount product’s
    revenue account and the net-of-revenue method'
  origin: services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-3
- id: BR-CAP-ACC-BAT-014-09
  proved_by: [ATS-ACC-BAT-014-06, TST-ACC-BAT-110]
  statement: Tax resolves to the rate’s payable account for the unit or its sales-tax default, failing without either
    and recording the selected account on the tax line.
  kind: calculation
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: services-accounting:modules/batches/tests/integration/services/posting/rebuilt-tax.integration.spec.js#puts
    the batch in error naming the rate and the unit when neither the rate nor the unit names a tax payable account,
    writing no entry
  origin: services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-1
- id: BR-CAP-ACC-BAT-014-10
  proved_by: [ATS-ACC-BAT-014-07, TST-ACC-BAT-097, TST-ACC-BAT-105]
  statement: Posting reads current splits, departments and projects rather than retaining their issue-time configuration.
  kind: calculation
  enforced_at:
  - service
  must_prove: true
  provenance: test
  source: 'services-accounting:modules/batches/tests/integration/services/posting/rebuilt-documents.integration.spec.js#credits
    the revenue as the splits stand at posting: 50.00 to the line’s revenue account, 50.00 to the split’s, not the
    25% the product had at issue'
  origin: none
  note: The cited product record confirms a narrower policy; this full rule includes implementation details without
    a matching recorded decision and inherits proposed intent.
- id: BR-CAP-ACC-BAT-014-11
  proved_by: [ATS-ACC-BAT-014-11]
  statement: Cross-unit product revenue needs the inter-unit receivable and liability account pair, but the examined
    product provides no configuration writer for that pair.
  kind: validation
  enforced_at:
  - service
  must_prove: true
  provenance: inferred
  source: services-accounting:modules/batches/db/business-unit-inter-entity-accounts.table.ts; FND-ACC-BAT-011
  origin: none
scenarios:
- id: SC-CAP-ACC-BAT-014-01
  given: A dues invoice issued before accounts were configured.
  when: Finance supplies receivable and revenue accounts and posts its batch.
  then: The entry uses the configured destinations and retains them on the invoice lines.
  provenance: test
  source: react-console:acceptance/accounting/playwright/journeys/batches-posting/ACT-ACC-0522.spec.ts#ACT-ACC-0522
- id: SC-CAP-ACC-BAT-014-02
  given: Three units use different write-off policies for equal amounts.
  when: Their batches post and a write-off is later reversed.
  then: Each policy selects its own debit destination and the reversal mirrors its original write-off.
  provenance: test
  source: react-console:acceptance/accounting/playwright/journeys/batches-posting/ACT-ACC-0523.spec.ts#ACT-ACC-0523
edge_cases: []
constraints:
- Products and Books maintain the configuration and policies used by account resolution.
depends_on: []
related:
- CAP-ACC-BAT-012
- CAP-ACC-BAT-015
journeys:
- JNY-ACC-BAT-004
open_questions: []
evidence:
- 'Pinned services-accounting (f47cb263), examined sources: services/rules/gl-account-rules.ts, invoice-entry-rules.ts,
  posting-records.ts, services/engine/posted-accounting.ts, posting-reads.ts, services/persistence/reference-records.ts,
  db/business-unit-inter-entity-accounts.table.ts; tests integration/services/posting/gl-resolution-at-posting.integration.spec.js,
  write-off-policy.integration.spec.js, rebuilt-tax.integration.spec.js, rebuilt-documents.integration.spec.js,
  dimension-codes-at-posting.integration.spec.js, integration/services/persistence/reference-records.queries.integration.spec.js;
  docs/architecture/accounting-2.0/02-decisions.md (A-1, A-2, A-3).'
- 'Pinned react-console (baf6dae3), examined sources: journeys ACT-ACC-0521, 0522, 0523, 0549, 0551.'
controls: [TC-IAM-001, TC-IAM-005, TC-IAM-006, TC-AZ-001, TC-AZ-002, TC-AZ-003, TC-AZ-004, TC-TEN-001, TC-TEN-002, TC-TEN-003, TC-TEN-004, TC-DAT-001, TC-LOG-002, TC-LOG-003, TC-PI-003, TC-PI-005]
exercised_by: [FAS-ACC-BAT-03-01, FAS-ACC-BAT-03-02, FAS-ACC-BAT-03-03, FAS-ACC-BAT-03-05]
suites: [TST-ACC-BAT-011, TST-ACC-BAT-012, TST-ACC-BAT-013, TST-ACC-BAT-097, TST-ACC-BAT-102, TST-ACC-BAT-105, TST-ACC-BAT-110, TST-ACC-BAT-115]
---

# Resolve posting accounts and retain their snapshots

## Purpose

Posting chooses the financial destinations that apply now and preserves the choices used for later correction.

## How It Works

Customers can issue documents while financial configuration is incomplete. Posting resolves the account purposes needed for each eligible line. It uses applicable product configuration and unit defaults, then retains the accounting it actually used. Later corrections consult that original accounting. New configuration influences later postings without rewriting earlier ones. An unresolved account prevents the affected batch from posting and gives finance staff a specific setup problem.

## Relationships

- Related outcome: Inspect posting readiness before submission, which addresses the connected batch work.
- Related outcome: Produce document entries using the applicable accounting method, which addresses the connected batch work.
