F: Validator meldet BR-FXEXT-IC-08 bei einer innergemeinschaftlichen Lieferung – was tun?

Thema
VB.NET
SDK-Mitglieder
AddProduct_Comfort() AddTradeAllowanceCharge() AddTradeTax() ZUGFeRD_Profile
Business Terms
BT-116 Kategoriespezifischer Steuerbasisbetrag BT-120 Umsatzsteuerbefreiungsgrund BT-24 Spezifikationskennung BT-99 Betrag des Zuschlags auf Dokumentenebene BT-131 Nettobetrag der Rechnungsposition BT-48 Umsatzsteuer-Identifikationsnummer des Käufers BT-118 Code der Umsatzsteuerkategorie BT-121 Code für den Umsatzsteuerbefreiungsgrund
Codebeispiele
VB.NET
Veröffentlicht

Kurz: Die Regel BR-FXEXT-IC-08 gibt es nur im Profil Factur-X/ZUGFeRD EXTENDED. Sie meldet sich typischerweise bei einer steuerfreien innergemeinschaftlichen Lieferung (Kategorie K) mit einem Zuschlag auf Belegebene, etwa für Fracht oder Verpackung. Meist ist die Rechnung gar nicht absichtlich EXTENDED, sondern wurde durch einen einzelnen Aufruf umgestellt. Stellen Sie sie wieder auf EN 16931 um, entfällt die Regel – Ihre Beträge sind in der Regel richtig.

Was die Regel prüft

Für die Steuerzeile der Kategorie K (BT-118) rechnet der Validator nach, ob die Bemessungsgrundlage (BT-116) der Summe aus Positionsbeträgen (BT-131) und Zu- und Abschlägen auf Belegebene (BT-99, BT-92) entspricht. Factur-X EXTENDED kennt die Regel in drei Varianten:

RegelWas gezählt wird
BR-FXEXT-IC-08inialle Positionen und Zu-/Abschläge der Kategorie K und desselben Steuersatzes
BR-FXEXT-IC-08revnur Positionen und Zu-/Abschläge, deren Befreiungsgrund identisch mit dem Befreiungsgrund der Steuerzeile (BT-120, BT-121) ist
BR-FXEXT-IC-08beine der beiden Varianten muss erfüllt sein; laut Regeltext soll künftig nur noch die zweite gelten

Die Meldung kommt fast immer aus der Variante rev. Steht der Befreiungsgrund in der Steuerzeile, aber nicht am Zuschlag, zählt der Validator den Zuschlag nicht mit – und die Differenz ist genau der Zuschlag.

Beispiel

Zwei Positionen à 90,00 €, dazu 15,00 € Verpackung, Kategorie K, 0 %, Befreiungsgrund „Steuerfreie innergemeinschaftliche Lieferung“ in der Steuerzeile:

BetragBefreiungsgrundvon rev gezählt?
Position 190,00 €wie Steuerzeileja
Position 290,00 €wie Steuerzeileja
Zuschlag Verpackung15,00 €keinernein
Bemessungsgrundlage BT-116195,00 €erwartet: 180,00 €

Rechnerisch ist die Rechnung korrekt (180,00 + 15,00 = 195,00), nur die Zuordnung über den Befreiungsgrund passt nicht. Lässt man den Befreiungsgrund in den Positionen weg, solange die Rechnung noch EXTENDED ist, zählt der Validator sogar gar nichts mehr mit. Die Lösung ist deshalb nicht, an den Beträgen zu drehen, sondern das Profil zu korrigieren.

Die Validatoren bewerten die Meldung unterschiedlich: Mustang zeigt sie als Warnung, andere Prüfwerkzeuge wie Valitool als Fehler und stufen die Rechnung als nicht valide ein. Beheben sollten Sie sie in jedem Fall.

Warum ist die Rechnung überhaupt EXTENDED?

