Generate statements
Who does this: FS Preparer · Senior Accountant · Platform Admin When: Every TB row carries a
taxonomyKeyand you want to assemble the Balance Sheet, P&L, SOCE, and Cash Flow. Result: A newFsGeneratedStatementrow withversionNobumped, and four statement tabs populated. The engagement transitions toSTATEMENTS_GENERATED.
The statement generator is deterministic — no AI involved. Every figure is a pure function of the mapped TB. Running it twice on the same inputs yields the same outputs; running it after a mapping change yields the corrected outputs and bumps versionNo.
Before you start
- [ ] Engagement at
TB_MAPPED(every TB row has ataxonomyKey). - [ ] You hold
GENERATE_STATEMENTS.
Steps
- Open the engagement → Statements tab.
- Click Generate.
- The handler runs synchronously and refreshes the page with four tabs:
- Balance Sheet (SOFP)
- P&L (SPLOCI)
- SOCE
- Cash Flow (SOCF — indirect method)
- The status badge moves to
STATEMENTS_GENERATED.
How to know it worked
- All four statement tabs render with figures.
- The Balance Sheet's
is_balancedindicator is green (total_assets ≈ total_equity_and_liabilitieswithin ±1.0 SGD). - The activity log shows
fs.statements.generatedwithversionNoin the payload. - The anomalies list at the top of the tab is empty, or contains only acceptable warnings.
Common situations
| If you see… | It means… | What to do |
|---|---|---|
Red not balanced banner on the BS tab | total_assets != total_equity_and_liabilities | Almost always a sign-flip in the mapping. Open the anomaly list; the affected rows are highlighted. Open Mapping; override; regenerate. See Statements not balanced |
Anomaly: negative_working_capital | Current liabilities exceed current assets | Often legitimate (e.g. a deferred-revenue-heavy SaaS). Document on the engagement; ship. See Negative working capital |
Anomaly: zero_revenue | The revenue section sums to zero | Either a real fact (dormant entity) or a mapping miss. Check the Mapping tab |
Anomaly: profit_no_tax | PBT > 0 but no income-tax expense | Either legitimate (tax loss carryforward, exemption) or a mapping miss for income_tax_expense. Verify |
Anomaly: sign_flip | A credit-side taxonomy key resolved to a debit balance after sign normalisation (or vice versa) | Open the affected row in Mapping; check the key matches the natural balance of the GL account |
Regenerate
Re-running Generate is allowed. It is the self-loop STATEMENTS_GENERATED → STATEMENTS_GENERATED. Each run bumps versionNo. The latest version is what downstream notes / DOCX consume.
NOTE
Regenerating statements does not invalidate previously generated notes. The notes preview still renders against the prior statement version; only the next Generate notes call picks up the new version. Plan accordingly — if you regenerated to fix a sign flip and notes already shipped, regenerate notes too.