Die Interfaces benutzen

Ein ZUGFeRD-PDF schreiben

Dies ist ein Beispiel for Mustangproject 1. Mustang 2 ist großteils kompatibel aber für Details muss diese Seite noch überarbeitet werden.

  1. Erstellen Sie eine neue Klasse im src-Ordner, beispielsweise MustangWriter mit einer „Public static void main()“ .
  2. Erstellen Sie eine Run configuration mit Run|Run configurations, Klick auf Java Application und einem Klick auf das Icon für “neu”.
  3. Lassen Sie die Hauptklasse IZUGFeRDExportableTransaction implementieren:
    public class MustangWriter implements IZUGFeRDExportableTransaction {
  4. Fügen Sie folgenden Code vor der Hauptklasse, aber nachpackage mustangtest;, in dieser Datei ein:
    
    class Contact implements IZUGFeRDExportableContact {}
    class Item implements IZUGFeRDExportableItem {
        private BigDecimal price, quantity;
        private Product product;
    }
    class Product implements IZUGFeRDExportableProduct {
        private String description, name, unit;
        private BigDecimal VATPercent;
    }  
    class Payment implements IZUGFeRDTradeSettlementPayment {
    }
                                  
                                
  5. und fügen Sie die Imports durch Klicken von STRG+SHIFT+O (Windows) oder CMD+SHIFT+O (Mac) ein.
  6. Klicken Sie links auf die Hauptklasse MustangWriter und drücken Sie ALT+SHIFT+S
    (Windows)/ALT+CMD+S (Mac),
    wählen Sie “Override/Implement Methods” und drücken Sie Return.
  7. Klicken Sie links auf den Klassenname Contact und drücken Sie ALT+SHIFT+S
    (Windows)/ALT+CMD+S (Mac),
    wählen Sie “Override/Implement Methods” und drücken Sie Return.
  8. Klicken Sie auf Item, drücken Sie ALT+SHIFT+S or ALT+CMD+S, wählen Sie „Generate Getters and Setters“. Wählen Sie “all members” und drücken Sie Return.
  9. Bleiben Sie auf Item, führen Sie ein erneutes Refactoring durch (ALT+SHIFT+S oder ALT+CMD+S) und wählen Sie „Generate Constructor using Fields“. Wählen Sie erneut “all member variables” und drücken Sie Return.
  10. Die Item-Klasse benötigt neben Gettern und Settern auch andere Methoden, refactoren Sie erneut (ALT+SHIFT+S ooder ALT+CMD+S) und wählen Sie Override/Implement Methods
  11. „Generate Getters and Setters“ für die Klasse (nicht die Member Variable) „Product“: Klicken Sie auf Product, (ALT+SHIFT+S oder ALT+CMD+S) und wählen Sie „Generate Getters and Setters“. Wählen Sie “all members” und bestätigen Sie.
  12. Klicken Sie erneut auf Product, drücken Sie ALT+SHIFT+S und wählen Sie „Generate Constructor using Fields“. Wählen Sie erneut all members und bestätigen Sie mit Return.
  13. Rechtsklicken Sie auf Payment, wählen Sie Source|„Override and Implement Methods“. Überschreiben Sie mindestens getOwnBIC(), getOwnBankName() und getOwnIBAN().
  14. Ihre Rohfassungs sollte nun wie diese aussehen.
  15. Die folgenden Methoden von Contact sollten jetzt die folgenden Zeichenketten zurückliefern:
    • getCountry(): “DE”
    • getLocation(): “Spielkreis”
    • getName(): “Theodor Est”
    • getStreet(): “Bahnstr. 42”
    • getVATID(): “DE999999999”
    • getZIP(): “88802”;
  16. Die folgenden Payment-Methoden sollten die folgenden Strings zurückliefern:
    • getOwnBIC(): “COBADEFFXXX”
    • getOwnBankName(): “Commerzbank”
    • getOwnIBAN(): “DE88200800000970375700”
  17. Die folgenden Methoden der Hauptklasse sollten folgendes zurückliefern:
    • getCurrency(): “EUR”
    • getDeliveryDate(): newGregorianCalendar(2017,Calendar.NOVEMBER,17).getTime();
    • Durch STRG+SHIFT+O (Windows) oder CMD+SHIFT+O (Mac)
      werden die notwendigen GregorianCalendar und Calendar-Klasse importiert
    • getDueDate(): new
      GregorianCalendar(2017,Calendar.DECEMBER,9).getTime();
    • getIssueDate(): new
      GregorianCalendar(2017,Calendar.NOVEMBER,18).getTime();
    • getNumber(): “RE-20171118/506”
    • getOwnBIC(): “COBADEFFXXX”
    • getOwnBankName(): “Commerzbank”
    • getOwnCountry() “DE”
    • getOwnIBAN(): “DE88 2008 0000 0970 3757 00”
    • getOwnLocation() “Stadthausen”
    • getOwnOrganisationFullPlaintextInfo(): “Bei Spiel GmbH\n”+
      “Ecke 12\n”+
      “12345 Stadthausen\n”+
      “Geschäftsführer: Max Mustermann”
    • getOwnOrganisationName(): “Bei Spiel GmbH”
    • getOwnStreet() “Ecke 12”
    • getOwnTaxID(): “22/815/0815/4”
    • getOwnVATID(): “DE136695976”
    • getOwnZIP() “12345”
    • getRecipient(): new Contact();
    • IZUGFeRDTradeSettlementPayment[] getTradeSettlementPayment(): Payment P = new Payment();
      IZUGFeRDTradeSettlementPayment[] allP = new Payment[1];
      allP[0] = P;
      return allP;
  18. getZFItems() der Hauptklasse kann jetzt Produkte erstellen und einen Array von Posten zurückliefern:
    
    Item[] allItems=new Item[3];
    Product designProduct=new Product("", "Künstlerische Gestaltung (Stunde): Einer Beispielrechnung",
    "HUR", new BigDecimal("7.000000"));
    Product balloonProduct=new Product("", "Luftballon: Bunt, ca. 500ml", "C62", new
    BigDecimal("19.000000"));
    Product airProduct=new Product("", "Heiße Luft pro Liter", "LTR", new BigDecimal("19.000000"));
    allItems[0]=new Item(new BigDecimal("160"), new BigDecimal("1"), designProduct);
    allItems[1]=new Item(new BigDecimal("0.79"), new BigDecimal("400"), balloonProduct);
    allItems[2]=new Item(new BigDecimal("0.10"), new BigDecimal("200"), airProduct);
    return allItems;                        
                        
  19. Jetzt erstellen wir eine “private void” Methode mit dem Namen apply in der MustangWriter-Klasse
  20. Instanziieren Sie die Hauptklasse von MustangWriter in der main-Funktion und rufen Sie apply() auf.
  21. In der apply-Funktionen können Sie nun
    • eine neue ZUGFeRDExporterFromA1Factory instanziieren,
    • setProducer und setCreator darauf laufen lassen (bspw. ZUGFeRDExporter ze=newZUGFeRDExporterFromA1Factory().setProducer("string").setCreator("string")) und den ZUGFeRDExporter von der Factory bekommen load("./MustangGnuaccountingBeispielRE-20171118_506new.pdf").
    • Benutzen Sie gern eine eigene PDF/A-1 Rechnungsdatei.
    • in der Kette (.setProducer().setCreator()…) können Sie auch setZUGFeRDVersion(2) setzen und vor allem
    • die PDFattachZugferdFile-Funktion (mit der IZUGFeRDExportableTransaction, also „this“ als Parameter) aus dem ZUGFeRDExporter benutzen sowie
    • export() aufrufen um die PDF/A-3-Datei zu speichern.
    • Die Importe können wieder durch STRG+SHIFT+O (Windows) oder CMD+SHIFT+O (Mac) eingefügt werden.

    Die apply-Funktion sieht dann – mit entsprechenden try/catch-Blöcken- wie folgt aus:

    
    private void apply() {
        try {
            System.out.println("Lese Blanko-PDF");
            ZUGFeRDExporter ze = new ZUGFeRDExporterFromA1Factory().setProducer("Meine Anwendung")
            .setCreator(System.getProperty("user.name"))
            .load("./MustangGnuaccountingBeispielRE-20190610_507blanko.pdf");
            System.out.println("Erzeuge und hänge ZUGFeRD-Daten an");
            ze.PDFattachZugferdFile(this);
            System.out.println("Schreibe ZUGFeRD-PDF");
            ze.export("./MustangGnuaccountingBeispielRE-20190610_507new.pdf");
            System.out.println("Done.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    
    }                    
                    
  22. „Meine Anwendung“ und System.getProperty(“user.name”) werden in den Metadaten als „Producer“ (erzeugende Anwendung) beziehungsweise „Creator“ (Author) gespeichert. Passen Sie dies gegebenenfalls an.
  23. Instanziieren Sie ein MustangWriter in public static void main and rufen seine apply()-Funktion auf.
  24. Start Sie um die ZUGFeRD-Rechnungen in den in Export angegebenen Dateinamen zu schreiben.
  25. Um der APL gerecht zu werden: Passen Sie die NOTICE-Datei an und fügen Sie Ihrer Anwendung hinzu.

Resultat

IhreMustangWriter.java sollte nun so aussehen.

Aktualisierung von Mustang 1.x

Alter Wert Neuer Wert
Repository github.com/ZUGFeRD… entfernen (verfügbar über Maven Central)
Group id org.mustangproject.zugferd org.mustangproject
Artifact id mustang library
Version 1.7.8 2.0.0

Wenn Sie den Validierer einbetten wollen verwenden Sie validator als Artifact ID. Er beinhaltet die Funktionalität der library, ist aber durch seine Abhängigkeiten >20 MB
größer. ZF2 war mit Mustang 1 schon möglich, ist aber default in Mustang 2, also brauchen Sie ein

.setZUGFeRDVersion(1)

wenn Sie kein ZUGFeRD 2 wünschen.

In der Kommandozeile müssen jetzt alle Actions über –action=<dieAktion> ausgeführt werden, das heißt
–combine ändert sich zu –action=combine.

PDFattachZugferdFile

heißt jetzt

setTransaction

und anstelle von

ZUGFeRDExporterFromA1Factory

wird

ZUGFeRDExporterFromA1

jetzt eine Klasse zurückliefern die

IZUGFeRDExporter

statt

ZUGFeRDExporter

implementiert.
Aus

ZUGFeRDExporter ze = new ZUGFeRDExporterFromA1Factory().setZUGFeRDConformanceLevel(ZUGFeRDConformanceLevel.COMFORT).load(SOURCE_PDF)) {

wird daher

IZUGFeRDExporter ze = new ZUGFeRDExporterFromA1().setZUGFeRDVersion(1).setZUGFeRDConformanceLevel(ZUGFeRDConformanceLevel.EN16931).load(SOURCE_PDF)) {

Anstelle von

Profile.EXTENDED

verwenden Sie bitte

Profiles.getByName("Extended")

Um Profile älterer ZUGFeRD-Versionen zu nutzen geben Sie die Version bitte wie folgt an:

Profiles.getByName("Extended")

für ein Extended-Profil von ZF1.

Die alte Contact-Klasse heißt jetzt TradeParty. Die TradeParty (=Firma) kann Ansprechpartner beinhalten die in der neuen Contact-Klasse definiert werden können.