---
id: CAP-ACC-CLS-009
title: Recognize close-owned revenue and reverse it on reopen
feature: FEAT-ACC-CLS-03
product_area: accounting
module: close
revision: 1
status: draft
product_intent: proposed
implementation_evidence: observed
supersedes:
  - >-
    CAP-ACC-REC-021 (react-console acceptance inventory, the recognition and
    reversal)
  - RUL-ACC-REC-082
  - RUL-ACC-REC-088
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - >-
    services-accounting:docs/milestones/plans/ACCT-M4-plan.md#4a row 74 (class
    A: the six steps of the close)
  - >-
    services-accounting:docs/milestones/walkthroughs/ACCT-M3-handoff.md#Decisions
    it carries
purpose: >-
  Closing recognizes scheduled revenue through a system batch, and reopening
  reverses the close’s revenue work.
outcomes:
  - Due revenue reaches the ledger through a close-owned posting.
  - Reopening restores recognition state while retaining reversal evidence.
concepts:
  - CON-ACC-CLS-003
actors:
  - ACT-ACC-016
  - ACT-ACC-015
surfaces:
  - job
preconditions: []
postconditions: []
permissions: []
rules:
  - id: BR-CAP-ACC-CLS-009-01
    proved_by: [ATS-ACC-CLS-009-01, TST-ACC-CLS-023]
    statement: >-
      The close recognizes due unrecognized entries and posts a deferred revenue
      batch named for the unit and period, dated at period end and debiting
      deferred revenue.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/fiscal-close/tests/integration/services/jobs/revenue-recognition.integration.spec.js#posts
      July's deferred revenue system batch, named and dated as 1.0 did
    origin: >-
      services-accounting:docs/milestones/plans/ACCT-M4-plan.md#4a row 74 (class
      A; plan approved 2026-10-21)
    examples:
      positive: >-
        The unit’s July recognition uses its named period-end deferred revenue
        batch.
  - id: BR-CAP-ACC-CLS-009-02
    proved_by: [ATS-ACC-CLS-009-01, TST-ACC-CLS-023]
    statement: Entries beyond period end remain unrecognized.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/fiscal-close/tests/integration/services/jobs/revenue-recognition.integration.spec.js#marks
      the July entries recognized and leaves the later ones unrecognized
    origin: none
  - id: BR-CAP-ACC-CLS-009-03
    proved_by: [ATS-ACC-CLS-009-01, ATS-ACC-CLS-009-06, TST-ACC-CLS-023]
    statement: >-
      The close-owned event key prevents duplicate posting of the recognition
      batch.
    kind: invariant
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/fiscal-close/tests/integration/services/jobs/revenue-recognition.integration.spec.js#posts
      it once, under the close’s event key
    origin: none
  - id: BR-CAP-ACC-CLS-009-04
    proved_by: [ATS-ACC-CLS-009-02, TST-ACC-CLS-017, TST-ACC-CLS-021]
    statement: >-
      A recognition step with no due entries is skipped with an explanation and
      creates no batch.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/fiscal-close/tests/integration/services/jobs/close-job.integration.spec.js#records
      why revenue recognition and COGS were skipped
    origin: fiscal-close design L5 (Rhythm 1.0 omitted an empty batch)
  - id: BR-CAP-ACC-CLS-009-05
    proved_by: [ATS-ACC-CLS-009-03, ATS-ACC-CLS-009-06, TST-ACC-CLS-022, TST-ACC-CLS-023]
    statement: >-
      Reopening unrecognizes the close’s entries and reverses its batch with
      swapped debits and credits, skipping reversal when the close recognized
      nothing.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/fiscal-close/tests/integration/services/jobs/revenue-recognition.integration.spec.js#writes
      a reversing entry for each, debits and credits swapped
    origin: >-
      services-accounting:docs/milestones/walkthroughs/ACCT-M3-handoff.md#Decisions
      it carries
  - id: BR-CAP-ACC-CLS-009-06
    proved_by: [ATS-ACC-CLS-009-04, ATS-ACC-CLS-009-06, TST-ACC-CLS-023]
    statement: >-
      A subsequent close recognizes those entries again and reposts the period’s
      batch using the new run’s key.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/fiscal-close/tests/integration/services/jobs/revenue-recognition.integration.spec.js#posts
      the same batch again, as its second posting, under the new run’s key
    origin: none
  - id: BR-CAP-ACC-CLS-009-07
    proved_by: [ATS-ACC-CLS-009-05, TST-ACC-CLS-003]
    statement: >-
      Manual posting, reopening, archiving and deletion of the close-owned
      system batch are refused.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: documented
    source: >-
      react-console:acceptance/accounting/journeys/reconciliation-close/ACT-ACC-0615.json
    origin: none
  - id: BR-CAP-ACC-CLS-009-08
    proved_by: [ATS-ACC-CLS-009-06, ATS-ACC-CLS-009-07]
    statement: >-
      A refused recognition step fails while retaining the period in closing
      state for recovery.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: observed
    source: >-
      services-accounting:modules/fiscal-close/services/jobs/fiscal-close-job-tasks.ts:recognizeRevenue
    origin: none
