Appearance
Universal Invoice Builder — v1 handoff
Status: Implementation complete for v1 (standard invoices only in custom mode).
Migration: Backend/migrations/20260929_invoice_builder.sql
Backward compatibility: Default invoice_mode = inventory; existing rows unchanged.
What shipped
- Data:
invoice_mode,layout_config,InvoiceBuilderTemplate - Admin: Inventory / Custom toggle, column builder, templates, totals from currency column
- Outputs: Server PDF (email-quality), portal/pay/email custom tables, export/ledger fields
- Discovery: Custom badges, Custom layouts list filter, customer ledger chip
- PDF:
GET /newinvoice/singleinvoice/:id/pdf+Admin/src/utils/invoicePdfFetch.js
Verify (15 min)
- Apply migration; restart Backend.
cd Backend && npm run test:invoice-buildernpm run invoice-builder:smoke --prefix qa-tests(Admin :3000, env fromBackend/.env)- Spot-check one custom + one inventory invoice using
universal-invoice-builder-qa.md
Key files
| Layer | Path |
|---|---|
| Migration | Backend/migrations/20260929_invoice_builder.sql |
| Validation | Backend/utils/invoiceLayoutConfig.js (+ Admin mirror) |
| API | Backend/Routes/new_invoice.route.js, invoice_builder_template.route.js |
| PDF server | Backend/pdf/InvoiceDocument.jsx, InvoicePdfCustomTable.jsx |
| Admin UI | Admin/src/Components/Invoice/NewInvoice.jsx, InvoiceBuilderPanel.jsx, CustomLineTable.jsx |
| PDF client fallback | Admin/src/Components/Invoice/InvoiceDetailClientPdf.jsx |
Out of v1 scope
- Custom layout on quotes, recurring, CSV import
- Single shared PDF bundle across Admin webpack and Node esbuild (server + lazy client fallback today)
Docs
- English:
docs/guide/invoice.md(Custom section) - Hindi:
docs/hi/guide/invoice.md - QA matrix:
docs/plans/universal-invoice-builder-qa.md - E2E / smoke:
docs/plans/universal-invoice-builder-e2e.md