---
id: ATS-ACC-CLS-001
scope: CAP-ACC-CLS-001
product_area: accounting
module: close
revision: 2
status: proposed
approved_by: null
approved_at: null
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-ACC-CLS-001-01
    title: Locate the current period across years
    level: api
    proves:
      - BR-CAP-ACC-CLS-001-02
    preconditions: Earlier months are closed and later months remain open.
    steps: Request the business unit’s calendar.
    expected: 'Only the earliest unfinished month is current, including after a year boundary.'
    negative: false
    data_needs: A unit calendar spanning two years.
    bound_to:
      - >-
        services-accounting:modules/fiscal-close/tests/integration/services/periods/period-calendar.integration.spec.js#marks
        the first period not closed current, the next year’s January
      - >-
        services-accounting:modules/fiscal-close/tests/e2e/fiscal-close-readiness.e2e.spec.js#marks
        September 2026 current
      - TST-ACC-CLS-024
      - TST-ACC-CLS-016
    provenance: test
    source: >-
      services-accounting:modules/fiscal-close/tests/integration/services/periods/period-calendar.integration.spec.js#marks
      the first period not closed current, the next year’s January
    category: rule
  - id: ATS-ACC-CLS-001-02
    title: Reject inconsistent close stamps and correction counts
    level: api
    proves:
      - BR-CAP-ACC-CLS-001-03
      - BR-CAP-ACC-CLS-001-04
      - INV-DOM-ACC-CLS-001-02
      - INV-DOM-ACC-CLS-001-05
    preconditions: Period constraints are active.
    steps: >-
      Insert closed periods without stamps, nonclosed periods with stamps and a negative correction
      count.
    expected: All inconsistent writes fail.
    negative: true
    data_needs: Period rows with invalid close metadata.
    bound_to:
      - >-
        services-accounting:modules/fiscal-close/tests/integration/db/fiscal-close.table.integration.spec.js#refuses
        a closed period without its closer
      - >-
        services-accounting:modules/fiscal-close/tests/integration/db/fiscal-close.table.integration.spec.js#refuses
        an open period that names a closer and a time
      - >-
        services-accounting:modules/fiscal-close/tests/integration/db/fiscal-close.table.integration.spec.js#refuses
        a reopening period that still names its closer
      - >-
        services-accounting:modules/fiscal-close/tests/integration/db/fiscal-close.table.integration.spec.js#refuses
        a negative reopen count
      - TST-ACC-CLS-018
    provenance: test
    source: >-
      services-accounting:modules/fiscal-close/tests/integration/db/fiscal-close.table.integration.spec.js#refuses
      a closed period without its closer
    category: invariant
  - id: ATS-ACC-CLS-001-03
    title: Derive the year state from its periods
    level: api
    proves:
      - BR-CAP-ACC-CLS-001-05
      - INV-DOM-ACC-CLS-001-07
    preconditions: The first eleven periods are closed.
    steps: 'Move the final period through closing, closed and reopening, and read the calendar.'
    expected: 'The year follows completion and reopening, with final-period close details when closed.'
    negative: false
    data_needs: One nearly completed fiscal year.
    bound_to:
      - >-
        services-accounting:modules/fiscal-close/tests/integration/services/persistence/fiscal-periods.integration.spec.js#stays
        open while its twelfth period is closing
      - >-
        services-accounting:modules/fiscal-close/tests/integration/services/persistence/fiscal-periods.integration.spec.js#becomes
        closed exactly when its twelfth period closes
      - >-
        services-accounting:modules/fiscal-close/tests/integration/services/persistence/fiscal-periods.integration.spec.js#becomes
        open again when one period starts reopening
      - >-
        services-accounting:modules/fiscal-close/tests/integration/services/periods/period-calendar.integration.spec.js#answers
        a closed year with its last period’s close
      - TST-ACC-CLS-026
      - TST-ACC-CLS-024
    provenance: test
    source: >-
      services-accounting:modules/fiscal-close/tests/integration/services/persistence/fiscal-periods.integration.spec.js#becomes
      closed exactly when its twelfth period closes
    category: transition
  - id: ATS-ACC-CLS-001-04
    title: Validate calendar access and unit selection
    level: api
    proves:
      - BR-CAP-ACC-CLS-001-06
      - BR-CAP-ACC-CLS-001-07
    preconditions: One caller has read authority and another lacks it.
    steps: 'Request a calendar without a unit, for a foreign unit and without read authority.'
    expected: 'Responses are validation failure, not found and access denied respectively.'
    negative: true
    data_needs: Two callers and two workspaces.
    bound_to:
      - >-
        services-accounting:modules/fiscal-close/tests/e2e/fiscal-close-readiness.e2e.spec.js#refuses
        a request without business_unit_id with 400
      - >-
        services-accounting:modules/fiscal-close/tests/e2e/fiscal-close-readiness.e2e.spec.js#answers
        404 for a unit the tenant does not have
      - >-
        services-accounting:modules/fiscal-close/tests/e2e/fiscal-close-readiness.e2e.spec.js#refuses
        a principal without accounting.fiscal-periods.read with 403
      - TST-ACC-CLS-016
    provenance: test
    source: >-
      services-accounting:modules/fiscal-close/tests/e2e/fiscal-close-readiness.e2e.spec.js#the
      periods
    category: validation
  - id: ATS-ACC-CLS-001-05
    title: Control access to the close workspace
    level: browser
    proves:
      - BR-CAP-ACC-CLS-001-07
    preconditions: The console user lacks the fiscal-period read grant.
    steps: Inspect the Accounting menu and visit the close workspace directly.
    expected: The menu omits the entry and direct access is refused.
    negative: true
    data_needs: A user without close-workspace read access.
    bound_to: []
    provenance: proposed
    source: 'react-console:app/(console)/console/[tenantId]/accounting/close/layout.tsx:CloseLayout'
    category: permission
  - id: ATS-ACC-CLS-001-06
    title: Follow a final-month close into the next calendar year
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-CLS-001-02
      - BR-CAP-ACC-CLS-001-05
    preconditions: 'A unit has eleven closed months and a clean final month, with future years available.'
    steps: >-
      Read the current month and its authorization; close it, then read the calendar and execution
      history.
    expected: >-
      The final month’s result agrees with year standing, the next current month and the recorded
      run.
    negative: false
    data_needs: 'A unit has eleven closed months and a clean final month, with future years available.'
    bound_to: []
    provenance: proposed
    source:
      - >-
        rhythm-v2-docs:specs/accounting/close/design/workflows/WF-ACC-CLS-001-close-a-month.md#What
        It Does
      - >-
        services-accounting:modules/fiscal-close/tests/integration/services/periods/period-calendar.integration.spec.js#marks
        the first period not closed current, the next year’s January
      - >-
        services-accounting:modules/fiscal-close/tests/integration/services/persistence/fiscal-periods.integration.spec.js#becomes
        closed exactly when its twelfth period closes
    exercises:
      - CAP-ACC-CLS-001
      - CAP-ACC-CLS-002
      - CAP-ACC-CLS-010
      - CAP-ACC-CLS-013
    workflows: []
  - id: ATS-ACC-CLS-001-07
    title: Read calendars on each side of the year limit
    category: boundary
    level: api
    proves:
      - BR-CAP-ACC-CLS-001-09
    preconditions: A unit has exactly one hundred fiscal years; another has one hundred and one.
    steps: Request each complete calendar.
    expected: >-
      The first request returns the complete ordered calendar; the second refuses rather than
      returning a truncated calendar.
    negative: true
    data_needs: A unit has exactly one hundred fiscal years; another has one hundred and one.
    bound_to: []
    provenance: proposed
    source: >-
      services-accounting:modules/fiscal-close/services/persistence/fiscal-periods.ts:listCloseCalendar
  - id: ATS-ACC-CLS-001-08
    title: Read the complete ordered calendar
    category: rule
    level: api
    proves:
      - BR-CAP-ACC-CLS-001-01
    preconditions: A workspace contains two years for one unit and a separate unit in another workspace.
    steps: Read the first unit’s calendar and its closing metadata.
    expected: >-
      The selected unit’s years and months appear in date order with the stored close details;
      foreign calendar data is excluded.
    negative: false
    data_needs: A workspace contains two years for one unit and a separate unit in another workspace.
    bound_to:
      - TST-ACC-CLS-027
      - >-
        services-accounting:modules/fiscal-close/tests/integration/services/persistence/fiscal-periods.queries.integration.spec.js#answers
        the unit’s years oldest first, each mapped whole
    provenance: test
    source: >-
      services-accounting:modules/fiscal-close/tests/integration/services/persistence/fiscal-periods.queries.integration.spec.js#answers
      the unit’s years oldest first, each mapped whole