Das Aloaha ZUGFeRD SDK stellt eine Rechnung automatisch auf EXTENDED um, sobald Sie ein Feld setzen, das es nur dort gibt. Ob das passiert ist, sehen Sie im XML an der Spezifikationskennung (BT-24): urn:cen.eu:en16931:2017#conformant#urn:factur-x.eu:1p0:extended statt urn:cen.eu:en16931:2017. Bei innergemeinschaftlichen Lieferungen sind es fast immer diese beiden Aufrufe:

AuslöserStattdessen
Befreiungsgrund je Position: AddProduct_Comfort mit gefülltem TaxExemptionReasonin der Position "" übergeben und den Grund einmal in der Steuerzeile mit AddTradeTax angeben
USt-IdNr. bei der Lieferanschrift: AddShipToTradePartyTAX oder WriteShipToTradeParty mit VAT_Noweglassen – die USt-IdNr. des Käufers (BT-48) genügt. Die Lieferanschrift mit Land bleibt, sie ist bei Kategorie K Pflicht

Alle weiteren Aufrufe, die EXTENDED setzen: Warum erstellt das SDK meine Rechnung als Factur-X EXTENDED?

So bleibt die Rechnung EN 16931 (VB.NET)

' Positionen: TaxExemptionReason (23. Parameter) leer lassen
' ... alo.AddProduct_Comfort(..., "VAT", "K", "0.00", "", "90.00", "EUR") ...

' Lieferanschrift ohne USt-IdNr. - KEIN Aufruf von AddShipToTradePartyTAX

' Zuschlag auf Belegebene
alo.AddTradeAllowanceCharge(True, "", "EUR", "15.00", "EUR", "VAT", "K", "0.00", "Verpackung")

' Steuerzeile: hier und nur hier steht der Befreiungsgrund
alo.AddTradeTax("0.00", "EUR", "195.00", "EUR", "VAT", "K", "0.00", _
    "Steuerfreie innergemeinschaftliche Lieferung", "", "", "", "VATEX-EU-IC")

' vor dem Speichern prüfen, ob das Profil umgestellt wurde
If alo.ZUGFeRD_Profile = Aloaha_ZUGFeRD.iXML.ZUGFeRDProfile.extended Then
    Console.WriteLine("Profil EXTENDED - Positionen und Lieferanschrift prüfen")
End If

Bei einer XRechnung nennt ab Version 11 zusätzlich LastWarning den Aufruf, der auf EXTENDED umgestellt hat. Prüfen können Sie das Ergebnis direkt im SDK mit ValidateInvoicePDF bzw. ValidateInvoiceXML.

Wenn die Rechnung EXTENDED bleiben muss

Brauchen Sie EXTENDED aus anderen Gründen, muss derselbe Befreiungsgrund an allen Beträgen der Kategorie stehen: in den Positionen, an jedem Zu- und Abschlag auf Belegebene und in der Steuerzeile. Ab Version 11.0.0.16 setzen Sie ihn am Zuschlag mit SetTradeAllowanceChargeExemption:

Dim grund As String = "Steuerfreie innergemeinschaftliche Lieferung"

' Positionen: Befreiungsgrund je Position (EXTENDED)
' ... alo.AddProduct_Comfort(..., "VAT", "K", "0.00", grund, "90.00", "EUR") ...

' Zuschlag und derselbe Befreiungsgrund daran (-1 = der zuletzt angelegte Zu-/Abschlag)
alo.AddTradeAllowanceCharge(True, "", "EUR", "15.00", "EUR", "VAT", "K", "0.00", "Verpackung")
alo.SetTradeAllowanceChargeExemption(-1, grund)

' Steuerzeile mit demselben Text
alo.AddTradeTax("0.00", "EUR", "195.00", "EUR", "VAT", "K", "0.00", grund)

