---
id: ATS-ACC-BKS-001
scope: CAP-ACC-BKS-001
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-001-01
    title: Create with a generated identity
    level: api
    proves:
      - BR-CAP-ACC-BKS-001-01
    preconditions: The proposed name is unused.
    steps: Submit a minimal valid unit and another with a blank name.
    expected: >-
      The valid unit receives a name-derived identifier; the blank-name request
      identifies the name error and writes nothing.
    negative: false
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-046
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/business-units.e2e.spec.js#creates
      it under the id its name suggests, in the tenant of the path
    category: validation
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/business-units.e2e.spec.js#creates
        it under the id its name suggests, in the tenant of the path
      - >-
        services-accounting:modules/books/tests/e2e/business-units.e2e.spec.js#answers
        400 naming name for a name of nothing but spaces
      - >-
        services-accounting:modules/books/tests/e2e/business-units.e2e.spec.js#writes
        no unit for a body it refused: the id reads back 404
  - id: ATS-ACC-BKS-001-02
    title: Keep founding choices fixed
    level: api
    proves:
      - BR-CAP-ACC-BKS-001-02
      - INV-DOM-ACC-BKS-001-01
    preconditions: An existing unit uses USD and a January start.
    steps: Submit replacements choosing CAD and then a July start.
    expected: Both return a field-specific conflict and preserve the unit.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-046
      - TST-ACC-BKS-074
      - TST-ACC-BKS-063
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/business-units.e2e.spec.js#answers
      409 to a change of the base currency, naming the column
    category: invariant
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/business-units.e2e.spec.js#answers
        409 to a change of the base currency, naming the column
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#refuses
        a change of fiscal-year start month in Rhythm 1.0’s words
      - >-
        services-accounting:modules/books/tests/integration/db/configuration-records.table.integration.spec.js#refuses
        a change of base_currency_code (RHF01)
  - id: ATS-ACC-BKS-001-03
    title: Create the unit and calendar atomically
    level: api
    proves:
      - BR-CAP-ACC-BKS-001-03
      - INV-DOM-ACC-BKS-001-02
    preconditions: No unit exists for the request.
    steps: >-
      Create it normally, then repeat with an induced failure in the second
      generated year.
    expected: >-
      Success includes two twelve-period open years; failure leaves no unit,
      currency row or first year.
    negative: false
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-087
      - TST-ACC-BKS-054
    provenance: test
    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
    category: failure
    binding_evidence:
      - >-
        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
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/fiscal-years.integration.spec.js#rolls
        the unit back with its currency row and its first year
      - >-
        services-accounting:modules/books/tests/e2e/fiscal-years.e2e.spec.js#gives
        the unit the year of today and the next, each with its twelve open
        periods
  - id: ATS-ACC-BKS-001-04
    title: Apply creation defaults
    level: api
    proves:
      - BR-CAP-ACC-BKS-001-04
    preconditions: The unit has not been created.
    steps: Supply only required founding values.
    expected: All unspecified settings return their creation defaults.
    negative: false
    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#gives
      every setting the request left out its default
    category: rule
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/business-units.e2e.spec.js#gives
        every setting the request left out its default
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#defaults
        every setting to Rhythm 1.0’s value and leaves out the fields the create
        did not give
  - id: ATS-ACC-BKS-001-05
    title: Preserve omitted extension settings
    level: api
    proves:
      - BR-CAP-ACC-BKS-001-05
    preconditions: 'A unit has foreign currencies, tender fees and revenue-reversal treatment.'
    steps: Replace it using an editor body omitting those settings.
    expected: The saved unit retains all omitted extension settings.
    negative: false
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-074
      - TST-ACC-BKS-002
    provenance: test
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#keeps
      the supported currencies when the replacement does not state them
    category: edge
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#keeps
        the supported currencies when the replacement does not state them
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#keeps
        the flag when a replacement leaves it out
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#keeps
        the stored treatment on a replacement that leaves it out
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#keeps
        the six settings on a replacement that names none of them (the console’s
        unit editor predates them)
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0002.spec.ts#ACT-ACC-0002
  - id: ATS-ACC-BKS-001-06
    title: Protect units with dependent configuration
    level: api
    proves:
      - BR-CAP-ACC-BKS-001-06
      - INV-DOM-ACC-BKS-001-08
    preconditions: >-
      Units have receiving accounts, projects, or only calendars and
      departments, including a product-used department.
    steps: Request deletion in each dependency state.
    expected: >-
      Accounts and projects block deletion with their kinds named; a free unit
      cascades to owned setup, while product usage blocks the cascading removal.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-074
      - TST-ACC-BKS-080
    provenance: test
    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
    category: transition
    binding_evidence:
      - >-
        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
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#leaves
        no fiscal year, fiscal period or department of the unit behind
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#refuses
        a unit that still has accounting projects, naming them, and keeps its
        years and departments
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/departments.integration.spec.js#refuses
        the delete 409, naming the unit’s products
  - id: ATS-ACC-BKS-001-07
    title: Initialize a current working context
    level: browser
    proves:
      - BR-CAP-ACC-BKS-001-08
    preconditions: The user has selected another active unit.
    steps: >-
      Create a unit in the console, visit invoice entry and inspect the
      remembered working context and offered unit choices.
    expected: >-
      The remembered active choice remains available and the new unit appears
      among the selectable choices without reload.
    negative: false
    data_needs: Isolated fixture records matching this scenario’s setup.
    bound_to:
      - TST-ACC-BKS-001
    provenance: test
    source: >-
      react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0001.spec.ts#ACT-ACC-0001
    category: rule
    binding_evidence:
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0001.spec.ts#ACT-ACC-0001
    note: >-
      This binding proves the invoice-entry working context. Initialization of
      other scoped lists remains a separate coverage gap.
  - id: ATS-ACC-BKS-001-08
    title: Open a chapter’s complete books
    level: browser
    proves:
      - AS-JNY-ACC-BKS-001-01
      - AS-JNY-ACC-BKS-001-02
      - AS-JNY-ACC-BKS-001-03
    preconditions: An administrator has isolated journey data.
    steps: >-
      Follow chapter setup across unit, calendar, account, default, bank and
      term screens.
    expected: Read-back confirms the entered configuration and calendar.
    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-0001.spec.ts#ACT-ACC-0001
    category: interaction
    binding_evidence:
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0001.spec.ts#ACT-ACC-0001
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0008.spec.ts#ACT-ACC-0008
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0009.spec.ts#ACT-ACC-0009
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0011.spec.ts#ACT-ACC-0011
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0018.spec.ts#ACT-ACC-0018
    component_bindings:
      - TST-ACC-BKS-001
      - TST-ACC-BKS-007
      - TST-ACC-BKS-008
      - TST-ACC-BKS-010
      - TST-ACC-BKS-013
    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-001-09
    title: Replace a wrongly denominated unit
    level: browser
    proves:
      - AS-JNY-ACC-BKS-002-01
      - AS-JNY-ACC-BKS-002-02
      - AS-JNY-ACC-BKS-002-03
    preconditions: A USD unit has an account and project.
    steps: >-
      Attempt currency correction and deletion, remove the blockers, then
      recreate in CAD.
    expected: >-
      Correction and dependent deletion are refused first; the freed unit is
      replaced with a CAD unit and fresh calendar.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-004
    provenance: test
    source: >-
      react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0004.spec.ts#ACT-ACC-0004
    category: transition
    binding_evidence:
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0004.spec.ts#ACT-ACC-0004
  - id: ATS-ACC-BKS-001-10
    title: >-
      Exercise the grants for establish a separate set of books for each
      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.read
      - accounting.business-units.create
      - accounting.business-units.update
      - accounting.business-units.delete
      - accounting.business-units.query
    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-001-11
    title: 'Create, hide, restore and remove an inactive unit'
    category: transition
    level: api
    proves:
      - BR-CAP-ACC-BKS-001-03
      - BR-CAP-ACC-BKS-001-06
      - BR-CAP-ACC-BKS-016-05
      - INV-DOM-ACC-BKS-001-02
    preconditions: Two unused unit identities and an administrator are available.
    steps: >-
      Create one inactive unit and one active unit. Deactivate and reactivate
      the active unit at its read version. Compare active-only and inclusive
      lists. Remove each unused unit and read its owned setup.
    expected: >-
      Each state transition matches the referenced lifecycle, and successful
      removal leaves no owned configuration.
    negative: false
    data_needs: >-
      Run-owned records for the stated setup; retain the initial values for
      comparison.
    bound_to: []
    provenance: proposed
    source: >-
      specs/accounting/books/design/state-models/STATE-ACC-BKS-001-business-unit-lifecycle.md:transitions
    state_model: STATE-ACC-BKS-001
    transitions:
      - - absent
        - inactive
      - - active
        - inactive
      - - inactive
        - active
      - - inactive
        - deleted
      - - active
        - deleted
    binding_evidence: []
  - id: ATS-ACC-BKS-001-12
    title: Founding month endpoints
    category: boundary
    level: api
    proves:
      - BR-CAP-ACC-BKS-001-01
    preconditions: >-
      An isolated workspace has records needed for both eligible and ineligible
      examples.
    steps: >-
      Create otherwise identical units with months zero, one, twelve and
      thirteen.
    expected: The valid endpoints commit their calendars; refused inputs leave no setup.
    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#creates
      it under the id its name suggests, in the tenant of the path
    binding_evidence: []
  - id: ATS-ACC-BKS-001-13
    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-001-14
    title: Currency setup commits with the new unit
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-BKS-001-03
      - BR-CAP-ACC-BKS-002-04
    preconditions: >-
      Run-owned records satisfy the preconditions of the referenced capability
      proofs.
    steps: >-
      Create a unit with supported currencies and inspect its currency settings
      and both initial years.
    expected: >-
      The read-back joins the selected currencies to the unit and complete
      calendar.
    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/fiscal-years.integration.spec.js#gives
        the new unit exactly its two years, the one containing today and the
        next
      - >-
        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
    exercises:
      - CAP-ACC-BKS-001
      - CAP-ACC-BKS-002
    workflows:
      - WF-ACC-BKS-001
      - WF-ACC-BKS-002
    binding_evidence: []
  - id: ATS-ACC-BKS-001-15
    title: Policy survives a unit availability change
    category: interaction
    level: browser
    proves:
      - BR-CAP-ACC-BKS-001-05
      - BR-CAP-ACC-BKS-003-02
    preconditions: >-
      Run-owned records satisfy the preconditions of the referenced capability
      proofs.
    steps: >-
      Set write-off treatment, change description and cycle the unit through
      inactive and active, then read the saved policy.
    expected: The unit changes availability while its omitted policy remains intact.
    negative: false
    data_needs: >-
      Run-owned records for the stated setup; retain the initial values for
      comparison.
    bound_to:
      - TST-ACC-BKS-002
    provenance: test
    source:
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#keeps
        the supported currencies when the replacement does not state them
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#takes
        bad_debt_expense on a create that leaves the treatment out
    exercises:
      - CAP-ACC-BKS-001
      - CAP-ACC-BKS-003
    workflows:
      - WF-ACC-BKS-001
      - WF-ACC-BKS-002
    binding_evidence:
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0002.spec.ts#ACT-ACC-0002
  - id: ATS-ACC-BKS-001-16
    title: Calendar failure rolls back a new unit
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-BKS-001-03
      - BR-CAP-ACC-BKS-009-04
    preconditions: >-
      Run-owned records satisfy the preconditions of the referenced capability
      proofs.
    steps: >-
      Induce a failure while writing the second initial year, then read the
      unit, currency rows and calendar.
    expected: No part of the attempted setup remains.
    negative: false
    data_needs: >-
      Run-owned records for the stated setup; retain the initial values for
      comparison.
    bound_to:
      - TST-ACC-BKS-087
    provenance: test
    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
      - >-
        services-accounting:modules/books/tests/integration/db/fiscal-years.table.integration.spec.js#refuses
        a year leaving a gap after the latest, in Rhythm 1.0’s sentence
    exercises:
      - CAP-ACC-BKS-001
      - CAP-ACC-BKS-009
    workflows:
      - WF-ACC-BKS-001
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/fiscal-years.integration.spec.js#rolls
        the unit back with its currency row and its first year
  - id: ATS-ACC-BKS-001-17
    title: A stale unit edit preserves its established books
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-BKS-001-02
      - BR-CAP-ACC-BKS-016-05
    preconditions: >-
      Run-owned records satisfy the preconditions of the referenced capability
      proofs.
    steps: >-
      Save a description change, then submit an earlier-version replacement and
      read the unit and calendar.
    expected: The stale request preserves the accepted change and founding setup.
    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 to a change of the base currency, naming the column
      - >-
        services-accounting:modules/books/tests/e2e/payment-terms.e2e.spec.js#answers
        400 naming is_active to a replacement that leaves it out
    exercises:
      - CAP-ACC-BKS-001
      - CAP-ACC-BKS-016
    workflows:
      - WF-ACC-BKS-002
      - WF-ACC-BKS-003
    binding_evidence: []
  - id: ATS-ACC-BKS-001-18
    title: Template validation rolls back the full unit replacement
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-BKS-001-05
      - BR-CAP-ACC-BKS-015-04
    preconditions: >-
      Run-owned records satisfy the preconditions of the referenced capability
      proofs.
    steps: >-
      Submit a new description, changed currency settings and an inactive
      document choice in one replacement; read the unit and currency rows.
    expected: The rejected document choice prevents every attempted replacement change.
    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#keeps
        the supported currencies when the replacement does not state 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-001
      - CAP-ACC-BKS-015
    workflows:
      - WF-ACC-BKS-002
    binding_evidence: []
  - id: ATS-ACC-BKS-001-19
    title: Keep the selected working unit across page navigation
    category: edge
    level: browser
    proves:
      - BR-CAP-ACC-BKS-001-08
    preconditions: >-
      The mock workspace has two active units and invoice entry contains typed
      charges.
    steps: >-
      Switch to the other unit, confirm discarding the previous charges, select
      a product of the new unit and navigate to the invoice list. Inspect the
      remembered context and offered currencies.
    expected: >-
      The selected unit remains the working context across navigation and its
      offered currency choices match the new unit setup.
    negative: false
    data_needs: >-
      The suite’s isolated mock records for two active units, their products and
      currencies.
    bound_to:
      - TST-ACC-BKS-198
    provenance: test
    source: >-
      react-console:e2e/mock/accounting-invoice-context.mock.spec.ts#a business
      unit change starts the charges over in that unit and is remembered
    binding_evidence:
      - >-
        react-console:e2e/mock/accounting-invoice-context.mock.spec.ts#a
        business unit change starts the charges over in that unit and is
        remembered
