---
id: ATS-ACC-BKS-002
scope: CAP-ACC-BKS-002
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-002-01
    title: Require currencies before enablement
    level: api
    proves:
      - BR-CAP-ACC-BKS-002-01
    preconditions: There is no saved unit.
    steps: >-
      Create with defaults, create enabled without currencies, and enable an
      existing empty set.
    expected: >-
      Default enablement is off and both empty-set attempts receive the legacy
      refusal.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-074
    provenance: test
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#creates
      a unit with Enable Multicurrency off by default
    category: transition
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#creates
        a unit with Enable Multicurrency off by default
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#refuses
        Enable Multicurrency on a create with no supported currency, in Rhythm
        1.0’s words
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#refuses
        turning Enable Multicurrency on with no supported currency to keep,
        leaving the unit unchanged
  - id: ATS-ACC-BKS-002-02
    title: Reject foreign currency in single-currency mode
    level: unit
    proves:
      - BR-CAP-ACC-BKS-002-02
    preconditions: Multicurrency is disabled.
    steps: 'Evaluate the base, foreign and listed currencies.'
    expected: >-
      The base passes; foreign use is refused because the switch governs
      eligibility.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-173
    provenance: test
    source: >-
      services-accounting:modules/books/tests/unit/rules/multi-currency-rules.spec.js#refuses
      a foreign currency when the flag is off, with 1.0’s sentence
    category: rule
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/unit/rules/multi-currency-rules.spec.js#refuses
        a foreign currency when the flag is off, with 1.0’s sentence
      - >-
        services-accounting:modules/books/tests/unit/rules/multi-currency-rules.spec.js#reads
        the flag, not the supported list
  - id: ATS-ACC-BKS-002-03
    title: Validate the supported set
    level: api
    proves:
      - BR-CAP-ACC-BKS-002-03
      - INV-DOM-ACC-BKS-001-03
    preconditions: The base currency is USD.
    steps: 'Submit duplicate CAD, base USD, unknown XXX and a 201-entry set.'
    expected: Each invalid set is refused with its reason.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-046
      - TST-ACC-BKS-074
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/business-units.e2e.spec.js#answers
      400 to a supported currency named twice, in Rhythm 1.0’s words
    category: validation
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/business-units.e2e.spec.js#answers
        400 to a supported currency named twice, in Rhythm 1.0’s words
      - >-
        services-accounting:modules/books/tests/e2e/business-units.e2e.spec.js#answers
        400 to the base currency among the supported ones, in Rhythm 1.0’s words
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#refuses
        more supported currencies than its bound
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#refuses
        a supported currency Accounting does not offer
  - id: ATS-ACC-BKS-002-04
    title: Retain per-currency policy
    level: api
    proves:
      - BR-CAP-ACC-BKS-002-04
    preconditions: A unit supports foreign currencies.
    steps: >-
      Submit complete and defaulted settings, an invalid rate source and
      settings on the base row.
    expected: >-
      Valid defaults apply; the unsupported source and base-row settings are
      refused.
    negative: false
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-074
      - TST-ACC-BKS-053
      - TST-ACC-BKS-063
    provenance: test
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#answers
      each supported currency with its settings, the defaults for one that
      stated none, and the codes beside them
    category: rule
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#answers
        each supported currency with its settings, the defaults for one that
        stated none, and the codes beside them
      - >-
        services-accounting:modules/books/tests/e2e/exchange-rates.e2e.spec.js#refuses
        a source that is neither the table nor a provider, naming the field
      - >-
        services-accounting:modules/books/tests/integration/db/configuration-records.table.integration.spec.js#refuses
        an exchange rate source or a pricing default on the base row (RHF09): it
        converts to nothing
  - id: ATS-ACC-BKS-002-05
    title: Preserve currencies already in use
    level: api
    proves:
      - BR-CAP-ACC-BKS-002-05
      - INV-DOM-ACC-BKS-001-04
    preconditions: CAD has a GL account and EUR has a merchant account.
    steps: Remove each currency and disable multicurrency.
    expected: >-
      The refusals name the dependent currencies and record kinds and preserve
      the saved set.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-046
      - TST-ACC-BKS-074
      - TST-ACC-BKS-067
    provenance: test
    source: >-
      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
    category: invariant
    binding_evidence:
      - >-
        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
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#names
        merchant accounts when only a merchant account uses the currency
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#refuses
        turning Enable Multicurrency off while a GL account uses a supported
        currency, leaving the unit unchanged
      - >-
        services-accounting:modules/books/tests/integration/db/exchange-rates.table.integration.spec.js#refuses
        removing a supported currency a rate still uses, naming it (the
        service), by the key (the database)
  - id: ATS-ACC-BKS-002-06
    title: Restrict account currencies
    level: api
    proves:
      - BR-CAP-ACC-BKS-002-06
      - INV-DOM-ACC-BKS-002-02
    preconditions: The unit supports CAD but not GBP.
    steps: 'Create GL, bank and merchant accounts denominated in GBP.'
    expected: Each request receives the configured-currency refusal.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-055
      - TST-ACC-BKS-045
      - TST-ACC-BKS-056
    provenance: test
    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
    category: validation
    binding_evidence:
      - >-
        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
      - >-
        services-accounting:modules/books/tests/e2e/bank-accounts.e2e.spec.js#answers
        400 to a currency the unit is not enabled for
      - >-
        services-accounting:modules/books/tests/e2e/merchant-accounts.e2e.spec.js#answers
        400 to a currency the unit is not enabled for
  - id: ATS-ACC-BKS-002-07
    title: Resolve simultaneous removal and account creation
    level: browser
    proves:
      - BR-CAP-ACC-BKS-002-08
    preconditions: Two administrators share a EUR-enabled unit.
    steps: Race EUR removal against creation of a EUR account.
    expected: >-
      One succeeds, the other receives a refusal, and no account is stranded in
      an unsupported currency.
    negative: true
    data_needs: Two independent administrator sessions.
    bound_to:
      - TST-ACC-BKS-006
    provenance: test
    source: >-
      react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0007.spec.ts#ACT-ACC-0007
    category: concurrency
    binding_evidence:
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0007.spec.ts#ACT-ACC-0007
  - id: ATS-ACC-BKS-002-08
    title: Begin foreign-currency trading
    level: browser
    proves:
      - AS-JNY-ACC-BKS-006-01
      - AS-JNY-ACC-BKS-006-02
      - AS-JNY-ACC-BKS-006-03
    preconditions: A unit keeps its base books in USD.
    steps: Complete the foreign-currency setup journey.
    expected: >-
      Read-back confirms policies, foreign accounts and rates; account usage
      protects its currency.
    negative: false
    data_needs: The setup needs no extra fixture records.
    bound_to: []
    provenance: proposed
    source: >-
      react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0006.spec.ts#ACT-ACC-0006
    category: interaction
    binding_evidence:
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0006.spec.ts#ACT-ACC-0006
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0030.spec.ts#ACT-ACC-0030
    component_bindings:
      - TST-ACC-BKS-005
      - TST-ACC-BKS-022
    finding: FND-ACC-BKS-084
    note: >-
      The original component assertions use independent fixtures; no existing
      suite executes this complete journey with shared records.
  - id: ATS-ACC-BKS-002-09
    title: >-
      Exercise the grants for enable supported foreign currencies for a business
      unit
    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.business-units.update
      - accounting.business-units.read
    binding_evidence: []
    supporting_tests: []
  - id: ATS-ACC-BKS-002-10
    title: Supported-set size endpoints
    category: boundary
    level: api
    proves:
      - BR-CAP-ACC-BKS-002-03
    preconditions: >-
      An isolated workspace has records needed for both eligible and ineligible
      examples.
    steps: >-
      Submit the largest offered set, then a repeated entry and a synthetic set
      beyond the declared size limit.
    expected: >-
      The offered set persists; duplicate and excessive membership are refused
      without changing the saved set.
    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/business-units.e2e.spec.js#answers
      400 to a supported currency named twice, in Rhythm 1.0’s words
    binding_evidence: []
  - id: ATS-ACC-BKS-002-11
    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-002-12
    title: Stored rates protect their enabled currency
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-BKS-002-05
      - BR-CAP-ACC-BKS-004-02
    preconditions: >-
      Run-owned records satisfy the preconditions of the referenced capability
      proofs.
    steps: >-
      Create a dated foreign quote, try removing its currency, delete the quote
      and repeat removal.
    expected: >-
      The quote blocks removal; after it is removed, unused currency removal
      succeeds.
    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/business-units.e2e.spec.js#answers
        409 naming the currency, the unit and the kinds of account that use it
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/exchange-rates.integration.spec.js#refuses
        changing the unit, the currency or the day: a rate’s identity is
        write-once
    exercises:
      - CAP-ACC-BKS-002
      - CAP-ACC-BKS-004
    workflows: []
    binding_evidence: []
  - id: ATS-ACC-BKS-002-13
    title: Foreign accounts protect their enabled currency
    category: interaction
    level: browser
    proves:
      - BR-CAP-ACC-BKS-002-05
      - BR-CAP-ACC-BKS-002-06
      - BR-CAP-ACC-BKS-005-01
    preconditions: >-
      Run-owned records satisfy the preconditions of the referenced capability
      proofs.
    steps: >-
      Enable CAD, create a CAD chart account and attempt to remove CAD from the
      unit.
    expected: >-
      The account reads back in the configured currency and prevents its
      removal.
    negative: false
    data_needs: >-
      Run-owned records for the stated setup; retain the initial values for
      comparison.
    bound_to:
      - TST-ACC-BKS-005
    provenance: test
    source:
      - >-
        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
      - >-
        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
      - >-
        services-accounting:modules/books/tests/e2e/gl-accounts.e2e.spec.js#stores
        the code trimmed and upper-cased, under the id from the lower-cased code
    exercises:
      - CAP-ACC-BKS-002
      - CAP-ACC-BKS-005
    workflows: []
    binding_evidence:
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0006.spec.ts#ACT-ACC-0006
  - id: ATS-ACC-BKS-002-14
    title: Receiving destinations use the enabled currency set
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-BKS-002-06
      - BR-CAP-ACC-BKS-007-01
    preconditions: >-
      Run-owned records satisfy the preconditions of the referenced capability
      proofs.
    steps: >-
      Create local bank and merchant destinations in an enabled foreign
      currency, then try an unsupported one.
    expected: >-
      The enabled destinations save and the unsupported ones leave no receiving
      records.
    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/gl-accounts.e2e.spec.js#answers
        400 to a currency the unit is not enabled for, in Rhythm 1.0’s words
      - >-
        services-accounting:modules/books/tests/e2e/bank-accounts.e2e.spec.js#answers
        400 to another unit’s GL account, naming both units
    exercises:
      - CAP-ACC-BKS-002
      - CAP-ACC-BKS-007
    workflows: []
    binding_evidence: []
  - id: ATS-ACC-BKS-002-15
    title: Invalid content selection preserves currency settings
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-BKS-002-04
      - BR-CAP-ACC-BKS-015-04
    preconditions: >-
      Run-owned records satisfy the preconditions of the referenced capability
      proofs.
    steps: >-
      Change a supported currency policy while selecting unusable content in the
      same unit replacement, then read its policies.
    expected: The complete rejected replacement preserves the earlier currency policy.
    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/integration/services/persistence/business-units.integration.spec.js#answers
        each supported currency with its settings, the defaults for one that
        stated none, and the codes beside them
      - >-
        services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#answers
        400 to a business unit naming an inactive template
    exercises:
      - CAP-ACC-BKS-002
      - CAP-ACC-BKS-015
    workflows:
      - WF-ACC-BKS-002
    binding_evidence: []
