ZUGFeRD Dokumentation

Das ZUGFeRD Format

ZUGFeRD ist ein von FeRD (Forums elektronische Rechnung Deutschland) entwickelter Standard um die Erstellung und Verbreitung von elektronischen Rechnungen zu vereinheitlichen. Dabei wird ein XML Format verwendet, welches die elektronische Rechnungsprüfung ermöglicht. Das XML wird hierbei von PDFreactor über die ZUGFeRD API erzeugt und der Benutzer selbst muss sich nicht mit dem XML auseinandersetzen.

ZUGFeRD Profil

PDFreactor unterstützt zwei der drei von FeRD definierten Profile: basic und comfort. Das dritte Profil extended wird zurzeit nicht unterstützt. Das Profil bestimmt welche ZUGFeRD-Properties generiert werden und welche nicht. Ohne ein Profil kann das ZUGFeRD PDF nicht erzeugt werden und die Konvertierung wird mit einer entsprechenden Exception terminiert.

Ist das ZUGFeRD Profil basic, so werden keine Properties des Profils comfort erzeugt, selbst wenn diese angegeben wurden. Ist das Profil jedoch comfort, so werden Properties des Profils basic generiert, wenn diese angegeben wurden. Außerdem gibt es Properties die immer benötigt werden um ein ZUGFeRD PDF zu erstellen. Diese Properties benötigen das Profil basic und müssen über die ZUGFeRD API angegeben werden. Weiterhin ist anzumerken, dass höhere Profile keine weiteren Properties benötigen damit ein ZUGFeRD PDF erstellt wird. Es ist also möglich ein ZUGFeRD PDF mit dem Profil comfort zu erzeugen und dabei basic Properties anzugeben.

Profil Beschreibung
basic Das niedrigste ZUGFeRD Profil. Ermöglicht es benötigte Informationen anzugeben. Vollständige elektronische Validierung ist nicht vorausgesetzt.
comfort Höherer Level als basic. Ermöglicht genauere Angaben, vor allem in Bezug auf Positionen. Ermöglicht zu einem gewissen Maße die elektronische Validierung.

PDF und XML

Ein ZUGFeRD PDF besteht aus zwei Teilen, dem PDF und dem XML. Alles was im PDF zu sehen ist, kann in das XML generiert werden. Auch wenn die API es erlaubt beliebige gültige Werte auf jedes Property zu setzen, besagt die ZUGFeRD Spezifikation, dass nur Informationen angegeben werden dürfen, die im PDF zu sehen sind oder von diesen Informationen abgeleitet werden können. Ein Beispiel für den letzteren Fall ist das Land, welches im XML als 2-stelliger ZUGFeRD Code angegeben werden muss. Im Rückschluss bedeutet das, dass ZUGFeRD-Properties, die für das ZUGFeRD PDF benötigt werden und nicht über das PDF angegeben werden können, zu einem fehlerhaften PDF und XML führen. Es gibt natürlich Fälle in denen die Informationen womöglich nicht im PDF vorliegen, wie z.B. die Properties zugferd-profile oder test-indicator.

Voraussetzungen

Um das ZUGFeRD PDF zu erzeugen, müssen zuerst einige Voraussetzungen erfüllt werden.

PDF/A3 Conformance Level

Für ZUGFeRD muss zunächst ein PDF Standard gewählt werden, der Langzeitarchivierung ermöglicht, wie z.B. PDF/A. Der PDF Standard muss außerdem Anhänge erlauben, was die Optionen auf die Standards PDF/A-3a, PDF/A-3b, PDF/A-3u und PDF/A-3a mit der PDF/UA-1 Spezifikation, einschränkt.

JavaScript Verarbeitung

Um das ZUGFeRD PDF aus dem PDF zu erzeugen, muss das JavaScript angegeben werden. Dies kann entweder im Dokument oder über die PDFreactor API angegeben werden. Damit das JavaScript verarbeitet wird, muss zunächst jedoch die JavaScript-Verarbeitung für PDFreactor aktiviert werden.

Das folgende Beispiel beinhaltet alle Voraussetzungen, damit PDFreactor ein ZUGFeRD PDF mit Hilfe der Java Bibliothek oder dem Java Wrapper erzeugen kann:

