From 0f7da79a644e9fcca0d82739d1489ec750aea0ed Mon Sep 17 00:00:00 2001 From: Matt Date: Tue, 2 Jun 2026 00:44:27 +0200 Subject: [PATCH] =?UTF-8?q?docs(launch):=20Financial=20report=20SHIPPED=20?= =?UTF-8?q?(Phase=204)=20=E2=80=94=20payments-model=20reframe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) --- docs/launch-readiness.md | 47 +++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/docs/launch-readiness.md b/docs/launch-readiness.md index ae73ca21..d75aa489 100644 --- a/docs/launch-readiness.md +++ b/docs/launch-readiness.md @@ -50,8 +50,13 @@ Phases (status snapshot 2026-05-27): PDF; server-side PDF endpoint for branded output. _See gaps below._ 3. ❌ Marketing report — NOT BUILT. Pending Init 1b cutover. -4. ❌ Financial report — NOT BUILT. Pending Init 1c decision on - whether to enable the invoices module (currently default OFF). +4. ✅ Financial report — **SHIPPED in b690fb8d.** Built on the canonical + payments + expenses tables (invoices module stays OFF); the + invoice-centric spec was reframed onto the payments model + ("outstanding AR" → expected-deposit shortfall; "AR aging" → + outstanding deposits by deal age). 7 KPIs, 6 charts, 4 tables, port- + currency normalised, 1y default range, templates + export. Marketing + is the only remaining unbuilt report. 5. ⚠️ Custom (ad-hoc) report builder — partial ship. 6. ✅ Scheduled reports with optional emailing — BullMQ poll + render path live; recipients optional; PDF-only output. @@ -133,25 +138,31 @@ Not built. Spec at `docs/reports-content-spec.md` § Report 03 calls for: data flowing from the new intake endpoint (Init 1b step 1 — pending website env flip). -#### Phase 4 — Financial report (LAUNCH-BLOCK if Financial is in beta scope) +#### Phase 4 — Financial report ✅ SHIPPED in b690fb8d -Not built. Spec at `docs/reports-content-spec.md` § Report 02 calls for: +**Decision taken (2026-06-02):** ship on the canonical `payments` + +`expenses` tables; invoices module stays OFF. The invoice-centric spec +(§ Report 02) was reframed onto the payments model so the report is +populated rather than 90% empty: -- 7 KPIs (revenue collected, pipeline value, deposits, outstanding AR, - overdue AR, expenses, net contribution) -- 6 charts (revenue by month stacked, quarterly/yearly toggle, EOI → - Deposit → Contract funnel, AR aging, cash flow line, expense - breakdown donut) -- 4 tables (outstanding invoices, recent payments, refund/write-off - log, expense ledger) -- Filters: invoice kind, payment status, currency, billing entity type +- 7 KPIs: revenue collected (net of refunds), deposits, balance, + pipeline (expected deposits), outstanding deposits (expected−collected + on open deals = the AR analogue), expenses, net contribution. +- 6 charts: revenue by month (deposit/balance, with month/quarter/year + toggle), collection funnel (EOI → deposit → contract → won), + outstanding deposits by deal age (AR-aging analogue, no invoice due + dates exist), cash flow (inflow vs outflow), expense breakdown donut. +- 4 tables: outstanding deposits, recent payments, refund/write-off log, + expense ledger. +- All money normalised to port currency; 1y default range; templates + + CSV/XLSX/PDF export. -**Blocker:** depends on the invoices module being in use. Per Init 1c -spike, the module is default OFF and the canonical money path is the -per-interest Payments tab. **Decision needed**: ship Financial with -data from `payments` only (no invoice surface) OR flip invoices module -on for PN + train rep + ship Financial. Today the report would be 90% -empty. +**Follow-up (deferred, not launch-blocking):** if the user later flips +the invoices module ON, add invoice-sourced AR (due dates → true aging) + +- the invoice/payment-status/billing-entity filters from the original + spec. Browser-verified against live data (0 payment rows in dev → revenue + $0 correct; 165 expenses populate the expense surfaces). #### Phase 5 — Custom builder gaps