---
id: ADR-ACC-BKS-009
title: Explicit fiscal generation with calendar checks at commit
product_area: accounting
module: books
revision: 1
status: proposed
design_intent: confirmed
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
decision: >-
  Creation supplies the first two years. Staff explicitly extends coverage by
  one to five years within the five-year starting-date horizon; lookups and
  scheduled work do not generate years. Database checks protect monthly
  boundaries, sequence and twelve periods per year.
constrains:
  - DOM-ACC-BKS-003
  - STATE-ACC-BKS-002
  - WF-ACC-BKS-001
  - WF-ACC-BKS-005
  - SCR-ACC-BKS-008
origin: >-
  services-accounting docs/milestones/ACCT-M1-books-and-invoices.md#D3, #D10.2;
  docs/milestones/plans/ACCT-M1-plan.md#D12
alternatives:
  - option: Generate missing coverage during lookup or a scheduled roll.
    why_not: >-
      The cited milestone choice reserves calendar extension for explicit
      controller action.
  - option: Validate calendar shape only in the service.
    why_not: Shared-table writers also need the database’s deferred calendar checks.
consequences:
  - >-
    A recurring roll outside configured coverage fails with the uncovered date
    and unit.
  - The examined implementation offers no advance coverage warning.
  - >-
    Close writes period standing, and the database derives year standing from
    its periods.
supersedes: []
evidence:
  - >-
    services-accounting at f47cb263:
    modules/books/services/persistence/fiscal-years.ts
  - >-
    services-accounting at f47cb263: modules/books/db/fiscal-years.table.ts,
    fiscal-periods.table.ts
---

# Explicit fiscal generation with calendar checks at commit

## Context

Controllers determine calendar coverage. Period lookup reports whether a date is covered, while Close controls period standing.

## Decision

Creation supplies the first two years. Staff explicitly extends coverage by one to five years within the five-year starting-date horizon; lookups and scheduled work do not generate years. Database checks protect monthly boundaries, sequence and twelve periods per year.

## Alternatives Considered

Generate missing coverage during lookup or a scheduled roll. The cited milestone choice reserves calendar extension for explicit controller action.

Validate calendar shape only in the service. Shared-table writers also need the database’s deferred calendar checks.

## Consequences

A recurring roll outside configured coverage fails with the uncovered date and unit.

The examined implementation offers no advance coverage warning.

Close writes period standing, and the database derives year standing from its periods.
