ZUGFeRD - Tutorial
Last Update: 26.09.2024 |
Einleitung
Der nachfolgende Guide soll Sie beim Empfangen und Erstellen von ZUGFeRD-Nachrichten unterstützen. Er bildet die gängigsten Fragen und Stolperfallen ab, die bei der Arbeit mit ZUGFeRD aufkommen können. Sollten Sie trotz unseres Guides offene Fragen haben, zögern Sie nicht, ein Ticket unter support@lobster.de zu öffnen.
Nun aber viel Spaß mit unserem ZUGFeRD Guide!
Was ist ZUGFeRD?
ZUGFeRD ist ein branchenübergreifendes Datenformat für den elektronischen Rechnungsdatenaustausch, das vom Forum elektronische Rechnung Deutschland (FeRD) mit Unterstützung des Bundesministeriums für Wirtschaft und Energie erarbeitet wurde.
Das ZUGFeRD-Datenformat basiert auf der Richtlinie 2014/55/EU vom 16. April 2014 über die elektronische Rechnungsstellung bei öffentlichen Aufträgen und auf der am 28. Juni 2017 veröffentlichten Norm EN16931.
Zudem werden die Cross-Industry-Invoice (CII) von UN/CEFACT und die ISO-Norm 19005-3:2012 (PDF/A-3) ab ZUGFeRD 2.0 berücksichtigt.
Die Einsatzgebiete dieses hybriden Rechnungsformats sind vielfältig. Sowohl im B2B-, im B2G- und im B2C-Geschäftsverkehr kann ZUGFeRD eingesetzt werden.
Inhaltliche Identität
Als hybrides Datenformat integriert ZUGFeRD in einem PDF-Dokument (PDF/A-3) strukturierte Rechnungsdaten im XML-Format. Das heißt, der Rechnungsversand erfolgt grundsätzlich in Form eines PDF-Dokuments, welches die Sichtkomponente der Rechnung darstellt.
Gleichzeitig wird ein inhaltlich identisches Mehrstück derselben Rechnung (XML) innerhalb des PDF mit versandt, so dass die elektronische Verarbeitung der Rechnung über die strukturierten Rechnungsdaten - nach Übertragung in das unternehmensspezifische Softwaresystem - problemlos möglich ist.
PDF und XML müssen die Vorgaben des § 14 Abs. 4 Umsatzsteuergesetz ( UStG ) berücksichtigen, um inhaltlich identische Mehrstücke derselben Rechnung darzustellen. Da die Finanzverwaltung keine konkreten Prüfpflichten bzw. Kontrollmaßnahmen für dieses Verfahren festgelegt hat, ist dem Rechnungssender und dem Rechnungssteller zu empfehlen, eigene Prüfmechanismen zur Sicherstellung der inhaltlichen Identität der beiden Rechnungen einzuführen. Neben den gesetzlichen Regelungen sind auch die Grundsätze zur ordnungsgemäßen Führung und Aufbewahrung von Büchern, Aufzeichnungen und Unterlagen in elektronischer Form sowie zum Datenzugriff , zuletzt vom 28. November 2019, zu beachten.
(Quelle:
https://www.ferd-net.de/standards/was-ist-zugferd/was-ist-zugferd.html)
Kurz gesagt, handelt es sich um ein PDF welches ein XML enthält, dass z. B. mit dem Acrobat Reader von Adobe angesehen und von Lobster Integration ausgelesen werden kann.
ZUGFeRD-Verarbeitung in den verschiedenen Phasen
Basis-Daten: Preparser
Hier können Sie in der Vorverarbeitung den Preparser ZUGFeRD nutzen, indem Sie in den Basis-Daten unter Erweiterungen → Vorbearbeitung den genannten Preparser auswählen.
Dieser extrahiert ohne weitere Konfiguration das enthaltene XML mit dem Namen ZUGFeRD-invoice.xml, zugferd-invoice.xml oder factur-x.xml.
Phase 3: Strukturen erstellen und Mapping
In der Phase 3 wird der Grundstein für die ZUGFeRD-XML-Nachricht gelegt. Hier wird die Struktur für das gewünschte Konformitätslevel inklusive der nötigen Namespaces erstellt.
Die Struktur wird bei ZUGFeRD aus mehreren XSDs erzeugt. Wichtig dabei ist, dass Sie immer die Struktur für die geforderte ZUGFeRD-Version und Konformitätsstufe verwenden.
Alle verfügbaren ZUGFeRD-Informationen inklusive aller XSDs für die aktuelle ZUGFeRD Version 2.3 (Stand September 24) sind hier verfügbar: https://www.ferd-net.de/standards/zugferd-2.3/zugferd-2.3.html
Praxisbeispiel
Ist also die Version ZUGFeRD 2.1 EXTENDED gefordert, laden Sie sich das Paket für Version 2.3 herunter und suchen Sie sich dafür das entsprechende Schema heraus. Die Schemata sind jeweils abwärtskompatibel.
Für den Fall ZUGFeRD 2.1 EXTENDED verwenden Sie ZUGFeRD 2.3 EXTENDED. Das Schema besteht aus 4 XSDs:
Factur-X_1.0.07_EXTENDED.xsd (Haupt-XSD)
Factur-X_1.0.07_EXTENDED_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd
Factur-X_1.0.07_EXTENDED_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd
Factur-X_1.0.07_EXTENDED_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd
Die Haupt-XSD verweist auf die Unter-XSDs. Legen Sie die 3 Unter-XSDs in das Rootverzeichnis des Integration Servers.
Erzeugen Sie nun die Zielstruktur über die Datei-Analyse im Menü der Zielstruktur (Menü → Struktur erzeugen → aus Datei-Analyse), indem Sie die Haupt-XSD auf die Analyse ziehen und XSD/DTD Schema als Art auswählen.
Als Root-Elementname geben Sie CrossIndustryInvoice an und klicken dann auf Anwenden.
Hinweis: Wenn Sie den Root-Namen einer XSD nicht kennen, können Sie data in das Feld eingeben. Lobster Integration sucht dann nach dem Root-Namen. Voraussetzung ist allerdings, dass es nur einen Rootnamen in der XSD gibt.
Praktischerweise wird die Dokumentart XML sowie das Root-Element in Phase 2 automatisch eingetragen, sodass Sie sich darüber keine Gedanken mehr machen müssen.
Mehr zu XML Schemas: Abschnitt XML-Schemas (XSD/DTD).
Haben Sie alles richtig gemacht, wird eine Struktur erstellt und Sie können mit dem Mapping beginnen.
In dem ZUGFeRD-Paket finden Sie auch Beschreibungen, welche Ihnen helfen, die richtigen Orte für Ihre Daten zu finden.
Wenn Sie eine ZUGFeRD-Beispiel-XML ansehen, werden Ihnen die Präfixe vor den XML-Tags auffallen. Sowie die Elemente, denen ein xmlns: vorangestellt sind, die man auch für Attribute halten könnte.
<?xml version=
"1.0"
encoding=
"UTF-8"
?>
<rsm:CrossIndustryInvoice xmlns:rsm=
"urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100"
xmlns:qdt=
"urn:un:unece:uncefact:data:standard:QualifiedDataType:100"
xmlns:ram=
"urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100"
xmlns:xs=
"http://www.w3.org/2001/XMLSchema"
xmlns:udt=
"urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100"
>
<rsm:ExchangedDocumentContext>
<ram:TestIndicator>
<udt:Indicator>
true
</udt:Indicator>
</ram:TestIndicator>
<ram:GuidelineSpecifiedDocumentContextParameter>
<ram:ID>urn:cen.eu:en16931:
2017
#conformant#urn:factur-x.eu:1p0:extended</ram:ID>
</ram:GuidelineSpecifiedDocumentContextParameter>
</rsm:ExchangedDocumentContext>
<rsm:ExchangedDocument>
<ram:ID>KR87654321012</ram:ID>
<ram:Name>KOSTENRECHNUNG</ram:Name>
<ram:TypeCode>
380
</ram:TypeCode>
<ram:IssueDateTime>
<udt:DateTimeString format=
"102"
>
20241115
</udt:DateTimeString>
</ram:IssueDateTime>
<ram:IncludedNote>
<ram:ContentCode>ST3</ram:ContentCode>
<ram:Content>Es bestehen Rabatt- oder Bonusvereinbarungen.</ram:Content>
<ram:SubjectCode>AAK</ram:SubjectCode>
</ram:IncludedNote>
<ram:IncludedNote>
<ram:ContentCode>EEV</ram:ContentCode>
<ram:Content>Der Verkäufer bleibt Eigentümer der Waren bis zur vollständigen Erfüllung der Kaufpreisforderung.</ram:Content>
<ram:SubjectCode>AAJ</ram:SubjectCode>
</ram:IncludedNote>
<ram:IncludedNote>
<ram:Content>MUSTERLIEFERANT GMBH
BAHNHOFSTRASSE
99
99199
MUSTERHAUSEN
Geschäftsführung:
Max Mustermann
USt-IdNr: DE123456789
Telefon: +
49
932
431
0
www.musterlieferant.de
HRB Nr.
372876
Amtsgericht Musterstadt
GLN
4304171000002
</ram:Content>
<ram:SubjectCode>REG</ram:SubjectCode>
</ram:IncludedNote>
</rsm:ExchangedDocument>
<rsm:SupplyChainTradeTransaction>
<ram:IncludedSupplyChainTradeLineItem>
<ram:AssociatedDocumentLineDocument>
<ram:LineID>
1
</ram:LineID>
</ram:AssociatedDocumentLineDocument>
<ram:SpecifiedTradeProduct>
<ram:GlobalID schemeID=
"0088"
>
4123456000014
</ram:GlobalID>
<ram:SellerAssignedID>WA997</ram:SellerAssignedID>
<ram:Name>Wirkarbeit HT</ram:Name>
<ram:ApplicableProductCharacteristic>
<ram:Description>Zählpunkt</ram:Description>
<ram:Value>DE0001346484600000000000000100038</ram:Value>
</ram:ApplicableProductCharacteristic>
</ram:SpecifiedTradeProduct>
<ram:SpecifiedLineTradeAgreement>
<ram:GrossPriceProductTradePrice>
<ram:ChargeAmount>
0.0520
</ram:ChargeAmount>
</ram:GrossPriceProductTradePrice>
<ram:NetPriceProductTradePrice>
<ram:ChargeAmount>
0.0520
</ram:ChargeAmount>
</ram:NetPriceProductTradePrice>
</ram:SpecifiedLineTradeAgreement>
<ram:SpecifiedLineTradeDelivery>
<ram:BilledQuantity unitCode=
"KWH"
>
1000.0000
</ram:BilledQuantity>
</ram:SpecifiedLineTradeDelivery>
<ram:SpecifiedLineTradeSettlement>
<ram:ApplicableTradeTax>
<ram:TypeCode>VAT</ram:TypeCode>
<ram:CategoryCode>S</ram:CategoryCode>
<ram:RateApplicablePercent>
19.00
</ram:RateApplicablePercent>
</ram:ApplicableTradeTax>
<ram:SpecifiedTradeSettlementLineMonetarySummation>
<ram:LineTotalAmount>
52.00
</ram:LineTotalAmount>
</ram:SpecifiedTradeSettlementLineMonetarySummation>
</ram:SpecifiedLineTradeSettlement>
</ram:IncludedSupplyChainTradeLineItem>
<ram:IncludedSupplyChainTradeLineItem>
<ram:AssociatedDocumentLineDocument>
<ram:LineID>
2
</ram:LineID>
</ram:AssociatedDocumentLineDocument>
<ram:SpecifiedTradeProduct>
<ram:GlobalID schemeID=
"0088"
>
4123456000021
</ram:GlobalID>
<ram:SellerAssignedID>ÖST250</ram:SellerAssignedID>
<ram:Name>Ökosteuer Lieferant</ram:Name>
</ram:SpecifiedTradeProduct>
<ram:SpecifiedLineTradeAgreement>
<ram:GrossPriceProductTradePrice>
<ram:ChargeAmount>
0.0205
</ram:ChargeAmount>
</ram:GrossPriceProductTradePrice>
<ram:NetPriceProductTradePrice>
<ram:ChargeAmount>
0.0205
</ram:ChargeAmount>
</ram:NetPriceProductTradePrice>
</ram:SpecifiedLineTradeAgreement>
<ram:SpecifiedLineTradeDelivery>
<ram:BilledQuantity unitCode=
"KWH"
>
1000.0000
</ram:BilledQuantity>
</ram:SpecifiedLineTradeDelivery>
<ram:SpecifiedLineTradeSettlement>
<ram:ApplicableTradeTax>
<ram:TypeCode>VAT</ram:TypeCode>
<ram:CategoryCode>S</ram:CategoryCode>
<ram:RateApplicablePercent>
19.00
</ram:RateApplicablePercent>
</ram:ApplicableTradeTax>
<ram:SpecifiedTradeSettlementLineMonetarySummation>
<ram:LineTotalAmount>
20.50
</ram:LineTotalAmount>
</ram:SpecifiedTradeSettlementLineMonetarySummation>
</ram:SpecifiedLineTradeSettlement>
</ram:IncludedSupplyChainTradeLineItem>
<ram:IncludedSupplyChainTradeLineItem>
<ram:AssociatedDocumentLineDocument>
<ram:LineID>
3
</ram:LineID>
</ram:AssociatedDocumentLineDocument>
<ram:SpecifiedTradeProduct>
<ram:GlobalID schemeID=
"0088"
>
4260331811362
</ram:GlobalID>
<ram:Name>Kommissionierer
1250032
D. Muster</ram:Name>
<ram:Description>Besteller: Hr. Mayer, Personalnr.
4488
</ram:Description>
</ram:SpecifiedTradeProduct>
<ram:SpecifiedLineTradeAgreement>
<ram:GrossPriceProductTradePrice>
<ram:ChargeAmount>
15.0000
</ram:ChargeAmount>
<ram:AppliedTradeAllowanceCharge>
<ram:ChargeIndicator>
<udt:Indicator>
false
</udt:Indicator>
</ram:ChargeIndicator>
<ram:ActualAmount>
4.50
</ram:ActualAmount>
<ram:Reason>Artikelrabatt
1
</ram:Reason>
</ram:AppliedTradeAllowanceCharge>
</ram:GrossPriceProductTradePrice>
<ram:NetPriceProductTradePrice>
<ram:ChargeAmount>
10.5000
</ram:ChargeAmount>
</ram:NetPriceProductTradePrice>
</ram:SpecifiedLineTradeAgreement>
<ram:SpecifiedLineTradeDelivery>
<ram:BilledQuantity unitCode=
"HUR"
>
27.5000
</ram:BilledQuantity>
</ram:SpecifiedLineTradeDelivery>
<ram:SpecifiedLineTradeSettlement>
<ram:ApplicableTradeTax>
<ram:TypeCode>VAT</ram:TypeCode>
<ram:CategoryCode>S</ram:CategoryCode>
<ram:RateApplicablePercent>
19.00
</ram:RateApplicablePercent>
</ram:ApplicableTradeTax>
<ram:SpecifiedTradeSettlementLineMonetarySummation>
<ram:LineTotalAmount>
288.75
</ram:LineTotalAmount>
</ram:SpecifiedTradeSettlementLineMonetarySummation>
</ram:SpecifiedLineTradeSettlement>
</ram:IncludedSupplyChainTradeLineItem>
<ram:IncludedSupplyChainTradeLineItem>
<ram:AssociatedDocumentLineDocument>
<ram:LineID>
4
</ram:LineID>
</ram:AssociatedDocumentLineDocument>
<ram:SpecifiedTradeProduct>
<ram:GlobalID schemeID=
"0088"
>
2001015001325
</ram:GlobalID>
<ram:SellerAssignedID>FB05</ram:SellerAssignedID>
<ram:Name>FALTENBEUTEL 16x6x28 CM</ram:Name>
</ram:SpecifiedTradeProduct>
<ram:SpecifiedLineTradeAgreement>
<ram:GrossPriceProductTradePrice>
<ram:ChargeAmount>
0.0105
</ram:ChargeAmount>
</ram:GrossPriceProductTradePrice>
<ram:NetPriceProductTradePrice>
<ram:ChargeAmount>
0.0105
</ram:ChargeAmount>
</ram:NetPriceProductTradePrice>
</ram:SpecifiedLineTradeAgreement>
<ram:SpecifiedLineTradeDelivery>
<ram:BilledQuantity unitCode=
"H87"
>
3500.0000
</ram:BilledQuantity>
</ram:SpecifiedLineTradeDelivery>
<ram:SpecifiedLineTradeSettlement>
<ram:ApplicableTradeTax>
<ram:TypeCode>VAT</ram:TypeCode>
<ram:CategoryCode>S</ram:CategoryCode>
<ram:RateApplicablePercent>
19.00
</ram:RateApplicablePercent>
</ram:ApplicableTradeTax>
<ram:SpecifiedTradeSettlementLineMonetarySummation>
<ram:LineTotalAmount>
36.75
</ram:LineTotalAmount>
</ram:SpecifiedTradeSettlementLineMonetarySummation>
</ram:SpecifiedLineTradeSettlement>
</ram:IncludedSupplyChainTradeLineItem>
<ram:IncludedSupplyChainTradeLineItem>
<ram:AssociatedDocumentLineDocument>
<ram:LineID>
5
</ram:LineID>
</ram:AssociatedDocumentLineDocument>
<ram:SpecifiedTradeProduct>
<ram:GlobalID schemeID=
"0088"
>
4123456000038
</ram:GlobalID>
<ram:SellerAssignedID>KOP05</ram:SellerAssignedID>
<ram:Name>Kopierpapier A4</ram:Name>
<ram:Description>Zählerstand von-bis:
543210
-
544420
</ram:Description>
<ram:ApplicableProductCharacteristic>
<ram:Description>Zähler-Nr.</ram:Description>
<ram:Value>MG-X79318</ram:Value>
</ram:ApplicableProductCharacteristic>
</ram:SpecifiedTradeProduct>
<ram:SpecifiedLineTradeAgreement>
<ram:GrossPriceProductTradePrice>
<ram:ChargeAmount>
0.0100
</ram:ChargeAmount>
</ram:GrossPriceProductTradePrice>
<ram:NetPriceProductTradePrice>
<ram:ChargeAmount>
0.0100
</ram:ChargeAmount>
</ram:NetPriceProductTradePrice>
</ram:SpecifiedLineTradeAgreement>
<ram:SpecifiedLineTradeDelivery>
<ram:BilledQuantity unitCode=
"H87"
>
1210.0000
</ram:BilledQuantity>
</ram:SpecifiedLineTradeDelivery>
<ram:SpecifiedLineTradeSettlement>
<ram:ApplicableTradeTax>
<ram:TypeCode>VAT</ram:TypeCode>
<ram:CategoryCode>S</ram:CategoryCode>
<ram:RateApplicablePercent>
19.00
</ram:RateApplicablePercent>
</ram:ApplicableTradeTax>
<ram:SpecifiedTradeSettlementLineMonetarySummation>
<ram:LineTotalAmount>
12.10
</ram:LineTotalAmount>
</ram:SpecifiedTradeSettlementLineMonetarySummation>
</ram:SpecifiedLineTradeSettlement>
</ram:IncludedSupplyChainTradeLineItem>
<ram:ApplicableHeaderTradeAgreement>
<ram:SellerTradeParty>
<ram:ID>
549910
</ram:ID>
<ram:GlobalID schemeID=
"0088"
>
4333741000005
</ram:GlobalID>
<ram:Name>MUSTERLIEFERANT GMBH</ram:Name>
<ram:DefinedTradeContact>
<ram:TelephoneUniversalCommunication>
<ram:CompleteNumber>+
49
932
431
500
</ram:CompleteNumber>
</ram:TelephoneUniversalCommunication>
<ram:EmailURIUniversalCommunication>
<ram:URIID>max.mustermann
@musterlieferant
.de</ram:URIID>
</ram:EmailURIUniversalCommunication>
</ram:DefinedTradeContact>
<ram:PostalTradeAddress>
<ram:PostcodeCode>
99199
</ram:PostcodeCode>
<ram:LineOne>BAHNHOFSTRASSE
99
</ram:LineOne>
<ram:CityName>MUSTERHAUSEN</ram:CityName>
<ram:CountryID>DE</ram:CountryID>
</ram:PostalTradeAddress>
<ram:SpecifiedTaxRegistration>
<ram:ID schemeID=
"FC"
>
201
/
113
/
40209
</ram:ID>
</ram:SpecifiedTaxRegistration>
</ram:SellerTradeParty>
<ram:BuyerTradeParty>
<ram:ID>
339420
</ram:ID>
<ram:GlobalID schemeID=
"0088"
>
4304171000002
</ram:GlobalID>
<ram:Name>MUSTER-KUNDE GMBH</ram:Name>
<ram:PostalTradeAddress>
<ram:PostcodeCode>
40235
</ram:PostcodeCode>
<ram:LineOne>KUNDENWEG
88
</ram:LineOne>
<ram:CityName>DUESSELDORF</ram:CityName>
<ram:CountryID>DE</ram:CountryID>
</ram:PostalTradeAddress>
</ram:BuyerTradeParty>
<ram:AdditionalReferencedDocument>
<ram:IssuerAssignedID>A777123</ram:IssuerAssignedID>
<ram:TypeCode>
130
</ram:TypeCode>
</ram:AdditionalReferencedDocument>
</ram:ApplicableHeaderTradeAgreement>
<ram:ApplicableHeaderTradeDelivery>
<ram:ShipToTradeParty>
<ram:GlobalID schemeID=
"0088"
>
4304171088093
</ram:GlobalID>
<ram:Name>MUSTER-MARKT</ram:Name>
<ram:DefinedTradeContact>
<ram:DepartmentName>
7322
</ram:DepartmentName>
</ram:DefinedTradeContact>
<ram:PostalTradeAddress>
<ram:PostcodeCode>
31157
</ram:PostcodeCode>
<ram:LineOne>HAUPTSTRASSE
44
</ram:LineOne>
<ram:CityName>SARSTEDT</ram:CityName>
<ram:CountryID>DE</ram:CountryID>
</ram:PostalTradeAddress>
</ram:ShipToTradeParty>
<ram:ActualDeliverySupplyChainEvent>
<ram:OccurrenceDateTime>
<udt:DateTimeString format=
"102"
>
20241030
</udt:DateTimeString>
</ram:OccurrenceDateTime>
</ram:ActualDeliverySupplyChainEvent>
<ram:DeliveryNoteReferencedDocument>
<ram:IssuerAssignedID>L87654321012</ram:IssuerAssignedID>
</ram:DeliveryNoteReferencedDocument>
</ram:ApplicableHeaderTradeDelivery>
<ram:ApplicableHeaderTradeSettlement>
<ram:InvoiceCurrencyCode>EUR</ram:InvoiceCurrencyCode>
<ram:InvoiceeTradeParty>
<ram:ID>
339420
</ram:ID>
<ram:GlobalID schemeID=
"0088"
>
4304171000002
</ram:GlobalID>
<ram:Name>MUSTER-KUNDE GMBH</ram:Name>
<ram:PostalTradeAddress>
<ram:PostcodeCode>
40235
</ram:PostcodeCode>
<ram:LineOne>KUNDENWEG
88
</ram:LineOne>
<ram:CityName>DUESSELDORF</ram:CityName>
<ram:CountryID>DE</ram:CountryID>
</ram:PostalTradeAddress>
</ram:InvoiceeTradeParty>
<ram:ApplicableTradeTax>
<ram:CalculatedAmount>
76.67
</ram:CalculatedAmount>
<ram:TypeCode>VAT</ram:TypeCode>
<ram:BasisAmount>
403.55
</ram:BasisAmount>
<ram:LineTotalBasisAmount>
410.10
</ram:LineTotalBasisAmount>
<ram:AllowanceChargeBasisAmount>-
6.55
</ram:AllowanceChargeBasisAmount>
<ram:CategoryCode>S</ram:CategoryCode>
<ram:RateApplicablePercent>
19.00
</ram:RateApplicablePercent>
</ram:ApplicableTradeTax>
<ram:SpecifiedTradeAllowanceCharge>
<ram:ChargeIndicator>
<udt:Indicator>
false
</udt:Indicator>
</ram:ChargeIndicator>
<ram:BasisAmount>
410.10
</ram:BasisAmount>
<ram:ActualAmount>
21.55
</ram:ActualAmount>
<ram:Reason>Sonderrabatt</ram:Reason>
<ram:CategoryTradeTax>
<ram:TypeCode>VAT</ram:TypeCode>
<ram:CategoryCode>S</ram:CategoryCode>
<ram:RateApplicablePercent>
19.00
</ram:RateApplicablePercent>
</ram:CategoryTradeTax>
</ram:SpecifiedTradeAllowanceCharge>
<ram:SpecifiedLogisticsServiceCharge>
<ram:Description>Transportkosten: Frachbetrag</ram:Description>
<ram:AppliedAmount>
15.00
</ram:AppliedAmount>
<ram:AppliedTradeTax>
<ram:TypeCode>VAT</ram:TypeCode>
<ram:CategoryCode>S</ram:CategoryCode>
<ram:RateApplicablePercent>
19.00
</ram:RateApplicablePercent>
</ram:AppliedTradeTax>
</ram:SpecifiedLogisticsServiceCharge>
<ram:SpecifiedTradePaymentTerms>
<ram:Description>Skontovereinbarung:
2
% bei Zahlung innerhalb
10
Tagen nach Rechnungsdatum</ram:Description>
<ram:ApplicableTradePaymentDiscountTerms>
<ram:BasisPeriodMeasure unitCode=
"DAY"
>
10
</ram:BasisPeriodMeasure>
<ram:CalculationPercent>
2.00
</ram:CalculationPercent>
</ram:ApplicableTradePaymentDiscountTerms>
</ram:SpecifiedTradePaymentTerms>
<ram:SpecifiedTradeSettlementHeaderMonetarySummation>
<ram:LineTotalAmount>
410.10
</ram:LineTotalAmount>
<ram:ChargeTotalAmount>
15.00
</ram:ChargeTotalAmount>
<ram:AllowanceTotalAmount>
21.55
</ram:AllowanceTotalAmount>
<ram:TaxBasisTotalAmount>
403.55
</ram:TaxBasisTotalAmount>
<ram:TaxTotalAmount currencyID=
"EUR"
>
76.67
</ram:TaxTotalAmount>
<ram:GrandTotalAmount>
480.22
</ram:GrandTotalAmount>
<ram:TotalPrepaidAmount>
0.00
</ram:TotalPrepaidAmount>
<ram:DuePayableAmount>
480.22
</ram:DuePayableAmount>
</ram:SpecifiedTradeSettlementHeaderMonetarySummation>
</ram:ApplicableHeaderTradeSettlement>
</rsm:SupplyChainTradeTransaction>
</rsm:CrossIndustryInvoice>
Dabei handelt es sich um Namespaces, welche einzelne XML-Elementen einer eindeutigen Adresse zuordnen. Mehr zu Namespaces erfahren Sie hier: https://de.wikipedia.org/wiki/Namensraum_(XML)
Diese werden nicht automatisch erstellt, sondern können über Felder mit einer speziellen Syntax definiert werden.
Ein Feld für eine Namespacedefinition bekommt immer den Namen des Namespaces und das Suffix _nsdef.
Bleiben wir also beim Beispiel ZUGFeRD 2.3 EXTENDED. Dort werden folgenden Namespaces benötigt:
xmlns:rsm="urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100" |
Hier haben wir also 5 Namespaces, die deklariert werden müssen. Legen Sie daher also die Felder wie folgt an und geben Sie diesen die URI als Fixwert mit:
Feld |
Wert |
rsm_nsdef |
urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100 |
qdt_nsdef |
urn:un:unece:uncefact:data:standard:QualifiedDataType:10 |
xs_nsdef |
http://www.w3.org/2001/XMLSchema |
udt_nsdef |
urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100 |
ram_nsdef |
urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100 |
Nun müssen die deklarierten Namespaces auch den Knoten und Felder bekannt gemacht werden, um den Tags das jeweilige Präfix zu geben.
Dafür steht Ihnen in den Knoten- und Feldeigenschaften das Attribut XML Namespace zur Verfügung. Tragen Sie dort den Namespace ein, welcher als Suffix für das XML-Element verwendet werden soll.
Soll eine untergeordnete Struktur ebenfalls den gleichen Namespace erhalten, kann der Namespace über das Kontextmenü an die untergeordneten Knoten und Felder vererbt werden.
Öffnen Sie dafür auf dem entsprechenden Knoten das Kontextmenü durch einen Rechtsklick und wählen Sie XML Namespaces vererben aus.
Gehen Sie so durch die gesamte Struktur, um den Elementen die Namespaces, genau wie in den Beispielen aus dem Paket, zuzuordnen.
Jetzt haben wir ganz viel über XML geredet, aber Sie fragen sich bestimmt, wann die PDF-Rechnung wichtig wird. Genau jetzt.
Nachdem das Mapping steht, sollte man sich auch überlegen, wo die PDF-Rechnung herkommt.
Idealerweise hat ein vorgelagertes System diese schon erstellt und in ein Verzeichnis gelegt. Diesen Pfad ermitteln Sie mit einer eigenen Logik und speichern diesen in eine Variable, welche wir in einer der nächsten Phasen brauchen.
Hinweis: Achten Sie darauf, dass es sich um ein Verzeichnis innerhalb des Installationsverzeichnisses des Integration Servers handelt und nicht um ein Netzlaufwerk.
Das PDF kann auch mit dem PDFCreator erzeugt werden, wenn das nicht durch ein anderes System erledigt werden kann.
Phase 5: Integration Unit
Es gibt zwei Wege, eine ZUGFeRD zu erstellen:
Die ZUGFeRD IU.
Die XMLNoTemplateUnit in Verbindung mit dem Postexecuter ZUGFerdPDF.
Unsere Empfehlung ist der 2. Weg mit der XMLNoTemplateUnit in Verbindung mit dem ZUGFerdPDF-Postexecuter. Die Vorteile liegen auf der Hand:
Es muss keine Vorlage erstellt werden.
Alle XML-Besonderheiten (Attribute, Namespaces, Strukturen) werden in der Zielstruktur erzeugt, sind für jeden sichtbar und leicht zu debuggen. Siehe auch Abschnitt Satzarterkennungen, eindeutige/reservierte Namen für XML.
Es kann auch ohne weiteres in anderen Antwortwegen auf das XML zugegriffen werden.
Basierend auf der Empfehlung, verwenden Sie die XMLNoTemplateUnit wie gewohnt.
Je nachdem, ob Sie in anderen Antwortwegen das XML benötigen (z.B. für das Archiv) oder nicht, kann direkt unter der Integration Unit im Bereich Nachbearbeitung der Postexecuter ZUGFerdPDF verwendet werden.
In diesem Fall würde dann das Ergebnis aus der Integration Unit immer die ZUGFeRD sein und das XML wäre nur noch über diese auszulesen.
Daher empfehlen wir die Erstellung der ZUGFeRD erst im entsprechenden Antwortweg.
Phase 6: ZUGFeRD erstellen
Es kann selbstverständlich jede Art von Antwortweg verwendet werden.
Der Antwortweg (oder auch mehrere), der die ZUGFeRD als Ergebnis ausgeben soll, erhält in den Inhalts-Einstellungen den PostExecuter ZUGFerdPDF.
Hier brauchen Sie nun den Pfad zur PDF-Rechnung. Dieser sollte vollständig aus einer Variablen kommen. In der Konfiguration wird auch das Konformitätslevel und die ZUGFeRD-Version erwartet. Optional können ab ZUGFeRD 2 noch weitere Anhänge in das PDF gepackt werden.
Gehen wir davon aus, dass wir den Pfad zur PDF-Rechnung in Phase 3 in die Variable var__pfad_zum_PDF geschrieben haben, wir das Konformitätslevel EXTENDED brauchen, eine ZUGFeRD Version 2 erstellen und keine weiteren Daten mit Anhängen wollen. Die Konfiguration dazu sieht dann so aus:
@var__pfad_zum_PDF@:EXTENDED:2 |
Außerdem setzen Sie die Inhalts-Einstellung auf Ausgabe von IU und die Kodierung auf UTF-8.
Das Ergebnis ist eine ZUGFeRD-PDF mit eingebettetem XML.
Jetzt fragen Sie sich aber vielleicht, wann welche ZUGFeRD-Version und welches Konformitätslevel benötigt wird. Gute Frage!
Diese Frage lässt sich recht einfach beantworten: Ihr Partner wird Ihnen mitteilen, welche ZUGFeRD-Version Sie ihm in welchem Level übermitteln sollen.
Was aber, wenn Ihr Partner Ihnen nur eine Beispiel-XML gesendet hat?
Auch hier gilt: Kein Problem. Die ZUGFeRD-Version lässt sich anhand des XMLs über folgende Punkte herausfinden.
Der Name der XML.
ZUGFeRD 1: ZUGFeRD-invoice.xml und zugferd-invoice.xml
ZUGFeRD 2: factur-x.xmlDas Root-Element.
ZUGFeRD 1: CrossIndustryDocument
ZUGFeRD 2: CrossIndustryInvoice
Damit wissen wir jetzt die Version, aber wie steht es um das Konformitätslevel?
Das steht praktischerweise in einer validen ZUGFeRD-Nachricht in den Daten. Suchen Sie nach dem Tag <ram:ID>. Dort finden Sie einen String, welcher das konkrete Konformitätslevel enthält.
<ram:ID>urn:cen.eu:en16931:
2017
#compliant#urn:factur-x.eu:1p0:basic</ram:ID>
In diesem Beispiel sehen wir, dass es sich um das Konformitätslevel BASIC handelt.
Mit diesen Informationen kann die ZUGFeRD-Konfiguration dann in jedem Fall erfolgreich durchgeführt werden.
Phase 6: ZUGFeRD auslesen
Parallel zum ZUGFeRD-Preparser, welcher eine XML aus einer ZUGFeRD ausliest, gibt es auch einen Postexecuter, der dies kann: ZUGFeRDExtractXML.
Dieser kann verwendet werden, wenn in Phase 3 z. B. nur der PDF-Teil analysiert werden soll, um zu entscheiden, was mit der XML und dem PDF geschehen soll. Es kann dann z. B. einen Antwortweg geben, der die komplette ZUGFeRD archiviert, einen der das XML an ein Verarbeitungsprofil schickt und einen, der nur das XML archiviert.
Der Postexecuter sollte nicht in Phase 5 verwendet werden.
Besonderheiten
PDF/A-3
ZUGFeRD basiert auf dem PDF/A-3-Standard. Lobster Integration versucht beim Erstellen der Daten die verknüpfte PDF-Rechnung zu einer PDF/A-3 umzuwandeln. Damit das gelingen kann, sollte das PDF sauber erstellt worden sein.
Abweichend von der Dokumentation kann auch ein PDF-A verwendet werden, da dort die Metadaten meist schon in der richtigen Form sind.
Abweichende Namen des XMLs
Es kann auch passieren, dass Ihnen ein Partner eine ZUGFeRD (zumindest behauptet er, es sei eine) zukommen lässt und das XML vom Preparser ZUGFeRD bzw. vom Postexecuter ZUGFeRDExtractXML nicht ausgelesen werden kann, weil kein XML mit den oben beschriebenen Namen in den Metadaten gefunden werden kann.
Schaut man mit dem Adobe Acrobat in das PDF, steht dort aber der vermeintlich korrekte Name.
Wenn dies der Fall ist, handelt es sich nicht um eine valide ZUGFeRD-Rechnung.
Der XML-Teil kann trotzdem ausgelesen werden, nur nicht mit dem ZUGFeRD-Bordmitteln.
Verwenden Sie in einem solchen Fall den Preparser ExtractFileFromPDF.
Sie sollten Ihren Partner aber darauf hinweisen, dass es sich um kein valides ZUGFeRD handelt.
EN16931 XRECHNUNG
ZUGFeRD 2.2 in der Konformitätsstufe XRECHNUNG wird von deutschen Behörden im Rahmen der EN16931 als Rechnungsformat für die E-Rechnung akzeptiert.
Allerdings wird hier nur der XML-Teil ohne PDF erwartet. Beachten Sie dafür aber auch die Anforderungen der jeweiligen Behörden und Partner.
Der Ablauf zur Erstellung der XML-Datei ist genau derselbe, wie bei den anderen Typen, mit dem Unterschied, dass die XML-Datei am Ende nicht in ein PDF gepackt wird.
Fehlerbehandlung
Wenn ein Validator das XML oder das PDF moniert, gilt es, Verschiedenes zu prüfen.
Wird das XML moniert, prüfen Sie, ob die Strukturen korrekt sind, alle Namespaces richtig deklariert und zugeordnet sind und dass an den entsprechenden Stellen die richtigen Formate und Codes gemäß ZUGFeRD-Beschreibungen vorhanden sind.
Wird das PDF selbst moniert, muss an der Stelle geprüft werden, an der das PDF erstellt wird. Es konnte dann von Lobster Integration aus dem vorliegenden PDF kein valides PDF/A-3 erstellt werden.
Gründe dafür können schon vorab defekte PDF-Metadaten sein. Dies kann z. B. passieren, wenn mehrere unterschiedliche Programme an der Erstellung des PDFs beteiligt waren.
Wir arbeiten daran, dass diese externen Einflüsse keine Auswirkungen mehr auf die Erstellung von validen PDF/A-3 haben. Lassen Sie aber bei einem beanstandeten PDF Ihren Partner prüfen, ob er die ZUGFeRD annehmen würde.