---
id: ATS-ACC-BKS-009
scope: CAP-ACC-BKS-009
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-009-01
    title: Extend the existing calendar
    level: api
    proves:
      - BR-CAP-ACC-BKS-009-01
    preconditions: The unit already has two years.
    steps: 'Generate with default count, count two and count six.'
    expected: Default and two-year requests append consecutive years; six is refused.
    negative: false
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-054
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/fiscal-years.e2e.spec.js#answers
      200 with one year by default, the year after the latest, and the count
    category: rule
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/fiscal-years.e2e.spec.js#answers
        200 with one year by default, the year after the latest, and the count
      - >-
        services-accounting:modules/books/tests/e2e/fiscal-years.e2e.spec.js#answers
        the two years asked for, each following the one before
      - >-
        services-accounting:modules/books/tests/e2e/fiscal-years.e2e.spec.js#answers
        400 to number_of_years above five
  - id: ATS-ACC-BKS-009-02
    title: Use fiscal naming for years and months
    level: unit
    proves:
      - BR-CAP-ACC-BKS-009-02
    preconditions: January-start and July-start examples exist.
    steps: Plan each year.
    expected: >-
      January uses one year name and July spans two, with numbered monthly
      suffixes.
    negative: false
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-168
    provenance: test
    source: >-
      services-accounting:modules/books/tests/unit/fiscal-year-rules.spec.js#names
      the year by its calendar year alone
    category: rule
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/unit/fiscal-year-rules.spec.js#names
        the year by its calendar year alone
      - >-
        services-accounting:modules/books/tests/unit/fiscal-year-rules.spec.js#names
        the year by both calendar years it spans
      - >-
        services-accounting:modules/books/tests/unit/fiscal-year-rules.spec.js#gives
        the year twelve monthly periods from January to December
      - >-
        services-accounting:modules/books/tests/unit/fiscal-year-rules.spec.js#suffixes
        the year name with the two-digit period number
  - id: ATS-ACC-BKS-009-03
    title: Apply the start-date horizon atomically
    level: api
    proves:
      - BR-CAP-ACC-BKS-009-03
      - INV-DOM-ACC-BKS-003-05
    preconditions: The next requested year extends beyond the allowed horizon.
    steps: Request single and multi-year generation.
    expected: >-
      The refusal identifies the start-date limit and leaves all requested years
      unwritten.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-087
      - TST-ACC-BKS-168
    provenance: test
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/fiscal-years.integration.spec.js#refuses
      the generation in Rhythm 1.0’s words, naming the first start too far ahead
      and the latest allowed
    category: failure
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/fiscal-years.integration.spec.js#refuses
        the generation in Rhythm 1.0’s words, naming the first start too far
        ahead and the latest allowed
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/fiscal-years.integration.spec.js#writes
        none of the years, not even the years within reach
      - >-
        services-accounting:modules/books/tests/unit/fiscal-year-rules.spec.js#refuses
        a year starting a month after the same calendar day five years ahead
        (ACCT-M1 D10.2)
      - >-
        services-accounting:modules/books/tests/unit/fiscal-year-rules.spec.js#limits
        the 29th of February to the 28th of February five years on, unless that
        year is a leap year
  - id: ATS-ACC-BKS-009-04
    title: Enforce complete contiguous periods
    level: api
    proves:
      - BR-CAP-ACC-BKS-009-04
      - INV-DOM-ACC-BKS-003-01
    preconditions: The unit already has a calendar year.
    steps: 'Attempt a gap, overlap, eleven-period year and mid-month boundary.'
    expected: Commit refuses each malformed calendar and rolls back its writes.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-068
    provenance: test
    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
    category: invariant
    binding_evidence:
      - >-
        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
      - >-
        services-accounting:modules/books/tests/integration/db/fiscal-years.table.integration.spec.js#refuses
        a year overlapping the latest
      - >-
        services-accounting:modules/books/tests/integration/db/fiscal-years.table.integration.spec.js#refuses,
        at its commit, a year written with eleven periods
      - >-
        services-accounting:modules/books/tests/integration/db/fiscal-years.table.integration.spec.js#refuses
        a start date that is not the first of a month
  - id: ATS-ACC-BKS-009-05
    title: Rename without changing the calendar
    level: api
    proves:
      - BR-CAP-ACC-BKS-009-05
      - INV-DOM-ACC-BKS-003-03
    preconditions: The year is read at its current version.
    steps: 'Rename it, change its start and change a period’s status.'
    expected: Renaming succeeds without structural changes; other replacements conflict.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-054
      - TST-ACC-BKS-087
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/fiscal-years.e2e.spec.js#changes
      nothing else: the dates, the status and the periods are as read
    category: transition
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/fiscal-years.e2e.spec.js#changes
        nothing else: the dates, the status and the periods are as read
      - >-
        services-accounting:modules/books/tests/e2e/fiscal-years.e2e.spec.js#answers
        409 to a changed start date, naming the column
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/fiscal-years.integration.spec.js#refuses
        a changed period status in Rhythm 1.0’s words
  - id: ATS-ACC-BKS-009-06
    title: Remove only the latest fully open year
    level: api
    proves:
      - BR-CAP-ACC-BKS-009-06
      - INV-DOM-ACC-BKS-003-04
    preconditions: Three years exist and the middle includes a closed period.
    steps: Attempt deletion of the oldest and latest.
    expected: >-
      The older-year refusal names the latest; the latest is removed with its
      periods.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-054
      - TST-ACC-BKS-087
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/fiscal-years.e2e.spec.js#answers
      409 naming the latest year
    category: transition
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/fiscal-years.e2e.spec.js#answers
        409 naming the latest year
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/fiscal-years.integration.spec.js#refuses
        a year with a closed period in Rhythm 1.0’s words, and keeps it
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/fiscal-years.integration.spec.js#no
        longer reads the year it read before the delete, nor any of its periods
  - id: ATS-ACC-BKS-009-07
    title: Derive year standing from periods
    level: api
    proves:
      - BR-CAP-ACC-BKS-009-07
      - INV-DOM-ACC-BKS-003-02
    preconditions: Every period begins open.
    steps: Close all periods and reopen one.
    expected: >-
      The year closes only with all periods closed and reopens with a reopened
      period.
    negative: false
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-068
    provenance: test
    source: >-
      services-accounting:modules/books/tests/integration/db/fiscal-years.table.integration.spec.js#keeps
      the year open while one period is open
    category: invariant
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/integration/db/fiscal-years.table.integration.spec.js#keeps
        the year open while one period is open
      - >-
        services-accounting:modules/books/tests/integration/db/fiscal-years.table.integration.spec.js#closes
        the year when its last open period is closed
      - >-
        services-accounting:modules/books/tests/integration/db/fiscal-years.table.integration.spec.js#reopens
        the year when one of its periods is reopened
  - id: ATS-ACC-BKS-009-08
    title: Use the workspace’s local date
    level: api
    proves:
      - BR-CAP-ACC-BKS-009-08
    preconditions: The local date remains in October while UTC is in November.
    steps: Establish a new business unit at that instant.
    expected: Its first calendar year is based on the local October reference.
    negative: false
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-087
    provenance: test
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/fiscal-years.integration.spec.js#starts
      from the tenant’s month, where the UTC date is already the next month
    category: boundary
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/fiscal-years.integration.spec.js#starts
        from the tenant’s month, where the UTC date is already the next month
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/fiscal-years.integration.spec.js#starts
        from November in a tenant whose zone is UTC, at the same instant (the
        premise: the zone is what differs)
  - id: ATS-ACC-BKS-009-09
    title: Review calendar maintenance across screens
    level: browser
    proves:
      - AS-JNY-ACC-BKS-003-01
      - AS-JNY-ACC-BKS-003-02
      - AS-JNY-ACC-BKS-003-03
    preconditions: The unit begins its year in July.
    steps: 'Follow generation, rename, deletion and period-lookup work.'
    expected: Each screen and read-back reflects the journey’s calendar changes.
    negative: false
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-018
    provenance: test
    source: >-
      react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0023.spec.ts#ACT-ACC-0023
    category: interaction
    binding_evidence:
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0023.spec.ts#ACT-ACC-0023
  - id: ATS-ACC-BKS-009-10
    title: Exercise the grants for extend and maintain a unit’s fiscal calendar
    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.fiscal-years.read
      - accounting.fiscal-years.create
      - accounting.fiscal-years.update
      - accounting.fiscal-years.delete
    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-009-11
    title: Append two generation requests without overlapping coverage
    category: concurrency
    level: api
    proves:
      - BR-CAP-ACC-BKS-009-01
      - BR-CAP-ACC-BKS-009-04
      - INV-DOM-ACC-BKS-003-01
    preconditions: >-
      The unit has two years and enough horizon for two further one-year
      requests.
    steps: >-
      Start two generation requests simultaneously from separate connections,
      then read every resulting year and period.
    expected: >-
      Both serialized extensions follow the referenced generation contract and
      the final calendar satisfies the structural invariant.
    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/workflows/WF-ACC-BKS-005-generate-a-units-next-fiscal-years.md:concurrency
    binding_evidence: []
  - id: ATS-ACC-BKS-009-12
    title: An extension becomes available to dated lookup
    category: interaction
    level: browser
    proves:
      - BR-CAP-ACC-BKS-009-01
      - BR-CAP-ACC-BKS-010-02
    preconditions: >-
      Run-owned records satisfy the preconditions of the referenced capability
      proofs.
    steps: >-
      Look up the day after coverage, generate one year and repeat the identical
      lookup.
    expected: >-
      The initial absence creates no year; the explicit extension makes the date
      resolvable.
    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/workflows/WF-ACC-BKS-005-generate-a-units-next-fiscal-years.md
    exercises:
      - CAP-ACC-BKS-009
      - CAP-ACC-BKS-010
    workflows:
      - WF-ACC-BKS-005
    binding_evidence:
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0023.spec.ts#ACT-ACC-0023
    supporting_tests:
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0023.spec.ts#ACT-ACC-0023
    finding: FND-ACC-BKS-070
    note: >-
      The browser run extends coverage and checks lookups afterward; it does not
      repeat the same previously uncovered date, so the complete interaction
      remains proposed.
