Skip to content

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) ​

  1. Apply migration; restart Backend.
  2. cd Backend && npm run test:invoice-builder
  3. npm run invoice-builder:smoke --prefix qa-tests (Admin :3000, env from Backend/.env)
  4. Spot-check one custom + one inventory invoice using universal-invoice-builder-qa.md

Key files ​

LayerPath
MigrationBackend/migrations/20260929_invoice_builder.sql
ValidationBackend/utils/invoiceLayoutConfig.js (+ Admin mirror)
APIBackend/Routes/new_invoice.route.js, invoice_builder_template.route.js
PDF serverBackend/pdf/InvoiceDocument.jsx, InvoicePdfCustomTable.jsx
Admin UIAdmin/src/Components/Invoice/NewInvoice.jsx, InvoiceBuilderPanel.jsx, CustomLineTable.jsx
PDF client fallbackAdmin/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

Beentara — Business management made simple.