evidence:
  - 'services-accounting examination inputs: the bound test files.'
  - 'react-console examination inputs: the close layout and the domain menu.'
  - >-
    Testing back-fill: pinned executable files are inspected; no backend or browser result is
    claimed.
coverage:
  rule: covered
  transition: covered
  validation: covered
  permission: covered
  edge: 'gap: FND-ACC-CLS-057'
  failure: 'gap: FND-ACC-CLS-057'
  boundary: covered
  concurrency: 'gap: FND-ACC-CLS-057'
  invariant: covered
  interaction: covered
coverage_notes:
  rule:
    scenarios:
      - ATS-ACC-CLS-001-01
      - ATS-ACC-CLS-001-08
    provenance: inferred
    source:
      - ATS-ACC-CLS-001-01
      - ATS-ACC-CLS-001-08
    note: Specified coverage does not establish that all variants execute or pass.
  transition:
    scenarios:
      - ATS-ACC-CLS-001-03
    provenance: inferred
    source:
      - ATS-ACC-CLS-001-03
    note: Specified coverage does not establish that all variants execute or pass.
  validation:
    scenarios:
      - ATS-ACC-CLS-001-04
    provenance: inferred
    source:
      - ATS-ACC-CLS-001-04
    note: Specified coverage does not establish that all variants execute or pass.
  permission:
    scenarios:
      - ATS-ACC-CLS-001-05
    provenance: inferred
    source:
      - ATS-ACC-CLS-001-05
    note: Specified coverage does not establish that all variants execute or pass.
  edge:
    reason: >-
      Concurrent calendar reads during finalization and service-side closer-name resolution lack
      complete proof.
    provenance: unknown
    source: FND-ACC-CLS-057
  failure:
    reason: >-
      Concurrent calendar reads during finalization and service-side closer-name resolution lack
      complete proof.
    provenance: unknown
    source: FND-ACC-CLS-057
  boundary:
    scenarios:
      - ATS-ACC-CLS-001-07
    provenance: inferred
    source:
      - ATS-ACC-CLS-001-07
    note: Specified coverage does not establish that all variants execute or pass.
  concurrency:
    reason: >-
      Concurrent calendar reads during finalization and service-side closer-name resolution lack
      complete proof.
    provenance: unknown
    source: FND-ACC-CLS-057
  invariant:
    scenarios:
      - ATS-ACC-CLS-001-02
    provenance: inferred
    source:
      - ATS-ACC-CLS-001-02
    note: Specified coverage does not establish that all variants execute or pass.
  interaction:
    scenarios:
      - ATS-ACC-CLS-001-06
    provenance: inferred
    source:
      - ATS-ACC-CLS-001-06
    note: Specified coverage does not establish that all variants execute or pass.
