---
id: ATS-ACC-BKS-006
scope: CAP-ACC-BKS-006
product_area: accounting
module: books
revision: 2
status: proposed
approved_by: null
approved_at: null
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-ACC-BKS-006-01
    title: Expose every default purpose
    level: api
    proves:
      - BR-CAP-ACC-BKS-006-01
    preconditions: The unit has no assignments.
    steps: Read its defaults and the purpose vocabulary.
    expected: >-
      All fifteen ordered purposes are returned with expected types and empty
      assignments.
    negative: false
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-049
      - TST-ACC-BKS-064
    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
    category: rule
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/default-gl-accounts.e2e.spec.js#answers
        all fifteen purposes in display order, with the count
      - >-
        services-accounting:modules/books/tests/e2e/default-gl-accounts.e2e.spec.js#answers
        each purpose with its name, description and expected account types
      - >-
        services-accounting:modules/books/tests/integration/db/configuration-vocabularies.table.integration.spec.js#seeds
        the nine purposes of design D3 in Rhythm 1.0’s order, then
        reconciliation’s four, then M5’s tax payable, with their expected
        account types
  - id: ATS-ACC-BKS-006-02
    title: Replace only eligible assignments
    level: api
    proves:
      - BR-CAP-ACC-BKS-006-02
      - INV-DOM-ACC-BKS-002-03
      - INV-DOM-ACC-BKS-002-06
    preconditions: Two units and an inactive account exist.
    steps: >-
      Assign across units, assign an inactive account and replace a valid
      assignment twice.
    expected: Invalid choices fail; valid replacement leaves one current assignment.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-049
      - TST-ACC-BKS-078
    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
    category: validation
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/default-gl-accounts.e2e.spec.js#answers
        400 to another unit’s GL account, naming both units
      - >-
        services-accounting:modules/books/tests/e2e/default-gl-accounts.e2e.spec.js#answers
        400 to an inactive GL account
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/default-gl-accounts.integration.spec.js#replaces
        the row’s account and bumps its version, keeping one row for the purpose
  - id: ATS-ACC-BKS-006-03
    title: Use unit permissions for defaults
    level: api
    proves:
      - BR-CAP-ACC-BKS-006-03
    preconditions: The caller can read but cannot update business units.
    steps: 'Read, assign and clear defaults.'
    expected: Reading succeeds and both mutations receive permission refusals.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-049
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/default-gl-accounts.e2e.spec.js#lets
      a principal holding only accounting.business-units.read list the defaults
    category: permission
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/default-gl-accounts.e2e.spec.js#lets
        a principal holding only accounting.business-units.read list the
        defaults
      - >-
        services-accounting:modules/books/tests/e2e/default-gl-accounts.e2e.spec.js#refuses
        that principal an assignment 403 permission_missing
      - >-
        services-accounting:modules/books/tests/e2e/default-gl-accounts.e2e.spec.js#refuses
        that principal a clear 403 permission_missing
  - id: ATS-ACC-BKS-006-04
    title: Resolve the chart’s missing-default notice
    level: browser
    proves:
      - BR-CAP-ACC-BKS-006-07
    preconditions: The unit has accounts but no defaults.
    steps: Open its chart and complete the assignment drawer.
    expected: The gaps appear in the notice; saved assignments read back and remove it.
    negative: false
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-007
    provenance: test
    source: >-
      react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0008.spec.ts#ACT-ACC-0008
    category: interaction
    binding_evidence:
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0008.spec.ts#ACT-ACC-0008
  - id: ATS-ACC-BKS-006-05
    title: Clear an already empty assignment
    category: boundary
    level: api
    proves:
      - BR-CAP-ACC-BKS-006-04
    preconditions: >-
      An isolated workspace has records needed for both eligible and ineligible
      examples.
    steps: 'Clear an assigned purpose twice, then read the purpose list.'
    expected: >-
      Both clears succeed and the complete purpose list contains an empty
      selection for that purpose.
    negative: true
    data_needs: >-
      Run-owned records for the stated setup; retain the initial values for
      comparison.
    bound_to: []
    provenance: proposed
    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
    binding_evidence: []
  - id: ATS-ACC-BKS-006-06
    title: Keep one destination during competing assignments
    category: concurrency
    level: api
    proves:
      - BR-CAP-ACC-BKS-006-02
      - INV-DOM-ACC-BKS-002-06
    preconditions: >-
      Two active eligible accounts belong to one unit and both administrators
      can assign its defaults.
    steps: >-
      Assign both accounts to the same purpose from independent connections,
      then read the assignment and its stored rows.
    expected: >-
      Every accepted request leaves one current eligible destination; no
      duplicate purpose assignment survives.
    negative: false
    data_needs: >-
      Run-owned records for the stated setup; retain the initial values for
      comparison.
    bound_to: []
    provenance: proposed
    source: >-
      services-accounting:modules/books/db/business-unit-default-gl-accounts.table.ts
    design_invariants:
      - INV-DOM-ACC-BKS-002-06
    binding_evidence: []
  - id: ATS-ACC-BKS-006-07
    title: Tax posting follows the available destination choice
    category: interaction
    level: browser
    proves:
      - BR-CAP-ACC-BKS-006-06
      - BR-CAP-ACC-BKS-013-02
    preconditions: >-
      Run-owned records satisfy the preconditions of the referenced capability
      proofs.
    steps: >-
      Post equivalent taxed work with a rate-specific account, only a unit
      default, and neither choice.
    expected: The three outcomes follow the cited destination resolution rule.
    negative: false
    data_needs: >-
      Run-owned records for the stated setup; retain the initial values for
      comparison.
    bound_to:
      - TST-ACC-BKS-017
    provenance: test
    source:
      - 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-1'
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0022.spec.ts#ACT-ACC-0022
    exercises:
      - CAP-ACC-BKS-006
      - CAP-ACC-BKS-013
    workflows: []
    binding_evidence:
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0022.spec.ts#ACT-ACC-0022
  - id: ATS-ACC-BKS-006-08
    title: Supply the allowance destination before retrying a write-off
    category: interaction
    level: browser
    proves:
      - BR-CAP-ACC-BKS-006-06
      - BR-CAP-ACC-BKS-003-02
    preconditions: >-
      A unit uses allowance write-offs but has no allowance default; its
      run-owned write-off awaits posting.
    steps: >-
      Post the pending work, inspect the missing-destination failure, assign the
      allowance default and retry the posting.
    expected: >-
      The configured destination changes the later posting outcome while the
      earlier failure remains recorded.
    negative: false
    data_needs: 'Run-owned postable unit, write-off and active local allowance account.'
    bound_to:
      - TST-ACC-BKS-003
    provenance: test
    source: >-
      react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0003.spec.ts#ACT-ACC-0003
    binding_evidence:
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0003.spec.ts#ACT-ACC-0003
    exercises:
      - CAP-ACC-BKS-006
      - CAP-ACC-BKS-003
    workflows: []
