---
id: ATS-ACC-BKS-008
scope: CAP-ACC-BKS-008
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-008-01
    title: Keep independent dimension namespaces
    level: api
    proves:
      - BR-CAP-ACC-BKS-008-01
      - INV-DOM-ACC-BKS-002-09
    preconditions: Two units exist.
    steps: >-
      Repeat a department code locally, use it in the other unit and create a
      project with the same code.
    expected: >-
      Normalization and derived identity apply; only the local department
      duplicate fails.
    negative: false
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-050
      - TST-ACC-BKS-070
      - TST-ACC-BKS-170
    provenance: test
    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
    category: validation
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/departments.e2e.spec.js#answers
        400 to a code the unit already has, under the id it derives
      - >-
        services-accounting:modules/books/tests/e2e/departments.e2e.spec.js#accepts
        the same code in another unit
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/accounting-projects.integration.spec.js#accepts
        the same code in another unit, and a department of the same code in the
        same unit
      - >-
        services-accounting:modules/books/tests/unit/rules/accounting-dimensions.spec.js#derives
        <business unit id>_<code> lower-cased, Rhythm 1.0’s <BU>-<CODE> as a
        configuration id
  - id: ATS-ACC-BKS-008-02
    title: Keep dimension identities fixed
    level: api
    proves:
      - BR-CAP-ACC-BKS-008-02
      - INV-DOM-ACC-BKS-002-09
    preconditions: A department and project are saved.
    steps: Change their codes and units.
    expected: Each replacement identifies the immutable-field conflict.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-050
      - TST-ACC-BKS-044
      - TST-ACC-BKS-061
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/departments.e2e.spec.js#answers
      409 to a change of code, naming the column
    category: invariant
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/departments.e2e.spec.js#answers
        409 to a change of code, naming the column
      - >-
        services-accounting:modules/books/tests/e2e/accounting-projects.e2e.spec.js#answers
        409 to a change of business unit, naming the column
      - >-
        services-accounting:modules/books/tests/integration/db/accounting-dimensions.table.integration.spec.js#refuses
        a change of code (RHF01)
  - id: ATS-ACC-BKS-008-03
    title: Recompute readable labels
    level: api
    proves:
      - BR-CAP-ACC-BKS-008-03
      - BR-CAP-ACC-BKS-008-04
    preconditions: A department and unnamed project exist.
    steps: 'Rename the department, read the project and create a nameless department.'
    expected: >-
      Labels use the updated name or code alone, and the unnamed department is
      refused.
    negative: false
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-050
      - TST-ACC-BKS-044
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/departments.e2e.spec.js#answers
      the new name, and the display name recomputed from it
    category: rule
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/departments.e2e.spec.js#answers
        the new name, and the display name recomputed from it
      - >-
        services-accounting:modules/books/tests/e2e/accounting-projects.e2e.spec.js#answers
        it with no name, no end date, and the code alone as its display name
      - >-
        services-accounting:modules/books/tests/e2e/departments.e2e.spec.js#answers
        400 to a display_name-only body: the display name is derived, the name
        is required
  - id: ATS-ACC-BKS-008-04
    title: Protect a product’s reporting dimension
    level: api
    proves:
      - BR-CAP-ACC-BKS-008-05
    preconditions: A product setup references the department.
    steps: Delete the department’s business unit.
    expected: The product dependency blocks removal of the unit and dimension.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-080
    provenance: test
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/departments.integration.spec.js#refuses
      the delete 409, naming the unit’s products
    category: failure
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/departments.integration.spec.js#refuses
        the delete 409, naming the unit’s products
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/departments.integration.spec.js#keeps
        the unit and its department
  - id: ATS-ACC-BKS-008-05
    title: Reject unsupported extensions
    level: api
    proves:
      - BR-CAP-ACC-BKS-008-06
    preconditions: The unit is available.
    steps: Create a project with custom-field values.
    expected: The unsupported properties are refused.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-044
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/accounting-projects.e2e.spec.js#answers
      400 to custom field values, which Accounting does not carry yet
    category: validation
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/accounting-projects.e2e.spec.js#answers
        400 to custom field values, which Accounting does not carry yet
  - id: ATS-ACC-BKS-008-06
    title: Exercise the grants for organize reporting by department and project
    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.departments.read
      - accounting.departments.create
      - accounting.departments.update
      - accounting.departments.delete
      - accounting.accounting-projects.read
      - accounting.accounting-projects.create
      - accounting.accounting-projects.update
      - accounting.accounting-projects.delete
    binding_evidence: []
    supporting_tests:
      - >-
        services-accounting:modules/books/tests/e2e/accounting-dimensions-security.e2e.spec.js#is
        refused the create 403 permission_missing
  - id: ATS-ACC-BKS-008-07
    title: Collection identity boundaries
    category: boundary
    level: api
    proves:
      - BR-CAP-ACC-BKS-008-01
    preconditions: >-
      An isolated workspace has records needed for both eligible and ineligible
      examples.
    steps: >-
      Use the same code in a second unit and in the other dimension collection,
      then repeat it within its original collection and unit.
    expected: Only the repeated identity in the original collection is refused.
    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/departments.e2e.spec.js#answers
      400 to a code the unit already has, under the id it derives
    binding_evidence: []
  - id: ATS-ACC-BKS-008-08
    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-008-09
    title: Chart and dimensions share the selected unit context
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-BKS-008-08
      - BR-CAP-ACC-BKS-005-07
    preconditions: >-
      Run-owned records satisfy the preconditions of the referenced capability
      proofs.
    steps: >-
      Switch the working unit and create one chart account, department and
      project through their editors; read each record and list.
    expected: >-
      Each editor and scoped list uses the selected unit while the independent
      code collections retain their own identities.
    negative: false
    data_needs: >-
      Run-owned records for the stated setup; retain the initial values for
      comparison.
    bound_to: []
    provenance: proposed
    source:
      - 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#R16'
      - 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#R15'
    exercises:
      - CAP-ACC-BKS-008
      - CAP-ACC-BKS-005
    workflows: []
    binding_evidence: []