// Erzeugung des configuration Objekts Configuration config = new Configuration(); // Angabe der Conformance config.setConformance(Conformance.PDFA3A); // JavaScript Aktivierung config.setJavaScriptMode(JavaScriptMode.ENABLED); // Angabe des JavaScripts via file URL Resource zugferd = new Resource(); zugferd.setUri("file:///path/to/your/zugferd.js"); config.setUserScripts(zugferd);

ZUGFeRD Validierung

PDFreactor validiert keine Preise oder Gesamtbeträge, die über die ZUGFeRD API angegeben wurden. Bei der Verwendung der API wird von PDFreactor erwartet, dass alle Positionen, Steuern und Beträge richtig berechnet wurden. Ansonsten wäre das Dokument nicht valide. Einige Properties werden jedoch validiert. Das schließt zum Großteil die Properties ein, die als ZUGFeRD Code angegeben werden müssen, wie z.B. document-type oder der Länder-Code. Dies schließt Codes mit ein, die über das options Objekt gesetzt werden. Außerdem werden durch die ZUGFeRD Spezifikation angegebene Sonderfälle validiert, wie z.B. die Elemente GrossPrice und NetPrice.

Die zwei Elementtypen

Bevor die API verwendet werden kann, müssen zunächst die beiden Elementtypen geklärt werden. Einmalige und wiederholende Elemente, beide folgen einer Baumstruktur.

Einmalige Elemente

Einmalige Elemente sind Blattelemente, die direkt über den Root verbunden sind. Diese Elemente können nur einmal über die API gesetzt werden, sind jedoch die wichtigsten Elemente. Es ist sogar möglich ein ZUGFeRD PDF nur mit einmaligen Elementen zu erstellen. Beispiele für einmalige Elemente sind currency, um die dokumentenweite Währung zu definieren oder document-type, um die Art des Dokuments, z.B. Rechnung, per ZUGFeRD Code zu beschreiben.

Wiederholende Elemente

Auch wenn wiederholende Elemente nicht benötigt werden um das ZUGFeRD PDF zu erstellen, bieten sie die Möglichkeit mehr Informationen anzugeben. Diese Elemente können je nach Dokument einmal oder auch mehrmals angegeben werden. Wiederholende Elemente sind selbst nicht mit dem Root verbunden, bilden jedoch Verzweigungen an denen wiederum Blattelemente zu finden sind. Als Beispiel für ein wiederholendes Element sind Positionen. Diese bilden eine Verzweigung über den Pfad item. Die Blattelemente wiederum beinhalten die Informationen wie z.B. den Name des Produkts (item.name) oder die Menge (item.billed-quantity).

Es ist auch möglich, dass eine weitere Verzweigung für ein weiteres wiederholendes Element, an einer bestehenden Verzweigung gebildet wird. Dies sind verschachtelte wiederholende Elemente. Die Schachtelung wird bei der Benutzung der ZUGFeRD-Properties ersichtlich. Es gibt zudem noch eine Einschränkung, welche Blattelemente angegeben werden müssen. Z.B. ist die wichtigste Information einer Position der Name des Produkts (item.name) und muss daher gesetzt werden, damit diese Position generiert wird. Wenn möglich sollten weitere Informationen angegeben werden, diese sind jedoch nicht verpflichtend.

Verwendung von ZUGFeRD-Properties

Um anzugeben welches Element mit welchem Wert beschrieben werden soll, werden ZUGFeRD-Properties benötigt. Diese ZUGFeRD-Properties können zudem noch in Pfade und Properties fragmentiert werden. Auch wenn für die meisten Dokumente keine Fragmente benötigt werden, können diese bei der richtigen Benutzung hilfreich sein. Alle gültigen ZUGFeRD-Properties sind in der Property-Dokumentation zu finden.

Fragmente

Ein ZUGFeRD-Property besteht immer aus mindestens einem Fragment. Durch das Teilen eines ZUGFeRD-Propertys an dem "." wird die Baumstruktur des Propertys ersichtlich. Hierbei kann auch sofort unterschieden werden, ob es sich bei dem ZUGFeRD-Property um ein einmaliges oder ein wiederholendes Element handelt.

// Fragmentieren eines ZUGFeRD-Propertys "zugferd-profile" = "zugferd-profile" "item.name" = "item", "name" "item.tax.type" = "item", "tax", "type"

Besitzt ein ZUGFeRD-Property, wie z.B. "zugferd-profile", keinen ".", so ist es automatisch ein Property für ein einmaliges Element.

Pfad Fragment

