feat(invoices)!: Obsah sections, internal-only notes, unified per-page PDF header+footer
Invoices now mirror the issued-orders document model: - New invoice_sections table (CZ/EN rich-text "Obsah") edited via the shared SectionsEditor, printed inline right after the items on the PDF. Full-replace on update, same transaction as items. - Printed notes dropped: the notes column is removed (migration merges existing content into internal_notes first); the form field is now "Interni poznamky", never printed. Legacy payloads sending notes are silently stripped. - Form cleanup: Cislo faktury and Vystavil fields removed (number lives in the header, issued_by auto-fills); page header title restyled to the orders/offers pattern (number span + status chip). - Unified per-page PDF header for the red-accent family: shared buildPdfHeaderTemplate in pdf-shared (22mm logo, red heading, red rule) rendered by a Puppeteer headerTemplate on EVERY page of both invoices and issued orders (incl. the /file fallback render); body headers are print-hidden. htmlToPdf gained the headerTemplate option. - Footer parity: invoices get the per-page "Vystavil + Strana X z Y" footer; the invoice bottom block (notice + QR/VAT recap + Prevzal) is break-inside: avoid so a page break can never split it. - @page margins now match the template space (32mm top, 18mm bottom) - Chromium lays out by CSS @page margins, which also fixes issued orders' content running into the 18mm footer zone on full pages. BREAKING CHANGE: invoices.notes column dropped (data merged into internal_notes); deploy must run prisma migrate deploy + generate. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -74,6 +74,15 @@ export interface HtmlToPdfOptions {
|
||||
* Chromium's default date/title header.
|
||||
*/
|
||||
footerTemplate?: string;
|
||||
/**
|
||||
* Chromium headerTemplate HTML rendered in the top margin of EVERY page
|
||||
* (same rules as footerTemplate: inline styles, explicit font-size; images
|
||||
* must be data: URLs). When set, the top margin grows to 32mm to make room
|
||||
* — the document body must NOT render its own header then, or page 1 shows
|
||||
* it twice. NOTE: Chromium lays pages out by the document's CSS @page
|
||||
* margins when present (they override this option) — keep them in sync.
|
||||
*/
|
||||
headerTemplate?: string;
|
||||
}
|
||||
|
||||
export async function htmlToPdf(
|
||||
@@ -95,16 +104,16 @@ export async function htmlToPdf(
|
||||
format: "A4",
|
||||
printBackground: true,
|
||||
margin: {
|
||||
top: "10mm",
|
||||
top: options.headerTemplate ? "32mm" : "10mm",
|
||||
bottom: options.footerTemplate ? "18mm" : "10mm",
|
||||
left: "10mm",
|
||||
right: "10mm",
|
||||
},
|
||||
...(options.footerTemplate
|
||||
...(options.footerTemplate || options.headerTemplate
|
||||
? {
|
||||
displayHeaderFooter: true,
|
||||
headerTemplate: "<span></span>",
|
||||
footerTemplate: options.footerTemplate,
|
||||
headerTemplate: options.headerTemplate || "<span></span>",
|
||||
footerTemplate: options.footerTemplate || "<span></span>",
|
||||
}
|
||||
: {}),
|
||||
timeout: 15_000,
|
||||
|
||||
Reference in New Issue
Block a user