---
id: ATS-ACC-BKS-007
scope: CAP-ACC-BKS-007
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-007-01
    title: Require same-unit receiving destinations
    level: api
    proves:
      - BR-CAP-ACC-BKS-007-01
      - INV-DOM-ACC-BKS-002-03
    preconditions: Two units each have GL accounts.
    steps: Create local bank and merchant accounts using the other unit’s GL account.
    expected: Both refusals identify the unit mismatch.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-045
      - TST-ACC-BKS-056
      - TST-ACC-BKS-063
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/bank-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/bank-accounts.e2e.spec.js#answers
        400 to another unit’s GL account, naming both units
      - >-
        services-accounting:modules/books/tests/e2e/merchant-accounts.e2e.spec.js#answers
        400 to another unit’s GL account, naming both units
      - >-
        services-accounting:modules/books/tests/integration/db/configuration-records.table.integration.spec.js#refuses
        a bank account of tenant B naming tenant A’s GL account, though B has a
        unit of the same id
  - id: ATS-ACC-BKS-007-02
    title: Limit account-number storage
    level: api
    proves:
      - BR-CAP-ACC-BKS-007-02
      - INV-DOM-ACC-BKS-002-07
    preconditions: The unit has a cash GL account.
    steps: 'Submit alphabetic, five-digit and three-digit suffixes, then four digits.'
    expected: Invalid suffixes fail and the four-digit suffix succeeds.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-045
      - TST-ACC-BKS-063
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/bank-accounts.e2e.spec.js#answers
      400 to an account_number_last4 holding a letter
    category: boundary
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/bank-accounts.e2e.spec.js#answers
        400 to an account_number_last4 holding a letter
      - >-
        services-accounting:modules/books/tests/e2e/bank-accounts.e2e.spec.js#answers
        400 to an account_number_last4 of five digits
      - >-
        services-accounting:modules/books/tests/integration/db/configuration-records.table.integration.spec.js#refuses
        three digits as the last four
  - id: ATS-ACC-BKS-007-03
    title: Preserve receiving-account context
    level: api
    proves:
      - BR-CAP-ACC-BKS-007-03
    preconditions: A bank and merchant account exist.
    steps: Try changes to each unit and currency.
    expected: Every immutable-field change conflicts.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-045
      - TST-ACC-BKS-056
      - TST-ACC-BKS-063
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/bank-accounts.e2e.spec.js#answers
      409 to a change of currency, naming the column (0049)
    category: invariant
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/bank-accounts.e2e.spec.js#answers
        409 to a change of currency, naming the column (0049)
      - >-
        services-accounting:modules/books/tests/e2e/bank-accounts.e2e.spec.js#answers
        409 to a change of business unit, naming the column
      - >-
        services-accounting:modules/books/tests/e2e/merchant-accounts.e2e.spec.js#answers
        409 to a change of business unit, naming the column
      - >-
        services-accounting:modules/books/tests/integration/db/configuration-records.table.integration.spec.js#refuses
        a change of currency_code (RHF01)
  - id: ATS-ACC-BKS-007-04
    title: Require processor context without implying connection
    level: api
    proves:
      - BR-CAP-ACC-BKS-007-04
      - BR-CAP-ACC-BKS-007-05
      - INV-DOM-ACC-BKS-002-08
    preconditions: The unit has no merchant configuration yet.
    steps: >-
      Submit an unaccompanied processor reference, an unknown processor and
      valid processor/no-processor cases.
    expected: Invalid cases fail; valid records report Not Connected.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-056
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/merchant-accounts.e2e.spec.js#answers
      400 to a processor account reference without a processor
    category: validation
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/merchant-accounts.e2e.spec.js#answers
        400 to a processor account reference without a processor
      - >-
        services-accounting:modules/books/tests/e2e/merchant-accounts.e2e.spec.js#answers
        400 to a payment processor Accounting does not know
      - >-
        services-accounting:modules/books/tests/e2e/merchant-accounts.e2e.spec.js#answers
        the processing status not_connected
      - >-
        services-accounting:modules/books/tests/e2e/merchant-accounts.e2e.spec.js#answers
        the processing status not_connected all the same
  - id: ATS-ACC-BKS-007-05
    title: Preserve reconciliation-owned settings
    level: api
    proves:
      - BR-CAP-ACC-BKS-007-06
    preconditions: Reconciliation has set a merchant settlement destination and timing.
    steps: Save a replacement through receiving-account configuration.
    expected: The settlement columns retain their prior values.
    negative: false
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-091
    provenance: test
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/merchant-accounts.integration.spec.js#leaves
      the settlement columns payout reconciliation owns as they were stored
    category: edge
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/merchant-accounts.integration.spec.js#leaves
        the settlement columns payout reconciliation owns as they were stored
  - id: ATS-ACC-BKS-007-06
    title: Retain a settlement destination
    level: api
    proves:
      - BR-CAP-ACC-BKS-007-07
    preconditions: A merchant account names the bank account for settlement.
    steps: Request deletion of that bank account.
    expected: Deletion fails and the destination remains.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-069
    provenance: test
    source: >-
      services-accounting:modules/books/tests/integration/db/reconciliation-configuration.table.integration.spec.js#refuses
      deleting the bank account a merchant account settles to
    category: invariant
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/integration/db/reconciliation-configuration.table.integration.spec.js#refuses
        deleting the bank account a merchant account settles to
  - id: ATS-ACC-BKS-007-07
    title: Protect accounts referenced by financial work
    level: api
    proves:
      - BR-CAP-ACC-BKS-007-09
    preconditions: Bank and merchant accounts are used by assignment rules and payouts.
    steps: Attempt deletion of each receiving account.
    expected: Each reference produces a named refusal and preserves the account.
    negative: true
    data_needs: Isolated fixture records matching this scenario’s setup.
    bound_to: []
    provenance: proposed
    source: >-
      services-accounting:modules/books/services/persistence/configuration-refusals.ts:STILL_REFERENCED
    category: failure
    binding_evidence: []
  - id: ATS-ACC-BKS-007-08
    title: Exercise the grants for configure where received money lands
    category: permission
    level: api
    proves:
      - BR-CAP-ACC-BKS-016-01
    preconditions: >-
      An application-authorized reader and administrator share the run-owned
      setup. A third principal lacks the relevant resource grant.
    steps: >-
      Read the relevant configuration as the reader, attempt each supported
      mutation, then repeat with the matching administrator grants. Repeat the
      reads without their resource grants.
    expected: >-
      The permission outcomes match the cited authorization rule, and refused
      mutations leave every configured value unchanged.
    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/e2e/configuration-security.e2e.spec.js#is
      refused the create 403 permission_missing
    permissions_exercised:
      - accounting.bank-accounts.read
      - accounting.bank-accounts.create
      - accounting.bank-accounts.update
      - accounting.bank-accounts.delete
      - accounting.merchant-accounts.read
      - accounting.merchant-accounts.create
      - accounting.merchant-accounts.update
      - accounting.merchant-accounts.delete
      - accounting.application.access
    binding_evidence: []
    supporting_tests:
      - >-
        services-accounting:modules/books/tests/e2e/configuration-security.e2e.spec.js#is
        refused the create 403 permission_missing
  - id: ATS-ACC-BKS-007-09
    title: Refuse the second replacement of a shared read version
    category: concurrency
    level: api
    proves:
      - BR-CAP-ACC-BKS-016-05
    preconditions: >-
      Two administrators read the same version of the relevant mutable record.
      Each prepares a different otherwise valid replacement.
    steps: >-
      Release both replacement requests from a barrier. Read the record again
      and retry the losing payload at its original version.
    expected: >-
      One replacement commits, the other is stale, and repeating the stale
      request preserves the winning values.
    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/e2e/payment-terms.e2e.spec.js#answers
      400 naming is_active to a replacement that leaves it out
    interaction_with:
      - CAP-ACC-BKS-016
    binding_evidence: []
  - id: ATS-ACC-BKS-007-10
    title: Used receiving currency cannot be switched off
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-BKS-007-03
      - BR-CAP-ACC-BKS-002-05
    preconditions: >-
      Run-owned records satisfy the preconditions of the referenced capability
      proofs.
    steps: >-
      Create a foreign-currency receiving account and attempt both currency
      removal and multicurrency disablement.
    expected: Each attempt preserves the receiving account and its enabled currency.
    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/tests/e2e/bank-accounts.e2e.spec.js#answers
        409 to a change of currency, naming the column (0049)
      - >-
        services-accounting:modules/books/tests/e2e/business-units.e2e.spec.js#answers
        409 naming the currency, the unit and the kinds of account that use it
    exercises:
      - CAP-ACC-BKS-007
      - CAP-ACC-BKS-002
    workflows: []
    binding_evidence: []
