ZUGFeRD konforme Rechnungen mit .net/ C# erstellen

November 24, 2013, with 7 comments
by admin

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?!

Aktualisiert am January 3, 2014

Keine Kommentare

  1. Sehr 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 ^^

  2. Genial!!! 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.

  3. Bekomme 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.

  4. Hi 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

    • Hallo Dimitri,

      ein Parser ist ebenfalls vorhanden. Siehe InvoiceDescriptor.Load()!

      • Hi 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.

  5. Hi 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

Schreibe einen Kommentar

Kommentar absenden >>