↓ Zum Hauptinhalt springen
csv2zugferd

beispiele

ZUGFeRD mit Bankverbindung und SEPA-Lastschrift

Beispiel: IBAN, BIC und SEPA-Lastschriftdaten (Gläubiger-ID, Mandatsreferenz) per YAML-Mapping in die ZUGFeRD-Rechnung schreiben – mit csv2zugferd ab Version 1.1.0.

Seit Version 1.1.0 schreibt csv2zugferd die Bankverbindung des Verkäufers und SEPA-Lastschriftdaten in die ZUGFeRD-Rechnung. Konfiguriert wird das im YAML-Abschnitt paymentMeans. Die Werte kommen entweder fest aus der Konfiguration (typisch für die eigene IBAN) oder pro Rechnung aus einer CSV-Spalte (typisch für Mandat und Kunden-IBAN).

ZahlungsarttypeCodePflichtangaben
SEPA-Überweisung58IBAN des Verkäufers (BT-84)
Überweisung (nicht SEPA)30IBAN bzw. Kontonummer des Verkäufers (BT-84)
SEPA-Lastschrift59Gläubiger-ID (BT-90), Mandatsreferenz (BT-89), IBAN des Käufers (BT-91)

Beispiel 1: SEPA-Überweisung mit fester IBAN
#

Die eigene Bankverbindung ändert sich selten und steht deshalb direkt in der YAML-Datei. Als Verwendungszweck wird die Rechnungsnummer aus der CSV übernommen.

mapping:
  paymentMeans:
    typeCode:
      value: "58"
    information:
      value: "SEPA-Überweisung"
    paymentReference:
      column: "INVOICE_NO"
    sellerAccounts:
      - iban:
          value: "DE02 1203 0000 0000 2020 51"
        bic:
          value: "BYLADEM1001"
        name:
          value: "Muster GmbH"

Leerzeichen in IBAN und BIC werden entfernt. Mehrere Konten sind möglich, dafür weitere Einträge unter sellerAccounts anlegen.

Ergebnis im ZUGFeRD-XML:

<ram:ApplicableHeaderTradeSettlement>
  <ram:PaymentReference>2026-0001</ram:PaymentReference>
  <ram:InvoiceCurrencyCode>EUR</ram:InvoiceCurrencyCode>
  <ram:SpecifiedTradeSettlementPaymentMeans>
    <ram:TypeCode>58</ram:TypeCode>
    <ram:Information>SEPA-Überweisung</ram:Information>
    <ram:PayeePartyCreditorFinancialAccount>
      <ram:IBANID>DE02120300000000202051</ram:IBANID>
      <ram:AccountName>Muster GmbH</ram:AccountName>
    </ram:PayeePartyCreditorFinancialAccount>
    <ram:PayeeSpecifiedCreditorFinancialInstitution>
      <ram:BICID>BYLADEM1001</ram:BICID>
    </ram:PayeeSpecifiedCreditorFinancialInstitution>
  </ram:SpecifiedTradeSettlementPaymentMeans>
  …

Beispiel 2: SEPA-Lastschrift mit Mandat aus der CSV
#

Bei einer Lastschrift zieht der Verkäufer den Betrag ein. Mandatsreferenz und Kunden-IBAN sind pro Kunde verschieden und kommen deshalb aus der CSV:

INVOICE_NO;INVOICE_DATE;...;MANDATE_ID;CUSTOMER_IBAN;CUSTOMER_BIC
2026-0002;28.09.2026;...;MANDAT-2026-001;DE89 3704 0044 0532 0130 00;COBADEFFXXX
mapping:
  paymentMeans:
    typeCode:
      value: "59"
    information:
      value: "SEPA-Lastschrift"
    paymentReference:
      column: "INVOICE_NO"
    directDebit:
      creditorId:
        value: "DE98ZZZ09999999999"
      mandateReference:
        column: "MANDATE_ID"
      buyerIban:
        column: "CUSTOMER_IBAN"
      buyerBic:
        column: "CUSTOMER_BIC"

Ergebnis im ZUGFeRD-XML (gekürzt):