evidence:
  - >-
    Verified source file:
    services-accounting:modules/books/services/persistence/configuration-refusals.ts
  - >-
    Verified source file:
    services-accounting:modules/books/tests/e2e/bank-accounts.e2e.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/e2e/merchant-accounts.e2e.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/db/configuration-records.table.integration.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/db/reconciliation-configuration.table.integration.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/services/persistence/merchant-accounts.integration.spec.js
product_intent: proposed
coverage:
  rule: 'gap: FND-ACC-BKS-068'
  transition: not-applicable
  validation: covered
  permission: covered
  edge: covered
  failure: covered
  boundary: covered
  concurrency: covered
  invariant: covered
  interaction: covered
coverage_notes:
  rule:
    scenarios: []
    provenance: unknown
    source: FND-ACC-BKS-068
    reason: >-
      No scenario isolates this category for the capability at the pinned
      revision.
    gap: FND-ACC-BKS-068
  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-007-record-where-a-business-units-cash-and-card-money-lands.md
  validation:
    scenarios:
      - ATS-ACC-BKS-007-01
      - ATS-ACC-BKS-007-04
    provenance: documented
    source:
      - ATS-ACC-BKS-007-01
      - ATS-ACC-BKS-007-04
  permission:
    scenarios:
      - ATS-ACC-BKS-007-08
    provenance: documented
    source:
      - ATS-ACC-BKS-007-08
  edge:
    scenarios:
      - ATS-ACC-BKS-007-05
    provenance: documented
    source:
      - ATS-ACC-BKS-007-05
  failure:
    scenarios:
      - ATS-ACC-BKS-007-07
    provenance: documented
    source:
      - ATS-ACC-BKS-007-07
  boundary:
    scenarios:
      - ATS-ACC-BKS-007-02
    provenance: documented
    source:
      - ATS-ACC-BKS-007-02
  concurrency:
    scenarios:
      - ATS-ACC-BKS-007-09
    provenance: documented
    source:
      - ATS-ACC-BKS-007-09
  invariant:
    scenarios:
      - ATS-ACC-BKS-007-03
      - ATS-ACC-BKS-007-06
    provenance: documented
    source:
      - ATS-ACC-BKS-007-03
      - ATS-ACC-BKS-007-06
  interaction:
    scenarios:
      - ATS-ACC-BKS-007-10
    provenance: documented
    source:
      - ATS-ACC-BKS-007-10