Alle Fragmente mit Ausnahme des letzten, sind Pfade. Diese Pfade werden genutzt um einzelne oder mehrere wiederholende Elemente zu spezifizieren. Der Grund dafür ist, dass wiederholende Elemente selbst keine Werte haben können. Nur ihre Blattelemente können Werte haben. Mit Pfaden ist es somit möglich die Baumstruktur anzugeben.

// Pfad "item" ro.zugferd.get("item", 0);

Beinhaltet ein ZUGFeRD-Property mehr als einen "." so handelt es sich um ein wiederholendes Element innerhalb eines wiederholenden Elements. Dabei gilt es zu beachten, dass es sich hierbei um zwei Pfade handelt. Es ist nicht erlaubt diese beiden Pfade als einen Pfad anzugeben. Stattdessen wird der erste Pfad dazu benutzt um ein wiederholendes Element über das ro.zugferd Objekt abzufragen. Der Zweite Pfad wird dann verwendet um von diesem Element wiederum ein wiederholendes Element abzufragen.

// Pfad "item.tax" var item = ro.zugferd.get("item", 0); item.get("tax", 0);

Da Einmalige Elemente nur einmal im Dokument vorkommen, besitzen diese ZUGFeRD-Properties keinen ".".

Property Fragment

Das letzte Fragment oder das ZUGFeRD-Property persönlich, falls das ZUGFeRD-Property keine "." beinhaltet, ist das Property. Dieses Fragment definiert das Blattelement welches den angegebenen oder ausgelesenen Wert erhalten soll.

// Einmalige Elemente ro.zugferd.set("zugferd-profile", "basic"); // Wiederholende Elemente ro.zugferd.get("item", 0).set("name", "Sample Product"); // Verschachtelte wiederholende Elemente ro.zugferd.get("item", 0).get("tax", 0).set("type", "VAT");

Wann werden Fragmente benötigt?

In den meisten Fällen werden Fragmente nicht benötigt. Ein komplexes Dokument kann auch ohne Fragmentierung eines ZUGFeRD-Propertys in ein ZUGFeRD PDF umgewandelt werden. Fragmente werden nur benötigt, um einen Wert auf ein bestimmtes wiederholendes Element zu setzen. Sobald eine get Methoden des "ro.zugferd" Objekts mit dem ersten Fragment aufgerufen wurde, um ein wiederholendes Element zu erhalten, benötigen alle Methoden die auf diesem wiederholenden Element aufgerufen werden, das nächste Fragment des ZUGFeRD-Propertys. Beispiel:

<table> <thead> <tr> <th>Produkt</th> <th>Preis</th> </tr> <thead> <tbody> <tr class="item"> <td>Position 1</td> <td>50.00</td> </tr> <tr class="item"> <td>Position 2</td> <td>4.99</td> </tr> </tbody> </table>

Diese Tabelle kann mit oder ohne Fragmente in das ZUGFeRD PDF umgewandelt werden.

// Ohne Fragmente // Setzen der Produktnamen ro.zugferd.setFromSelectorAll("item.name", ".item td:nth-child(0)"); // Setzen der Produktpreise ro.zugferd.setFromSelectorAll("item.line-total", ".item td:nth-child(1)", { inputFormat: "." } ); // Mit Fragmenten unter der Voraussetzung, dass mindestens zwei Elemente mit dem Pfad vorhanden sind. // Erhalten aller Elemente mit dem Pfad "item". var items = ro.zugferd.get("item"); // Iterieren über das Array items for (var i = 0; i < items.length; i++) { // Setzen der Produktnamen items[i].setFromSelector("name", ".item:nth-child(" + i + ") td:nth-child(0)"); // Setzen der Produktpreise items[i].setFromSelector("line-total", ".item:nth-child(" + i + ") td:nth-child(1)", { inputFormat: "." } ); }

Wie zu sehen ist, sind beide Wege möglich. Fragmente bringen jedoch eine gewisse Komplexität mit sich und sollten nur dann benutzt werden, wenn der Fall danach verlangt.

Sonderfälle

Auch wenn die API so einfach wie möglich gehalten werden soll, bedürfen manche Elemente und Properties mehr Aufmerksamkeit als andere. Dies liegt zum einen an der ZUGFeRD Spezifikation, zum anderen an der Implementierung in PDFreactor.

Steuer und Umsatzsteuernummer