<ram:ApplicableHeaderTradeSettlement>
  <ram:CreditorReferenceID>DE98ZZZ09999999999</ram:CreditorReferenceID>
  <ram:PaymentReference>2026-0002</ram:PaymentReference>
  …
  <ram:SpecifiedTradeSettlementPaymentMeans>
    <ram:TypeCode>59</ram:TypeCode>
    <ram:Information>SEPA-Lastschrift</ram:Information>
    <ram:PayerPartyDebtorFinancialAccount>
      <ram:IBANID>DE89370400440532013000</ram:IBANID>
    </ram:PayerPartyDebtorFinancialAccount>
  </ram:SpecifiedTradeSettlementPaymentMeans>
  <ram:SpecifiedTradePaymentTerms>
    …
    <ram:DirectDebitMandateID>MANDAT-2026-001</ram:DirectDebitMandateID>
  </ram:SpecifiedTradePaymentTerms>

Die Kunden-IBAN erscheint im Log von csv2zugferd nur maskiert, zum Beispiel DE89**************3000.

Beispiel 3: Überweisung und Lastschrift in einer CSV
#

Viele CRM- und ERP-Exporte enthalten Kunden mit und ohne Lastschriftmandat. Über eine Regel wählt csv2zugferd die Zahlungsart pro Rechnung:

mapping:
  paymentMeans:
    typeCode:
      default: "58"
      rules:
        - when:
            column: "PAYMENT_METHOD"
            regex: "(?i)^lastschrift$"
          value: "59"
    paymentReference:
      column: "INVOICE_NO"
    sellerAccounts:
      - iban:
          value: "DE02120300000000202051"
    directDebit:
      creditorId:
        value: "DE98ZZZ09999999999"
      mandateReference:
        column: "MANDATE_ID"
      buyerIban:
        column: "CUSTOMER_IBAN"

directDebit wird nur ausgewertet, wenn die Zahlungsart 59 (oder 49) ist. Bei einer Überweisung bleiben Mandat und Kunden-IBAN deshalb automatisch weg.

Aufruf
#

.\csv2zugferd-win-x64.exe --csv .\rechnungen.csv --pdf .\rechnung.pdf --config .\config.yml --output .\out

Warnungen statt Abbruch
#

Fehlen Pflichtangaben, bricht csv2zugferd nicht ab, sondern schreibt eine Warnung ins Log:

[WRN] Zahlungsart 58 (Überweisung) ohne IBAN des Verkäufers (BR-61)
[WRN] SEPA-Lastschrift ohne Mandatsreferenz (BT-89)

Geprüft werden außerdem die IBAN-Prüfsumme und fehlende Zahlungsanweisungen im Profil XRechnung (BR-DE-1). Ein unbekannter typeCode führt dagegen zu einem Fehler, weil die Konfiguration dann nicht stimmt.

Die erzeugte Rechnung vor dem produktiven Einsatz mit einem Validator prüfen, siehe ZUGFeRD-Validierung. Beim Mischen von Verkäuferkonto und Lastschrift erzeugt die zugrunde liegende Bibliothek je Konto einen eigenen Zahlungsblock.

Alle Felder im Überblick: YAML-Konfiguration – Zahlungsmittel und Bankverbindung · BT-Felder in ZUGFeRD

Häufige Fragen

Muss eine ZUGFeRD-Rechnung eine IBAN enthalten?

Nicht in jedem Fall. Die Zahlungsanweisungen (BG-16) sind in EN 16931 optional. Wird aber eine Überweisung als Zahlungsart angegeben (Code 30 oder 58), ist die IBAN des Verkäufers Pflicht (Regel BR-61). Im ZUGFeRD-Profil XRechnung sind Zahlungsanweisungen immer Pflicht (BR-DE-1).

Ab welcher Version kann csv2zugferd Bankdaten schreiben?

Ab csv2zugferd 1.1.0. Die Bankverbindung wird im YAML-Abschnitt paymentMeans konfiguriert.

Welche Angaben braucht eine SEPA-Lastschrift in der E-Rechnung?

Zahlungsart 59, die Gläubiger-ID des Verkäufers (BT-90), die Mandatsreferenz (BT-89) und die IBAN des Käufers (BT-91). csv2zugferd warnt im Log, wenn eine dieser Angaben fehlt.

Kann Überweisung und Lastschrift in einer CSV gemischt werden?

Ja. typeCode unterstützt Regeln: Enthält zum Beispiel eine Spalte PAYMENT_METHOD den Wert Lastschrift, wird Code 59 gesetzt, sonst 58 für SEPA-Überweisung.