F: XRechnung für Behörden und ZUGFeRD für Unternehmen – wie bediene ich beide aus einer Software?

BT-10 BT-24 BT-13 BT-132 BT-41
Thema
VB.NET
SDK-Mitglieder
Add_ReferencedDocument() CreateInvoice() IsKosit WriteBuyer() WriteSeller() WriteSellerContactPerson() ZUGFeRD_Profile ZUGfeRDStandard
Business Terms
BT-10 Referenz des Käufers BT-24 Spezifikationskennung BT-13 Bestellreferenz BT-132 Referenz zur Bestellposition BT-41 Kontaktstelle des Verkäufers
Codebeispiele
VB.NET
Veröffentlicht

Kurz: Sie brauchen keine zwei Programmversionen. Entscheiden Sie je Rechnung anhand des Empfängers, am besten über ein Kennzeichen im Kundenstamm: Für Behörden und andere öffentliche Auftraggeber (B2G) erzeugen Sie eine XRechnung (alo.isKOSIT = True mit Leitweg-ID, BT-10), für Unternehmen (B2B) eine ZUGFeRD-/Factur-X-Rechnung im Profil EN 16931 (COMFORT) – und nur wo nötig EXTENDED, etwa für Sammelrechnungen mit Bestellnummer je Position. Der übrige Code ist für beide gleich. Vor dem Speichern prüfen Sie mit alo.isKOSIT, alo.ZUGFeRD_Profile und alo.LastWarning, ob eine Behördenrechnung wirklich noch eine XRechnung ist.

Typische Suchbegriffe dafür sind „B2G und B2B mit einer Software“, „XRechnung und ZUGFeRD parallel erzeugen“, „öffentliche Auftraggeber und Industriekunden“, „Kommune, Landesamt oder Bundesbehörde als Kunde“ oder „welches Profil für welchen Empfänger“. Welches Profil eine Rechnung hat, steht im XML in der Spezifikationskennung (BT-24, GuidelineSpecifiedDocumentContextParameter).

Auf einen Blick

EmpfängerFormatEinstellung im SDKDarauf achten
Behörde, Kommune, öffentlicher Auftraggeber (B2G)XRechnung – meist als XML-Datei über das Rechnungsportal der BehördeZUGfeRDStandard = xInvoice, isKOSIT = True, Leitweg-IDLeitweg-ID (BT-10) und Kontakt des Verkäufers sind Pflicht; keine EXTENDED-Felder
Unternehmen, Standardfall (B2B)ZUGFeRD / Factur-X EN 16931 (COMFORT) als PDF/A-3 mit eingebettetem XMLProfil comfortkann jeder Empfänger verarbeiten; gilt nach dem BMF-Schreiben als E-Rechnung
Unternehmen mit SonderfällenZUGFeRD / Factur-X EXTENDEDstellt das SDK automatisch um, sobald ein EXTENDED-Feld gesetzt wirdnur wenn nötig, z. B. Bestellnummer je Position; vorher mit dem Empfänger abstimmen

Die Unterschiede der Profile im Detail: ZUGFeRD-Profile im Vergleich und ZUGFeRD, XRechnung und Factur-X: Was ist der Unterschied?

Der häufigste Fehler: Die Behördenrechnung wird unbemerkt EXTENDED

Das SDK stellt eine Rechnung automatisch auf Factur-X EXTENDED um, sobald Sie ein Feld setzen, das es nur in EXTENDED gibt – zum Beispiel eine Bestellnummer je Position mit Add_ReferencedDocument oder einen Befreiungsgrund in der Position. Damit keine Angabe verloren geht, wird isKOSIT dabei zurückgesetzt. Läuft derselbe Code für Industrie- und Behördenkunden, landet so ein EXTENDED-Feld leicht auch in einer Behördenrechnung, und die Behörde weist die Rechnung als „keine XRechnung“ zurück. Welche Aufrufe auf EXTENDED umstellen, zeigt Warum wird meine XRechnung als Factur-X EXTENDED erstellt?

Abhilfe: EXTENDED-Felder nur im Zweig für Unternehmenskunden aufrufen und vor dem Speichern prüfen (siehe unten).

Ein Code für beide Empfänger (VB.NET)

Dim alo As New Aloaha_ZUGFeRD.XML(Aloaha_ZUGFeRD.iXML.ZUGFeRDProfile.comfort, False, "IHR-LIZENZSCHLUESSEL")

If kunde.IstBehoerde Then
    alo.ZUGfeRDStandard = Aloaha_ZUGFeRD.iXML.ZUGFeRDVersion.xInvoice
    alo.isKOSIT = True                                          ' XRechnung
End If

alo.CreateInvoice(rechnung.Nummer, "", rechnung.Datum, "102", , "", "EUR")
alo.WriteSeller("Muster GmbH", "75179", "Pforzheim", "Werkstraße 1", "", "DE", "DE123456789")
alo.WriteSellerContactPerson("Buchhaltung", "", "rechnung@muster.example", "+49 7231 000000")   ' BT-41..43

' Käufer: der 9. Parameter ist die Leitweg-ID (BT-10) - bei Unternehmen leer oder deren Bestellerreferenz
alo.WriteBuyer(kunde.Name, kunde.PLZ, kunde.Ort, kunde.Strasse, "", "DE", kunde.Kundennummer, kunde.UStIdNr, kunde.LeitwegID)

