F: Wie gebe ich Skonto in der XRechnung an? Das #SKONTO#-Format im SDK

BT-20 BT-9 BT-115 BT-24
Thema
VB.NET
SDK-Mitglieder
AddTradePaymentTerms() IsKosit
Business Terms
BT-20 Zahlungsbedingungen BT-9 Fälligkeitsdatum der Zahlung BT-115 Fälliger Zahlungsbetrag BT-24 Spezifikationskennung
Codebeispiele
VB.NET, VB6 / VBScript (COM), XML
Veröffentlicht

Kurz: In einer XRechnung steht Skonto (Zahlungsrabatt, Skontoabzug, englisch early payment discount oder cash discount) als eigene Zeile in den Zahlungsbedingungen (BT-20, Payment terms), und zwar in einem festen Format: #SKONTO#TAGE=14#PROZENT=2.00#, abgeschlossen mit einem Zeilenumbruch. So schreibt es die Regel BR-DE-18 der XRechnung vor. Mit dem Aloaha ZUGFeRD SDK übergeben Sie diese Zeile als Text an AddTradePaymentTerms. Die Skonto-Parameter derselben Funktion (Prozent, Frist, Betrag) gibt es dagegen nur im Profil EXTENDED: Wer sie setzt, macht aus der XRechnung eine Factur-X-EXTENDED-Rechnung.

Auf einen Blick

WegAufrufProfilFür XRechnung?
Skonto-Zeile als Text in BT-20AddTradePaymentTerms("#SKONTO#TAGE=14#PROZENT=2.00#")bleibt EN 16931 / XRechnungJa, so vorgeschrieben (BR-DE-18)
Skonto nur als FreitextAddTradePaymentTerms("2 % Skonto bei Zahlung in 14 Tagen")bleibt EN 16931 / XRechnungGültig, aber Warnung: Empfänger kann es nicht automatisch verarbeiten
Strukturierte Skonto-ParameterAddTradePaymentTerms(…, Period, DiscountPercent, …)wird Factur-X EXTENDEDNein

Das Format

FallZeile in BT-20
2 % Skonto innerhalb von 14 Tagen auf den Zahlbetrag#SKONTO#TAGE=14#PROZENT=2.00#
Skonto nur auf einen Teilbetrag (z. B. ohne Fracht)#SKONTO#TAGE=14#PROZENT=2.00#BASISBETRAG=850.00#
Zwei Skontostufen#SKONTO#TAGE=7#PROZENT=3.00#
#SKONTO#TAGE=14#PROZENT=2.00#

Die Regeln dazu:

  • Jede Skonto-Angabe ist eine eigene Zeile, beginnt mit #, die Teile werden durch # getrennt, und die Zeile endet mit #.
  • Nach jeder Skonto-Zeile folgt ein Zeilenumbruch, auch nach der letzten.
  • Alles in Großbuchstaben, ohne Leerzeichen.
  • TAGE ist eine ganze Zahl. PROZENT hat einen Punkt als Dezimaltrennzeichen und zwei Nachkommastellen, also 2.00 statt 2 oder 2,00.
  • BASISBETRAG geben Sie nur an, wenn das Skonto nicht auf den gesamten Zahlbetrag (BT-115) gilt. Der Betrag hat ebenfalls einen Punkt und zwei Nachkommastellen.
  • Normaler Text wie „Zahlbar innerhalb 30 Tagen ohne Abzug“ darf in BT-20 stehen, aber in einer eigenen Zeile.

So setzen Sie Skonto mit dem SDK

Am einfachsten rufen Sie AddTradePaymentTerms zweimal auf: einmal für den Text mit dem Fälligkeitsdatum (BT-9) und einmal für die Skonto-Zeile. Das SDK fasst beide in den einen Zahlungsbedingungs-Block zusammen, den EN 16931 erlaubt, setzt einen Zeilenumbruch zwischen die Zeilen und ergänzt den Zeilenumbruch nach der letzten Skonto-Zeile.

' VB.NET
Dim alo As New Aloaha_ZUGFeRD.XML(Aloaha_ZUGFeRD.iXML.ZUGFeRDProfile.comfort, False, "IHR-LIZENZSCHLUESSEL")
alo.isKOSIT = True
' … Rechnungskopf, Parteien, Positionen …
Dim tage As Integer = 14
Dim prozent As Decimal = 2D
Dim inv As System.Globalization.CultureInfo = System.Globalization.CultureInfo.InvariantCulture
alo.AddTradePaymentTerms("Zahlbar innerhalb 30 Tagen ohne Abzug.", "20261127", "102")
alo.AddTradePaymentTerms("#SKONTO#TAGE=" & tage.ToString(inv) & "#PROZENT=" & prozent.ToString("0.00", inv) & "#")
' VBA / VB6 (COM)
Dim alo As Object
Set alo = CreateObject("Aloaha_ZUGFeRD.XML")
alo.isKOSIT = True
' … Rechnungskopf, Parteien, Positionen …
Dim tage As Integer, prozent As Double
tage = 14: prozent = 2
alo.AddTradePaymentTerms "Zahlbar innerhalb 30 Tagen ohne Abzug.", "20261127", "102"
alo.AddTradePaymentTerms "#SKONTO#TAGE=" & tage & "#PROZENT=" & Replace(Format(prozent, "0.00"), ",", ".") & "#"

Wenn Sie alles in einem Aufruf übergeben, setzen Sie die Zeilenumbrüche selbst, auch den am Ende:

' VB.NET
alo.AddTradePaymentTerms("Zahlbar innerhalb 30 Tagen ohne Abzug." & vbLf & _
                         "#SKONTO#TAGE=14#PROZENT=2.00#" & vbLf, "20261127", "102")

Im XML steht danach eine Zahlungsbedingung mit beiden Zeilen und dem Fälligkeitsdatum:

<ram:SpecifiedTradePaymentTerms>
  <ram:Description>Zahlbar innerhalb 30 Tagen ohne Abzug.
#SKONTO#TAGE=14#PROZENT=2.00#
</ram:Description>
  <ram:DueDateDateTime>
    <udt:DateTimeString format="102">20261127</udt:DateTimeString>
  </ram:DueDateDateTime>
</ram:SpecifiedTradePaymentTerms>

Den Prozentsatz formatieren Sie wie oben unabhängig von den Ländereinstellungen: in VB.NET mit ToString("0.00", CultureInfo.InvariantCulture), in VBA mit Replace(Format(prozent, "0.00"), ",", "."). Mit deutschen Einstellungen entstünde sonst 2,00.

Nicht verwenden: die Skonto-Parameter von AddTradePaymentTerms

AddTradePaymentTerms hat zusätzlich die Parameter PeriodUnit, Period, DiscountPercent, DiscountAmount und BasisOfDiscountAmount. Diese strukturierten Skonto-Felder gibt es nur im Profil EXTENDED. Sobald einer davon gefüllt ist, stellt das SDK die Rechnung auf Factur-X EXTENDED um, und viele Empfänger von XRechnungen lehnen sie dann ab. Ab Version 11 meldet LastWarning diese Umstellung mit dem Namen des Aufrufs. Für XRechnung und EN 16931 lassen Sie diese Parameter leer und verwenden die Textzeile. Mehr dazu in Warum wird meine XRechnung als Factur-X EXTENDED erstellt?

Typische Fehler bei der Skonto-Zeile

Diese Fehler führen beim KoSIT-Validator und bei der eingebauten Prüfung des SDK (ab 11.0.0.10, Beta) zu einem Verstoß gegen BR-DE-18:

  • Komma statt Punkt oder ohne Nachkommastellen: PROZENT=2,00 oder PROZENT=2 statt PROZENT=2.00. Häufig, wenn der Wert mit deutschen Ländereinstellungen formatiert wird.
  • Kein Zeilenumbruch nach der letzten Skonto-Zeile.
  • Kleinbuchstaben oder Leerzeichen, z. B. #Skonto#Tage=14# oder # SKONTO #.
  • Text in derselben Zeile, z. B. Skonto: #SKONTO#TAGE=14#PROZENT=2.00#.
  • Das abschließende # fehlt.

Warnung „Skontobedingungen liegen nur als Freitext vor“

Prüfportale wie valitool melden zum Beispiel [VD-Valitool-148]: Die Rechnung enthält Skontobedingungen, aber nur als Freitext („2 % Skonto bei Zahlung innerhalb 14 Tagen“). Die Rechnung bleibt gültig, der Empfänger kann das Skonto aber nicht automatisch verarbeiten. Ergänzen Sie die Skonto-Zeile im obigen Format; den Freitext können Sie zusätzlich behalten. Danach prüfen Sie die Rechnung wie in Wie prüfe ich meine XRechnung vor dem Versand? beschrieben. Meldet das Prüfportal zusätzlich „UTF-8 mit BOM“, hilft diese Antwort.

Gilt das auch für ZUGFeRD?

BR-DE-18 ist eine Regel der XRechnung. In einer ZUGFeRD- oder Factur-X-Rechnung im Profil EN 16931 ist das Format nicht vorgeschrieben, viele deutsche Empfänger werten es aber ebenfalls aus. Es schadet dort nicht. Mit XRechnung 4.0 kommen eigene Felder für strukturiertes Skonto; der Zeitplan steht in XRechnung 4.0: Zeitplan und Änderungen.

Häufige Fragen

Wie sieht die Skonto-Angabe in der XRechnung aus?

Als eigene Zeile in den Zahlungsbedingungen BT-20, zum Beispiel #SKONTO#TAGE=14#PROZENT=2.00#, gefolgt von einem Zeilenumbruch.

Muss nach der Skonto-Zeile ein Zeilenumbruch stehen?

Ja, nach jeder Skonto-Zeile, auch nach der letzten. Das SDK ergänzt ihn, wenn Sie die Skonto-Zeile in einem eigenen Aufruf von AddTradePaymentTerms übergeben.

Wie gebe ich zwei Skontostufen an?

Mit zwei Zeilen, zum Beispiel #SKONTO#TAGE=7#PROZENT=3.00# und #SKONTO#TAGE=14#PROZENT=2.00#, jeweils mit Zeilenumbruch.

Warum wird meine Rechnung EXTENDED, wenn ich Skonto setze?

Weil Prozent, Frist oder Betrag als Parameter von AddTradePaymentTerms übergeben wurden. Diese Felder gibt es nur in EXTENDED. Für XRechnung die Parameter leer lassen und die #SKONTO#-Zeile als Text übergeben.

Warum meldet der Validator BR-DE-18?

Meist steht der Prozentsatz mit Komma oder ohne zwei Nachkommastellen, oder nach der letzten Skonto-Zeile fehlt der Zeilenumbruch.

Ist eine XRechnung mit Skonto nur als Freitext ungültig?

Nein. Prüfportale geben eine Warnung aus, weil der Empfänger das Skonto nicht automatisch verarbeiten kann. Mit der #SKONTO#-Zeile verschwindet die Warnung.

Business Terms in diesem Artikel: BT-20 BT-9 BT-115 BT-24