---
id: CAP-ACC-CLS-011
title: Reopen the most recent closed month for correction
feature: FEAT-ACC-CLS-03
product_area: accounting
module: close
revision: 1
status: draft
product_intent: confirmed
implementation_evidence: observed
supersedes:
  - CAP-ACC-REC-018 (react-console acceptance inventory)
  - RUL-ACC-REC-087
  - RUL-ACC-REC-089
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - >-
    services-accounting:docs/milestones/plans/ACCT-M4-plan.md#4a row 75 (class
    A: reopen needs a reason of at least ten characters and
    accounting.fiscal-periods.reopen; the period counts its reopens)
purpose: >-
  An authorized person explains a correction and reopens the latest eligible
  month while retaining its close evidence.
outcomes:
  - Post-close corrections have an accountable request and reason.
  - >-
    The month records another completed reopen without losing the earlier
    snapshot.
concepts:
  - CON-ACC-CLS-003
  - CON-ACC-CLS-001
actors:
  - ACT-ACC-015
  - ACT-ACC-016
surfaces:
  - console
  - api
  - job
preconditions:
  - The selected period is the latest eligible closed period.
postconditions:
  - >-
    The period returns to open with its reopen counted, revenue reversed and
    earlier close evidence retained.
permissions:
  - key: accounting.fiscal-periods.reopen
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-ACC-CLS-011-01
    proved_by: [ATS-ACC-CLS-011-01, TST-ACC-CLS-017, TST-ACC-CLS-050]
    statement: >-
      A reopen request requires an idempotency key and a trimmed reason from ten
      to two thousand characters.
    kind: validation
    enforced_at:
      - api
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/fiscal-close/tests/e2e/fiscal-close-runs.e2e.spec.js#refuses
      a reason under ten characters with 400
    origin: >-
      services-accounting:docs/milestones/plans/ACCT-M4-plan.md#4a row 75 (class
      A; plan approved 2026-10-21)
  - id: BR-CAP-ACC-CLS-011-02
    proved_by: [ATS-ACC-CLS-011-01, ATS-ACC-CLS-011-07, TST-ACC-CLS-002, TST-ACC-CLS-017, TST-ACC-CLS-050]
    statement: >-
      Submitting a reopen requires the reopen grant, independently of the close
      grant.
    kind: permission
    enforced_at:
      - api
    must_prove: true
    provenance: test
    source: >-
      services-accounting:tests/unit/fiscal-close-permissions.spec.ts#is
      required by the fiscal close routes: close by the close, reopen by the
      reopen, read by every other
    origin: >-
      services-accounting:docs/milestones/plans/ACCT-M4-plan.md#4a row 75 (class
      A; plan approved 2026-10-21)
  - id: BR-CAP-ACC-CLS-011-03
    proved_by: [ATS-ACC-CLS-011-02, ATS-ACC-CLS-011-05, TST-ACC-CLS-002, TST-ACC-CLS-022]
    statement: >-
      Submission and locking both reject a month that is not the latest eligible
      closed month, including a month already open.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/fiscal-close/tests/integration/services/jobs/reopen-job.integration.spec.js#refuses
      reopening August while September is closed, with 1.0’s sentence
    origin: fiscal-close design L10 (Rhythm 1.0 REOPEN-1 and REOPEN-2 kept)
  - id: BR-CAP-ACC-CLS-011-04
    proved_by: [ATS-ACC-CLS-011-03, ATS-ACC-CLS-011-06, TST-ACC-CLS-017, TST-ACC-CLS-022]
    statement: >-
      Reopen execution locks the period, reverses close-owned revenue and
      finalizes the return to open in three durable steps.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/fiscal-close/tests/integration/services/jobs/reopen-job.integration.spec.js#completes
      its three steps
    origin: none
  - id: BR-CAP-ACC-CLS-011-05
    proved_by: [ATS-ACC-CLS-011-04, TST-ACC-CLS-022]
    statement: >-
      The lock step checks the reason again and preserves the prior closer and
      close time for cancellation; an invalid reason leaves the period closed.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/fiscal-close/tests/integration/services/jobs/reopen-job.integration.spec.js#refuses
      a reason under ten characters in the job’s lock, the period left closed
    origin: >-
      services-accounting:docs/milestones/plans/ACCT-M4-plan.md#4a row 75 (class
      A; plan approved 2026-10-21)
  - id: BR-CAP-ACC-CLS-011-06
    proved_by: [ATS-ACC-CLS-011-03, ATS-ACC-CLS-011-06, TST-ACC-CLS-017, TST-ACC-CLS-022]
    statement: >-
      Finalization clears close details, increments the reopen count and records
      the requester and reason in a run event.
    kind: lifecycle
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/fiscal-close/tests/integration/services/jobs/reopen-job.integration.spec.js#opens
      the period and counts the reopen
    origin: >-
      services-accounting:docs/milestones/plans/ACCT-M4-plan.md#4a row 75 (class
      A: the period counts its reopens)
  - id: BR-CAP-ACC-CLS-011-07
    proved_by: [ATS-ACC-CLS-011-03, ATS-ACC-CLS-011-06, TST-ACC-CLS-017, TST-ACC-CLS-022]
    statement: >-
      Reopening retains the close snapshot and adds the reopen to the close
      record’s linked history.
    kind: invariant
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/fiscal-close/tests/integration/services/jobs/reopen-job.integration.spec.js#keeps
      the close’s snapshot
    origin: fiscal-close design §6.2
  - id: BR-CAP-ACC-CLS-011-08
    proved_by: []
    statement: The reopen run identifies the close whose work it reverses.
    kind: policy
    enforced_at:
      - service
      - database
    must_prove: false
    provenance: test
    source: >-
      services-accounting:modules/fiscal-close/tests/integration/services/jobs/reopen-job.integration.spec.js#ends
      the reopen succeeded, naming the close it reverses
    origin: none
  - id: BR-CAP-ACC-CLS-011-09
    proved_by: []
    statement: >-
      Reopening makes no aging request; another close requests the next aging
      version.
    kind: policy
    enforced_at:
      - service
    must_prove: false
    provenance: documented
    source: >-
      services-accounting:docs/fiscal-close/PHASE-2-PLAN.md#4.1 A/R aging
      snapshot request
    origin: Snapshot Architecture agreement of 2026-10-16 (recorded in the plan)
  - id: BR-CAP-ACC-CLS-011-10
    proved_by: [ATS-ACC-CLS-011-05, TST-ACC-CLS-002]
    statement: >-
      The console requires a reason and typed month label when reopening the
      authorized latest closed month.
    kind: policy
    enforced_at:
      - console
    must_prove: true
    provenance: observed
    source: 'react-console:components/accounting/close/reopen-dialog.tsx:ReopenDialog'
    origin: none