evidence:
  - >-
    Verified source file:
    react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0001.spec.ts
  - >-
    Verified source file:
    react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0002.spec.ts
  - >-
    Verified source file:
    react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0004.spec.ts
  - >-
    Verified source file:
    react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0008.spec.ts
  - >-
    Verified source file:
    react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0009.spec.ts
  - >-
    Verified source file:
    react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0011.spec.ts
  - >-
    Verified source file:
    react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0018.spec.ts
  - >-
    Verified source file:
    services-accounting:modules/books/tests/e2e/business-units.e2e.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/e2e/fiscal-years.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/services/persistence/business-units.integration.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/services/persistence/departments.integration.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/services/persistence/fiscal-years.integration.spec.js
product_intent: proposed
state_transition_coverage:
  - state_model: STATE-ACC-BKS-001
    from: absent
    to: active
    trigger: Create an active unit
    provenance: test
    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
    scenarios:
      - ATS-ACC-BKS-001-03
  - state_model: STATE-ACC-BKS-001
    from: absent
    to: inactive
    trigger: Create an inactive unit
    provenance: observed
    source: >-
      services-accounting:modules/books/services/persistence/business-units.ts:createBusinessUnit
    scenarios:
      - ATS-ACC-BKS-001-11
  - state_model: STATE-ACC-BKS-001
    from: active
    to: inactive
    trigger: Deactivate the unit
    provenance: observed
    source: >-
      services-accounting:modules/books/services/persistence/business-units.ts:updateBusinessUnit
    scenarios:
      - ATS-ACC-BKS-001-11
  - state_model: STATE-ACC-BKS-001
    from: inactive
    to: active
    trigger: Reactivate the unit
    provenance: observed
    source: >-
      services-accounting:modules/books/services/persistence/business-units.ts:updateBusinessUnit
    scenarios:
      - ATS-ACC-BKS-001-11
  - state_model: STATE-ACC-BKS-001
    from: active
    to: deleted
    trigger: Remove an active unit
    provenance: test
    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
    scenarios:
      - ATS-ACC-BKS-001-11
      - ATS-ACC-BKS-001-06
  - state_model: STATE-ACC-BKS-001
    from: inactive
    to: deleted
    trigger: Remove an inactive unit
    provenance: observed
    source: >-
      services-accounting:modules/books/services/persistence/business-units.ts:deleteBusinessUnit
    scenarios:
      - ATS-ACC-BKS-001-11