rule_coverage:
  - rule: BR-CAP-ACC-BKS-007-01
    scenarios:
      - ATS-ACC-BKS-007-01
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/bank-accounts.e2e.spec.js#answers
      400 to another unit’s GL account, naming both units
  - rule: BR-CAP-ACC-BKS-007-02
    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
  - rule: BR-CAP-ACC-BKS-007-03
    scenarios:
      - ATS-ACC-BKS-007-03
      - ATS-ACC-BKS-007-10
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/bank-accounts.e2e.spec.js#answers
      409 to a change of currency, naming the column (0049)
  - rule: BR-CAP-ACC-BKS-007-04
    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
  - rule: BR-CAP-ACC-BKS-007-05
    scenarios:
      - ATS-ACC-BKS-007-04
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/merchant-accounts.e2e.spec.js#answers
      the processing status not_connected all the same
  - rule: BR-CAP-ACC-BKS-007-06
    scenarios:
      - ATS-ACC-BKS-007-05
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/merchant-accounts.integration.spec.js#leaves
      the settlement columns payout reconciliation owns as they were stored
  - rule: BR-CAP-ACC-BKS-007-07
    scenarios:
      - ATS-ACC-BKS-007-06
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/integration/db/reconciliation-configuration.table.integration.spec.js#refuses
      deleting the bank account a merchant account settles to
  - rule: BR-CAP-ACC-BKS-007-09
    scenarios:
      - ATS-ACC-BKS-007-07
    provenance: documented
    source: >-
      services-accounting:modules/books/services/persistence/configuration-refusals.ts:STILL_REFERENCED
related_coverage:
  - capability: CAP-ACC-BKS-002
    scenarios:
      - ATS-ACC-BKS-007-10
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-007-record-where-a-business-units-cash-and-card-money-lands.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.bank-accounts.read
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-007-08
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-007-record-where-a-business-units-cash-and-card-money-lands.md
    execution_gap: FND-ACC-BKS-068
  - key: accounting.bank-accounts.create
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-007-08
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-007-record-where-a-business-units-cash-and-card-money-lands.md
    execution_gap: FND-ACC-BKS-068
  - key: accounting.bank-accounts.update
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-007-08
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-007-record-where-a-business-units-cash-and-card-money-lands.md
    execution_gap: FND-ACC-BKS-068
  - key: accounting.bank-accounts.delete
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-007-08
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-007-record-where-a-business-units-cash-and-card-money-lands.md
    execution_gap: FND-ACC-BKS-068
  - key: accounting.merchant-accounts.read
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-007-08
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-007-record-where-a-business-units-cash-and-card-money-lands.md
    execution_gap: FND-ACC-BKS-068
  - key: accounting.merchant-accounts.create
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-007-08
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-007-record-where-a-business-units-cash-and-card-money-lands.md
    execution_gap: FND-ACC-BKS-068
  - key: accounting.merchant-accounts.update
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-007-08
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-007-record-where-a-business-units-cash-and-card-money-lands.md
    execution_gap: FND-ACC-BKS-068
  - key: accounting.merchant-accounts.delete
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-007-08
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-007-record-where-a-business-units-cash-and-card-money-lands.md
    execution_gap: FND-ACC-BKS-068
  - key: accounting.application.access
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-007-08
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-007-record-where-a-business-units-cash-and-card-money-lands.md
    execution_gap: FND-ACC-BKS-068
reviewed_at: '2026-10-23'
---

# Configure where received money lands: Capability Test Specification

## Coverage

- Require same-unit receiving destinations.
- Limit account-number storage.
- Preserve receiving-account context.
- Require processor context without implying connection.
- Require processor context without implying connection.
- Preserve reconciliation-owned settings.
- Retain a settlement destination.
- Protect accounts referenced by financial work.

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

## Interactions With Related Capabilities

- Used receiving currency cannot be switched off.

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

## 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.
