---
id: CAP-ACC-BKS-006
title: Assign accounts to standard posting purposes
feature: FEAT-ACC-BKS-02
product_area: accounting
module: books
revision: 1
status: draft
product_intent: confirmed
implementation_evidence: inconsistent
supersedes:
  - CAP-ACC-CFG-003
  - CAP-ACC-CFG-016
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#R2'
  - 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D12'
  - 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-1'
purpose: >-
  Controllers provide fallback destinations for posting when a document leaves
  its account unspecified.
outcomes:
  - A posting purpose selects no more than one active account of its unit.
  - The chart highlights important unassigned defaults.
  - >-
    Account configuration gaps are addressed during posting without blocking
    invoice issue.
concepts:
  - CON-ACC-BKS-002
actors:
  - ACT-ACC-001
  - ACT-ACC-002
  - ACT-ACC-004
surfaces:
  - console
  - api
preconditions: []
postconditions: []
permissions:
  - key: accounting.business-units.read
    where_checked: api
    scope: tenant
  - key: accounting.business-units.update
    where_checked: api
    scope: tenant
  - key: accounting.application.access
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-ACC-BKS-006-01
    proved_by: [ATS-ACC-BKS-006-01, TST-ACC-BKS-049, TST-ACC-BKS-064]
    statement: >-
      The default-purpose vocabulary returns fifteen purposes in display order:
      nine legacy purposes, four reconciliation purposes, sales tax payable and
      doubtful-account allowance, with expected types supplied as guidance.
    kind: policy
    enforced_at:
      - database
      - api
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/default-gl-accounts.e2e.spec.js#answers
      all fifteen purposes in display order, with the count
    origin: 'services-accounting:docs/milestones/plans/ACCT-M1-plan.md#D12'
  - id: BR-CAP-ACC-BKS-006-02
    proved_by: [ATS-ACC-BKS-006-02, ATS-ACC-BKS-006-06, ATS-ACC-BKS-013-09, TST-ACC-BKS-017, TST-ACC-BKS-049, TST-ACC-BKS-078]
    statement: >-
      Each purpose has at most one assigned active GL account of its own unit; a
      new assignment replaces the previous one and cross-unit choices identify
      both units in the refusal.
    kind: validation
    enforced_at:
      - api
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/default-gl-accounts.e2e.spec.js#answers
      400 to another unit’s GL account, naming both units
    origin: none
  - id: BR-CAP-ACC-BKS-006-03
    proved_by: [ATS-ACC-BKS-006-03, TST-ACC-BKS-049]
    statement: >-
      Reading defaults requires business-unit read permission, while assignment
      and clearing require business-unit update permission.
    kind: permission
    enforced_at:
      - api
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/default-gl-accounts.e2e.spec.js#refuses
      that principal an assignment 403 permission_missing
    origin: none
  - id: BR-CAP-ACC-BKS-006-04
    proved_by: [ATS-ACC-BKS-005-09, ATS-ACC-BKS-006-05, TST-ACC-BKS-007]
    statement: >-
      Clearing a purpose removes its assignment and succeeds even when the
      assignment is already absent.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: false
    provenance: test
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/default-gl-accounts.integration.spec.js#answers
      the purpose with no account when clearing a purpose the unit has no
      default for
    origin: none
  - id: BR-CAP-ACC-BKS-006-05
    proved_by: []
    statement: >-
      The service accepts a default account whose type differs from the
      purpose’s expected types.
    kind: policy
    enforced_at:
      - service
      - database
    must_prove: false
    provenance: observed
    source: >-
      services-accounting:modules/books/db/default-gl-account-purposes.table.ts:defaultGlAccountPurposes
    origin: 'services-accounting:docs/milestones/plans/ACCT-M1-plan.md#D12'
  - id: BR-CAP-ACC-BKS-006-06
    proved_by: [ATS-ACC-BKS-003-11, ATS-ACC-BKS-006-07, ATS-ACC-BKS-006-08, TST-ACC-BKS-003, TST-ACC-BKS-017]
    statement: >-
      Missing default accounts do not prevent invoice issue; posting resolves
      them later and reports a document error if neither the document nor the
      unit supplies the needed account.
    kind: policy
    enforced_at:
      - service
    must_prove: false
    provenance: documented
    source: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-1'
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-1'
  - id: BR-CAP-ACC-BKS-006-07
    proved_by: [ATS-ACC-BKS-006-04, TST-ACC-BKS-007]
    statement: >-
      The Chart of Accounts page offers the assignment drawer and displays
      Default Accounts Needed while receivables, deferred revenue, bad-debt
      expense, missing-product revenue or sales tax payable is unassigned.
    kind: policy
    enforced_at:
      - console
    must_prove: true
    provenance: documented
    source: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#R2'
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#R2'
  - id: BR-CAP-ACC-BKS-006-08
    proved_by: []
    statement: >-
      The console offers only active accounts in the selected unit with types
      expected by the purpose.
    kind: policy
    enforced_at:
      - console
    must_prove: false
    provenance: observed
    source: >-
      react-console:components/configuration/accounting/business-unit-default-gl-accounts.tsx:activeOptionsFor
    origin: none