design_coverage:
  objects:
    - DOM-ACC-CLS-001
  invariants:
    - id: INV-DOM-ACC-CLS-001-01
      scenarios: []
      gap: FND-ACC-CLS-057
      provenance: unknown
      source: FND-ACC-CLS-057
    - id: INV-DOM-ACC-CLS-001-02
      scenarios:
        - ATS-ACC-CLS-001-02
      provenance: test
      source:
        - >-
          services-accounting:modules/fiscal-close/tests/integration/db/fiscal-close.table.integration.spec.js#refuses
          a closed period without its closer
    - id: INV-DOM-ACC-CLS-001-03
      scenarios: []
      gap: FND-ACC-CLS-057
      provenance: unknown
      source: FND-ACC-CLS-057
    - id: INV-DOM-ACC-CLS-001-04
      scenarios: []
      gap: FND-ACC-CLS-057
      provenance: unknown
      source: FND-ACC-CLS-057
    - id: INV-DOM-ACC-CLS-001-05
      scenarios:
        - ATS-ACC-CLS-001-02
      provenance: test
      source:
        - >-
          services-accounting:modules/fiscal-close/tests/integration/db/fiscal-close.table.integration.spec.js#refuses
          a closed period without its closer
    - id: INV-DOM-ACC-CLS-001-06
      scenarios: []
      gap: FND-ACC-CLS-057
      provenance: unknown
      source: FND-ACC-CLS-057
    - id: INV-DOM-ACC-CLS-001-07
      scenarios:
        - ATS-ACC-CLS-001-03
      provenance: test
      source:
        - >-
          services-accounting:modules/fiscal-close/tests/integration/services/persistence/fiscal-periods.integration.spec.js#becomes
          closed exactly when its twelfth period closes
    - id: INV-DOM-ACC-CLS-001-08
      scenarios: []
      gap: FND-ACC-CLS-057
      provenance: unknown
      source: FND-ACC-CLS-057
    - id: INV-DOM-ACC-CLS-001-09
      scenarios: []
      gap: FND-ACC-CLS-057
      provenance: unknown
      source: FND-ACC-CLS-057
    - id: INV-DOM-ACC-CLS-001-10
      scenarios: []
      gap: FND-ACC-CLS-057
      provenance: unknown
      source: FND-ACC-CLS-057
  permissions:
    - key: accounting.fiscal-periods.read
      where_checked: api
      gap: FND-ACC-CLS-057
      provenance: unknown
      source: FND-ACC-CLS-057
      note: >-
        Existing permission scenarios cover the named cases; complete grant and surface variants
        need qualification.
    - key: accounting.fiscal-periods.read
      where_checked: console
      gap: FND-ACC-CLS-057
      provenance: unknown
      source: FND-ACC-CLS-057
      note: >-
        Existing permission scenarios cover the named cases; complete grant and surface variants
        need qualification.
  workflows: []
  state_models:
    - STATE-ACC-CLS-001
  transitions:
    - model: STATE-ACC-CLS-001
      from: open
      to: closing
      provenance: unknown
      source: FND-ACC-CLS-057
      gap: FND-ACC-CLS-057
      note: >-
        Writer and workflow scenarios supply selected outcomes; full guard, side-effect and race
        variants require qualification.
    - model: STATE-ACC-CLS-001
      from: closing
      to: closed
      provenance: unknown
      source: FND-ACC-CLS-057
      gap: FND-ACC-CLS-057
      note: >-
        Writer and workflow scenarios supply selected outcomes; full guard, side-effect and race
        variants require qualification.
    - model: STATE-ACC-CLS-001
      from: closing
      to: open
      provenance: unknown
      source: FND-ACC-CLS-057
      gap: FND-ACC-CLS-057
      note: >-
        Writer and workflow scenarios supply selected outcomes; full guard, side-effect and race
        variants require qualification.
    - model: STATE-ACC-CLS-001
      from: closed
      to: reopening
      provenance: unknown
      source: FND-ACC-CLS-057
      gap: FND-ACC-CLS-057
      note: >-
        Writer and workflow scenarios supply selected outcomes; full guard, side-effect and race
        variants require qualification.
    - model: STATE-ACC-CLS-001
      from: reopening
      to: open
      provenance: unknown
      source: FND-ACC-CLS-057
      gap: FND-ACC-CLS-057
      note: >-
        Writer and workflow scenarios supply selected outcomes; full guard, side-effect and race
        variants require qualification.
    - model: STATE-ACC-CLS-001
      from: reopening
      to: closed
      provenance: unknown
      source: FND-ACC-CLS-057
      gap: FND-ACC-CLS-057
      note: >-
        Writer and workflow scenarios supply selected outcomes; full guard, side-effect and race
        variants require qualification.
  interactions:
    - with: CAP-ACC-CLS-002
      scenario: ATS-ACC-CLS-001-06
      provenance: proposed
      source:
        - >-
          rhythm-v2-docs:specs/accounting/close/design/workflows/WF-ACC-CLS-001-close-a-month.md#What
          It Does
        - >-
          services-accounting:modules/fiscal-close/tests/integration/services/periods/period-calendar.integration.spec.js#marks
          the first period not closed current, the next year’s January
        - >-
          services-accounting:modules/fiscal-close/tests/integration/services/persistence/fiscal-periods.integration.spec.js#becomes
          closed exactly when its twelfth period closes
    - with: CAP-ACC-CLS-010
      scenario: ATS-ACC-CLS-001-06
      provenance: proposed
      source:
        - >-
          rhythm-v2-docs:specs/accounting/close/design/workflows/WF-ACC-CLS-001-close-a-month.md#What
          It Does
        - >-
          services-accounting:modules/fiscal-close/tests/integration/services/periods/period-calendar.integration.spec.js#marks
          the first period not closed current, the next year’s January
        - >-
          services-accounting:modules/fiscal-close/tests/integration/services/persistence/fiscal-periods.integration.spec.js#becomes
          closed exactly when its twelfth period closes
    - with: CAP-ACC-CLS-013
      scenario: ATS-ACC-CLS-001-06
      provenance: proposed
      source:
        - >-
          rhythm-v2-docs:specs/accounting/close/design/workflows/WF-ACC-CLS-001-close-a-month.md#What
          It Does
        - >-
          services-accounting:modules/fiscal-close/tests/integration/services/periods/period-calendar.integration.spec.js#marks
          the first period not closed current, the next year’s January
        - >-
          services-accounting:modules/fiscal-close/tests/integration/services/persistence/fiscal-periods.integration.spec.js#becomes
          closed exactly when its twelfth period closes
