Passend zu diesem Post gibt es bereits einige Posts in Englisch (hier, hier).
Zur einfacheren Lesbarkeit habe ich mich entschlossen, diese Information zusätzlich auf Deutsch anzubieten.
ZUGFeRD ist eine Initiative, die unter dem Dach des BMWi (Bundesministerium für Wirtschaft und Technologie) gegründet wurde. Es beruht darauf, Rechnungen im PDF/A-3-Format zu erstellen und in dieses Dokument eine xml-Datei einzubetten, die alle Rechnungsinformationen in strukturierter Form enthält. Diese xml-Datei ermöglicht zum einen das einfache Indizieren der PDF-Datei in ein Dokumentenarchiv und zum anderen auch das automatische Buchen der Rechnungen in ERP-Lösungen.
Für die Erstellung von PDF/A-3-Dateien gibt es diverse Lösungen am Markt. Besonders die Konverter von PDF nach PDF/A-3 sind sehr einfach in der Handhabung.
Die Erstellung der xml-Datei jedoch ist schwierig. Es gibt einige Anbieter, die passende Bibliotheken anbieten, jedoch sind diese in der Regel kommerziell und machen teilweise einen nicht sehr reifen Eindruck.
Daher habe ich mich entschlossen, eine eigene Bibliothek zu entwickeln, die die Erstellung von ZUGFeRD-xml-Dateien mit .net (C#, Visual Basic.net etc.) ermöglicht. Diese Bibliothek wird unter github gehostet und ermöglicht so die Mitarbeit anderer Interessierter.
Um die Nutzung in Visual Studio zu erleichtern, ist die ZUGFeRD-Bibliothek ebenfalls unter nuget verfügbar.
Das xml-Format ist relativ komplex und inhaltlich vergleichbar mit einer EDI-Rechnung. Bei der Entwicklung habe ich mich daher bemüht, den Funktionen möglichst sprechende Namen zu geben und möglichst viel Dokumentation einzutragen.
Dieses Beispiel:
InvoiceDescriptor desc = InvoiceDescriptor.CreateInvoice("471102", new DateTime(2013, 6, 5), CurrencyCodes.EUR, "GE2020211-471102");
desc.Profile = Profile.Comfort;
desc.ReferenceOrderNo = "AB-312";
desc.AddNote("Rechnung gemäß Bestellung Nr. 2013-471331 vom 01.03.2013.");
desc.AddNote("Es bestehen Rabatt- und Bonusvereinbarungen.", SubjectCode.AAA);
desc.SetBuyer("Kunden Mitte AG", "69876", "Frankfurt", "Kundenstraße", "15", "DE", "88", "4000001987658");
desc.AddBuyerTaxRegistration("DE234567890", TaxRegistrationSchemeID.VA);
desc.SetBuyerContact("Hans Muster");
desc.SetSeller("Lieferant GmbH", "80333", "München", "Lieferantenstraße", "20", "DE", "88", "4000001123452");
desc.AddSellerTaxRegistration("201/113/40209", TaxRegistrationSchemeID.FC);
desc.AddSellerTaxRegistration("DE123456789", TaxRegistrationSchemeID.VA);
desc.SetBuyerOrderReferenceDocument("2013-471331", new DateTime(2013, 03, 01));
desc.SetDeliveryNoteReferenceDocument("2013-51111", new DateTime(2013, 6, 3));
desc.ActualDeliveryDate = new DateTime(2013, 6, 3);
desc.SetTotals(202.76m, 5.80m, 14.73m, 193.83m, 21.31m, 215.14m, 50.0m, 165.14m);
desc.AddApplicableTradeTax(9.06m, 129.37m, 7m, TaxType.VAT, TaxCategoryCode.S);
desc.AddApplicableTradeTax(12.25m, 64.46m, 19m, TaxType.VAT, TaxCategoryCode.S);
desc.AddLogisticsServiceCharge(5.80m, "Versandkosten", TaxType.VAT, TaxCategoryCode.S, 7m);
desc.AddTradeAllowanceCharge(true, 10m, CurrencyCodes.EUR, 1m, "Sondernachlass", TaxType.VAT, TaxCategoryCode.S, 19);
desc.AddTradeAllowanceCharge(true, 137.7m, CurrencyCodes.EUR, 13.73m, "Sondernachlass", TaxType.VAT, TaxCategoryCode.S, 7);
desc.SetTradePaymentTerms("Zahlbar innerhalb 30 Tagen netto bis 04.07.2013, 3% Skonto innerhalb 10 Tagen bis 15.06.2013", new DateTime(2013, 07, 04));
desc.Save("output.xml");
erzeugt die xml-Datei wie sie im ZUGFeRD-Informationspaket enthalten ist. Eigentlich relativ gut leserlich. Oder?!