evidence:
  - >-
    Verified source file:
    react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0023.spec.ts
  - >-
    Verified source file:
    services-accounting:modules/books/tests/e2e/fiscal-years.e2e.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/db/fiscal-years.table.integration.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/services/persistence/fiscal-years.integration.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/unit/fiscal-year-rules.spec.js
product_intent: proposed
state_transition_coverage:
  - state_model: STATE-ACC-BKS-002
    from: ungenerated
    to: open
    trigger: Generate calendar coverage
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/fiscal-years.e2e.spec.js#answers
      the two years asked for, each following the one before
    scenarios:
      - ATS-ACC-BKS-009-01
  - state_model: STATE-ACC-BKS-002
    from: open
    to: closing
    trigger: Begin closing a period
    provenance: observed
    source: >-
      services-accounting:modules/fiscal-close/services/rules/transitions.ts:PERIOD_STATUS_TRANSITIONS
    scenarios: []
    gap: FND-ACC-BKS-070
  - state_model: STATE-ACC-BKS-002
    from: closing
    to: closed
    trigger: Finalize the close
    provenance: test
    source: >-
      services-accounting:modules/books/tests/integration/db/fiscal-years.table.integration.spec.js#closes
      the year when its last open period is closed
    scenarios: []
    gap: FND-ACC-BKS-070
  - state_model: STATE-ACC-BKS-002
    from: closing
    to: open
    trigger: Return a failed or cancelled close to open
    provenance: observed
    source: >-
      services-accounting:modules/fiscal-close/services/rules/transitions.ts:PERIOD_STATUS_TRANSITIONS
    scenarios: []
    gap: FND-ACC-BKS-070
  - state_model: STATE-ACC-BKS-002
    from: closed
    to: reopening
    trigger: Begin reopening
    provenance: observed
    source: >-
      services-accounting:modules/books/db/fiscal-periods.table.ts:fiscal_periods_year_status_trigger
    scenarios: []
    gap: FND-ACC-BKS-070
  - state_model: STATE-ACC-BKS-002
    from: reopening
    to: open
    trigger: Complete reopening
    provenance: observed
    source: >-
      services-accounting:modules/fiscal-close/services/persistence/fiscal-periods.ts
    scenarios: []
    gap: FND-ACC-BKS-070
  - state_model: STATE-ACC-BKS-002
    from: reopening
    to: closed
    trigger: Return a failed reopening to closed
    provenance: observed
    source: >-
      services-accounting:modules/fiscal-close/services/rules/transitions.ts:PERIOD_STATUS_TRANSITIONS
    scenarios: []
    gap: FND-ACC-BKS-070
  - state_model: STATE-ACC-BKS-002
    from: open
    to: removed
    trigger: Remove eligible calendar records
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/fiscal-years.e2e.spec.js#answers
      409 naming the latest year
    scenarios:
      - ATS-ACC-BKS-009-06