Die ZUGFeRD Spezifikation sieht hier eine uneingeschränkte Angabe von Registrierungen pro beteiligter Partei vor. PDFreactor limitiert dies jedoch auf zwei Properties. Im Fall des Verkäufers, wären diese seller-vatid und seller-taxid.

Die Elemente Gross- und NetPrice

Die Elemente Gross- und NetPrice, werden immer zusammen erzeugt, auch wenn nur eines davon per ZUGFeRD-Property item.gross-price-amount oder item.net-price-amount angegeben wurde. Solange nicht das ZUGFeRD-Property item.gross-price-allowance-charge.amount angegeben wurde, welches einen Zu- oder Abschlag definiert, sind Gross- und NetPrice gleich. Wurde item.gross-price-allowance-charge.amount jedoch angegeben, dürfen Gross- und NetPrice nicht mehr identisch sein. In diesem Fall würde kein ZUGFeRD PDF generiert und eine entsprechende Fehlermeldung ausgegeben werden.

Referenzierte Dokumente

Ein Dokument kann als Referenz im ZUGFeRD PDF angegeben werden. Dies wäre z.B. bei einer Stornierung die vorher gesendete Rechnung. Bei der Angabe eines referenzierten Dokuments wird das options Objekt Property benötigt um das aktuelle Datumsformat anzugeben, jedoch nicht das Property scheme. Dieses wird von der ZUGFeRD Spezifikation auf den Wert yyyy-MM-dd'T'00:00:00 festgelegt.

document-type

Um die Art des Dokuments per ZUGFeRD Code anzugeben, wird das Property document-type genutzt. Auch wenn es sich beim Dokument nicht um eine Handelsrechnung handelt, kann im ZUGFeRD Profil basic nur der ZUGFeRD Code 380 angegeben werden. Andere Dokumentenarten benötigen möglicherweise mehr Informationen, die nicht im basic Profile angegeben werden können.

charge-total und allowance-total

Per ZUGFeRD Spezifikation werden diese beiden ZUGFeRD-Properties benötigt um das ZUGFeRD PDF zu generieren. Auch wenn diese benötigt werden, setzt PDFreactor diese Properties automatisch mit dem Wert 0.00, da es möglicherweise nicht möglich ist diese Properties immer über das PDF zu setzen. Sollten diese beiden Properties jedoch über das PDF angegeben werden können, so sollten diese auch gesetzt werden um die Korrektheit des ZUGFeRD PDFs zu gewährleisten.

item.global-id-type

Bei der Angabe eines ZUGFeRD-Propertys mit dem Typ Global ID, wird im Normalfall der ZUGFeRD Code für die Organisation über das options Objekt Property scheme gesetzt. Die einzige Ausnahme bildet hier das ZUGFeRD-Property item.global-id. Der ZUGFeRD Code für die Organisation wird hier gesondert über das ZUGFeRD-Property item.global-id-type gesetzt um zu verhindern, dass beim Setzen nicht erwünschte Ergebnisse entstehen, die später mühsam korrigiert werden müssen.

mandate-reference-id

Sollte das ZUGFeRD-Property mandate-reference angegeben werden, so ist es möglich für diesen Gläubiger eine ID zu hinterlegen. Diese mandate-reference-id wird jedoch vom Gläubiger selbst vergeben und muss genutzt werden. Das ZUGFeRD-Property mandate-reference-id wird jedoch nicht benötigt um mandate-reference zu generieren.

API Methoden

ro.zugferd

Um mit der ZUGFeRD API zu interagieren, wird das ro.zugferd Objekt benötigt. Mit diesem Objekt ist es möglich, bestimmte Werte zu konfigurieren, Standardwerte für wiederholende Elemente anzugeben sowie für das Standardeingabe- und Ausgabeformat festzulegen. Außerdem können einmalige und wiederholende Elemente gesetzt und wiederholende Elemente abgefragt werden.

addMapping(key, value, options?)

Mappings werden verwendet um einen bestimmten Wert, anstelle des Werts der der Wert der einer Methode übergeben wurde, zu setzen, sofern dieser Wert identisch zum angegebenen Key ist. Dies ist vor allem dann von Interesse wenn der zu setzende Wert zwar menschenlesbar ist, von dem ZUGFeRD-Property jedoch ein ZUGFeRD Code verlangt wird. Es gilt zu beachten, dass der Key zwischen Groß- und Kleinschreibung unterscheidet und Leerzeichen berücksichtigt. Um das Mapping für einen Methodenaufruf zu deaktivieren, kann das options Objekt Property ignoreMapping verwendet werden. Ein errorHandler kann über das options Objekt angehängt werden.

