Die Mustang-Klassen benutzen

Einfache Rechnung

Es gibt eine generelle Klassen-Testdatei die Sie für weitergehende Informationen einsehen können, eine zur XRechnung und eine betreffs des Rechnungsimporters.
Zunächst bauen und konfigurieren wir einen Exporter, der die PDF/A-Datei lädt in die wie unsere Rechnung einbetten:


ZUGFeRDExporterFromA1 ze = new ZUGFeRDExporterFromA1().setProducer("My Application").setCreator(System.getProperty("user.name")).ignorePDFAErrors().load(SOURCE_PDF));

Dann erstellen und konfigurieren wir unser Invoice-Objekt mit wesentlich mehr Konfigurationsaufwand:


ze.setTransaction(new Invoice().setDueDate(new Date()).setIssueDate(new Date()).setDeliveryDate(new Date())
.setSender(new TradeParty(orgname, "teststr", "55232", "teststadt", "DE").addBankDetails(new BankDetails("777666555", "DE4321"))).setOwnTaxID("4711").setOwnVATID("DE19990815")
.setRecipient(new TradeParty("Franz Müller", "teststr.12", "55232", "Entenhausen", "DE")
.setContact(new Contact("nameRep", "phoneRep", "emailRep@test.com"))).setNumber("X12")
.addItem(new Item(new Product("Testprodukt", "", "C62", new BigDecimal(19)), new BigDecimal(2.5), new BigDecimal(1.0))));

Sie können mehrere addItem hintereinander hängen. In diesem Fall haben wir eine Rechnung mit der Nummer “X12” mit einem 1,0 mal 19%, 2,50€ “Testprodukt” in der Mengeneinheit “Stück”(C62, vgl. den Units-Reiter in dieser Excel-Datei) mit 19% Umsatzsteuer.
Nun exportieren wir die erstellte ZUGFeRD-Datei mit


ze.export("factur-x.pdf");

Gerne können Sie diese Datei validieren und bitte prüfen Sie mindestens Stichprobenartig dass die berechneten Summen in der eingebetteten XML-Datei denen in der PDF-Datei entsprechen.

XRechnung XML

Der ZUGFeRD2PullProvider ist eigentlich ein UN/CEFACT 2016b-provider, deshalb kann er direkt (zf2p.generateXML(i); und zf2p.getXML())
genutzt werden um UN/CEFACT CII XRechnungen zu erzeugen, unter der Voraussetzung, dass das XRechnung-Profil gewählt wurde, ein Absender-Ansprechpartner
und eine Leitwegs-ID angegeben wurde.
Eine XRechnung wie diese kann so erzeugt werden:


		Invoice i = new Invoice().setDueDate(new Date()).setIssueDate(new Date()).setDeliveryDate(new Date())
				.setSender(new TradeParty("Test company","teststr","55232","teststadt","DE").addTaxID("DE4711").addVATID("DE0815").setContact(new Contact("Hans Test","+49123456789","test@example.org")).addBankDetails(new BankDetails("DE12500105170648489890","COBADEFXXX")))
				.setRecipient(new TradeParty("Franz Müller", "teststr.12", "55232", "Entenhausen", "DE"))
				.setReferenceNumber("991-01484-64")//leitweg-id
				.setNumber("123").addItem(new Item(new Product("Testprodukt", "", "C62", BigDecimal.ZERO), /*price*/ new BigDecimal("1.0"),  /*qty*/ new BigDecimal("1.0")));

		ZUGFeRD2PullProvider zf2p = new ZUGFeRD2PullProvider();
		zf2p.setProfile(Profiles.getByName("XRechnung"));
		zf2p.generateXML(i);
		String theXML = new String(zf2p.getXML());
			try {
			BufferedWriter writer = new BufferedWriter(new FileWriter("xrechnung.xml"));
			writer.write(theXML);
			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

Stornorechnung

Um eine Rechnung ganz oder teilweise zu widerrufen verwenden Sie eine negative Menge und übergeben der setCorrection-Methode der Invoice-Klasse die Nummer der zu korrigierenden Rechnung. Die negative Menge führt auch zu einem negativen Zahlbetrag. Folgendes Beispiel wiederruft die Rechnung aus dem vorangegangenem Beispiel:


ze.setTransaction(new Invoice().setDueDate(new Date()).setIssueDate(new Date()).setDeliveryDate(new Date())
.setSender(new TradeParty(orgname, "teststr", "55232", "teststadt", "DE").addBankDetails(new BankDetails("777666555", "DE4321"))).setOwnTaxID("4711").setOwnVATID("DE19990815")
.setRecipient(new TradeParty("Franz Müller", "teststr.12", "55232", "Entenhausen", "DE")
.setContact(new Contact("nameRep", "phoneRep", "emailRep@test.com"))).setNumber("X13")
.addItem(new Item(new Product("Testproduct", "", "C62", new BigDecimal(19)), new BigDecimal("2.5"), new BigDecimal(-1.0))).setCorrection("X12"));

Rabatte und Zuschläge

Rabatte und Zuschläge können auf Positions- und Dokumentebene gewährt werden und absolut oder prozentual sein. Sie müssen angeben, welchen Umsatzsteuersatz sie betreffen und in einigen Profilen wie EN16931 gibt es keine Zuschläge auf Positionsebene.

Für einen 50% Zuschlag auf positionsebene mit 19% USt nutzen Sie


.addItem(new Item(new Product("Testprodukt", "", "C62", new BigDecimal(19)), price, new BigDecimal(1.0)).addCharge(new Charge().setPercent(new BigDecimal(50)).setTaxPercent(new BigDecimal(19))))

und für einen 10€ Rabatt auf Dokumentebene hängen Sie bitte folgendes an die Invoice an:


.addAllowance(new Allowance(new BigDecimal(10)).setTaxPercent(new BigDecimal(19)))

Lesen

Um Rechnungen in ein Invoice-Objekt zu lesen verwenden Sie extractInvoice aus ZUGFeRDInvoiceImporter


ZUGFeRDInvoiceImporter zii=new ZUGFeRDInvoiceImporter("./target/testout-ZF2new.pdf");
Invoice invoice=zii.extractInvoice(); // surround this with try/catch

Jetzt können Sie beispielsweise die Rechnungsnummer (

invoice.getNumber()

), das Ausstellungsdatum
(

invoice.getIssueDate()

), die Anzahl der Positionen (

invoice.getZFItems().length

), die Menge der zweiten Position (

invoice.getZFItems()[1].getQuantity().toString())

), die Mengeneinheit des Produkts der dritten Position (

invoice.getZFItems()[2].getProduct().getUnit()

), die Straße des Empfängers (

invoice.getRecipient().getStreet()

) auslesen oder wie folgt den Gesamtbetrag berechnen/prüfen:


		TransactionCalculator tc=new TransactionCalculator(invoice);
		assertEquals(new BigDecimal("571.04"),tc.getTotalGross());