Problem
Financial records remain mutable across reporting periods. Backdated edits after statements, investor payouts, or reconciliations can make previously issued reports impossible to reproduce.
Scope
- Introduce open, soft-closed, hard-closed, and reopened accounting-period states.
- Assign every ledger entry, settlement, repayment, payout, fee, and adjustment to a period using an explicit timezone policy.
- Reject inserts or mutations into hard-closed periods.
- Correct mistakes through linked reversing and replacement entries, never destructive edits.
- Require maker-checker approval and a reason/evidence hash to reopen a period.
- Snapshot trial balance, subledger totals, reconciliation status, and report hashes at close.
- Add close-readiness checks for unmatched Paystack events, pending Stellar finality, failed jobs, and unbalanced journals.
Acceptance criteria
- Reports for a closed period are byte-for-byte reproducible.
- Closed entries cannot be edited or deleted through any API or background job.
- Reopen and correction history is complete and attributable.
- Late-arriving external events follow a documented next-period adjustment policy.
- Period close fails when financial invariants or reconciliation gates fail.
Required tests
Timezone boundaries, late events, reversal chains, concurrent close/post attempts, reopen approval, failed close recovery, and report-hash reproduction.
Non-goals
Do not implement tax rules; provide reliable accounting-period primitives.
Problem
Financial records remain mutable across reporting periods. Backdated edits after statements, investor payouts, or reconciliations can make previously issued reports impossible to reproduce.
Scope
Acceptance criteria
Required tests
Timezone boundaries, late events, reversal chains, concurrent close/post attempts, reopen approval, failed close recovery, and report-hash reproduction.
Non-goals
Do not implement tax rules; provide reliable accounting-period primitives.