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:
Mustang Architekturdiagramm

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

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.1</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.1.0'
    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.1.0'
    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

  1. 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.
  2. Erstellen Sie eine “run configuration”: klicken Sie in Run|Run configurations auf Java Application,und dort auf das Icon für eine neue Konfiguration.
  3. Geben Sie innerhalb der Main-Methode ZUGFeRDImporter zu=new ZUGFeRDImporter("MustangGnuaccountingBeispielRE-20190610_507.pdf"); ein und
  4. fügen Sie die imports durch drücken von STRG+SHIFT+O (Windows) oder CMD+SHIFT+O (Mac) hinzu.
  5. prüfen Sie gegebenenfalls mit if (zu.canParse()) ob es sich um eine geeignete ZUGFeRD-Datei handelt
  6. und zu.parse() um in der Folge die getter-Methoden wie getAmount() nutzen zu können
  7. 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.
  8. 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

  1. Download
    1. Mustang
      1. die JAR-Datei http://mustangproject.org/deploy/mustang-2.1.1.jar
      2. die notice-Datei http://mustangproject.org/deploy/NOTICE
  2. In Ihrer Entwicklungsumgebung: Fügen Sie die http://mustangproject.org/deploy/mustang-2.1.1.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.1</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"));