evidence:
  - >-
    Verified source file:
    react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0006.spec.ts
  - >-
    Verified source file:
    react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0007.spec.ts
  - >-
    Verified source file:
    react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0030.spec.ts
  - >-
    Verified source file:
    services-accounting:modules/books/tests/e2e/bank-accounts.e2e.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/e2e/business-units.e2e.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/e2e/exchange-rates.e2e.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/e2e/gl-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/exchange-rates.table.integration.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/unit/rules/multi-currency-rules.spec.js
product_intent: proposed
coverage:
  rule: covered
  transition: covered
  validation: covered
  permission: covered
  edge: 'gap: FND-ACC-BKS-063'
  failure: 'gap: FND-ACC-BKS-063'
  boundary: covered
  concurrency: covered
  invariant: covered
  interaction: covered
coverage_notes:
  rule:
    scenarios:
      - ATS-ACC-BKS-002-02
      - ATS-ACC-BKS-002-04
    provenance: documented
    source:
      - ATS-ACC-BKS-002-02
      - ATS-ACC-BKS-002-04
  transition:
    scenarios:
      - ATS-ACC-BKS-002-01
    provenance: documented
    source:
      - ATS-ACC-BKS-002-01
  validation:
    scenarios:
      - ATS-ACC-BKS-002-03
      - ATS-ACC-BKS-002-06
    provenance: documented
    source:
      - ATS-ACC-BKS-002-03
      - ATS-ACC-BKS-002-06
  permission:
    scenarios:
      - ATS-ACC-BKS-002-09
    provenance: documented
    source:
      - ATS-ACC-BKS-002-09
  edge:
    scenarios: []
    provenance: unknown
    source: FND-ACC-BKS-063
    reason: >-
      No scenario isolates this category for the capability at the pinned
      revision.
    gap: FND-ACC-BKS-063
  failure:
    scenarios: []
    provenance: unknown
    source: FND-ACC-BKS-063
    reason: >-
      No scenario isolates this category for the capability at the pinned
      revision.
    gap: FND-ACC-BKS-063
  boundary:
    scenarios:
      - ATS-ACC-BKS-002-10
    provenance: documented
    source:
      - ATS-ACC-BKS-002-10
  concurrency:
    scenarios:
      - ATS-ACC-BKS-002-07
      - ATS-ACC-BKS-002-11
    provenance: documented
    source:
      - ATS-ACC-BKS-002-07
      - ATS-ACC-BKS-002-11
  invariant:
    scenarios:
      - ATS-ACC-BKS-002-05
    provenance: documented
    source:
      - ATS-ACC-BKS-002-05
  interaction:
    scenarios:
      - ATS-ACC-BKS-002-08
      - ATS-ACC-BKS-002-12
      - ATS-ACC-BKS-002-13
      - ATS-ACC-BKS-002-14
      - ATS-ACC-BKS-002-15
    provenance: documented
    source:
      - ATS-ACC-BKS-002-08
      - ATS-ACC-BKS-002-12
      - ATS-ACC-BKS-002-13
      - ATS-ACC-BKS-002-14
      - ATS-ACC-BKS-002-15
