- Thema
- VB.NET
- SDK-Mitglieder
- AddProduct_Comfort() AddTradeAllowanceCharge() AddTradeTax() WriteBuyer() WriteItemTradeTax()
- Business Terms
- BT-120 Umsatzsteuerbefreiungsgrund BT-121 Code für den Umsatzsteuerbefreiungsgrund BT-151 Code der Umsatzsteuerkategorie des in Rechnung BT-118 Code der Umsatzsteuerkategorie BT-24 Spezifikationskennung BT-131 Nettobetrag der Rechnungsposition
- Codebeispiele
- VB.NET, XML, Visual FoxPro
- Veröffentlicht
Kurz: In EN 16931 und XRechnung gibt es keinen Befreiungsgrund in der Position. Text (BT-120) und Code (BT-121, z. B. VATEX-EU-IC) gehören nur in die Steueraufschlüsselung: Parameter 8 und 12 von AddTradeTax. Die Position bekommt nur Steuerkategorie (BT-151) und Satz. Nur in Factur-X EXTENDED setzen Sie Text und Code je Position mit WriteItemTradeTax. Dann müssen Text und Code an jeder Position, an jedem Zu- und Abschlag und in der Steuerzeile identisch sein – sonst warnt der Validator mit BR-FXEXT-…-08rev.
Gesucht wird das unter vielen Namen: Befreiungsgrund in der Rechnungsposition, Steuerbefreiungsgrund je Position, VAT exemption reason code on line level, ExemptionReasonCode in IncludedSupplyChainTradeLineItem, VATEX-Code in der Position, Grund der Steuerbefreiung bei innergemeinschaftlicher Lieferung, Reverse Charge oder Ausfuhr.
Auf einen Blick
| Profil | Befreiungsgrund in der Position | Befreiungsgrund in der Steuerzeile | SDK-Aufrufe |
|---|---|---|---|
| EN 16931 (ZUGFeRD COMFORT) | nicht vorgesehen | Text und/oder Code (Pflicht bei E, AE, K, G, O) | AddProduct_Comfort ohne Befreiungsgrund, AddTradeTax mit Text und Code |
| XRechnung | nicht vorgesehen | wie EN 16931 | wie EN 16931, zusätzlich isKOSIT = True |
| Factur-X EXTENDED | erlaubt (BT-X-96 Text, BT-X-97 Code) | Text und/oder Code | WriteItemTradeTax je Position, SetTradeAllowanceChargeExemption je Zu-/Abschlag, AddTradeTax |
Setzen Sie einen Befreiungsgrund in der Position, stellt das SDK die Rechnung automatisch auf EXTENDED um und schaltet XRechnung ab – mit Hinweis in LastWarning. Welche Aufrufe das außerdem tun, steht in Warum wird meine XRechnung als Factur-X EXTENDED erstellt?
Weg 1: EN 16931 und XRechnung – Befreiungsgrund nur in der Steuerzeile
Für die meisten Rechnungen ist das der richtige Weg. Die Position trägt nur Kategorie und 0 %, der 23. Parameter von AddProduct_Comfort (TaxExemptionReason) bleibt leer:
' VB.NET
Dim alo As New Aloaha_ZUGFeRD.XML(Aloaha_ZUGFeRD.iXML.ZUGFeRDProfile.comfort, False, "IHR-LIZENZSCHLUESSEL")
' ... CreateInvoice, WriteSeller, WriteBuyer (mit USt-IdNr.), Lieferdatum ...
alo.AddProduct_Comfort("1", "", "A0", "10", "H87", "Bewehrungsanschluss", "Typ 0", "", "EUR", "", "", False, "", "", "",
"9.00", "EUR", "1", "H87", "VAT", "K", "0.00", "", "90.00", "EUR", "", "")
alo.AddProduct_Comfort("2", "", "A1", "10", "H87", "Bewehrungsanschluss", "Typ 1", "", "EUR", "", "", False, "", "", "",
"9.00", "EUR", "1", "H87", "VAT", "K", "0.00", "", "90.00", "EUR", "", "")
' Text = 8. Parameter, Code = 12. Parameter
alo.AddTradeTax("0.00", "EUR", "180.00", "EUR", "VAT", "K", "0.00",
"Steuerfreie innergemeinschaftliche Lieferung", "", "", "", "VATEX-EU-IC")
Ergebnis im XML: Die Position hat keinen Befreiungsgrund, die Steuerzeile Text und Code.
<!-- Position -->
<ram:ApplicableTradeTax>
<ram:TypeCode>VAT</ram:TypeCode>
<ram:CategoryCode>K</ram:CategoryCode>
<ram:RateApplicablePercent>0.00</ram:RateApplicablePercent>
</ram:ApplicableTradeTax>
<!-- Steuerzeile (BG-23) -->
<ram:ApplicableTradeTax>
<ram:CalculatedAmount>0.00</ram:CalculatedAmount>
<ram:TypeCode>VAT</ram:TypeCode>
<ram:ExemptionReason>Steuerfreie innergemeinschaftliche Lieferung</ram:ExemptionReason>
<ram:BasisAmount>180.00</ram:BasisAmount>
<ram:CategoryCode>K</ram:CategoryCode>
<ram:ExemptionReasonCode>VATEX-EU-IC</ram:ExemptionReasonCode>
<ram:RateApplicablePercent>0.00</ram:RateApplicablePercent>
</ram:ApplicableTradeTax>
Weg 2: Factur-X EXTENDED – Befreiungsgrund je Position mit WriteItemTradeTax
Brauchen Sie den Befreiungsgrund wirklich in jeder Position, rufen Sie direkt nach AddProduct_Comfort WriteItemTradeTax auf. Der erste Parameter ist der Rückgabewert von AddProduct_Comfort – der Index der Position, gezählt ab 0. WriteItemTradeTax ersetzt die Steuerangaben der Position komplett, Kategorie und Satz geben Sie deshalb noch einmal mit.
' VB.NET
Dim text As String = "Steuerfreie innergemeinschaftliche Lieferung"
Dim code As String = "VATEX-EU-IC"
For i As Integer = 0 To 1
Dim idx As Integer = alo.AddProduct_Comfort(CStr(i + 1), "", "A" & i, "10", "H87", "Bewehrungsanschluss", "Typ " & i, "", "EUR", "", "", False, "", "", "",
"9.00", "EUR", "1", "H87", "VAT", "K", "0.00", "", "90.00", "EUR", "", "")
alo.WriteItemTradeTax(idx, "0.00", "K", text, code) ' Index, Satz, Kategorie, Text, Code
Next
' Zu- oder Abschlag derselben Kategorie: derselbe Text und Code (ab Version 11.0.0.16)
alo.AddTradeAllowanceCharge(True, "", "EUR", "15.00", "EUR", "VAT", "K", "0.00", "Verpackung")
alo.SetTradeAllowanceChargeExemption(-1, text, code) ' -1 = zuletzt angelegter Zu-/Abschlag
' Steuerzeile: wieder derselbe Text und Code
alo.AddTradeTax("0.00", "EUR", "195.00", "EUR", "VAT", "K", "0.00", text, "", "", "", code)
Dasselbe in Visual FoxPro über COM:
loAlo = CREATEOBJECT("Aloaha_ZUGFeRD.XML")
&& ... CreateInvoice, WriteSeller, WriteBuyer ...
lcText = "Steuerfreie innergemeinschaftliche Lieferung"
lcCode = "VATEX-EU-IC"
lnIdx = loAlo.AddProduct_Comfort(1, "", "A0", "10", "H87", "Bewehrungsanschluss", "Typ 0", ;
"", "EUR", "", "", .F., "", "", "", "9.00", "EUR", "1", ;
"H87", "VAT", "K", "0.00", "", "90.00", "EUR", "", "")
loAlo.WriteItemTradeTax(lnIdx, "0.00", "K", lcText, lcCode)
loAlo.AddTradeAllowanceCharge(.T., "", "EUR", "15.00", "EUR", "VAT", "K", "0.00", "Verpackung")
loAlo.SetTradeAllowanceChargeExemption(-1, lcText, lcCode)
loAlo.AddTradeTax("0.00", "EUR", "195.00", "EUR", "VAT", "K", "0.00", lcText, "", "", "", lcCode)
Ergebnis in der Position:
<ram:ApplicableTradeTax>
<ram:TypeCode>VAT</ram:TypeCode>
<ram:ExemptionReason>Steuerfreie innergemeinschaftliche Lieferung</ram:ExemptionReason>
<ram:CategoryCode>K</ram:CategoryCode>
<ram:ExemptionReasonCode>VATEX-EU-IC</ram:ExemptionReasonCode>
<ram:RateApplicablePercent>0.00</ram:RateApplicablePercent>
</ram:ApplicableTradeTax>
Warum der Validator warnt: BR-FXEXT-…-08rev
In EXTENDED rechnet der Validator für jede Steuerzeile nach, ob ihre Bemessungsgrundlage zur Summe der Positionen und Zu- und Abschläge passt. Dabei zählt die Regel 08rev nur die Beträge mit demselben Text und demselben Code wie die Steuerzeile. Fehlt der Text an der Position oder ist er anders geschrieben, zählt die Position nicht mit – die Summe geht nicht auf, und es kommt die Warnung. Wir haben die Fälle mit dem SDK, dem eingebauten Validator und dem Mustang-Validator 2.26.0 geprüft:
| Position | Zuschlag | Steuerzeile | Ergebnis |
|---|---|---|---|
| kein Befreiungsgrund | kein Befreiungsgrund | Text + Code | EN 16931, gültig, keine Warnung |
| Text + Code | – | Text + Code | EXTENDED, gültig, keine Warnung |
| Text + Code | Text + Code | Text + Code | EXTENDED, gültig, keine Warnung |
| nur Code | – | nur Code | EXTENDED, gültig, keine Warnung |
| nur Code | – | Text + Code | Warnung BR-FXEXT-IC-08rev |
| anderer Text + Code | – | Text + Code | Warnung BR-FXEXT-IC-08rev |
Für die anderen Kategorien heißen die Regeln BR-FXEXT-E-08rev, BR-FXEXT-AE-08rev, BR-FXEXT-G-08rev usw. Mehr zur Regel und zu Zuschlägen: Validator meldet BR-FXEXT-IC-08.
Welcher Code passt?
| Kategorie (BT-151) | Bedeutung | Code (BT-121) |
|---|---|---|
| K | innergemeinschaftliche Lieferung | VATEX-EU-IC |
| AE | Reverse Charge, § 13b UStG | VATEX-EU-AE |
| G | Ausfuhr in ein Drittland | VATEX-EU-G |
| O | nicht steuerbar | VATEX-EU-O |
| E | steuerbefreit | je nach Befreiung, z. B. VATEX-EU-132 … oder nur Text |
Typische Fehler
- Code nur in der Position: Der Code steht an der Position, in der Steuerzeile aber Text und Code. In EXTENDED passt das nicht zusammen → Warnung. In EN 16931 wird die Rechnung dadurch unbemerkt EXTENDED.
- Befreiungsgrund in der Position bei XRechnung: Das SDK schaltet auf EXTENDED um, die Rechnung ist keine XRechnung mehr. Behörden lehnen sie dann ab.
- Unterschiedliche Schreibweise: „Steuerfreie innergemeinschaftliche Lieferung“ und „steuerfreie ig. Lieferung“ sind für den Validator zwei verschiedene Gründe. Verwenden Sie eine Variable für alle Aufrufe.
- Zuschlag vergessen: Fracht oder Verpackung derselben Kategorie brauchen in EXTENDED denselben Befreiungsgrund (
SetTradeAllowanceChargeExemption, für Logistik-ZuschlägeSetLogisticsServiceChargeExemption). - Falscher Index:
WriteItemTradeTaxerwartet den Index ab 0 (Rückgabewert vonAddProduct_Comfort), nicht die Positionsnummer aus Ihrem System.
Häufige Fragen
Wie setze ich den ExemptionReasonCode in einer Rechnungsposition?
Mit WriteItemTradeTax(Index, Satz, Kategorie, Text, Code) direkt nach AddProduct_Comfort; der Index ist der Rückgabewert von AddProduct_Comfort (ab 0). Das gibt es nur in Factur-X EXTENDED – das SDK stellt die Rechnung dann automatisch auf EXTENDED um.
Brauche ich einen Befreiungsgrund in den Positionen für EN 16931 oder XRechnung?
Nein. In EN 16931 und XRechnung gibt es den Befreiungsgrund nur in der Steueraufschlüsselung (BT-120 Text, BT-121 Code). Setzen Sie ihn mit AddTradeTax (Parameter 8 und 12) und lassen Sie ihn in den Positionen leer.
Warum meldet der Validator BR-FXEXT-IC-08rev, obwohl die Beträge stimmen?
Weil die Regel nur Positionen und Zu-/Abschläge mitzählt, deren Befreiungsgrund (Text und Code) genau dem der Steuerzeile entspricht. Steht nur der Code an der Position oder ist der Text anders geschrieben, fehlen diese Beträge in der Rechnung des Validators.
Reicht der Code ohne Text?
Ja, wenn er überall gleich ist: Code ohne Text an den Positionen und Code ohne Text in der Steuerzeile ist gültig. Ein Text nur in der Steuerzeile führt in EXTENDED dagegen zur Warnung.
Welchen Code nehme ich für eine innergemeinschaftliche Lieferung?
VATEX-EU-IC mit Kategorie K. Für Reverse Charge nach § 13b UStG VATEX-EU-AE mit Kategorie AE, für Ausfuhren VATEX-EU-G mit Kategorie G.
Ab welcher Version gibt es SetTradeAllowanceChargeExemption?
Ab Version 11.0.0.16. WriteItemTradeTax und der Code in AddTradeTax gibt es schon länger. Mit gültigem Wartungsvertrag ist das Update kostenlos.
Business Terms in diesem Artikel: BT-120 BT-121 BT-151 BT-118 BT-24 BT-131