coverage:
  rule: covered
  transition: covered
  validation: 'gap: FND-ACC-BKS-070'
  permission: covered
  edge: 'gap: FND-ACC-BKS-070'
  failure: covered
  boundary: covered
  concurrency: 'gap: FND-ACC-BKS-070'
  invariant: covered
  interaction: covered
coverage_notes:
  rule:
    scenarios:
      - ATS-ACC-BKS-009-01
      - ATS-ACC-BKS-009-02
    provenance: documented
    source:
      - ATS-ACC-BKS-009-01
      - ATS-ACC-BKS-009-02
  transition:
    scenarios:
      - ATS-ACC-BKS-009-05
      - ATS-ACC-BKS-009-06
    provenance: documented
    source:
      - ATS-ACC-BKS-009-05
      - ATS-ACC-BKS-009-06
  validation:
    scenarios: []
    provenance: unknown
    source: FND-ACC-BKS-070
    reason: >-
      No scenario isolates this category for the capability at the pinned
      revision.
    gap: FND-ACC-BKS-070
  permission:
    scenarios:
      - ATS-ACC-BKS-009-10
    provenance: documented
    source:
      - ATS-ACC-BKS-009-10
  edge:
    scenarios: []
    provenance: unknown
    source: FND-ACC-BKS-070
    reason: >-
      No scenario isolates this category for the capability at the pinned
      revision.
    gap: FND-ACC-BKS-070
  failure:
    scenarios:
      - ATS-ACC-BKS-009-03
    provenance: documented
    source:
      - ATS-ACC-BKS-009-03
  boundary:
    scenarios:
      - ATS-ACC-BKS-009-08
    provenance: documented
    source:
      - ATS-ACC-BKS-009-08
  concurrency:
    scenarios:
      - ATS-ACC-BKS-009-11
    provenance: unknown
    source: FND-ACC-BKS-070
    gap: FND-ACC-BKS-070
    reason: >-
      The examples isolate part of this category; the finding records its
      remaining specification or execution boundary.
  invariant:
    scenarios:
      - ATS-ACC-BKS-009-04
      - ATS-ACC-BKS-009-07
    provenance: documented
    source:
      - ATS-ACC-BKS-009-04
      - ATS-ACC-BKS-009-07
  interaction:
    scenarios:
      - ATS-ACC-BKS-009-09
      - ATS-ACC-BKS-009-12
    provenance: documented
    source:
      - ATS-ACC-BKS-009-09
      - ATS-ACC-BKS-009-12