evidence:
  - >-
    Verified source file:
    services-accounting:modules/books/tests/e2e/accounting-projects.e2e.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/e2e/departments.e2e.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/db/accounting-dimensions.table.integration.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/services/persistence/accounting-projects.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/unit/rules/accounting-dimensions.spec.js
product_intent: proposed
coverage:
  rule: covered
  transition: not-applicable
  validation: covered
  permission: covered
  edge: 'gap: FND-ACC-BKS-069'
  failure: covered
  boundary: covered
  concurrency: covered
  invariant: covered
  interaction: covered
coverage_notes:
  rule:
    scenarios:
      - ATS-ACC-BKS-008-03
    provenance: documented
    source:
      - ATS-ACC-BKS-008-03
  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-008-report-revenue-and-expense-by-department-and-accounting.md
  validation:
    scenarios:
      - ATS-ACC-BKS-008-01
      - ATS-ACC-BKS-008-05
    provenance: documented
    source:
      - ATS-ACC-BKS-008-01
      - ATS-ACC-BKS-008-05
  permission:
    scenarios:
      - ATS-ACC-BKS-008-06
    provenance: documented
    source:
      - ATS-ACC-BKS-008-06
  edge:
    scenarios: []
    provenance: unknown
    source: FND-ACC-BKS-069
    reason: >-
      No scenario isolates this category for the capability at the pinned
      revision.
    gap: FND-ACC-BKS-069
  failure:
    scenarios:
      - ATS-ACC-BKS-008-04
    provenance: documented
    source:
      - ATS-ACC-BKS-008-04
  boundary:
    scenarios:
      - ATS-ACC-BKS-008-07
    provenance: documented
    source:
      - ATS-ACC-BKS-008-07
  concurrency:
    scenarios:
      - ATS-ACC-BKS-008-08
    provenance: documented
    source:
      - ATS-ACC-BKS-008-08
  invariant:
    scenarios:
      - ATS-ACC-BKS-008-02
    provenance: documented
    source:
      - ATS-ACC-BKS-008-02
  interaction:
    scenarios:
      - ATS-ACC-BKS-008-09
    provenance: documented
    source:
      - ATS-ACC-BKS-008-09
rule_coverage:
  - rule: BR-CAP-ACC-BKS-008-01
    scenarios:
      - ATS-ACC-BKS-008-01
      - ATS-ACC-BKS-008-07
    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
  - rule: BR-CAP-ACC-BKS-008-02
    scenarios:
      - ATS-ACC-BKS-008-02
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/accounting-projects.e2e.spec.js#answers
      409 to a change of code, naming the column
  - rule: BR-CAP-ACC-BKS-008-03
    scenarios:
      - ATS-ACC-BKS-008-03
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/departments.e2e.spec.js#answers
      the new name, and the display name recomputed from it
  - rule: BR-CAP-ACC-BKS-008-04
    scenarios:
      - ATS-ACC-BKS-008-03
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/accounting-projects.e2e.spec.js#answers
      it with no name, no end date, and the code alone as its display name
  - rule: BR-CAP-ACC-BKS-008-05
    scenarios:
      - ATS-ACC-BKS-008-04
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/departments.integration.spec.js#refuses
      the delete 409, naming the unit’s products
  - rule: BR-CAP-ACC-BKS-008-06
    scenarios:
      - ATS-ACC-BKS-008-05
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/accounting-projects.e2e.spec.js#answers
      400 to custom field values, which Accounting does not carry yet
related_coverage:
  - capability: CAP-ACC-BKS-005
    scenarios:
      - ATS-ACC-BKS-008-09
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-008-report-revenue-and-expense-by-department-and-accounting.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.departments.read
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-008-06
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-008-report-revenue-and-expense-by-department-and-accounting.md
    execution_gap: FND-ACC-BKS-069
  - key: accounting.departments.create
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-008-06
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-008-report-revenue-and-expense-by-department-and-accounting.md
    execution_gap: FND-ACC-BKS-069
  - key: accounting.departments.update
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-008-06
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-008-report-revenue-and-expense-by-department-and-accounting.md
    execution_gap: FND-ACC-BKS-069
  - key: accounting.departments.delete
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-008-06
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-008-report-revenue-and-expense-by-department-and-accounting.md
    execution_gap: FND-ACC-BKS-069
  - key: accounting.accounting-projects.read
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-008-06
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-008-report-revenue-and-expense-by-department-and-accounting.md
    execution_gap: FND-ACC-BKS-069
  - key: accounting.accounting-projects.create
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-008-06
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-008-report-revenue-and-expense-by-department-and-accounting.md
    execution_gap: FND-ACC-BKS-069
  - key: accounting.accounting-projects.update
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-008-06
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-008-report-revenue-and-expense-by-department-and-accounting.md
    execution_gap: FND-ACC-BKS-069
  - key: accounting.accounting-projects.delete
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-008-06
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-008-report-revenue-and-expense-by-department-and-accounting.md
    execution_gap: FND-ACC-BKS-069
reviewed_at: '2026-10-23'
---

# Organize reporting by department and project: Capability Test Specification

## Coverage

- Keep independent dimension namespaces.
- Keep dimension identities fixed.
- Recompute readable labels.
- Recompute readable labels.
- Protect a product’s reporting dimension.
- Reject unsupported extensions.

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

## Interactions With Related Capabilities

- Chart and dimensions share the selected unit context.

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.