evidence:
  - >-
    Verified source file:
    react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0008.spec.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-accounts.integration.spec.js
product_intent: proposed
coverage:
  rule: covered
  transition: not-applicable
  validation: covered
  permission: covered
  edge: 'gap: FND-ACC-BKS-067'
  failure: 'gap: FND-ACC-BKS-067'
  boundary: covered
  concurrency: covered
  invariant: 'gap: FND-ACC-BKS-067'
  interaction: covered
coverage_notes:
  rule:
    scenarios:
      - ATS-ACC-BKS-006-01
    provenance: documented
    source:
      - ATS-ACC-BKS-006-01
  transition:
    reason: >-
      This capability initiates no independent state-model transition; its edits
      or reads use the owning record lifecycle and related-capability scenarios.
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-006-tell-posting-which-account-each-purpose-of-a-business-unit.md
  validation:
    scenarios:
      - ATS-ACC-BKS-006-02
    provenance: documented
    source:
      - ATS-ACC-BKS-006-02
  permission:
    scenarios:
      - ATS-ACC-BKS-006-03
    provenance: documented
    source:
      - ATS-ACC-BKS-006-03
  edge:
    scenarios: []
    provenance: unknown
    source: FND-ACC-BKS-067
    reason: >-
      No scenario isolates this category for the capability at the pinned
      revision.
    gap: FND-ACC-BKS-067
  failure:
    scenarios: []
    provenance: unknown
    source: FND-ACC-BKS-067
    reason: >-
      No scenario isolates this category for the capability at the pinned
      revision.
    gap: FND-ACC-BKS-067
  boundary:
    scenarios:
      - ATS-ACC-BKS-006-05
    provenance: documented
    source:
      - ATS-ACC-BKS-006-05
  concurrency:
    scenarios:
      - ATS-ACC-BKS-006-06
    provenance: documented
    source:
      - ATS-ACC-BKS-006-06
  invariant:
    scenarios: []
    provenance: unknown
    source: FND-ACC-BKS-067
    reason: >-
      No scenario isolates this category for the capability at the pinned
      revision.
    gap: FND-ACC-BKS-067
  interaction:
    scenarios:
      - ATS-ACC-BKS-006-04
      - ATS-ACC-BKS-006-07
      - ATS-ACC-BKS-006-08
    provenance: documented
    source:
      - ATS-ACC-BKS-006-04
      - ATS-ACC-BKS-006-07