---
# Understand a business unit’s close calendar: Capability Test Specification

## Coverage

Coverage records the cases specified here. Proposed cases and remaining variants need executable proof before qualification.

| Rule | Scenarios or Finding |
|---|---|
| `BR-CAP-ACC-CLS-001-02` | `ATS-ACC-CLS-001-01`, `ATS-ACC-CLS-001-06` |
| `BR-CAP-ACC-CLS-001-03` | `ATS-ACC-CLS-001-02` |
| `BR-CAP-ACC-CLS-001-04` | `ATS-ACC-CLS-001-02` |
| `BR-CAP-ACC-CLS-001-05` | `ATS-ACC-CLS-001-03`, `ATS-ACC-CLS-001-06` |
| `BR-CAP-ACC-CLS-001-06` | `ATS-ACC-CLS-001-04` |
| `BR-CAP-ACC-CLS-001-07` | `ATS-ACC-CLS-001-04`, `ATS-ACC-CLS-001-05` |
| `BR-CAP-ACC-CLS-001-08` | `FND-ACC-CLS-057` |
| `BR-CAP-ACC-CLS-001-09` | `ATS-ACC-CLS-001-07` |

| `BR-CAP-ACC-CLS-001-01` | `ATS-ACC-CLS-001-08` |

## Interactions With Related Capabilities

Follow a final-month close into the next calendar year. Read the current month and its authorization; close it, then read the calendar and execution history. The final month’s result agrees with year standing, the next current month and the recorded run. The interaction scenario names related capabilities and the workflows it exercises in its structured evidence.