coverage:
  rule: 'gap: FND-ACC-BKS-062'
  transition: covered
  validation: covered
  permission: covered
  edge: covered
  failure: covered
  boundary: covered
  concurrency: covered
  invariant: covered
  interaction: covered
coverage_notes:
  rule:
    scenarios:
      - ATS-ACC-BKS-001-04
      - ATS-ACC-BKS-001-07
    provenance: unknown
    source: FND-ACC-BKS-062
    gap: FND-ACC-BKS-062
    reason: >-
      The examples isolate part of this category; the finding records its
      remaining specification or execution boundary.
  transition:
    scenarios:
      - ATS-ACC-BKS-001-06
      - ATS-ACC-BKS-001-09
      - ATS-ACC-BKS-001-11
    provenance: documented
    source:
      - ATS-ACC-BKS-001-06
      - ATS-ACC-BKS-001-09
      - ATS-ACC-BKS-001-11
  validation:
    scenarios:
      - ATS-ACC-BKS-001-01
    provenance: documented
    source:
      - ATS-ACC-BKS-001-01
  permission:
    scenarios:
      - ATS-ACC-BKS-001-10
    provenance: documented
    source:
      - ATS-ACC-BKS-001-10
  edge:
    scenarios:
      - ATS-ACC-BKS-001-05
      - ATS-ACC-BKS-001-19
    provenance: documented
    source:
      - ATS-ACC-BKS-001-05
  failure:
    scenarios:
      - ATS-ACC-BKS-001-03
    provenance: documented
    source:
      - ATS-ACC-BKS-001-03
  boundary:
    scenarios:
      - ATS-ACC-BKS-001-12
    provenance: documented
    source:
      - ATS-ACC-BKS-001-12
  concurrency:
    scenarios:
      - ATS-ACC-BKS-001-13
    provenance: documented
    source:
      - ATS-ACC-BKS-001-13
  invariant:
    scenarios:
      - ATS-ACC-BKS-001-02
    provenance: documented
    source:
      - ATS-ACC-BKS-001-02
  interaction:
    scenarios:
      - ATS-ACC-BKS-001-08
      - ATS-ACC-BKS-001-14
      - ATS-ACC-BKS-001-15
      - ATS-ACC-BKS-001-16
      - ATS-ACC-BKS-001-17
      - ATS-ACC-BKS-001-18
    provenance: documented
    source:
      - ATS-ACC-BKS-001-08
      - ATS-ACC-BKS-001-14
      - ATS-ACC-BKS-001-15
      - ATS-ACC-BKS-001-16
      - ATS-ACC-BKS-001-17
      - ATS-ACC-BKS-001-18