ro.zugferd.addMapping("Rechnung", "380"); ro.zugferd.addMapping("Stück", "C62"); ro.zugferd.addMapping("Deutschland", "DE");

set(zugferdProperty, value, options?)

Setzt das angegebene ZUGFeRD-Property auf den spezifizierten Wert. Der Wert kann mit dem options Objekt modifiziert werden.

ro.zugferd.set("zugferd-profile", "basic");

setFromSelector(zugferdProperty, selector, options?)

Ruft über den angegebenen Selektor den Inhalt eines Elements des Dokuments ab und setzt diesen als Wert für das angegebenen ZUGFeRD-Property. Der Inhalt des ZUGFeRD-Elements kann mit dem options Objekt modifiziert werden.

ro.zugferd.setFromSelector("grand-total", "#grandTotal", { inputFormat: "." });

setFromSelectorAll(zugferdProperty, selector, options?)

Ruft den Textinhalt jedes Elements ab, das auf den spezifizierten Selektor zutrifft und setzt diesen als Wert für das angegebenen ZUGFeRD-Property. Dabei werden, sofern nicht vorhanden, neue wiederholende Elemente erzeugt. Diese Methode ist nicht für ZUGFeRD-Properties erlaubt, die mehrere Pfad Fragmente beinhalten. Für diese ZUGFeRD-Properties sollte die Methode setFromSelectorAll mit dem Selektor Array verwendet werden. Der Inhalt des Elements kann mit dem options Objekt modifiziert werden.

ro.zugferd.setFromSelectorAll("item.name", ".items .ProduktName");

setFromSelectorAll(zugferdProperty, selector[], options?)

Bei der Benutzung dieser Methode kann für jedes Fragment des ZUGFeRD-Propertys ein eigener Selektor angegeben werden. Werden mehr Selektoren angegeben als Fragmente vorhanden sind, wird der Methodenzugriff terminiert. Beschreibt der Selektor ein Pfad Fragment, so werden neue wiederholende Elemente erzeugt. Die Anzahl der neu erzeugten Elemente ist abhängig von den gefundenen Dokumentelementen und der bisherigen Anzahl an Elementen mit diesem Pfad. Um nur direkte Kindelemente zu selektieren, kann vor jedem Selektor nach dem ersten ein ">" angegeben werden. Der Inhalt des ZUGFeRD-Elements kann mit dem options Objekt modifiziert werden.

// Einfach geschachtelte Elemente ro.zugferd.setFromSelectorAll("item.name", [".items", ".ProduktName"] ); // Mehrfach geschachtelte Elemente // ".tax" beinhaltet den zu setzenden Wert. ro.zugferd.setFromSelectorAll("item.tax.percent", [".items", ".tax"] ); // ".tax" beinhaltet nicht den zu setzenden Wert. ro.zugferd.setFromSelectorAll("item.tax.percent", [".items", ".tax", ".percent"] ); // > Selektor ro.zugferd.setFromSelectorAll("item.tax.percent", [".items", "> tr:nth-child(2)"] );

get(pathFragment, index, options?)

Gibt das wiederholende Element mit dem spezifizierten Pfad und Index zurück. Gibt es kein wiederholendes Element mit diesem Index wird das ZUGFeRD-Element sowie alle vorhergehenden Elemente erzeugt. Ein errorHandler kann über das options Objekt angehängt werden.

ro.zugferd.get("item", 3);

get(pathFragment, options?)

Gibt ein Array aus allen wiederholenden Elementen mit dem angegebenen Pfad zurück. Gibt es kein wiederholendes Element mit dem Pfad, wird im errorHandler ein Error vom errorType 5000 geloggt. Ein errorHandler kann über das options Objekt angehängt werden. Das zurückgegebene Array ist nicht live, Werte die auf Elemente dieses Arrays gesetzt werden, werden dennoch auf die Elemente angewandt.

ro.zugferd.get("item");

Elemente

Elemente sind die wiederholenden Elemente, die über die ro.zugferd get Methoden zurückgegeben wurden.

set(propertyFragment, value, options?)