rule_coverage:
  - rule: BR-CAP-ACC-BKS-002-01
    scenarios:
      - ATS-ACC-BKS-002-01
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#refuses
      Enable Multicurrency on a create with no supported currency, in Rhythm
      1.0’s words
  - rule: BR-CAP-ACC-BKS-002-02
    scenarios:
      - ATS-ACC-BKS-002-02
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/unit/rules/multi-currency-rules.spec.js#refuses
      a foreign currency when the flag is off, with 1.0’s sentence
  - rule: BR-CAP-ACC-BKS-002-03
    scenarios:
      - ATS-ACC-BKS-002-03
      - ATS-ACC-BKS-002-10
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/business-units.e2e.spec.js#answers
      400 to a supported currency named twice, in Rhythm 1.0’s words
  - rule: BR-CAP-ACC-BKS-002-04
    scenarios:
      - ATS-ACC-BKS-002-04
      - ATS-ACC-BKS-002-15
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#answers
      each supported currency with its settings, the defaults for one that
      stated none, and the codes beside them
  - rule: BR-CAP-ACC-BKS-002-05
    scenarios:
      - ATS-ACC-BKS-002-05
      - ATS-ACC-BKS-002-12
      - ATS-ACC-BKS-002-13
    provenance: documented
    source: >-
      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
  - rule: BR-CAP-ACC-BKS-002-06
    scenarios:
      - ATS-ACC-BKS-002-06
      - ATS-ACC-BKS-002-13
      - ATS-ACC-BKS-002-14
    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
  - rule: BR-CAP-ACC-BKS-002-08
    scenarios:
      - ATS-ACC-BKS-002-07
    provenance: documented
    source: >-
      react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0007.spec.ts#ACT-ACC-0007
