F: Wie erstelle ich eine XRechnung, die verrechnet statt bezahlt wird?

Thema
Fragen und Antworten
SDK-Mitglieder
ActualDeliveryDate_102 AddPaymentMeans() AddProduct_Comfort() AddTradePaymentTerms() AddTradeTax() BusinessProcessSpecifiedDocumentContextParameter BuyerReference CreateInvoice() IsKosit Last_Error
Business Terms
BT-81 Code für die Zahlungsart BT-82 Text zur Zahlungsart BT-20 Zahlungsbedingungen BT-72 Tatsächliches Lieferdatum BG-16 Zahlungsanweisungen BG-14 Rechnungszeitraum BT-9 Fälligkeitsdatum der Zahlung BT-83 Verwendungszweck
Codebeispiele
VB.NET
Veröffentlicht

Kurz: Wird der Rechnungsbetrag nicht überwiesen, sondern mit einer Abrechnung oder Gutschrift verrechnet (einbehalten), verwenden Sie als Zahlungsart (BT-81) den Code 97 „Verrechnung zwischen Partnern“. Den Hinweis zur Verrechnung schreiben Sie in den Zahlungsart-Text (BT-82) und in die Zahlungsbedingungen (BT-20). Bankdaten sind dann nicht nötig.

Was die XRechnung verlangt

  • Die Gruppe Zahlungsanweisungen (BG-16) mit der Zahlungsart ist in der XRechnung Pflicht – auch wenn nichts überwiesen wird. Code 97 ist dafür vorgesehen.
  • IBAN und BIC werden nur für Überweisung (30, 58) und Lastschrift (59) verlangt – bei 97 bleiben sie leer.
  • Ist ein Betrag fällig, braucht die Rechnung ein Fälligkeitsdatum (BT-9) oder Zahlungsbedingungen (BT-20). Ein Satz wie „Der Betrag wird mit Abrechnung … verrechnet.“ erfüllt das.
  • Das Liefer- bzw. Leistungsdatum (BT-72) oder einen Leistungszeitraum (BG-14) sollten Sie immer angeben – das verlangt § 14 UStG ohnehin.

Beispiel mit dem Aloaha ZUGFeRD SDK (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("2026-0815", "Gebührenrechnung zur Abrechnung 2026-0815", "20261013", "102", , "", "EUR")

' Leistungsdatum (BT-72) und Abrechnungszeitraum (BG-14)
alo.ActualDeliveryDate_102 = "20261013"
alo.WriteBillingPeriod("20260901", "20260930", "102")

' Käufer, Verkäufer, Kontaktpersonen (Name ODER Abteilung, nicht beides)
alo.WriteBuyer("Muster GmbH", "12345", "Musterstadt", "Musterstraße 1", "", "DE", "K-4711")   ' Land (BT-55) und Kundennummer (BT-46)
alo.BuyerReference = "4711"
alo.WriteBuyerContactPerson("Max Muster", "", "rechnung@muster.example", "+49 30 123456")
alo.set_URIUniversalCommunication("rechnung@muster.example", "EM", False)   ' BT-49

alo.WriteSeller("Beispiel AG", "54321", "Beispielstadt", "Hauptstraße 2", "", "DE", "DE123456789")
alo.WriteSellerContactPerson("Erika Beispiel", "", "buchhaltung@beispiel.example", "+49 40 654321")
alo.set_URIUniversalCommunication("buchhaltung@beispiel.example", "EM", True) ' BT-34

' Zahlungsart 97 = Verrechnung, ohne Bankdaten (BT-81, BT-82)
alo.AddPaymentMeans(Aloaha_ZUGFeRD.iXML.Payment_Means.ClearanceBetweenPartners, _
                    "Verrechnung mit Abrechnung 2026-0815", "")
' Zahlungsbedingungen (BT-20)
alo.AddTradePaymentTerms("Der Betrag wird mit der Abrechnung 2026-0815 verrechnet. Keine Zahlung erforderlich.")
alo.PaymentReference = "2026-0815"                    ' BT-83

' Position, Steuer, Summen wie bei jeder anderen Rechnung
alo.AddProduct_Comfort("1", "", "", "1.00", "C62", "Abrechnungsgebühr", "", "", "EUR", "", "C62", False, "", "", "", _
                       "100.00", "EUR", "1.00", "C62", "VAT", "S", "19.00", "", "100.00", "EUR", "", "")
alo.AddTradeTax("19.00", "EUR", "100.00", "EUR", "VAT", "S", "19.00")   ' DueDateTypeCode leer lassen
alo.WriteTotals("100.00", "119.00", "119.00", "100.00", "19.00", "0.00", "0.00", "0.00", "0.00")

alo.SaveXML("C:\Rechnungen\xrechnung.xml")
If alo.Last_Error <> "" Then Console.WriteLine(alo.Last_Error)

Das mit diesem Code erzeugte XML wird vom KoSIT-Validator (XRechnung 3.0.2) ohne Fehler und ohne Warnungen angenommen. Alle Namen, Nummern und Adressen im Beispiel sind Muster-Werte. Fälliger Betrag (BT-115) bleibt der Rechnungsbetrag – verrechnet wird er außerhalb der Rechnung.

Typische Stolpersteine

  • Kein Liefer- oder Leistungsdatum: Ältere SDK-Versionen lassen dann den Lieferblock weg, die XRechnung wird mit einem Schemafehler abgelehnt – siehe „ApplicableHeaderTradeDelivery is expected“.
  • Datum statt Code bei der Steuer: Der letzte Parameter von AddTradeTax ist ein Code, kein Datum – siehe BR-CL-06.
  • Name und Abteilung beim Ansprechpartner: nur eines von beiden – siehe CII-SR-465.
  • Land des Käufers vergessen: Das Land (BT-55) ist Pflicht. Übergeben Sie es bei WriteBuyer oder setzen Sie alo.BuyerCountry = "DE".
  • Variablenname in Anführungszeichen: set_URIUniversalCommunication("MeineEmailVariable", …) schreibt den Text statt der Adresse in die Rechnung. Der Validator merkt das nicht.
  • Beträge mit Komma: Beträge immer mit Punkt übergeben, z. B. Betrag.ToString("0.00", System.Globalization.CultureInfo.InvariantCulture).

Prüfen Sie das Ergebnis vor dem Versand mit dem KoSIT-Validator: Wie prüfe ich meine XRechnung vor dem Versand? Mehr zu den Zahlungsarten: AddPaymentMeans und AddTradePaymentTerms.

Business Terms in diesem Artikel: BT-81 BT-82 BT-20 BT-72 BG-16 BG-14 BT-9 BT-83