@ -17,6 +17,8 @@ Six workstreams that take the console from "feature-complete" to "safe to go liv
| **D** | **Documents list page** + honest pagination on `GET /documents` | Documents are only reachable via client ledger/pipeline today; the endpoint returns ALL rows (rule-8 violation at scale) |
| **D** | **Documents list page** + honest pagination on `GET /documents` | Documents are only reachable via client ledger/pipeline today; the endpoint returns ALL rows (rule-8 violation at scale) |
| **E** | **Shell & profile**: collapsible sidebar, self-service profile (name + own password), "My Day" dashboard mode, minimal employee extras (phone/title) | Self password change doesn't exist; the old app's most-used surface was the per-person workbench |
| **E** | **Shell & profile**: collapsible sidebar, self-service profile (name + own password), "My Day" dashboard mode, minimal employee extras (phone/title) | Self password change doesn't exist; the old app's most-used surface was the per-person workbench |
| **F** | **Client support data** from APEX: AnyDesk/OS/DB-password (encrypted), district + sector, WhatsApp + secretary contacts | AnyDesk was referenced 44× in the old app — support opens it daily; district/sector are the team's main list filters |
| **F** | **Client support data** from APEX: AnyDesk/OS/DB-password (encrypted), district + sector, WhatsApp + secretary contacts | AnyDesk was referenced 44× in the old app — support opens it daily; district/sector are the team's main list filters |
| **G** | **Editable module→clients roster** + one-click *Convert & send* from list views | Founder call: both directions (client→modules, module→clients) must be editable, and proforma→invoice must be one click from anywhere |
| **H** | **Section-per-module quotation PDF** | Founder call: a quote spanning all 5 modules prints each module as its own titled section (name, inclusions, price) with clean page breaks, totals + terms on the last page |
Hard rules apply throughout (paise, one billing engine, dated config, immutable documents,
Hard rules apply throughout (paise, one billing engine, dated config, immutable documents,
portable repos, audited mutations in-txn, no silent caps, strict TS + green suite).
portable repos, audited mutations in-txn, no silent caps, strict TS + green suite).
@ -31,6 +33,13 @@ portable repos, audited mutations in-txn, no silent caps, strict TS + green suit
refresh token (`crypto.ts`). No `HQ_SECRET_KEY` ⇒ the field refuses to save, loudly.
refresh token (`crypto.ts`). No `HQ_SECRET_KEY` ⇒ the field refuses to save, loudly.
- **A4** Import UI accepts the same two CSVs the CLI does; parsing/verification/commit logic
- **A4** Import UI accepts the same two CSVs the CLI does; parsing/verification/commit logic
is **reused, not reimplemented** (`import-apex.ts` functions get routes, not a rewrite).
is **reused, not reimplemented** (`import-apex.ts` functions get routes, not a rewrite).
- **A5** Roster editing (WS-G) reuses the SAME audited repo calls Client 360 uses
(`updateClientModule`, `assignModule`) with the same gating — no second write path, so
the two views can never disagree.
- **A6** The sectioned layout (WS-H) applies to **QUOTATION** documents only; invoices and
proformas keep the compact billing table (they are payment paper, not proposals). It is
rendered inside the ONE shared `documentHtml` renderer, so the preview-fidelity guarantee
(screen HTML ≡ PDF HTML, byte-identical) is preserved by the existing golden test.
8. **Editable roster + quick convert** — inline edit/assign/unassign on the module roster; Convert & send on Documents + Pipeline rows. *(Accept: roster edits round-trip through the same audited repo fns as Client 360; unassign hides the row and shrinks totals; quick convert = exactly one invoice + one email.)*
9. **Sectioned quotation PDF** — section-per-module layout in `documentHtml` for QUOTATION. *(Accept: 5-module quote renders 5 titled sections + totals page; no section splits across pages; preview-fidelity golden test still passes; INVOICE/PI layout unchanged.)*