' ... Zahlungsangaben, Positionen, Steuer, Summen wie gewohnt ...

If Not kunde.IstBehoerde AndAlso rechnung.IstSammelrechnung Then
    ' nur für Unternehmen: Bestellnummer je Position (stellt auf EXTENDED um)
    alo.Add_ReferencedDocument(Aloaha_ZUGFeRD.iXML.WhichReferencedDocument.BuyerOrderReferencedDocument, _
                               posIndex, pos.Bestellnummer, pos.Bestellposition)
End If

' Prüfung vor dem Speichern
If kunde.IstBehoerde AndAlso (Not alo.isKOSIT OrElse _
        alo.ZUGFeRD_Profile = Aloaha_ZUGFeRD.iXML.ZUGFeRDProfile.extended) Then
    Throw New ApplicationException("Behördenrechnung ist keine XRechnung mehr: " & alo.LastWarning)
End If

Danach speichern Sie wie gewohnt: für die Behörde das XML mit SaveXML (Upload ins Rechnungsportal oder Versand per Peppol), für Unternehmen zusätzlich mit MergeXMLIntoPDF als ZUGFeRD-PDF. Manche Behörden nehmen auch ein ZUGFeRD-PDF im Profil XRECHNUNG an; das steht in ihren Vorgaben (Beispiel: XRechnung an Vermögen und Bau BW).

Die Leitweg-ID können Sie statt im 9. Parameter von WriteBuyer auch über die Eigenschaft alo.LeitwegID setzen; mehr dazu unter Leitweg-ID und Kundennummer.

Welches Profil hat meine Rechnung?

AbfrageErgebnis
alo.ZUGFeRD_Profilebasic (0), comfort (1, = EN 16931) oder extended (2)
alo.isKOSITTrue = XRechnung
alo.LastWarningab Version 11: welcher Aufruf eine XRechnung auf EXTENDED umgestellt hat
BT-24 im XMLSpezifikationskennung, z. B. urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0 für XRechnung

Vor dem ersten Versand an einen neuen Empfänger lohnt sich eine Prüfung mit einem Validator – auch direkt im SDK: E-Rechnung im SDK prüfen (Beta).

Sammelrechnungen an Behörden

Eine Bestellnummer je Position gibt es in der XRechnung nicht. Für Behörden erstellen Sie je Bestellung eine Rechnung oder schreiben die Bestellnummern als Text in den Positionshinweis (BT-127) – Details im Abschnitt Sammelrechnung der BT-132-FAQ. Mit der XRechnung 4.0 sollen mehrere Bestellungen je Rechnung möglich werden; das SDK unterstützt das über zusätzliche Funktionen, sobald die finale Version vorliegt. Mit gültigem Wartungsvertrag ist das Upgrade kostenlos.

Häufige Fragen

Muss ich für Behörden und Industriekunden zwei Programmversionen pflegen?

Nein. Ein Kennzeichen im Kundenstamm genügt: Für Behörden setzen Sie ZUGfeRDStandard = xInvoice, isKOSIT = True und die Leitweg-ID, für Unternehmen bleibt das Profil EN 16931 (COMFORT). Der übrige Code ist für beide gleich.

Welches Profil sollte ich für Industriekunden verwenden?

EN 16931 (COMFORT) als Standard, weil es jeder Empfänger verarbeiten kann und als E-Rechnung gilt. EXTENDED nur, wenn Sie Felder brauchen, die es nur dort gibt, etwa eine Bestellnummer je Position bei Sammelrechnungen.

Ist eine ZUGFeRD-EXTENDED-Rechnung auch eine XRechnung?

Nein. Eine EXTENDED-Rechnung hat eine andere Spezifikationskennung (BT-24) und wird von Empfängern, die eine XRechnung verlangen, zurückgewiesen. Das SDK setzt isKOSIT zurück, sobald es auf EXTENDED umstellt.

Wie erkenne ich im Programm, welches Profil eine Rechnung hat?

Vor dem Speichern über alo.ZUGFeRD_Profile (basic, comfort oder extended) und alo.isKOSIT (True = XRechnung). Ab Version 11 nennt alo.LastWarning den Aufruf, der eine XRechnung auf EXTENDED umgestellt hat. Im XML steht das Profil in BT-24.

Brauche ich die Leitweg-ID auch für Unternehmenskunden?

Nein. Die Leitweg-ID (BT-10) ist bei Rechnungen an deutsche Behörden Pflicht. Bei Unternehmen bleibt das Feld leer oder enthält eine Bestellerreferenz, die der Kunde vorgibt.

Darf ich auch Unternehmen eine XRechnung schicken?

Ja, die XRechnung erfüllt die EN 16931 und gilt auch im B2B-Bereich als E-Rechnung. Viele Unternehmen bevorzugen aber ZUGFeRD, weil das PDF zusätzlich eine lesbare Rechnung enthält. Stimmen Sie das Format im Zweifel mit dem Kunden ab.

Business Terms in diesem Artikel: BT-10 BT-24 BT-13 BT-132 BT-41