scenarios:
  - id: SC-CAP-ACC-CLS-011-01
    given: September is the latest closed month and its close recognized revenue.
    when: The controller requests reopening to account for a late invoice.
    then: >-
      Reversal completes, September opens with one reopen, and the close record
      links the correction reason.
    provenance: test
    source: >-
      services-accounting:modules/fiscal-close/tests/integration/services/jobs/reopen-job.integration.spec.js#the
      latest closed period, its close having recognised revenue
  - id: SC-CAP-ACC-CLS-011-02
    given: Both August and September are closed.
    when: Staff request reopening of August.
    then: Sequence validation refuses the action because September remains closed.
    provenance: test
    source: >-
      services-accounting:modules/fiscal-close/tests/integration/services/jobs/reopen-job.integration.spec.js#refuses
      reopening August while September is closed, with 1.0’s sentence
edge_cases: []
constraints:
  - >-
    Close and reopen requests use the same command-replay and exclusive-period
    mechanisms.
depends_on:
  - CAP-ACC-CLS-002
related:
  - CAP-ACC-CLS-009
  - CAP-ACC-CLS-012
  - CAP-ACC-CLS-014
journeys:
  - JNY-ACC-CLS-003
open_questions: []
evidence:
  - >-
    services-accounting examination inputs:
    modules/fiscal-close/aws/api/fiscal-period-close.routes.ts
    (reopenFiscalPeriod), fiscal-close.schemas.ts (reopenRequestSchema),
    services/jobs/close-run-actions.ts (requestPeriodReopen),
    fiscal-close-job-tasks.ts (lockForReopen, reverseRevenue, finalizeReopen),
    fiscal-close-steps.ts (MIN_REOPEN_REASON_LENGTH),
    aws/logic/fiscal-close.step-functions.ts (accounting-fiscal-close-reopen);
    tests integration/services/jobs/reopen-job.integration.spec.js,
    e2e/fiscal-close-runs.e2e.spec.js (the reopen),
    tests/unit/fiscal-close-permissions.spec.ts.
  - >-
    react-console examination inputs:
    components/accounting/close/reopen-dialog.tsx, close-history.tsx;
    acceptance/accounting/playwright/journeys/reconciliation-close/ACT-ACC-0614.spec.ts.
controls: [TC-IAM-001, TC-IAM-002, TC-IAM-004, TC-IAM-005, TC-IAM-006, TC-AZ-001, TC-AZ-002, TC-AZ-003, TC-AZ-004, TC-AZ-005, TC-AZ-006, TC-TEN-001, TC-TEN-002, TC-TEN-003, TC-DAT-001, TC-LOG-001, TC-LOG-002, TC-LOG-003, TC-LOG-004, TC-LOG-005, TC-PI-001, TC-PI-002, TC-PI-003, TC-PI-005]
exercised_by: [FAS-ACC-CLS-03-02, FAS-ACC-CLS-03-03, FAS-ACC-CLS-03-04, FAS-ACC-CLS-03-05]
suites: [TST-ACC-CLS-002, TST-ACC-CLS-017, TST-ACC-CLS-022, TST-ACC-CLS-050]
---

# Reopen the most recent closed month for correction

## Purpose

An authorized person explains a correction and reopens the latest eligible month while retaining its close evidence.

## How It Works

The controller locates the latest closed month and chooses Reopen. The console asks for a reason and the exact month label. The request checks eligibility and saves a run before starting its job. The locking step checks sequence and reason again. It preserves the earlier close details before moving the period into reopening. Revenue reversal follows, or records a skipped result when appropriate. Finalization opens the month and records the completed reopen. Staff can then post their correction and close the month again. The original snapshot remains available throughout. A stopped reopen may require retry rather than cancellation once revenue has been reversed.

## Relationships

- Authorization checks the permitted reopening sequence.
- Revenue processing reverses the close-owned posting.
- Recovery handles stopped execution.
- The close record retains the previous evaluation and linked reopen.