Setzt das angegebene Property Fragment auf den spezifizierten Wert. Der Wert kann mit dem options Objekt modifiziert werden.

// Setzen des Produktnamens // Einzelnes Element ro.zugferd.get("item", 3).set("name", "Muster Produkt"); // Mehrere Elemente ro.zugferd.get("item").forEach( function (param) { param.set("name", "Muster Produkt"); });

setFromSelector(propertyFragment, selector, options?)

Ruft über den angegebenen Selektor den Inhalt eines Elements ab und setzt diesen als Wert für das angegebenen Property Fragment. Der Inhalt des ZUGFeRD-Elements kann mit dem options Objekt modifiziert werden.

// Setzen des Produktnamens // Einzelnes Element ro.zugferd.get("item", 3).setFromSelector("name", "#spezifischerItemName"); // Mehrere Elemente var items = ro.zugferd.get("item"); for (var i = 0; i < items.length; i++) { items[i].setFromSelector("name", ".items:nth-child(" + (i + 1) + ") .ProduktName"); }

get(pathFragment, index, options?)

Wird diese Methode auf einem wiederholenden Element aufgerufen, so wird das verschachtelte wiederholende Element mit dem angegebenen Pfad Fragment an dem angegebenen Index zurückgegeben. Gibt es kein wiederholendes Element an dem Index, so werden das Element, sowie alle vorhergehenden Elemente erzeugt. Ein errorHandler kann über das options Objekt angehängt werden.

var item = ro.zugferd.get("item", 3); item.get("tax", 3);

get(pathFragment, options?)

Wird diese Methode auf einem wiederholenden Element aufgerufen, so wird ein Array bestehend aus allen verschachtelte wiederholenden Elementen mit dem angegebenen Pfad Fragment zurückgegeben. Gibt es keine Elemente mit dem Pfad Fragment wird im errorHandler ein error vom errorType 5000 geloggt. Ein errorHandler kann über das options Objekt angehängt werden. Das zurückgegebene Array ist nicht live, Werte die auf Elemente dieses Arrays gesetzt werden, werden dennoch auf die Elemente angewandt.

var item = ro.zugferd.get("item", 3); item.get("tax");

Das "options" Objekt

Das "options" Objekt kann einer Methode übergeben werden, um Texte zu modifizieren und um benötigte Informationen anzugeben. Bei ZUGFeRD-Properties vom Typ Date oder Number wird dieses Objekt immer benötigt, es sei denn die benötigten Informationen wurden bereits über die default Objekt Properties inputFormat und scheme angegeben. Wurden Informationen für das gleiche Property sowohl im options als auch im default Objekt angegeben, so werden nur die Informationen des options Objekts berücksichtigt.

inputFormat

Das inputFormat wird für ZUGFeRD-Properties von den Typen Date und Number benötigt. Für ZUGFeRD-Properties vom Typ Date wird das aktuelle Datumsformat als Java Pattern angegeben. Sollte es sich um ein Property des Typs Number handeln, so muss das Dezimaltrennzeichen angegeben werden. Das inputFormat wird nur in diesen beiden Fällen ausgewertet und verarbeitet. Der Default Wert für ZUGFeRD-Properties des Typs Number ist ",".

// Date ro.zugferd.set("buyer-order-reference-issue-date", "26.05.2017", { inputFormat: "dd.MM.yyyy" } ); // Number ro.zugferd.set("line-total", "12,550.85", { inputFormat: "." } );

scheme

Um das Ausgabeformat eines ZUGFeRD-Propertys vom Typ Date anzugeben wird das Property scheme benötigt. Das Format wird als einer der von ZUGFeRD spezifizierten Codes angegeben. Eine Ausnahme stellen hierbei ZUGFeRD-Properties des Typs Date dar. Diese benötigen kein Ausgabeformat. Eine weitere Anwendung findet scheme bei Global IDs. Die Codes sind in der Propertyliste unter dem jeweiligen Typ zu finden. Das Property scheme wird nur in diesen beiden Fällen ausgewertet und verarbeitet. Der Default Wert für ZUGFeRD-Properties des Typs Date ist 102.

// Date ro.zugferd.set("document-issue-date", "26.05.2017", { inputFormat: "dd.MM.yyyy", scheme: "102" } ); // Global ID ro.zugferd.set("seller-global-id", "4000001123452", { scheme: "0088" } );

startDelimiter

