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.

Empfänger

In Frankreich werden Empfänger über ihre Siret-Nummer identifiziert. Deren Typecode ist 0002, der über setLegalOrganisation gesetzt werden kann:


TradeParty recipient = new TradeParty("Franz Müller", "teststr.12", "55232", "Entenhausen", "DE");
String siret="0815";
String sirenTypeCode="0002";
recipient.setLegalOrganisation(new LegalOrganisation(siret,sirenTypeCode));

Für deutsche Behördenrechnungen kann wie hier beschrieben die Leitweg-ID per invoice.setReferenceNumber() gesetzt werden.

Endbetrag kontrollieren

Um sicherzustellen, dass der von Mustang errechnete Endbetrag dem in Ihrem PDF entspricht können Sie TransactionCalculator verwenden:


		TransactionCalculator tc=new TransactionCalculator(i);
		// tc.getTotalGross() muss jetzt Ihrem Endbetrag entsprechen

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"));

Kaufmännische Gutschriften

Kaufmännische Gutschriften können mit positiven Mengenangaben und setCreditNote() auf dem Invoice-Objekt implementiert werden:


ZUGFeRDExporterFromA1 ze = new ZUGFeRDExporterFromA1().setProducer("My Application")
		 .setCreator(System.getProperty("user.name")).setZUGFeRDVersion(2).ignorePDFAErrors()
		 .load("blanko.pdf")) {
Invoice i = new Invoice().setIssueDate(new Date()).setDueDate(new Date()).setDetailedDeliveryPeriod(new Date(), new Date()).setDeliveryDate(new Date()).setSender(new TradeParty(orgname, "teststr", "55232", "teststadt", "DE").addTaxID("4711").addVATID("DE0815").addBankDetails(new BankDetails("DE88200800000970375700", "COBADEFFXXX"))).setRecipient(new TradeParty("Franz Müller", "teststr.12", "55232", "Entenhausen", "DE").addVATID("DE0815")).setNumber(number)
		.addItem(new Item(new Product("Testprodukt", "", "C62", new BigDecimal(19)), price, qty))
		.addItem(new Item(new Product("Testprodukt", "", "C62", new BigDecimal(19)), price, qty))
		.addItem(new Item(new Product("Testprodukt", "", "C62", new BigDecimal(19)), price, qty)).setCreditNote();
ze.setTransaction(i);
ze.export("factur-x.pdf");

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)))

Dateianhänge

Sie können weitere rechnungsbegründende Unterlagen wie Aufmäße oder Stundenzettel Base64-codiert in die XML-Struktur einhängen oder als zusätzlich ins PDF einzubettende Dateien angeben:


 ZUGFeRDExporterFromA1 ze = new ZUGFeRDExporterFromA1().setProducer("My Application")
					 .setCreator(System.getProperty("user.name")).setZUGFeRDVersion(2).ignorePDFAErrors()
					 .load("sourcefuile.pdf")) {
			byte[] b = {12, 13};
			ze.attachFile("one.pdf", b, "application/pdf", "Alternative");
			ze.attachFile("two.pdf", b, "application/pdf", "Alternative");
			ze.setTransaction(new Invoice().setDueDate(new Date()).setIssueDate(new Date()).setDeliveryDate(new Date()).setSender(new TradeParty(orgname, "teststr", "55232", "teststadt", "DE").addTaxID(taxID)).setOwnVATID("DE0815").setRecipient(new TradeParty("Franz Müller", "teststr.12", "55232", "Entenhausen", "DE").addVATID("DE4711").setContact(new Contact("Franz Müller", "01779999999", "fr...@mueller.de", "teststr. 12", "55232", "Entenhausen", "DE"))).setNumber(number).addItem(new Item(new Product("Testprodukt", "", "C62", new BigDecimal(19)), price, new BigDecimal(1.0)))

			);
			ze.export("filename.pdf");

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());