Verglichen werden Text und Code des Befreiungsgrunds. Geben Sie einen Code wie VATEX-EU-IC deshalb entweder überall an (Positionen über WriteItemTradeTax, Zuschlag als dritten Parameter von SetTradeAllowanceChargeExemption, Steuerzeile in AddTradeTax) oder nirgends. Für EN-16931-Rechnungen und XRechnungen rufen Sie die Funktion nicht auf; sie stellt die Rechnung auf EXTENDED um.

Dasselbe gilt für Logistik-Zuschläge aus AddLogisticsServiceCharge: Dort setzen Sie den Befreiungsgrund mit SetLogisticsServiceChargeExemption. Beim CSV-Import und in zugcmd tragen Sie ihn in die Spalten exemptionreason und exemptionreasoncode der allowances.csv ein.

Ein vollständiges Beispiel für den Befreiungsgrund je Position mit WriteItemTradeTax – auch in Visual FoxPro – und eine Tabelle der geprüften Kombinationen finden Sie in Wie setze ich den Befreiungsgrund (ExemptionReasonCode) in den Positionen?

Gilt das auch für andere Steuerkategorien?

Ja. Dieselbe Regelfamilie gibt es in EXTENDED für die übrigen Kategorien: BR-FXEXT-E-08 (steuerbefreit), BR-FXEXT-AE-08 (Reverse Charge, § 13b UStG), BR-FXEXT-Z-08 (Nullsatz), BR-FXEXT-G-08 (Ausfuhr), BR-FXEXT-O-08 (nicht steuerbar) sowie BR-FXEXT-S-08 (Normalsatz), jeweils mit den Varianten ini und rev. Ursache und Lösung sind dieselben. Welche Kategorie wann passt: 0 % Umsatzsteuer – welche Kategorie?

Häufige Fragen

Sind meine Beträge falsch, wenn BR-FXEXT-IC-08 gemeldet wird?

Meist nicht. Die Regel zählt in EXTENDED nur Positionen und Zuschläge mit demselben Befreiungsgrund wie die Steuerzeile. Fehlt der Grund am Zuschlag, entsteht eine scheinbare Differenz in Höhe des Zuschlags, obwohl die Summen stimmen.

Gibt es BR-FXEXT-IC-08 auch im Profil EN 16931?

Nein. Die Regel gehört zu Factur-X EXTENDED. Im Profil EN 16931 gelten für die Kategorie K die Regeln der Norm (BR-IC-…), die keine Zuordnung über den Befreiungsgrund verlangen.

Wo gehört der Befreiungsgrund bei einer innergemeinschaftlichen Lieferung hin?

In die Umsatzsteueraufschlüsselung (BG-23), also in die Steuerzeile mit AddTradeTax: als Text (BT-120) und optional als Code VATEX-EU-IC (BT-121). In den Positionen bleibt das Feld leer, sonst wird die Rechnung EXTENDED.

Macht die USt-IdNr. des Käufers die Rechnung zu EXTENDED?

Nein, die USt-IdNr. des Käufers (BT-48) ist Teil der EN 16931. EXTENDED wird die Rechnung erst, wenn dieselbe Nummer zusätzlich bei der Lieferanschrift angegeben wird.

Kann ich in EXTENDED einen Befreiungsgrund an einen Zuschlag schreiben?

Ja, ab Version 11.0.0.16 mit SetTradeAllowanceChargeExemption. Verwenden Sie denselben Text (und gegebenenfalls Code) wie in der Steuerzeile, sonst zählt die Regel den Zuschlag weiterhin nicht mit.

Was ist der Unterschied zwischen IC-08ini, IC-08rev und IC-08b?

Die Variante ini zählt alle Beträge der Kategorie K, die Variante rev nur die mit identischem Befreiungsgrund, und IC-08b verlangt, dass eine der beiden erfüllt ist. Laut Regeltext soll künftig nur noch die strengere Variante rev gelten.

Business Terms in diesem Artikel: BT-116 BT-120 BT-24 BT-99 BT-131 BT-48 BT-118 BT-121