rule_coverage:
  - rule: BR-CAP-ACC-BKS-009-01
    scenarios:
      - ATS-ACC-BKS-009-01
      - ATS-ACC-BKS-009-11
      - ATS-ACC-BKS-009-12
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/fiscal-years.e2e.spec.js#answers
      the two years asked for, each following the one before
  - rule: BR-CAP-ACC-BKS-009-02
    scenarios:
      - ATS-ACC-BKS-009-02
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/unit/fiscal-year-rules.spec.js#names
      the year by both calendar years it spans
  - rule: BR-CAP-ACC-BKS-009-03
    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
  - rule: BR-CAP-ACC-BKS-009-04
    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
  - rule: BR-CAP-ACC-BKS-009-05
    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
  - rule: BR-CAP-ACC-BKS-009-06
    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
  - rule: BR-CAP-ACC-BKS-009-07
    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
  - rule: BR-CAP-ACC-BKS-009-08
    scenarios:
      - ATS-ACC-BKS-009-08
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/fiscal-years.integration.spec.js#starts
      from the tenant’s month, where the UTC date is already the next month
related_coverage:
  - capability: CAP-ACC-BKS-010
    scenarios:
      - ATS-ACC-BKS-009-12
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-009-keep-each-business-units-fiscal-calendar-ahead-of-its.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-070
  - workflow: WF-ACC-BKS-005
    interactions:
      - ATS-ACC-BKS-009-12
    provenance: documented
    source: >-
      specs/accounting/books/design/workflows/WF-ACC-BKS-005-generate-a-units-next-fiscal-years.md
    gap: FND-ACC-BKS-070
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-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.fiscal-years.read
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-009-10
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-009-keep-each-business-units-fiscal-calendar-ahead-of-its.md
    execution_gap: FND-ACC-BKS-070
  - key: accounting.fiscal-years.create
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-009-10
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-009-keep-each-business-units-fiscal-calendar-ahead-of-its.md
    execution_gap: FND-ACC-BKS-070
  - key: accounting.fiscal-years.update
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-009-10
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-009-keep-each-business-units-fiscal-calendar-ahead-of-its.md
    execution_gap: FND-ACC-BKS-070
  - key: accounting.fiscal-years.delete
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-009-10
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-009-keep-each-business-units-fiscal-calendar-ahead-of-its.md
    execution_gap: FND-ACC-BKS-070
reviewed_at: '2026-10-23'
---

# Extend and maintain a unit’s fiscal calendar: Capability Test Specification

## Coverage

- Extend the existing calendar.
- Use fiscal naming for years and months.
- Apply the start-date horizon atomically.
- Enforce complete contiguous periods.
- Rename without changing the calendar.
- Remove only the latest fully open year.
- Derive year standing from periods.
- Use the workspace’s local date.

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

## Interactions With Related Capabilities

- Review calendar maintenance across screens.
- An extension becomes available to dated lookup.

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.