rule_coverage:
  - rule: BR-CAP-ACC-BKS-001-01
    scenarios:
      - ATS-ACC-BKS-001-01
      - ATS-ACC-BKS-001-12
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/business-units.e2e.spec.js#creates
      it under the id its name suggests, in the tenant of the path
  - rule: BR-CAP-ACC-BKS-001-02
    scenarios:
      - ATS-ACC-BKS-001-02
      - ATS-ACC-BKS-001-17
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/business-units.e2e.spec.js#answers
      409 to a change of the base currency, naming the column
  - rule: BR-CAP-ACC-BKS-001-03
    scenarios:
      - ATS-ACC-BKS-001-03
      - ATS-ACC-BKS-001-11
      - ATS-ACC-BKS-001-14
      - ATS-ACC-BKS-001-16
    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
  - rule: BR-CAP-ACC-BKS-001-04
    scenarios:
      - ATS-ACC-BKS-001-04
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/business-units.e2e.spec.js#gives
      every setting the request left out its default
  - rule: BR-CAP-ACC-BKS-001-05
    scenarios:
      - ATS-ACC-BKS-001-05
      - ATS-ACC-BKS-001-15
      - ATS-ACC-BKS-001-18
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#keeps
      the supported currencies when the replacement does not state them
  - rule: BR-CAP-ACC-BKS-001-06
    scenarios:
      - ATS-ACC-BKS-001-06
      - ATS-ACC-BKS-001-11
    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
  - rule: BR-CAP-ACC-BKS-001-08
    scenarios:
      - ATS-ACC-BKS-001-07
      - ATS-ACC-BKS-001-19
    provenance: documented
    source: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#R28'
    gap: FND-ACC-BKS-062
