Elektronische Rechnungen schreiben und lesen
Lizenz
Mustangproject liegt unter der liberalen Apache Public License 2 vor und darf kostenlos in kommerziellen und nichtkommerziellen Produkten genutzt werden.
Quelltext
Das git repository des Mustangproject-Quelltext liegt auf Github.
Architektur
Sie können Mustang von der Kommandozeile aufrufen oder in Ihre Java-Software einbinden, entweder indem Sie (mit Maven oder Gradle) auf Mustang verweisen oder indem Sie die entsprechenden Dateien herunterladen.
Sie können PDF und XML zusammenfügen, trennen und/oder validieren. Auf der Kommandozeile müssen Sie um Factur-X zu schreiben immer eine PDF/A-1 Datei und eine XML-Datei angeben, mit der Bibliothek müssen Sie mindestens eine PDF/A-1-Datei angeben und können eigenes XML einbinden oder die Rechnungsklassen benutzen die die Interfaces benutzen, oder direkt per
interfaces kommunizieren. Factur-X lesen geht derzeit nur im “Bibliotheksmodus” wo Sie in ein
Rechnungsobjekt parsen können,
oder einfach nur per ZUGFeRDImporter Basisdaten auslesen.
Mit einem anderen Artefakt können Sie auch den Validierer in Ihre Software einbetten.
In der Kommandozeile gibt es auch kleinere Statistiken für Verzeichnisse mit Factur-X-Dateien und Sie können
versuchsweise XML von ZUGFeRD Version 1 auf 2 übersetzen, PDF/A-1 nach PDF/A-3 konvertieren, oder XML visualisieren, was in diesem Diagram fehlt:
Neues Projekt
Die Tastenkürzel dieses Beispiels geht von Eclipse als IDE aus.
Starten Sie Eclipse und erstellen ein neues Maven-Projekt, beispielsweise „MustangSample“ als “simple project”, Gruppen-ID “org.mustangproject”, Artifakt “mustangtest”.
Sie werden
- eine ZUGFeRD PDF/A-3 Beispieldatei für das Lesebeispiel benötigen. Speichern Sie es im selben Verzeichnis wie Ihre pom.xml.
- eine PDF/A-1-Datei ohne ZUGFeRD-Daten für das Schreibbeispiel die Sie sich
- direkt herunterladen
- oder selbst mit Libreoffice und der entsprechenden Quelldatei: Benutzen Sie Datei|Export als PDF und setzen Sie den Haken für PDF/A-1a in den Export-Option.
- Speichern Sie das Resultat als MustangGnuaccountingBeispielRE-20190610_507blanko.pdf, bitte ebenfalls im selben Verzeichnis wie ihre POM.xml.
Mit Maven
Öffnen Sie Ihre pom.xml und fügen Sie die Abhängigkeiten
<dependencies>
<dependency>
<groupId>org.mustangproject</groupId>
<artifactId>library</artifactId>
<version>2.1.0</version>
</dependency>
</dependencies>
hinzu.
Mit Gradle
Erstellen Sie ein neues Java-Gradle-Projekt. Mit der groovy DSL können Sie die Abhängigkeiten mavenCentral() wie folgt einfügen:
implementation 'org.mustangproject:library:2.0.3'
implementation 'org.xmlunit:xmlunit-assertj:2.8.2'
Die komplette build.gradle kann dann wie folgt aussehen
plugins {
id 'groovy'
id 'java'
}
group 'org.example'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.mustangproject:library:2.0.3'
implementation 'org.xmlunit:xmlunit-assertj:2.8.2'
compile 'org.codehaus.groovy:groovy-all:2.3.11'
testCompile group: 'junit', name: 'junit', version: '4.12'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
}
test {
useJUnitPlatform()
}
ZUGFeRD-Daten lesen
- Erstellen Sie eine neue Klasse im src/main/java-Verzeichnis und nennen Sie es beispielsweise Reader. Wählen Sie dabei die “Public static void main()”-Option.
- Erstellen Sie eine “run configuration”: klicken Sie in Run|Run configurations auf Java Application,und dort auf das Icon für eine neue Konfiguration.
- Geben Sie innerhalb der Main-Methode
ZUGFeRDImporter zu=new ZUGFeRDImporter("MustangGnuaccountingBeispielRE-20190610_507.pdf");
ein und - fügen Sie die imports durch drücken von
STRG
+SHIFT
+O
(Windows) oderCMD
+SHIFT
+O
(Mac) hinzu. - prüfen Sie gegebenenfalls mit
if (zu.canParse())
ob es sich um eine geeignete ZUGFeRD-Datei handelt - und
zu.parse()
um in der Folge die getter-Methoden wie getAmount() nutzen zu können - verwenden Sie schließlich beispielsweise
zu.getAmount()
. Es gibt nur für einige Attribute getter aber weitere können einfach ergänzt werden. Welche Daten verfügbar sind ersehen Sie beispielsweise der ZUGFeRD-invoice.xml die in jede ZUGFeRD-Datei eingebettet ist. - Vollständiges Beispiel
ZUGFeRDImporter zu=new ZUGFeRDImporter("MustangGnuaccountingBeispielRE-20190610_507.pdf"); System.out.println("Endbetrag: "+zu.getAmount());
Eigenes XML schreiben
Mustangprojects erstellt das nötige XML für Sie, alternativ können Sie auch eigenes XML angeben.
Erstellen Sie dazu eine Klasse XMLWriter mit einer statischen main-Methode. Benutzen Sie
ZUGFeRDExporter ze;
try {
System.out.println("Converting to PDF/A-3u");
/*
* Add .setZUGFeRDVersion and .setZUGFeRDConformanceLevel
* in the next lines to set the ZUGFeRD version respective profile of the XML
* you are inserting.
*/
ze = new ZUGFeRDExporterFromA1Factory().setProducer("My Application")
.setCreator(System.getProperty("user.name"))
.load("./MustangGnuaccountingBeispielRE-20190610_507blanko.pdf");
System.out.println("Attaching ZUGFeRD-Data");
/*
* Mustangproject checks if the input PDF/A file looks halfway valid and the XML
* data contains „<rsm:CrossIndustry“ which is the case for both ZF1
* (CrossIndustryDocument) and ZF2 files (CrossIndustryInvoice).
* Insert your (validated) XML here.
*/
String ownZUGFeRDXML = "<rsm:CrossIndustryDocument></rsm:CrossIndustryDocument>";
ze.setZUGFeRDXMLData(ownZUGFeRDXML.getBytes());
System.out.println("Writing ZUGFeRD-PDF");
ze.export("./Target.pdf");
} catch (IOException e) {
e.printStackTrace();
}
und importieren Sie die Klassen (STRG
+SHIFT
+O
in Windows oder CMD
+SHIFT
+O
auf dem Mac).Erstellen Sie eine Run-Configuration durch Klick auf Run|Run configurations, dann auf Java Application und dann Klick auf das Icon für “neu”.
Um das eigene EN16931 XML zu schreiben sei erwähnt:
Schema
Die EN16931 Schemadatei für UN/CEFACT ist das “SCRDM uncoupled” der 2016 (“16B”) Version
erhältlich von https://www.unece.org/cefact/xml_schemas/ .
Die Schemadatei des ZUGFeRD “info packet” sollte äquivalent sein.
CIUS
Als ZUGFeRD/Factur-X Profil können Sie bspw. einfach EN16931 nutzen. Als CIUS kommt XRechnung soweit als möglich in Frage.
Beispiel
Das XML der Mustangprojects Beispieldatei kann online eingesehen werden.
Der Grund warum diese Datei im XRechnungs-Validierer nicht funktioniert ist interessant:
Validatoren
Sie können sich den offiziellen XRechnung-Validator wie folgt herunterladen, konfigurieren und verwenden:
mkdir xr
cd xr
wget https://github.com/itplr-kosit/validator/releases/download/v1.0.2/validationtool-1.0.2-full.zip
wget https://github.com/itplr-kosit/validator-configuration-xrechnung/releases/download/release-2018-12-19/validator-configuration-xrechnung_1.2.0_2018-12-19.zip
unzip validationtool-1.0.2-full.zip
unzip validator-configuration-xrechnung_1.2.0_2018-12-19.zip
mkdir test/instances
Ihre Testdateien können Sie dann in test/instances ablegen. Validierungsberichte in HTML in test/reports erhalten Sie dann mit
java -jar validationtool-1.0.2-standalone.jar -s scenarios.xml -o test/reports -h test/instances/*.xml
Das EN16931 ZF Profile erwartet genau urn:cen.eu:en16931:2017 im RAM:ID-Element während die XRechnung urn:cen.eu:en16931:2017#compliant#urn:xoev-de:kosit:standard:xrechnung_1.2 erwartet.
Fügen Sie im Beispiel der RAM:ID #compliant#urn:xoev-de:kosit:standard:xrechnung_1.2 hinzu sollte es den XRechnungs-Validierer erfolgreich durchlaufen.
Die Ausgabe von
wget https://github.com/ZUGFeRD/ZUV/releases/download/v0.8.0/ZUV-0.8.0.jar
java -jar ZUV-0.8.0.jar -x <your file here>
sollte bei Ihren Dateien “valid” sein.
Es ist leider nicht ausreichend, lediglich mit den Schemadateien zu prüfen: Die Schematron-Datei prüft nämlich zusätzlich noch andere Elemente läßt aber auch einiges außer Acht was in der Schemadatei steht.
Schematron kann beispielsweise prüfen ob das Lieferdatum vor dem Rechnungsdatum liegt und ob die Gesamtsumme der Summe der Posten entspricht.
Validierer prüfen in der Regel sowohl gegen Schema als auch Schematron und Sie sollten einen benutzen oder diese Doppelprüfung auch vornehmen.
Rechenregeln
Wenn Sie wissen möchten wie viele Stellen hinter dem Komma Sie bei Beträgen angeben müssen oder wie richtig gerechnet wird: Das ist Teil des ersten Teils des Standards.
Codelisten
Wenn Sie Artikel in Fünferpacks verkaufen oder keine deutsche USt-ID angeben möchten, oder Firmen anders identifizieren oder eine Rechnung nach Malaysia schicken möchten brauchen Sie andere Codes.
Das CEF hat eine sehr praktische Liste aller möglichen Codes in EN16931 veröffentlicht.
XML generieren und schreiben
Sie können Rechnungen schreiben ohne das XML selbst schreiben zu müssen indem sie die normalen setter verwenden oder die Interfaces implementieren.
Project setup ohne Maven
- Download
- Mustang
- die JAR-Datei http://mustangproject.org/deploy/mustang-2.1.0.jar
- die notice-Datei http://mustangproject.org/deploy/NOTICE
- Mustang
- In Ihrer Entwicklungsumgebung: Fügen Sie die http://mustangproject.org/deploy/mustang-2.1.0.jar den JAR-Dateien Ihres Projekts hinzu (Rechtsklick auf Projektname, Eigenschaften), hinzufügen als „external Jar“ zum „Build Path“ im Reiter „libraries“.
Zusatzfunktionen
- Liefert ein ZUGFeRDExporter im ZUGFeRD 2-Modus
-
new ZUGFeRDExporterFromA1Factory().setZUGFeRDVersion(2).setZUGFeRDConformanceLevel(ZUGFeRDConformanceLevel.EN16931).load(SOURCE_PDF)
- Erstellt eine Factur-X-Datei (Gleicher Inhalt aber anderer Dateiname der eingebetteten Datei)
-
ZUGFeRDExporter ze = new ZUGFeRDExporterFromA1Factory().setProducer("My Application") .setCreator(System.getProperty("user.name")) .load("./MustangGnuaccountingBeispielRE-20170509_505blanko.pdf"); ze.setFacturX(); System.out.println("Generating and attaching ZUGFeRD-Data"); ze.PDFattachZugferdFile(this); System.out.println("Writing Factur-X-PDF"); ze.export("./factur-x.pdf");
- Liefert EN16931-konformes UN/CEFACT XML aus einer das Interface implementierenden Klasse. Sofern Sie eine buyerReference und einen seller contact angegeben haben ist der einzige Unterschied zu einer XRechnung der fehlende
#compliant#urn:xoev-de:kosit:standard:xrechnung_1.2
RAM:ID Suffix:
-
ZUGFeRDExporter ze = new ZUGFeRDExporter(); ze.setZUGFeRDVersion(2); ze.getProvider().generateXML(this); System.out.println("XML "+new String(ze.getProvider().getXML()));
- Setzt ein Testrechnungs-Flag
-
ZUGFeRDExporter.setTest()
- Überspringt die Eingangsprüfung auf valides PDF/A-1
-
ZUGFeRDExporter.ignoreA1Errors()
- Liefert die PDF XMP Metadaten
-
ZUGFeRDImporter().getMeta()
- Liefert ebenfalls das XML der ZUGFeRD-PDF-Datei und entfernt gleichzeigt mögliche UTF8 BOMs
-
ZUGFeRDImporter().getUTF8()
Einbetten des Validierers
Verwenden Sie als Abhängigkeit die Validiererbibliothek statt der Library in Ihrer pom.xml
<dependency>
<groupId>org.mustangproject</groupId>
<artifactId>validator</artifactId>
<version>2.1.0</version>
</dependency>
können Sie weiterhin alle Mustang-Funktionen nutzen und zusätzlich den Validierer wie folgt aufrufen:
ZUGFeRDValidator zfv=new ZUGFeRDValidator();
System.out.println(zfv.validate("factur-x.pdf"));