Zurück zu Rechnungsvorlagen
Cookbook

Rezepte für Rechnungsvorlagen

Kopierfertige BlockTemplate-Snippets für wiederkehrende Aufgaben — von SEPA-QR-Code bis dynamischen Steuerzeilen. Einfach in das body.blocks-Array (bzw. header / footer) einfügen.

Offenes Rezeptbuch mit Snippet-Karten (QR, Rabatt, Logo, Seitenzahl)
01

SEPA-Girocode (QR) für Überweisungen

Ein qrcode-Block mit EPC-069-12-konformem Inhalt aus dem nested seller.bankAccount (iban ist dort Pflicht — bei ZUGFeRD/XRechnung mit SEPA-Überweisung ohnehin zwingend). Kunden scannen ihn in ihrer Banking-App, Überweisungsdaten werden vorausgefüllt.

SEPA-Girocode (QR) für Überweisungen
json
1{
2 "type": "qrcode",
3 "condition": "{{seller.bankAccount.iban}}",
4 "data": {
5 "size": 120,
6 "alignment": "right",
7 "eccLevel": "M",
8 "content": "BCD\n002\n1\nSCT\n{{seller.bankAccount.bic}}\n{{seller.bankAccount.accountHolder}}\n{{seller.bankAccount.iban}}\nEUR{{total}}\n\n{{invoiceNumber}}\n\nRechnung {{invoiceNumber}}"
9 }
10}
02

Artikelnummer-Spalte in der Positions-Tabelle

Zusätzliche Spalte für die Artikel-/Leistungsnummer aus items[].articleNumber. Bei leerem Feld bleibt die Zelle einfach leer.

Artikelnummer-Spalte in der Positions-Tabelle
json
1{
2 "type": "table",
3 "data": {
4 "dataSource": "{{items}}",
5 "columns": [
6 { "field": "articleNumber", "header": "Artikel-Nr.", "width": "15%" },
7 { "field": "description", "header": "Beschreibung", "width": "*" },
8 { "field": "quantity", "header": "Menge", "width": "10%", "align": "center" },
9 { "field": "unitPrice", "header": "Einzel", "width": "15%", "align": "right", "format": "currency" },
10 { "field": "netAmount", "header": "Netto", "width": "15%", "align": "right", "format": "currency" }
11 ]
12 }
13}
03

Logo rechts, Firma links im Kopf

Zwei-Spalten-Header mit textueller Absenderadresse links und Logo rechts — repeatOnAllPages macht es zum Briefkopf. Das Logo wird als statische URL oder Base64-Data-URI eingebunden.

Logo rechts, Firma links im Kopf
json
1{
2 "header": {
3 "height": 100,
4 "repeatOnAllPages": true,
5 "blocks": [
6 {
7 "type": "columns",
8 "data": {
9 "columnGap": 20,
10 "columns": [
11 { "width": "*", "blocks": [
12 { "type": "text", "data": { "content": "{{seller.name}}", "style": "h2" } },
13 { "type": "text", "data": { "content": "{{seller.street}}", "style": "muted" } },
14 { "type": "text", "data": { "content": "{{seller.postalCode}} {{seller.city}}", "style": "muted" } }
15 ]},
16 { "width": "auto", "blocks": [
17 { "type": "image", "data": { "src": "https://cdn.example.com/logo.png", "fit": [140, 70], "alignment": "right" } }
18 ]}
19 ]
20 }
21 }
22 ]
23 }
24}
04

Seitenzahl im Footer

Die Runtime-Platzhalter {{pageNumber}} und {{pageCount}} liefern die aktuelle Seite und die Gesamtseitenzahl. Kombiniert mit repeatOnAllPages.

