Skip to content

Last reviewed: 2026-08-02

Financial Period Contract

Canonical objects: - FiscalCalendarProfile - FinancialPeriod

FiscalCalendarProfile required fields: - id - company_id - fiscal_year_end_month - fiscal_year_end_day - fiscal_year_end_day_rule - period_pattern - effective_from_fiscal_year - status - creation metadata

FinancialPeriod required fields: - id - company_id - period_type - label - start_date - end_date - parent_period_id when the period is nested - status - creation metadata - state-change history

Persistence fields:

fiscal_calendar_profile must persist: - id - company_id - fiscal_year_end_month - fiscal_year_end_day - fiscal_year_end_day_rule - period_pattern - effective_from_fiscal_year - status - created_at - created_by_actor_id

financial_period must persist: - id - company_id - period_type - label - start_date - end_date - parent_period_id when the period is nested - status - created_at - created_by_actor_id

financial_period_state_change must persist: - id - financial_period_id - sequence_number, starting at 1 and increasing by 1 within the period - prior_status when the state change follows an existing status - new_status - actor_id - changed_at - reason - audit_reference when available - close_run_id when a CloseRun finalized soft_closed or hard_closed - close_reopen_id when a CloseReopen produced reopened

Allowed statuses: - planned - open - soft_closed - hard_closed - reopened

Allowed period types: - fiscal_year - fiscal_quarter - fiscal_month

Allowed fiscal calendar profile statuses: - draft - active - retired

Allowed current period patterns: - calendar_month

Deferred period patterns: - retail_445

Retail and weekly-calendar fields are deferred until the weekly fiscal calendar contract is explicitly added.

Rules: - Period dates are inclusive. - Period dates are company-local business dates under the company's named accounting time zone. - When timestamp selection is required, resolve the inclusive dates through the Business Time Contract as a half-open interval. Preserve the named zone and resolved instants when the cutoff is durable evidence. - A period must have start_date <= end_date. - Period dates must not overlap for the same company, parent, and period type. - A child period must fit fully inside its parent period. - Standard generated fiscal months and fiscal quarters are direct children of the fiscal year. - Fiscal quarters are derived from generated fiscal periods. - For a standard 12-period calendar, each fiscal quarter consists of three fiscal periods. - Fiscal year end date must equal the end date of the final fiscal quarter and final fiscal period. - Monthly fiscal year end days must be day 1-27 or the final day of the selected month. - Fiscal calendar profiles must preserve whether the selected fiscal year end day is a fixed day or month-end rule. - Period identity must remain stable after creation. - Boundary changes must be tightly restricted after postings, child periods, or close history exist. - Posting must check period status through central period control. - Routine posting is blocked in planned and hard-closed periods. - Soft-closed periods block routine posting but may allow authorized close adjustments or corrections. - Soft-closed periods allow reversal and adjustment posting modes only through the dedicated protected correction actions and their required reason, evidence, preview, authorization, and audit behavior. - Hard-closed periods block routine, reversal, and adjustment posting modes until separately reopened. - Open and reopened periods allow reversal and adjustment posting modes when the Accounting Correction Contract is otherwise satisfied. - A correction target's period status does not select the new entry's period; the correction posting date resolves the controlling period. - Reopen requires authority, reason, and audit trail. - A new soft_closed or hard_closed transition requires the current eligible CloseRun, checks, waivers, report pack, authorization, and approval behavior defined by the Close Run Contract. - A new reopened transition requires a durable CloseReopen under that contract. - Low-level transition eligibility and persistence do not independently authorize close or reopen. - Period state changes must be attributable and append-oriented. - Persisted status and period type values must use stable snake_case contract values, not programming-language enum names. - Financial period state-change rows must be appended, not overwritten, when a period changes state. - sequence_number is the authoritative causal order of a period's state changes. It must be unique and contiguous within that period. - changed_at records attribution time and must not be used with state-change identity as a substitute for causal order because timestamps may be equal. - A period's current status must be explainable from its append-oriented state-change history.

Validation expectations: - date ranges are valid and non-overlapping. - date-to-period lookup returns at most one controlling period for a posting date. - period-cutoff resolution is deterministic across daylight-saving changes and fails visibly for an unavailable, invalid, or ambiguous boundary. - status transitions enforce soft close, hard close, and reopen rules. - parent periods cannot close before required child periods are closed according to close policy. - quarter constituent-month and fiscal-year constituent readiness follows the direct-child period-driven calendar rule in the Close Run Contract. - reopen preserves prior close history rather than overwriting it.

Required behavior: - define a fiscal calendar profile with fiscal year end date, period pattern, effective fiscal year, and lifecycle status; - generate monthly fiscal years with 12 fiscal month periods and 4 derived fiscal quarter periods; - define a period with explicit identity, type, dates, and status; - find the period containing a posting date; - evaluate whether a posting date is allowed, blocked, or requires override; - evaluate whether a period can be soft closed, hard closed, or reopened; - record close and reopen transitions with actor, reason, and audit reference. - link close and reopen state changes to the exact CloseRun or CloseReopen decision that caused them. - map persisted financial-period rows and state-change rows to the canonical FinancialPeriod object without changing identity, date boundaries, status meaning, or history order. - map canonical FinancialPeriod objects to persistence rows using the stable status and period-type values defined by this contract. - evaluate routine and correction posting modes without treating a correction target's historical period as the new entry's posting period.

Related truth pages: - company.contract.md - ../accounting/financial-periods.md - ../accounting/close.md - kernel.contract.md - accounting-correction.contract.md - close-run.contract.md - business-time.contract.md