scenarios:
  - id: SC-CAP-ACC-BKS-006-01
    given: A chapter has GL accounts but no assigned defaults.
    when: The controller visits the chapter’s chart.
    then: >-
      The missing-default notice identifies the gaps; completing the assignment
      drawer removes the notice.
    provenance: test
    source: >-
      react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0008.spec.ts#ACT-ACC-0008
  - id: SC-CAP-ACC-BKS-006-02
    given: A user has business-unit read permission only.
    when: They inspect defaults and request clearing of an assignment.
    then: 'Reading succeeds, but clearing is refused without changing the assignment.'
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/default-gl-accounts.e2e.spec.js#leaves
      accounts_receivable assigned after the refused clear
edge_cases: []
constraints: []
depends_on:
  - CAP-ACC-BKS-005
related:
  - CAP-ACC-BKS-003
  - CAP-ACC-BKS-013
journeys:
  - JNY-ACC-BKS-001
open_questions:
  - OQ-ACC-BKS-003
evidence:
  - >-
    Verified source file:
    react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0008.spec.ts
  - >-
    Verified source file:
    react-console:components/configuration/accounting/business-unit-default-gl-accounts.tsx
  - 'Verified source file: services-accounting:aws/accounting.service.ts'
  - >-
    Verified source file:
    services-accounting:docs/architecture/accounting-2.0/02-decisions.md
  - >-
    Verified source file:
    services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md
  - >-
    Verified source file:
    services-accounting:docs/milestones/plans/ACCT-M1-plan.md
  - >-
    Verified source file:
    services-accounting:modules/books/db/business-unit-default-gl-accounts.table.ts
  - >-
    Verified source file:
    services-accounting:modules/books/db/default-gl-account-purposes.table.ts
  - >-
    Verified source file:
    services-accounting:modules/books/tests/e2e/default-gl-accounts.e2e.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/db/configuration-vocabularies.table.integration.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/services/persistence/default-gl-account-purposes.queries.integration.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/services/persistence/default-gl-accounts.integration.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/services/persistence/default-gl-accounts.queries.integration.spec.js
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-005, TC-AZ-006, TC-TEN-001, TC-TEN-002, TC-TEN-003, TC-TEN-004, TC-DAT-001, TC-LOG-001, TC-LOG-002, TC-LOG-003, TC-LOG-004, TC-LOG-005, TC-PI-001, TC-PI-003, TC-PI-005]
exercised_by: [FAS-ACC-BKS-02-01, FAS-ACC-BKS-02-02, FAS-ACC-BKS-02-03, FAS-ACC-BKS-02-04]
suites: [TST-ACC-BKS-003, TST-ACC-BKS-007, TST-ACC-BKS-017, TST-ACC-BKS-049, TST-ACC-BKS-064, TST-ACC-BKS-078]
---

# Assign accounts to standard posting purposes

## Purpose

Controllers provide fallback destinations for posting when a document leaves its account unspecified.

## How It Works

The controller opens the default-account drawer from the unit’s chart. The drawer groups choices by their posting purpose. Staff choose the appropriate account from the unit’s chart and save the assignments. Empty choices remain visible so configuration gaps can be reviewed. The console narrows offered account types more than the service does. Invoice entry can continue before all defaults are complete. Posting reports the missing destination when it needs an account that configuration does not provide.

## Relationships

Posting combines document-specific choices with these unit defaults.
