Parent epic for all reporting features: income vs expenses, VAT reports, tax reports, profit/loss reports, invoice group reports, and report builder. V1 parity required before launch.
Three tracks
| Track |
Scope |
Issues |
Notes |
| A — Report Builder |
Band-based designer (header / group header / details / group footer / footer) with code-defined mason Bricks; configs stored as files in storage/, deliver-and-clone model; PDF generation for invoices & quotes consumes these templates |
Master story #130 → sub-tasks #521, #528 (Phase 1), #523, #519, #525 (Phase 2); then per-document template selection #411 (Phase 4); page-break support (#95) lands inside Phase 3 |
Status 2026-07-13: Phases 0–4 implemented on feature/130-report-builder (PR) — see #130 for as-built notes |
| B — Tabular reports |
v1-parity report pages: payment history, invoicing history, invoiced amount by client, sales by date, invoices per client — Filament pages + CSV export |
#145 |
Status 2026-07-13: implemented (PR) |
| C — Small items |
Email template variable for the invoicing contact |
#363 |
Status 2026-07-13: implemented (PR) |
Phased roadmap (Track A detail)
| Phase |
Work |
Issue(s) |
Depends on |
Acceptance criteria |
| 0 ✅ |
Merge PR #575 (dompdf driver + invoice blade) |
— |
— |
PR #575 merged to develop |
| 1 ✅ |
Pure-file storage service, manifest/bands schema, reports:sync-system command, brick registry harvest |
#521, #528 |
— |
Storage round-trip test passes; clone copies folder + rewrites manifest; ../ in a slug is rejected; Company A cannot load Company B's template; sync command is idempotent |
| 2 ✅ |
Builder UI: list/clone pages, five-band builder page, band-filtered bricks, brick config slide-over, move-to-band action |
#519, #523, #525 |
Phase 1 |
Builder page loads per band; save persists bands.json; band filtering excludes disallowed bricks; system templates are not editable or deletable |
| 3 ✅ |
ReportRenderer, default invoice/quote system templates, page-break support |
#130 (master), #95 (portion) |
Phases 0, 1 |
Renderer output contains HTML for configured bricks and omits toggled-off fields; PDF bytes are non-empty via the dompdf driver; page-break-inside: avoid present when band "keep together" is on; golden-file HTML snapshot matches for invoice/default |
| 4 ✅ |
Per-document template selection |
#411 |
Phase 3 |
Per #411's existing five test scenarios (adapted to disk-based slug resolution) |
| 5 ✅ (parallel) |
Tabular reports (payment history, sales by date, invoiced-by-client, etc.) |
#145 |
— |
Per #145's existing three Livewire test scenarios (naui95's spec, unchanged) |
| 6 ✅ (parallel) |
Invoicing-contact variables in email templates |
#363 |
— |
Scoped test criteria per #363, independent of the rendering pipeline |
Architecture, storage layout, and security constraints are specified in #130. Key decisions (2026-07-04): pure-file storage, no DB tables; bricks defined only in code; one Mason canvas per band; fresh branch feature/130-report-builder, harvesting the old feature/145-report-builder branch (PR #532 closed, branch kept for harvesting).
Parent epic for all reporting features: income vs expenses, VAT reports, tax reports, profit/loss reports, invoice group reports, and report builder. V1 parity required before launch.
Three tracks
storage/, deliver-and-clone model; PDF generation for invoices & quotes consumes these templatesfeature/130-report-builder(PR) — see #130 for as-built notesPhased roadmap (Track A detail)
developreports:sync-systemcommand, brick registry harvest../in a slug is rejected; Company A cannot load Company B's template; sync command is idempotentbands.json; band filtering excludes disallowed bricks; system templates are not editable or deletableReportRenderer, default invoice/quote system templates, page-break supportpage-break-inside: avoidpresent when band "keep together" is on; golden-file HTML snapshot matches forinvoice/defaultArchitecture, storage layout, and security constraints are specified in #130. Key decisions (2026-07-04): pure-file storage, no DB tables; bricks defined only in code; one Mason canvas per band; fresh branch
feature/130-report-builder, harvesting the oldfeature/145-report-builderbranch (PR #532 closed, branch kept for harvesting).