related_coverage:
  - capability: CAP-ACC-BKS-002
    scenarios:
      - ATS-ACC-BKS-001-14
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-001-open-a-set-of-books-for-each-organization-the-customer-keeps.md
  - capability: CAP-ACC-BKS-003
    scenarios:
      - ATS-ACC-BKS-001-15
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-001-open-a-set-of-books-for-each-organization-the-customer-keeps.md
  - capability: CAP-ACC-BKS-009
    scenarios:
      - ATS-ACC-BKS-001-16
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-001-open-a-set-of-books-for-each-organization-the-customer-keeps.md
  - capability: CAP-ACC-BKS-016
    scenarios:
      - ATS-ACC-BKS-001-17
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-001-open-a-set-of-books-for-each-organization-the-customer-keeps.md
workflow_coverage:
  - workflow: WF-ACC-BKS-001
    interactions:
      - ATS-ACC-BKS-001-14
      - ATS-ACC-BKS-001-15
      - ATS-ACC-BKS-001-16
    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-062
  - workflow: WF-ACC-BKS-002
    interactions:
      - ATS-ACC-BKS-001-14
      - ATS-ACC-BKS-001-15
      - ATS-ACC-BKS-001-17
      - ATS-ACC-BKS-001-18
    provenance: documented
    source: >-
      specs/accounting/books/design/workflows/WF-ACC-BKS-002-replace-a-business-units-settings.md
    gap: FND-ACC-BKS-062
  - workflow: WF-ACC-BKS-003
    interactions:
      - ATS-ACC-BKS-001-17
    provenance: documented
    source: >-
      specs/accounting/books/design/workflows/WF-ACC-BKS-003-delete-a-business-unit-and-its-owned-setup.md
    gap: FND-ACC-BKS-062
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
  - invariant: INV-DOM-ACC-BKS-003-01
    scenarios:
      - ATS-ACC-BKS-009-04
      - ATS-ACC-BKS-009-11
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/integration/db/fiscal-years.table.integration.spec.js#refuses
      a year leaving a gap after the latest, in Rhythm 1.0’s sentence
  - invariant: INV-DOM-ACC-BKS-003-02
    scenarios:
      - ATS-ACC-BKS-009-07
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/integration/db/fiscal-years.table.integration.spec.js#closes
      the year when its last open period is closed
  - invariant: INV-DOM-ACC-BKS-003-03
    scenarios:
      - ATS-ACC-BKS-009-05
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/fiscal-years.e2e.spec.js#answers
      409 to a changed start date, naming the column
  - invariant: INV-DOM-ACC-BKS-003-04
    scenarios:
      - ATS-ACC-BKS-009-06
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/fiscal-years.e2e.spec.js#answers
      409 naming the latest year
  - invariant: INV-DOM-ACC-BKS-003-05
    scenarios:
      - ATS-ACC-BKS-009-03
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/fiscal-years.integration.spec.js#writes
      none of the years, not even the years within reach
  - invariant: INV-DOM-ACC-BKS-003-06
    scenarios:
      - ATS-ACC-BKS-010-02
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/fiscal-years.e2e.spec.js#answers
      404 to the day after the last year, generating nothing