Seitenzahl im Footer
json
1{
2 "footer": {
3 "repeatOnAllPages": true,
4 "blocks": [
5 { "type": "line", "data": { "thickness": 0.5, "color": { "token": "lineColor" } } },
6 { "type": "text", "data": {
7 "content": "Seite {{pageNumber}} von {{pageCount}} • Rechnung {{invoiceNumber}}",
8 "fontSize": 8,
9 "alignment": "center",
10 "color": { "token": "mutedColor" }
11 }}
12 ]
13 }
14}
05

USt.-Zeilen dynamisch aus taxSummary

Eine Summary-Zeile je Steuersatz — ohne fest verdrahtete 19 %-Logik. Funktioniert gleichermaßen für gemischte Rechnungen mit 7 %, 19 %, Reverse-Charge (AE) oder steuerfrei (Z/E).

USt.-Zeilen dynamisch aus taxSummary
json
1{
2 "type": "summary",
3 "data": {
4 "alignment": "right",
5 "labelBold": true,
6 "headerRows": [
7 { "label": "Netto gesamt", "value": "{{subtotal}}", "valueFormat": "currency" }
8 ],
9 "dynamicRows": {
10 "dataSource": "{{taxSummary}}",
11 "valueField": "taxAmount",
12 "valueFormat": "currency",
13 "labelTemplate": "USt {{taxRate}}% ({{taxCategoryCode}})"
14 },
15 "footerRows": [
16 { "label": "Gesamtbetrag", "value": "{{total}}", "bold": true, "valueFormat": "currency", "separator": true }
17 ]
18 }
19}
06

Zahlungsbedingungen mit Skonto

Bedingter Block: nutzt paymentTerms.earlyPaymentDiscount (nested). Nur rendern, wenn discountPercent gesetzt ist.

Zahlungsbedingungen mit Skonto
json
1{
2 "type": "text",
3 "condition": "{{paymentTerms.earlyPaymentDiscount.discountPercent}}",
4 "data": {
5 "content": "Zahlbar bis {{dueDate}}. Bei Zahlung innerhalb von {{paymentTerms.earlyPaymentDiscount.days}} Tagen gewähren wir {{paymentTerms.earlyPaymentDiscount.discountPercent}}% Skonto.",
6 "fontSize": 9,
7 "margin": [0, 12, 0, 0]
8 }
9}
07

Kleinunternehmer-Hinweis (§ 19 UStG)

countrySpecific.isKleinunternehmer ist ein Boolean-Flag für DE-Rechnungen. Per condition wird der Paragraphen-Hinweis nur gerendert, wenn das Flag gesetzt ist.

Kleinunternehmer-Hinweis (§ 19 UStG)
json
1{
2 "type": "text",
3 "condition": "{{countrySpecific.isKleinunternehmer}}",
4 "data": {
5 "content": "Gemäß § 19 UStG wird keine Umsatzsteuer berechnet (Kleinunternehmer-Regelung).",
6 "italics": true,
7 "fontSize": 9,
8 "margin": [0, 12, 0, 0]
9 }
10}
08

B2G: Leitweg-ID im Kopfbereich

Für Rechnungen an öffentliche Auftraggeber (DE). Leitweg-ID und Bestellreferenz liegen unter countrySpecific. Hinweis zum Payload: countrySpecific verlangt den Pflicht-Discriminator countryCode: "DE", und EN 16931 erwartet mindestens eines von leitwegId oder buyerReference.

B2G: Leitweg-ID im Kopfbereich
json
1{
2 "type": "keyvalue",
3 "condition": "{{countrySpecific.leitwegId}}",
4 "data": {
5 "layout": "horizontal",
6 "labelWidth": 120,
7 "labelBold": true,
8 "items": [
9 { "label": "Leitweg-ID", "value": "{{countrySpecific.leitwegId}}" },
10 { "label": "Bestellreferenz", "value": "{{countrySpecific.buyerReference}}", "optionalMode": "anyEmpty" }
11 ]
12 }
13}

Ein Rezept fehlt dir?

Schreib uns — wir nehmen häufig nachgefragte Muster gerne in das Cookbook auf.

Rezept vorschlagen →