Das Property startDelimiter kürzt einen Text vom ersten Vorkommen des Delimiters bis zum Ende des Texts, sofern kein endDelimiter angegeben wurde.

ro.zugferd.set("seller-city", "66435 Frankfurt/M", { startDelimiter: " " }); // Ergebnis: "Frankfurt/M"

endDelimiter

Das Property endDelimiter kürzt einen Text vom Anfang des Texts (oder ab dem ersten startDelimiter) bis zum letzten Vorkommen des Delimiters.

ro.zugferd.set("seller-postcode", "66435 Frankfurt/M", { endDelimiter: " " }); // Ergebnis: "66435"

splitDelimiter

Mit Hilfe des Propertys splitDelimiter wird ein Text am angegeben Delimiter geteilt. Über das Property splitIndex kann dann das gewünschte Fragment ausgewählt werden.

splitIndex

Nachdem ein Text am splitDelimiter fragmentiert wurde, kann mit Hilfe des Propertys splitIndex ein Fragment ausgewählt werden. Wurde kein splitDelimiter angegeben, kann auch kein Fragment ausgewählt werden. Das erste Fragment hat den Index 0.

ro.zugferd.set("zugferd-profile", "Das ZUGFeRD Profil ist basic", { splitDelimiter: " ", splitIndex: 4 }); // Ergebnis // "basic"

processor

Über das Property processor kann einer Methode eine eigene Funktion übergeben werden. So können weitere Textmanipulationen anhand von bestimmten Bedingungen durchgeführt werden. Außerdem ist es möglich die Properties inputFormat und scheme zu setzen oder zu verändern. Folgende read-only Properties stehen als Parameter zur Verfügung:

Name Typ Beschreibung
rawText String Gibt den unverarbeiteten Text zurück.
text String Gibt den verarbeiteten Text zurück.
propertyName String Gibt den Namen des Propertys zurück, mit welchem die Methode aufgerufen wurde.
element Element Gibt das über den Selektor abgerufene Element zurück.
content String Gibt den Textinhalt des Elements, einschließlich des generierten before und after Textinhalts, zurück.
contentBefore String Gibt den generierten before Textinhalt des Elements zurück.
contentAfter String Gibt den generierten after Textinhalt des Elements zurück.
contentText String Gibt den Textinhalt des Elements zurück
// Benötigt kein inputFormat, da es sich bei tax.category nicht um den Typ "Number" handelt. ro.zugferd.set("tax.category", "19.00", { processor: function (param) { if (param.text == "19.00" || param.text == "7.00") { return "S"; // Einheitssatz } } }); // Änderung des Dezimaltrennzeichens ro.zugferd.set("tax.percent", "19.00", { processor: function (param) { if (param.text.indexOf(".") !== -1) { param.inputFormat = "."; } else { param.inputFormat = ","; } } });

ignoreMapping

Falls ein Mapping für ein bestimmtes ZUGFeRD-Property deaktiviert werden soll, so kann dies mit ignoreMapping erreicht werden.

// Mapping von "Rechnung" auf den ZUGFeRD Code "380". ro.zugferd.addMapping("Rechnung", "380"); // Name des Dokuments soll "Rechnung" bleiben ro.zugferd.set("document-name", "Rechnung", { ignoreMapping: true }); // Typ des Dokuments soll "380" sein. ro.zugferd.set("document-type", "Rechnung");

errorHandler

Mit dem Property errorHandler ist es möglich Fehlerfälle zu erkennen und diese zu analysieren. Außerdem können verschiedene Informationen zum aktuellen Verarbeitungsschritt abgefragt werden. Folgende Informationen können abgefragt werden:

Name Typ Beschreibung
methodName String Der Name der Methode.
propertyName String Der Name des ZUGFeRD-Propertys oder der Key beim Aufruf von addMapping
value String Der Wert der der Methode set oder addMapping übergeben wurde.
selectors String oder [String] Im Falle von setFromSelector der angegebene Selektor, bzw. ein Array von Selektoren im Falle von setFromSelectorAll.
options Object Das options Objekt welches der Methode übergeben wurde.
message String Die Nachricht des Errors, der Warning oder der Info.
errorType Number Der Typ der warning oder des errors. Bei info liegt kein Typ vor. Mehr Informationen zu den Typen finden sich hier.
level String Der Loglevel. Folgende Levels können vorliegen:
  • info: Informationen bezüglich neu erstellter ZUGFeRD-Elemente.
  • warning: Warnungen beenden die Konvertierung nicht. Informationen zur Ursache der Warnung finden sich im Property message.
  • error: Errors beenden die Konvertierung nicht, können aber zu Folgefehlern oder ungültigem ZUGFeRD PDF führen. Informationen zur Ursache des Fehlers finden sich im Property message.
