Anleitung

Rechnung mit ZUGFeRD

Erzeugen Sie eine deutsche Rechnung als PDF/A-3b, die die Rechnung auch als EN-16931-Daten trägt. Die Software des Empfängers bucht sie ohne Abtippen.

Auf dieser Seite

Community

ZUGFeRD und Factur-X sind ein Format mit zwei Namen. Die Datei ist ein PDF nach PDF/A-3b (der PDF-Norm für Langzeitarchive, die angehängte Dateien erlaubt). Ein Mensch liest die Seite. Im PDF steckt die Datei factur-x.xml. Sie enthält dieselbe Rechnung als Daten nach der Norm EN 16931. Die Software des Empfängers liest diese Datei.

Seit dem 1. Januar 2025 muss jedes deutsche Unternehmen solche Rechnungen empfangen können. Ein Unternehmen mit mehr als 800.000 € Umsatz im Vorjahr muss ab dem 1. Januar 2027 eine solche Rechnung senden. Alle anderen müssen es ab dem 1. Januar 2028.

Mit der Vorlage beginnen

Die Vorlage rechnung-zugferd ist eine vollständige Rechnung auf A4 für den Fensterumschlag, nach DIN 5008 Form B. Ihr Ordner enthält fünf Dateien:

Datei Was es ist
rechnung-zugferd.html Die Seite. Sie bindet ../din5008/din5008.css ein, der Ordner din5008/ muss also daneben liegen.
rechnung-zugferd.css Die Einstellungen für Form B.
rechnung-zugferd.schema.json Die Felder und was jedes aufnimmt.
sample.json Eine Rechnung mit 3 Positionen zu 19 % und 7 % Umsatzsteuer. Beginnen Sie damit.
rechnung-zugferd.pdf Das Beispiel, mit --einvoice gesetzt.

Die Positionstabelle trägt data-brevier-uebertrag. Auf einer zweiten Seite steht darum am Umbruch der Übertrag. Siehe Tabellen.

Daten eintragen

Legen Sie Ihre Rechnung in einer JSON-Datei ab, aufgebaut wie sample.json.

Feld Bedeutung
number, issueDate, deliveryDate, currency Rechnungsnummer, Rechnungsdatum, Leistungsdatum (JJJJ-MM-TT) und ein Währungscode wie EUR. Alle vier sind Pflicht.
dueDate oder paymentTerms Das Fälligkeitsdatum oder ein Satz zur Zahlung. Eines von beiden ist Pflicht.
seller, buyer name und address. In der Adresse ist nur country Pflicht, als Code wie DE. Der Verkäufer gibt außerdem vatId an.
lines Mindestens eine. Jede hat position, name, quantity, unitCode, unitPrice, netAmount und vatRate.
vat Ein Eintrag je Steuersatz: rate, taxableAmount, taxAmount.
totals lineNet, taxBasis, tax, gross, due.

unitCode ist ein UN/ECE-Code: HUR sind Stunden, DAY Tage, C62 Stück. Das XML bekommt immer den Code. Die Seite druckt unitLabel (zum Beispiel Std.) und nimmt sonst den Code.

PDF schreiben

brevier pdf rechnung-zugferd.html --data meine-rechnung.json --einvoice -o rechnung.pdf

Ohne --einvoice erhalten Sie dieselbe Seite als einfaches PDF/A-3b. Alle Optionen stehen in der CLI-Referenz.

Was Brevier prüft

Bevor Brevier die Datei schreibt, prüft es Ihre Daten gegen das Schema. Mit --einvoice prüft es außerdem, ob die Beträge stimmen. Es rechnet sie nicht für Sie aus.

Prüfung Regel
Eine Position netAmount ist quantity mal unitPrice, auf Cent gerundet.
Ein Steuereintrag taxableAmount ist die Summe der Positionen mit diesem Satz. taxAmount ist diese Summe mal dem Satz, auf Cent gerundet.
Die Summen lineNet ist die Summe der Positionen. taxBasis ist gleich lineNet. tax ist die Summe der Steuereinträge. gross ist taxBasis plus tax. due ist gleich gross.

Verletzt eine Regel, bricht der Befehl ab, schreibt keine Datei und nennt das Feld:

Error: E-invoice amounts do not add up: BT-112 Invoice total with VAT: is 3610.54 but BT-109 plus BT-110 is 3610.53

Datei prüfen

Listen Sie die angehängten Dateien auf. Eine gute Rechnung hat genau eine, factur-x.xml:

pdfdetach -list rechnung.pdf

Um das XML und den PDF/A-Teil zu prüfen, nutzen Sie Mustang und veraPDF:

java -jar Mustang-CLI-2.26.0.jar --action validate --no-notices --source rechnung.pdf
verapdf --flavour 3b rechnung.pdf

Mustang endet auch bei einer ungültigen Datei mit Exit-Code 0. Suchen Sie in seinem Bericht nach status="invalid".

Was noch nicht geht

  • Nur die Standard-Steuerkategorie S mit einem Satz über null. Satz null, steuerfrei und Reverse Charge stehen nicht im Schema.
  • Nur Rechnungen (Typ 380). Keine Gutschriften.
  • Keine Nachlässe, Zuschläge oder Anzahlungen.