rule_coverage:
  - rule: BR-CAP-ACC-BKS-006-01
    scenarios:
      - ATS-ACC-BKS-006-01
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/default-gl-accounts.e2e.spec.js#answers
      all fifteen purposes in display order, with the count
  - rule: BR-CAP-ACC-BKS-006-02
    scenarios:
      - ATS-ACC-BKS-006-02
      - ATS-ACC-BKS-006-06
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/default-gl-accounts.e2e.spec.js#answers
      400 to another unit’s GL account, naming both units
  - rule: BR-CAP-ACC-BKS-006-03
    scenarios:
      - ATS-ACC-BKS-006-03
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/default-gl-accounts.e2e.spec.js#refuses
      that principal an assignment 403 permission_missing
  - rule: BR-CAP-ACC-BKS-006-07
    scenarios:
      - ATS-ACC-BKS-006-04
    provenance: documented
    source: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#R2'
related_coverage:
  - capability: CAP-ACC-BKS-003
    scenarios:
      - ATS-ACC-BKS-006-08
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-006-tell-posting-which-account-each-purpose-of-a-business-unit.md
  - capability: CAP-ACC-BKS-013
    scenarios:
      - ATS-ACC-BKS-006-07
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-006-tell-posting-which-account-each-purpose-of-a-business-unit.md
workflow_coverage: []
coverage_interpretation: >-
  Covered means a specified scenario exists. Proposed scenarios and registered
  bindings do not establish a passed run or verified conformance.
invariant_coverage:
  - invariant: INV-DOM-ACC-BKS-002-01
    scenarios:
      - ATS-ACC-BKS-005-01
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/gl-accounts.e2e.spec.js#answers
      409 to a change of code, naming the column
  - invariant: INV-DOM-ACC-BKS-002-02
    scenarios:
      - ATS-ACC-BKS-002-06
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/gl-accounts.e2e.spec.js#answers
      400 to a currency the unit is not enabled for, in Rhythm 1.0’s words
  - invariant: INV-DOM-ACC-BKS-002-03
    scenarios:
      - ATS-ACC-BKS-006-02
      - ATS-ACC-BKS-007-01
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/default-gl-accounts.e2e.spec.js#answers
      400 to another unit’s GL account, naming both units
  - invariant: INV-DOM-ACC-BKS-002-04
    scenarios:
      - ATS-ACC-BKS-005-05
    provenance: documented
    source: >-
      services-accounting:modules/books/db/gl-accounts.table.ts:gl_accounts_default_guard_trigger
  - invariant: INV-DOM-ACC-BKS-002-05
    scenarios:
      - ATS-ACC-BKS-005-04
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/gl-accounts.integration.spec.js#translates
      the refusal of each restrict foreign key to a GL account into a 409 naming
      it
  - invariant: INV-DOM-ACC-BKS-002-06
    scenarios:
      - ATS-ACC-BKS-006-02
      - ATS-ACC-BKS-006-06
    provenance: documented
    source: >-
      services-accounting:modules/books/db/business-unit-default-gl-accounts.table.ts:business_unit_default_gl_accounts_active_trigger
  - invariant: INV-DOM-ACC-BKS-002-07
    scenarios:
      - ATS-ACC-BKS-007-02
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/bank-accounts.e2e.spec.js#answers
      400 to an account_number_last4 of five digits
  - invariant: INV-DOM-ACC-BKS-002-08
    scenarios:
      - ATS-ACC-BKS-007-04
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/merchant-accounts.e2e.spec.js#answers
      400 to a processor account reference without a processor
  - invariant: INV-DOM-ACC-BKS-002-09
    scenarios:
      - ATS-ACC-BKS-008-01
      - ATS-ACC-BKS-008-02
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/departments.e2e.spec.js#answers
      400 to a code the unit already has, under the id it derives
permission_coverage:
  - key: accounting.business-units.read
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-006-03
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-006-tell-posting-which-account-each-purpose-of-a-business-unit.md
  - key: accounting.business-units.update
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-006-03
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-006-tell-posting-which-account-each-purpose-of-a-business-unit.md
  - key: accounting.application.access
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-006-03
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-006-tell-posting-which-account-each-purpose-of-a-business-unit.md
reviewed_at: '2026-10-23'
---

# Assign accounts to standard posting purposes: Capability Test Specification

## Coverage

- Expose every default purpose.
- Replace only eligible assignments.
- Use unit permissions for defaults.
- Resolve the chart’s missing-default notice.

The structured coverage map distinguishes specified examples from remaining findings. Proposed examples require executable proof before qualification.

## Interactions With Related Capabilities

- Resolve the chart’s missing-default notice.
- Tax posting follows the available destination choice.

Related-capability and workflow references identify the seams each scenario exercises. The lifecycle coverage record retains transitions that still need individual proof.

- Supply the allowance destination before retrying a write-off.

## Binding Review

The pinned service and browser assertions support the registered bindings. Original test references remain beside each scenario so partial evidence and unresolved conformance remain reviewable.