permission_coverage:
  - key: accounting.business-units.read
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-001-10
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-001-open-a-set-of-books-for-each-organization-the-customer-keeps.md
    execution_gap: FND-ACC-BKS-062
  - key: accounting.business-units.create
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-001-10
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-001-open-a-set-of-books-for-each-organization-the-customer-keeps.md
    execution_gap: FND-ACC-BKS-062
  - key: accounting.business-units.update
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-001-10
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-001-open-a-set-of-books-for-each-organization-the-customer-keeps.md
    execution_gap: FND-ACC-BKS-062
  - key: accounting.business-units.delete
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-001-10
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-001-open-a-set-of-books-for-each-organization-the-customer-keeps.md
    execution_gap: FND-ACC-BKS-062
  - key: accounting.business-units.query
    where_checked: service
    scenarios:
      - ATS-ACC-BKS-001-10
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-001-open-a-set-of-books-for-each-organization-the-customer-keeps.md
    execution_gap: FND-ACC-BKS-062
reviewed_at: '2026-10-23'
---

# Establish a separate set of books for each business unit: Capability Test Specification

## Coverage

- Create with a generated identity.
- Keep founding choices fixed.
- Create the unit and calendar atomically.
- Apply creation defaults.
- Preserve omitted extension settings.
- Protect units with dependent configuration.
- Initialize a current working context.

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

## Interactions With Related Capabilities

- Open a chapter’s complete books.
- Currency setup commits with the new unit.
- Policy survives a unit availability change.
- Calendar failure rolls back a new unit.
- A stale unit edit preserves its established books.
- Template validation rolls back the full unit replacement.

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.