matchCount [Number] Das Property matchCount beinhaltet auf Level info ein Array von Zahlen, welches angibt wie viele Elemente im Dokument mit dem angegebenen Selektor gefunden wurden.
ro.zugferd.set("document-issue-date", "2017-06-06", { errorHandler: function (param) { if (param.level == "error") { console.log(param.level); console.log(param.errorType); console.log(param.message); } } });

Anmerkung: Wurde kein errorHandler über das Options oder dem Default Objekt angegeben, ist es nicht möglich aktuelle Informationen abzufragen und mögliche Fehlerfälle zu analysieren.

Das "default" Objekt

Mit dem default Objekt können die Properties inputFormat und scheme auf einer globalen Ebene angegeben werden. Die Werte der Properties werden verwendet, sofern diese nicht über das options Objekt angegeben wurden und der Typ des ZUGFeRD-Propertys diese verlangt. Außerdem ist es möglich für wiederholende Elemente Standardwerte anzugeben.

inputFormat

Über das Property inputFormat können Standardwerte für ZUGFeRD-Properties des Typs Date sowie des Typs Number gesetzt werden.

Name Beschreibung
dateFormat Angabe des Eingabeformats als Java Date Format Pattern.
decimalMark Angabe eines Dezimaltrennzeichens zur Verarbeitung von ZUGFeRD-Properties des Typs Number. Der Standardwert ist ",".

scheme

Über das Property scheme können Standardwerte für das Ausgabeformat von ZUGFeRD-Properties der Typen Date und Global ID gesetzt werden.

Name Beschreibung
dateFormat Angabe des Ausgabeformats des Datums als ZUGFeRD Codes. Die Codeliste ist in der Propertyliste unter dem Typ Date zu finden. Der Standardwert ist 102.
globalId Angabe der Organisation unter welcher die Global ID registriert ist. Ein Auszug der möglichen Codes findet sich in der Propertyliste unter dem Typ Global ID. Für die Angabe der Organisation bei dem ZUGFeRD-Property item.global-id wird dieses Property jedoch nicht ausgewährtet. Um den ZUGFeRD Code für die Organisation anzugeben steht das ZUGFeRD-Property item.global-id-type zur Verfügung.

propertyValues

Mit Hilfe des Propertys propertyValues können Standardwerte für wiederholende Elemente gesetzt werden. Die Syntax ist wie folgt:

propertyValues: { "propertyName": "Wert", "propertyName": "Wert" };

errorHandler

Das Property errorHandler ist in seiner Funktion gleich dem des options Objekts. Wird ein errorHandler als Standardwert angegeben so wird dieser bei jedem Methodenaufruf, bei dem kein expliziter errorHandler im options Objekt angegebene wurde, benutzt.

Ein möglicher Anwendungsfall kann wie folgt aussehen:

ro.zugferd.defaults = { inputFormat: { dateFormat: "dd-MM-yyyy", decimalMark: "." }, scheme: { globalid: "0088", dateFormat: "102" }, propertyValues: { "tax.type": "VAT", "item.tax.type": "VAT" } errorHandler: function (param) { if (param.level == "error") { console.log(param.level); console.log(param.errorType); console.log(param.message); } } };

ErrorTypes

Im Falle einer warning oder eines errors kann anhand folgender Typen das Problem zusammengefasst werden. Eine genauere Beschreibung ist im Property message des errorhandlers zu finden.

Typ Beschreibung
1000 Fehler in der Verwendung der API.
2000 Der Wert oder Textinhalt eines Elements konnte nicht mit dem angegeben options Objekt verarbeitet werden.
3000 Der Wert oder Textinhalt eines Elements ist ungültig oder ungültig für dieses ZUGFeRD-Property.
4000 Der Wert oder Textinhalt eines Elements konnte nicht verarbeitet werden. Dies tritt nur bei ZUGFeRD-Properties vom Typ Date oder Number auf.
5000 Fehler beim get Zugriff auf wiederholende Elemente oder wenn keine Elemente mit dem angegebenen Selektor im Dokument gefunden wurden.