- Thema
- Fragen und Antworten
- SDK-Mitglieder
- ActualDeliveryDate_102 AddBuyerAssignedID() AddContractReferencedDocument() AddDocumentNote() AddPaymentMeans() AddProduct_Comfort() AddTradeAllowanceCharge() AddTradePaymentTerms() AddTradeTax() BusinessProcessSpecifiedDocumentContextParameter
- Business Terms
- BT-3 Code für den Rechnungstyp BT-118 Code der Umsatzsteuerkategorie BT-151 Code der Umsatzsteuerkategorie des in Rechnung BT-121 Code für den Umsatzsteuerbefreiungsgrund BT-120 Umsatzsteuerbefreiungsgrund BT-31 Umsatzsteuer-Identifikationsnummer des Verkäufers BT-48 Umsatzsteuer-Identifikationsnummer des Käufers BT-12 Vertragsreferenz
- Codebeispiele
- VB.NET
- Veröffentlicht
Kurz: Wenn ein Rechnungsempfänger meldet, Ihre E-Rechnung enthalte „zero rated goods“ statt „VAT reverse charge“ und sei eine „commercial invoice“ statt einer „partial construction invoice“, dann zitiert er die englischen Namen der Codes im XML. „Zero rated goods“ ist die Steuerkategorie Z, „commercial invoice“ die Rechnungsart 380. Für eine Abschlagsrechnung über Bauleistungen nach § 13b UStG sind richtig: Steuerkategorie AE mit dem Befreiungsgrund VATEX-EU-AE und die Rechnungsart 875. Beides lässt sich mit dem Aloaha ZUGFeRD SDK setzen.
Warum man die Begriffe im XML nicht findet
Eine XRechnung oder ZUGFeRD-Rechnung enthält keine Klartexte für Steuerart und Rechnungsart, sondern Codes aus Codelisten. Prüfprogramme und Rechnungseingangssysteme zeigen dazu die englische Bezeichnung aus der Codeliste an:
| Im XML | Feld | Bezeichnung in der Codeliste | Bedeutung |
|---|---|---|---|
<ram:CategoryCode>Z</ram:CategoryCode> | BT-118, BT-151 | Zero rated goods | Steuersatz 0 % (Nullsatz) |
<ram:CategoryCode>AE</ram:CategoryCode> | BT-118, BT-151 | VAT Reverse Charge | Steuerschuldnerschaft des Leistungsempfängers (§ 13b UStG) |
<ram:TypeCode>380</ram:TypeCode> | BT-3 | Commercial invoice | normale Rechnung |
<ram:TypeCode>875</ram:TypeCode> | BT-3 | Partial construction invoice | Abschlagsrechnung (Bauleistung) |
<ram:TypeCode>876</ram:TypeCode> | BT-3 | Partial final construction invoice | Teilschlussrechnung |
<ram:TypeCode>877</ram:TypeCode> | BT-3 | Final construction invoice | Schlussrechnung |
Technisch ist eine Rechnung mit Z und 380 oft gültig – der Validator findet keinen Fehler. Inhaltlich ist sie aber falsch: Bei § 13b schuldet der Empfänger die Umsatzsteuer, die Leistung ist nicht steuerfrei. Viele Empfänger prüfen deshalb Steuerkategorie und Rechnungsart und lehnen die Rechnung ab.
So setzen Sie es mit dem SDK
- Rechnungsart (BT-3): Eigenschaft
Document_TypemitPartialConstructionInvoice(875),PartialFinalConstructionInvoice(876) oderFinalConstructionInvoice(877). Aus VBA/COM geht auchDocument_TypeINT = 875. Ohne Angabe schreibt das SDK 380. Wichtig: Die Eigenschaft erst nachCreateInvoicesetzen –CreateInvoicelegt jede neue Rechnung mit 380 an. - Steuerkategorie in den Positionen (BT-151): in
AddProduct_Comfort"AE"statt"Z", Steuersatz 0. - Steueraufschlüsselung (BG-23):
AddTradeTaxmit Kategorie"AE", Befreiungsgrund als Text (BT-120) und CodeVATEX-EU-AE(BT-121). - USt-IdNr.: Bei
AEmüssen die USt-IdNr. des Verkäufers (BT-31) und des Käufers (BT-48) in der Rechnung stehen – überWriteSellerundWriteBuyerbzw.AddBuyerTAX.
Beispiel: Abschlagsrechnung mit Reverse Charge (VB.NET)
Dim alo As New Aloaha_ZUGFeRD.XML(Aloaha_ZUGFeRD.iXML.ZUGFeRDProfile.comfort, False, "IHR-LIZENZSCHLUESSEL")
alo.ZUGfeRDStandard = Aloaha_ZUGFeRD.iXML.ZUGFeRDVersion.xInvoice
alo.isKOSIT = True ' XRechnung
alo.BusinessProcessSpecifiedDocumentContextParameter = "urn:fdc:peppol.eu:2017:poacc:billing:01:1.0"
alo.CreateInvoice("AR-2026-001", "", "20261008", "102", , "", "EUR")
alo.Document_Type = Aloaha_ZUGFeRD.iXML.DocumentType.PartialConstructionInvoice ' BT-3 = 875
alo.AddDocumentNote("Steuerschuldnerschaft des Leistungsempfängers nach § 13b UStG.")
alo.WriteSeller("Bau Beispiel GmbH", "35390", "Gießen", "Werkstraße 5", "", "DE", "DE123456789") ' BT-31
alo.WriteSellerContactPerson("Erika Beispiel", "", "rechnung@bau-beispiel.example", "+49 641 123456")
alo.set_URIUniversalCommunication("rechnung@bau-beispiel.example", "EM", True)
alo.WriteBuyer("Kunde Beispiel GmbH & Co. KG", "63667", "Nidda", "Kundenstraße 1", "", "DE", "", "DE987654321") ' BT-48
alo.BuyerReference = "25000151"
alo.set_URIUniversalCommunication("rechnungseingang@kunde.example", "EM", False)
alo.AddBuyerAssignedID("25000151") ' Bestellnummer BT-13
alo.AddContractReferencedDocument("7615") ' Vertragsnummer BT-12
alo.ActualDeliveryDate_102 = "20261007"
alo.AddPaymentMeans("58", "Überweisung", "DE02120300000000202051", "Bau Beispiel GmbH")
alo.AddTradePaymentTerms("Zahlbar ohne Abzug innerhalb von 21 Tagen", "20261029", "102")
' Position mit Kategorie AE und 0 %
alo.AddProduct_Comfort("1", "", "", "1", "H87", "1. Abschlagsrechnung gemäß Aufstellung", "", "", "EUR", "", "H87", _
False, "", "", "", "196289.81", "EUR", "1", "H87", "VAT", "AE", "0.00", "", "196289.81", "EUR", "", "")
' 4 % Nachlass auf Rechnungsebene (BG-20), ebenfalls Kategorie AE
alo.AddTradeAllowanceCharge(False, "196289.81", "EUR", "7851.59", "EUR", "VAT", "AE", "0.00", "Nachlass", "4", "95")
' Steueraufschlüsselung mit Befreiungsgrund und VATEX-Code
alo.AddTradeTax("0.00", "EUR", "188438.22", "EUR", "VAT", "AE", "0.00", _
"Steuerschuldnerschaft des Leistungsempfängers (§ 13b UStG)", "", "", "", "VATEX-EU-AE")
alo.WriteTotals("196289.81", "188438.22", "188438.22", "188438.22", "0.00", "7851.59", "0.00", "0.00", "0.00")
alo.SaveXML("C:\Rechnungen\abschlag.xml")
If alo.Last_Error <> "" Then Console.WriteLine(alo.Last_Error)
Alle Namen, Nummern und Bankdaten sind Muster-Werte. Eine mit genau diesem Aufbau erzeugte XRechnung wurde vom KoSIT-Validator (XRechnung-Konfiguration 3.0.2) ohne Fehler und ohne Warnungen angenommen (Stand 14.10.2026).
Weitere typische Fehler bei solchen Rechnungen
- Rechnungsart als Hinweistext: Der zweite Parameter von
CreateInvoiceist kein Code für die Rechnungsart, sondern ein Rechnungshinweis (BT-22).alo.CreateInvoice(Nr, "875", Datum, …)schreibt deshalb<ram:IncludedNote><ram:Content>875</ram:Content></ram:IncludedNote>ins XML, die Rechnungsart bleibt 380. Richtig:alo.CreateInvoice(Nr, "", Datum, "102", , "", "EUR") ' 2. Parameter = Hinweistext (BT-22), hier leer alo.Document_Type = Aloaha_ZUGFeRD.iXML.DocumentType.PartialConstructionInvoice ' danach: BT-3 = 875 - Nachlass als Position: Eine Position „abzgl. 4 % Nachlass“ mit positivem Einzelpreis und negativem Positionsbetrag passt nicht zusammen (Preis × Menge ≠ Betrag). Besser ist ein Nachlass auf Rechnungsebene wie im Beispiel.
- Vertragsnummer nur als Freitext: Sie gehört in BT-12 (
AddContractReferencedDocument), damit sie maschinell zugeordnet werden kann. - Platzhalter: Werte wie „Buchungsreferenz“ in BT-19 oder „1“ als Käuferreferenz weglassen bzw. durch die echten Werte des Kunden ersetzen.
Wie Abschläge in der Schlussrechnung verrechnet werden, steht unter Schlussrechnung mit Abschlagsrechnungen als XRechnung. Ihre eigene Rechnung prüfen Sie wie unter XRechnung vor dem Versand prüfen beschrieben.
Häufige Fragen
Was bedeutet „zero rated goods“ in einer E-Rechnung?
Das ist die englische Bezeichnung der Umsatzsteuerkategorie Z (Nullsatz, 0 %). Sie steht im XML als CategoryCode Z. Für Rechnungen nach § 13b UStG ist sie falsch – richtig ist AE (VAT Reverse Charge).
Welche Steuerkategorie gilt für § 13b UStG?
AE („VAT Reverse Charge“) mit 0 % Steuersatz, einem Befreiungsgrund als Text und dem Code VATEX-EU-AE. Die USt-IdNr. von Verkäufer und Käufer müssen in der Rechnung stehen.
Was bedeutet „commercial invoice“?
Das ist die Rechnungsart 380, die normale Handelsrechnung. Abschlagsrechnungen über Bauleistungen haben die Rechnungsart 875 („partial construction invoice“), Teilschlussrechnungen 876 und Schlussrechnungen 877.
Erlaubt die XRechnung die Rechnungsart 875?
Ja. Die XRechnung erlaubt unter anderem 326, 380, 381, 384, 389, 875, 876 und 877. Eine Abschlagsrechnung mit 875 und Reverse Charge wurde vom KoSIT-Validator ohne Fehler angenommen.
Wie setze ich die Rechnungsart 875 mit dem Aloaha ZUGFeRD SDK?
Mit alo.Document_Type = Aloaha_ZUGFeRD.iXML.DocumentType.PartialConstructionInvoice oder aus VBA/COM mit alo.Document_TypeINT = 875 – immer nach CreateInvoice. Ohne Angabe schreibt das SDK 380.
Warum steht 875 im Hinweis statt in der Rechnungsart?
Weil 875 als zweiter Parameter an CreateInvoice übergeben wurde. Dieser Parameter ist der Rechnungshinweis (BT-22), nicht die Rechnungsart. Die Rechnungsart setzen Sie nach CreateInvoice mit Document_Type bzw. Document_TypeINT.
Business Terms in diesem Artikel: BT-3 BT-118 BT-151 BT-121 BT-120 BT-31 BT-48 BT-12 BG-20