related_coverage:
  - capability: CAP-ACC-BKS-004
    scenarios:
      - ATS-ACC-BKS-002-12
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-002-let-a-business-unit-hold-and-price-money-in-currencies.md
  - capability: CAP-ACC-BKS-005
    scenarios:
      - ATS-ACC-BKS-002-13
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-002-let-a-business-unit-hold-and-price-money-in-currencies.md
  - capability: CAP-ACC-BKS-007
    scenarios:
      - ATS-ACC-BKS-002-14
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-002-let-a-business-unit-hold-and-price-money-in-currencies.md
workflow_coverage:
  - workflow: WF-ACC-BKS-001
    interactions: []
    provenance: documented
    source: >-
      specs/accounting/books/design/workflows/WF-ACC-BKS-001-open-a-business-unit-with-its-first-fiscal-years.md
    gap: FND-ACC-BKS-063
  - workflow: WF-ACC-BKS-002
    interactions:
      - ATS-ACC-BKS-002-15
    provenance: documented
    source: >-
      specs/accounting/books/design/workflows/WF-ACC-BKS-002-replace-a-business-units-settings.md
    gap: FND-ACC-BKS-063
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-001-01
    scenarios:
      - ATS-ACC-BKS-001-02
    provenance: documented
    source: >-
      services-accounting:modules/books/db/business-units.table.ts:business_units_freeze_trigger
  - invariant: INV-DOM-ACC-BKS-001-02
    scenarios:
      - ATS-ACC-BKS-001-03
      - ATS-ACC-BKS-001-11
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/fiscal-years.integration.spec.js#gives
      the new unit exactly its two years, the one containing today and the next
  - invariant: INV-DOM-ACC-BKS-001-03
    scenarios:
      - ATS-ACC-BKS-002-03
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/business-units.e2e.spec.js#answers
      400 to a supported currency named twice, in Rhythm 1.0’s words
  - invariant: INV-DOM-ACC-BKS-001-04
    scenarios:
      - ATS-ACC-BKS-002-05
    provenance: documented
    source: >-
      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
  - invariant: INV-DOM-ACC-BKS-001-05
    scenarios:
      - ATS-ACC-BKS-004-02
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/exchange-rates.integration.spec.js#refuses
      changing the unit, the currency or the day: a rate’s identity is
      write-once
  - invariant: INV-DOM-ACC-BKS-001-06
    scenarios:
      - ATS-ACC-BKS-003-03
      - ATS-ACC-BKS-003-04
    provenance: documented
    source: >-
      services-accounting:modules/books/services/persistence/business-units.ts:assertCardFeeRule;
      services-accounting:modules/books/db/business-units.table.ts:business_units_card_fee_rule_check
  - invariant: INV-DOM-ACC-BKS-001-07
    scenarios:
      - ATS-ACC-BKS-015-04
    provenance: documented
    source: >-
      services-accounting:modules/books/db/business-units.table.ts:business_units_template_references_trigger
  - invariant: INV-DOM-ACC-BKS-001-08
    scenarios:
      - ATS-ACC-BKS-001-06
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#refuses
      a unit with GL, bank and merchant accounts, naming all three
permission_coverage:
  - key: accounting.business-units.update
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-002-09
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-002-let-a-business-unit-hold-and-price-money-in-currencies.md
    execution_gap: FND-ACC-BKS-063
  - key: accounting.business-units.read
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-002-09
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-002-let-a-business-unit-hold-and-price-money-in-currencies.md
    execution_gap: FND-ACC-BKS-063
reviewed_at: '2026-10-23'
---

# Enable supported foreign currencies for a business unit: Capability Test Specification

## Coverage

- Require currencies before enablement.
- Reject foreign currency in single-currency mode.
- Validate the supported set.
- Retain per-currency policy.
- Preserve currencies already in use.
- Restrict account currencies.
- Resolve simultaneous removal and account creation.

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

## Interactions With Related Capabilities

- Begin foreign-currency trading.
- Stored rates protect their enabled currency.
- Foreign accounts protect their enabled currency.
- Receiving destinations use the enabled currency set.
- Invalid content selection preserves currency settings.

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.