scenarios:
  - id: SC-CAP-ACC-CLS-009-01
    given: An invoice’s revenue schedule spans July through September.
    when: 'July closes, reopens and closes again.'
    then: >-
      July’s share is recognized, reversed and recognized again; later shares
      remain deferred.
    provenance: test
    source: >-
      services-accounting:modules/fiscal-close/tests/integration/services/jobs/revenue-recognition.integration.spec.js#July's
      re-close
  - id: SC-CAP-ACC-CLS-009-02
    given: The selected month has no due recognition entries.
    when: The close reaches recognition.
    then: The step records a skipped outcome and explains the absence of due work.
    provenance: test
    source: >-
      services-accounting:modules/fiscal-close/tests/e2e/fiscal-close-runs.e2e.spec.js#says
      why the revenue and COGS steps were skipped
edge_cases: []
constraints:
  - Batch management owns the schedules and system batches invoked by closing.
depends_on:
  - CAP-ACC-CLS-007
related:
  - CAP-ACC-CLS-003
  - CAP-ACC-CLS-008
  - CAP-ACC-CLS-011
  - CAP-ACC-CLS-012
journeys:
  - JNY-ACC-CLS-003
open_questions:
  - OQ-ACC-CLS-003
evidence:
  - >-
    services-accounting examination inputs:
    modules/fiscal-close/services/ports/revenue-recognition-port.ts,
    services/jobs/fiscal-close-job-tasks.ts (recognizeRevenue, reverseRevenue);
    tests integration/services/jobs/revenue-recognition.integration.spec.js,
    close-job.integration.spec.js, reopen-job.integration.spec.js;
    docs/milestones/walkthroughs/ACCT-M3-handoff.md (Reporting D7).
  - >-
    react-console examination inputs:
    acceptance/accounting/journeys/reconciliation-close/ACT-ACC-0615.json and
    acceptance/accounting/playwright/journeys/reconciliation-close/ACT-ACC-0615.spec.ts.
controls: [TC-IAM-001, TC-IAM-005, TC-IAM-006, TC-AZ-001, TC-AZ-002, TC-AZ-003, TC-AZ-004, TC-TEN-001, TC-TEN-002, TC-TEN-003, TC-DAT-001, TC-DAT-004, TC-LOG-002, TC-LOG-003, TC-LOG-005, TC-AVL-001, TC-AVL-004, TC-MON-001, TC-MON-002, TC-MON-004, TC-PI-002, TC-PI-003, TC-PI-004, TC-PI-005]
exercised_by: [FAS-ACC-CLS-03-02, FAS-ACC-CLS-03-03]
suites: [TST-ACC-CLS-003, TST-ACC-CLS-017, TST-ACC-CLS-021, TST-ACC-CLS-022, TST-ACC-CLS-023]
---

# Recognize close-owned revenue and reverse it on reopen

## Purpose

Closing recognizes scheduled revenue through a system batch, and reopening reverses the close’s revenue work.

## How It Works

Execution invokes Batch management for due recognition work. The resulting system batch carries the unit and period in its name and the period end as its date. Entries due later remain deferred. The event key makes repeated posting requests resolve to the same close-owned work. When nothing is due, the step records why it was skipped. Reopening invokes the matching unrecognition and reversal functions. Reversal lines retain evidence of the earlier close rather than removing its effect without a trace. Closing again posts the same period batch under a new close key. Staff cannot maintain that system batch through ordinary manual actions. If recognition is refused, the closer follows the failed run’s recovery path.

## Relationships

- The preview exposes the due entries and missing setup before execution.
- The posting boundary grants the restricted close and reopen exceptions.
- Close, reopen and recovery drive recognition and reversal.
