ZUGFeRD konforme Rechnungen mit .net/ C# erstellen
November 24, 2013, with 7 commentsPassend 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?!
Aktualisiert am January 3, 2014
TTP schrieb am
February 18, 2014 um 7:21 pmSehr cool. Erleichtert mir meine Arbeit 🙂
Jetzt muss ich nur gucken, wie ich mein PDF aus PHP fpdf mit meiner XML verschmelze. Gibt es da ein gutes Batch-Tool für?
Hier übrigens der Code, wenn man VB.NET nutzt:
Imports s2industries.ZUGFeRD
und dann im Coding die erste Zeile durch diese beiden ersetzen:
Dim desc As New InvoiceDescriptor()
wenn man dann noch das “m” entfernt, läuft´s auch unter VB.NET ^^
Alex Sefrin schrieb am
January 15, 2016 um 3:08 pmGenial!!! Das erspart mir viel Arbeit!
@TTP: Leider konnte ich bisher nur von intarsys ein Tool finden, was aus PDF/A und XML-Datei ein PDF/A3 macht. Lässt sich aber aus meiner Sicht bisher nicht brauchbar integrieren.
Daniel Karr schrieb am
April 24, 2018 um 1:53 pmBekomme bei der Nutzung der aktuellsten Version 2.5.1 immer den Fehler “Der Typ- oder Namespacename ‘InvoiceDescriptor’ konnte nicht gefunden werden.”
sowie “Der Typ- oder Namespacename ‘s2industries’ konnte nicht gefunden werden.”
ich glaube die Zahl im Namespacename kommt dem C#-Compiler unter VS2013 nicht gut.
Dimitri schrieb am
September 23, 2018 um 10:21 amHi Stephan,
vielen, vielen Dank – dass funktioniert und spart mir viel Arbeit (ich schreibe eine mobile Anwendung auf Xamarin Basis). Planen Sie eine Erweiterung, die eingehende ZUGFeRD-Rechnungen parsen werden?
Gruß
Dimitri
stephan schrieb am
December 23, 2018 um 9:36 amHallo Dimitri,
ein Parser ist ebenfalls vorhanden. Siehe InvoiceDescriptor.Load()!
Ralf schrieb am
April 6, 2019 um 5:19 pmHi Stephan,
tolles Tool und danke für die Veröffentlichung.
Ich habe soeben versucht, unter VS 2017 mit VB einige Beispiel-Zugferd-Rechnungen mit InvoiceDescriptor.Load zu laden, um den XML-Part lesen zu können. Ich erhalte jedesmal die Meldung System.Xml.XmlException: “Ungültige Daten auf Stammebene. Zeile 1, Position 1.”
Was könnte ich dabei falsch machen ?
Ich danke schon mal kräftigst für die Hilfe.
Bernd schrieb am
June 6, 2019 um 11:39 amHi Stephan,
bin bisher sehr begeistert, wundere mich aber gerade über den Typ Tax und InvoiceDescriptor.Taxes.
Soweit ich es der ZUGFeRD_Spezifikation_Release_Candidate.pdf entnehme, dürfte es dort kein Tax.AllowanceChargeBasisAmount geben, hingegen fehlt aber “Trade_ Tax. Exemption Reason. Text”,
oder sehe ich da was falsch?
Gruß,
Bernd