Peppol BIS nach KSeF FA(3)
Diese Seite beschreibt, wie xTool Peppol BIS Billing 3.0 (UBL-Rechnung oder Gutschrift) auf KSeF FA(3) abbildet.
Die Konvertierung ist einseitig: Peppol → KSeF. Der umgekehrte Weg (KSeF → Peppol) existiert separat und wird hier nicht beschrieben.
| Rolle | Formatcode |
|---|---|
| Quellrechnung | peppol_bis_billing.invoice.3_0.xml_ubl |
| Quellgutschrift | peppol_bis_billing.credit_note.3_0.xml_ubl |
| Ziel | ksef_fa.invoice.3_0.xml |
xTool mappt Peppol zuerst in den Canonical-Hub (xtool.canonical.1_0) und erzeugt daraus FA(3). Das Ergebnis wird gegen die offizielle FA(3)-XSD validiert.
Zum Verbinden der Organisation mit KSeF vor dem Versand: Mit KSeF verbinden. Zum automatischen Konvertieren: Validieren und konvertieren und SFTP (+fa3 im Dateinamen). Bei einem Raw PDF per SFTP nutzt xTool PDF-Erkennung nach FA(3) statt Peppol-zu-FA-Konvertierung — siehe Raw PDF mit Formatcode.
Rechnungen (Typ 380)
Eine Peppol-Handelsrechnung (InvoiceTypeCode = 380) wird zu einem Standard-KSeF-Dokument mit RodzajFaktury = VAT. Beträge werden unverändert übernommen — das Vorzeichen wird nicht geändert.
| Peppol BIS | KSeF FA(3) | Hinweis |
|---|---|---|
| Rechnungsnummer (BT-1) | P_2 |
Unverändert |
| Ausstellungsdatum (BT-2) | P_1 |
Unverändert |
| Steuerzeitpunkt (BT-7) / Lieferdatum | P_6 |
Lieferdatum, falls vorhanden, sonst Steuerzeitpunkt |
| Rechnungszeitraum | P_6_OD / P_6_DO |
Beginn und Ende |
| Währung (BT-5) | KodWaluty |
z. B. PLN, EUR |
| Verkäufer (BG-4) | Podmiot1 |
NIP, Name, Adresse, Kontakte |
| Käufer (BG-7) | Podmiot2 |
NIP / EU-USt-IdNr. / andere ID |
| Lieferempfänger (BG-13) | Podmiot3 |
Rolle = 2 (Odbiorca) |
| Positionen (BG-25) | FaWiersz |
Eine FA(3)-Zeile je Peppol-Position |
| Steueraufschlüsselung | P_13_x / P_14_x |
Bemessungsgrundlage und USt je Satz |
| Fälliger Betrag (BT-115) | P_15 |
Zahlbetrag inklusive USt |
| Zahlung (BG-16) | Platnosc |
Art, Konto, Fälligkeit |
| Hinweise (BT-22) | Stopka |
Zusammengeführter Hinweistext |
| Bestellung (BT-13) | WarunkiTransakcji |
Bestellnummer |
| Lieferadresse (BG-13) | WarunkiTransakcji/Transport |
Lieferanschrift |
| Versandanzeige (BT-16) | WZ |
Falls vorhanden |
Gutschriften (Typ 381)
KSeF kennt keinen eigenen „negativen“ Dokumenttyp. Eine Peppol-Gutschrift (381) wird entweder als Korrekturrechnung (KOR) oder als Standardrechnung (VAT) mit negativen Nettobeträgen dargestellt.
KOR oder VAT
Die Wahl hängt von einer Referenz auf die Ursprungsrechnung (BG-3) ab:
| Bedingung | KSeF-Typ | Logik |
|---|---|---|
| Gutschrift enthält eine echte Ursprungsrechnungsnummer | KOR + DaneFaKorygowanej |
Korrektur mit Verweis auf das Original |
| Gutschrift enthält keine Ursprungsrechnungsnummer | VAT mit negativen Nettobeträgen |
KOR ist ohne Pflichtreferenz nicht zulässig |
Platzhalter gelten als fehlend: N/A, NA, -, none, null oder leere Zeichenkette. So entsteht kein KOR-Dokument ohne echte Originalnummer.
DaneFaKorygowanej (korrigierte Rechnung)
Nur bei KOR:
| FA(3)-Feld | Quelle | Beschreibung |
|---|---|---|
DataWystFaKorygowanej |
Ausstellungsdatum der Ursprungsrechnung | Sonst das Ausstellungsdatum der Gutschrift |
NrFaKorygowanej |
Nummer der Ursprungsrechnung | Original-Rechnungsnummer |
NrKSeFN |
Immer 1 |
Ursprungsrechnung wurde außerhalb von KSeF ausgestellt |
NrKSeFN = 1 gilt für alle eingehenden Peppol-Gutschriften: xTool hat keine KSeF-Nummer des Originals, weil es über Peppol ausgestellt wurde.
Beim VAT-Fallback entfällt DaneFaKorygowanej. PrzyczynaKorekty und TypKorekty werden geleert — sie sind bei VAT unzulässig.
Vorzeichen der Beträge
KSeF erwartet eine Korrektur als Delta nach der Korrektur. Bei einer mindernden Gutschrift ist das Netto-Delta negativ. xTool wendet -abs() auf Positionsnetto, Einzelpreis, Positionsrabatt und Dokumentensummen (einschließlich Zahlbetrag) an:
| Vorzeichen in der Peppol-Gutschrift | Ergebnis für Netto / Preis / Zahlbetrag |
|---|---|
| Positiv (übliche Peppol-Konvention) | Negativ |
| Bereits negativ (nicht standardkonformer Sender) | Negativ — nicht erneut invertiert |
| Null (z. B. Zeile mit 0 %) | Null |
Unbedingtes × -1 würde einen bereits negativen Betrag positiv machen. -abs() verhindert das.
Dieses Vorzeichen gilt für:
- Positionen (
FaWiersz):P_11(Netto),P_9A(Einzelpreis),P_10(Positionsrabatt, falls vorhanden) - Kopf (
Fa):P_13_x(Bemessungsgrundlagen aus den Positionen),P_15(Zahlbetrag)
USt-Beträge werden nicht ebenso invertiert. Die Steueraufschlüsselung auf Dokumentebene (Peppol-TaxSubtotal) wird unverändert nach P_14_x übernommen. Die Zeilen-P_11_VAT wird anschließend an diese Kopf-USt angeglichen. Bei der üblichen Peppol-Konvention (positive TaxSubtotals) bleiben P_14_x und die abgeglichene P_11_VAT positiv, während Netto und Zahlbetrag negativ sind.
Hat eine Peppol-Zeile eine negative Menge, nimmt xTool den Betrag der Menge und setzt das Vorzeichen auf den Einzelpreis. KSeF erwartet bei Gutschriften eine positive Menge und einen negativen Preis.
Korrekturgrund
Peppol BIS hat im xTool-Modell kein eigenes Feld für Korrekturgrund oder Korrekturtyp. Bei KOR setzt xTool PrzyczynaKorekty immer auf Korekta faktury (vom FA(3)-Schema verlangt). TypKorekty wird nicht gesetzt.
Parteien (Podmiot)
Podmiot1 (Verkäufer)
| Feld | Quelle | Hinweis |
|---|---|---|
| NIP | USt-IdNr. oder Steuernummer des Verkäufers | Falls leer, aus Peppol-Endpoint-Schema 9945 |
| Name | Name des Verkäufers | "-" wenn leer |
| Adresse | Adresse des Verkäufers | Straße, Ort, PLZ, Land |
| Kontakte | E-Mail und Telefon | Falls vorhanden |
| GLN | Endpoint-ID (Schema 0088) |
Falls vorhanden |
Die Verkäufer-NIP ist pflicht. Kann xTool keine 10-stellige polnische NIP ermitteln, schlägt die Konvertierung fehl.
Podmiot2 (Käufer)
Die Käuferidentifikation wird in dieser Reihenfolge gewählt:
- Polnische NIP (Käufer-USt-IdNr. beginnt mit
PLoder 10-stellige Steuernummer) - EU-USt-IdNr. (Ländercode + Nummer, für nicht-PL-USt-IdNrn.)
- Steuernummer (Land + Nummer)
- Andere Partei-ID (Land + Nummer)
- Endpoint-ID (Schema
9945→ PL-NIP; andere EU-USt-Schemata → EU-USt-IdNr.; übrige Schemata → ID) Brak ID = 1, wenn nichts gefunden wird
Podmiot3 (Lieferempfänger)
Wird angelegt, wenn Lieferdaten eine Adresse enthalten. Rolle = 2 (Odbiorca).
Steuersätze
| Peppol-Satz / Code | KSeF P_12 |
Kopf-Felder |
|---|---|---|
| 23 % | 23 |
P_13_1 / P_14_1 (Standard) |
| 22 % | 22 |
P_13_1 / P_14_1 (Standard) |
| 8 % | 8 |
P_13_2 / P_14_2 (ermäßigt 1) |
| 7 % | 7 |
P_13_2 / P_14_2 (ermäßigt 1) |
| 5 % | 5 |
P_13_3 / P_14_3 (ermäßigt 2; FA(3) beschreibt diesen Bucket aktuell als 5 %) |
| 4 % | 4 |
Nur Zeile P_12 — nicht in Kopf-P_13_x / P_14_x summiert |
| 3 % | 3 |
Nur Zeile P_12 — nicht in Kopf-P_13_x / P_14_x summiert |
0 %, Code E / ZW |
zw |
P_13_7 (befreit) |
0 %, Code AE / OO |
oo |
P_13_10 (Reverse Charge) |
0 %, jeder andere Code (einschließlich S, G, K, O) |
0 KR |
P_13_6_1 (null, Inland) |
Ein nicht unterstützter Prozentsatz (z. B. 19 %) bricht die Konvertierung mit einer klaren Fehlermeldung ab. Eine 0-%-Zeile mit einem anderen Code als E / ZW / AE / OO schlägt nicht fehl: sie wird als 0 KR geschrieben. Innergemeinschaftliche (K) und Export-Codes (G) werden nicht auf 0 WDT bzw. 0 EX abgebildet.
Die Zeilen-USt (P_11_VAT) wird immer als Netto × Satz berechnet (übersprungen für Codes E, AE, O). Die Kopf-USt (P_14_x) bevorzugt die Steueraufschlüsselung auf Dokumentebene, sofern vorhanden. Weicht die Summe der Zeilen-USt von der Kopfaufschlüsselung ab, wird die Differenz auf die letzte Zeile dieses Satzes gelegt.
Positionen (FaWiersz)
Jede Peppol-Position wird zu einer FaWiersz (oder ZamowienieWiersz bei Anzahlungsrechnungen ZAL / KOR_ZAL):
| FA(3)-Feld | Peppol-Quelle | Beschreibung |
|---|---|---|
P_6A |
Positionszeitraum | Endedatum, sonst Startdatum |
P_7 |
Artikelname | Beschreibung, wenn der Name leer ist |
P_8A |
Maßeinheit | UN/ECE-Code (z. B. C62); überschreibbar durch Eigenschaft unit_of_measure |
P_8B |
Menge | Absolutwert, wenn die Peppol-Menge negativ war |
P_9A |
Einzelpreis | Netto; negativ bei Gutschriften |
P_10 |
Positionsrabatt | Falls vorhanden; negativ bei Gutschriften |
P_11 |
Positionsnetto | Negativ bei Gutschriften |
P_11_VAT |
Positions-USt | Netto × Satz; anschließend an Kopf-P_14_x angeglichen (siehe Steuersätze) |
P_12 |
USt-Satzcode | Siehe Tabelle oben |
PKWiU |
Klassifikation | Schema PKWIU / PKWIUZ |
CN |
KN-Code | Schema CN |
PKOB |
PKOB | Schema PKOB |
GTIN |
Standard-Artikel-ID | Falls vorhanden |
Indeks |
Verkäufer-Artikel-ID | Falls vorhanden |
Zahlung (Platnosc)
Der Zahlungsblock entsteht, wenn Zahlungsdaten oder ein Fälligkeitsdatum vorhanden sind.
| FA(3)-Feld | Quelle | Beschreibung |
|---|---|---|
FormaPlatnosci |
Zahlungsmittelcode / -name | 6, wenn der Code 30, 31, 42 oder 58 ist oder der Name Transfer/SEPA/Bank enthält. 1–5 und 7 werden nur am Namen erkannt (cash, card, voucher, cheque/check, credit, mobile/phone). Sonst entfällt das Feld. Andere UNECE-Codes (z. B. 10 Bar, 48 Karte) werden nicht über den Code gemappt. |
RachunekBankowy |
IBAN / Kontonummer + BIC | Empfängerkonto |
TerminPlatnosci |
Fälligkeitsdatum (BT-9) | Datum, bis zu dem die Rechnung zu zahlen ist |
Zaplacono |
Bezahlt vs. Zahlbetrag | 1, wenn der gezahlte Betrag ≥ Zahlbetrag |
DataZaplaty |
Fälligkeitsdatum | Gesetzt, wenn Zaplacono = 1 |
Währung und Kurs
Ist die Rechnung nicht in PLN:
KodWalutyerhält die Rechnungswährung.- Ist ein Wechselkurs vorhanden, füllt xTool
KursWalutyZund USt-Beträge in PLN (P_14_1W,P_14_2W,P_14_3W). - Ohne Kurs wird eine Warnung protokolliert; die PLN-Umrechnungsfelder bleiben leer (von der XSD erlaubt).
Zusätzliche Beschreibungen (DodatkowyOpis)
| Quelle | Schlüssel | Ebene |
|---|---|---|
| Kundenauftragsreferenz (BT-14) | sales_order_reference |
Kopf |
| Sonstige Positionseigenschaften | Eigenschaftsname | Zeile (mit Zeilennummer) |
Heißt eine Positionseigenschaft unit_of_measure, wird ihr Wert nach P_8A geschrieben und nicht als DodatkowyOpis angelegt.
Annotationen (Adnotacje)
Mit schema-sicheren Standardwerten:
| Feld | Standard | Überschreibung |
|---|---|---|
P_16 |
2 (nein) |
— |
P_17 |
2 (nein) |
1 bei Typen 389 / 527 |
P_18 |
2 (nein) |
— |
P_18A |
2 (nein) |
— |
Zwolnienie |
P_19N = 1 (keine Befreiung) |
P_19 = 1, P_19A = <Text> bei Befreiungsgrund (BT-6) |
NoweSrodkiTransportu |
P_22_N = 1 (nein) |
— |
P_23 |
2 (nein) |
— |
PMarzy |
P_PMarzy_N = 1 (nein) |
— |
Fußzeile (Stopka)
Dokumenthinweise (BT-22) werden zusammengeführt und nach Stopka/Informacje geschrieben.
XSD-Validierung
Das konvertierte XML wird gegen FA(3) geprüft. Dazu gehören:
- Elementreihenfolge in Sequenzen
- Pflichtfelder
- Auswahlen (z. B.
NrKSeF/NrKSeFFaKorygowanejoderNrKSeFNinDaneFaKorygowanej) - Datentypen (
TKwotowy,TWybor1,TStawkaPodatku,TFormaPlatnosci) - Zeichenkettenlängen
Validierungsfehler beenden die Konvertierung mit einer ausführlichen Meldung.
Aktuelle Einschränkungen
| Einschränkung | Beschreibung |
|---|---|
| Rabatte/Zuschläge auf Dokumentebene | Werden nicht nach KSeF gemappt (Warnung im Log) |
Anzahlungsrechnungen (ZAL) |
Struktur ZamowienieWiersz existiert; volle Anzahlungslogik ist nicht umgesetzt |
| Kopfsummen 4 % / 3 % | Werden nach Zeile P_12 geschrieben; nicht in P_13_x / P_14_x summiert |
| WDT / Export 0 % | Peppol-Codes K / G werden zu 0 KR, nicht zu 0 WDT / 0 EX |
| Kopf-USt bei Gutschriften | P_14_x folgt Peppol-TaxSubtotal (nicht -abs()); Zeilen-P_11_VAT wird daran angeglichen |
| USt-Margenverfahren | Nicht unterstützt (P_23 = 2) |
| Neue Transportmittel | Nicht unterstützt (P_22_N = 1) |
| Factoring | Nicht unterstützt (RachunekBankowyFaktora leer) |
| Bevollmächtigter | Nicht unterstützt (PodmiotUpowazniony leer) |
Rechnung vs. Gutschrift
| Aspekt | Rechnung (380) | Gutschrift (381) mit Referenz | Gutschrift (381) ohne Referenz |
|---|---|---|---|
RodzajFaktury |
VAT |
KOR |
VAT |
DaneFaKorygowanej |
Nein | Ja (NrKSeFN = 1) |
Nein |
PrzyczynaKorekty |
Nein | Ja (immer Korekta faktury) |
Nein |
TypKorekty |
Nein | Nein | Nein |
| Vorzeichen Netto / Zahlbetrag | Unverändert | Negativ (-abs) |
Negativ (-abs) |
Vorzeichen USt (P_14_x) |
Unverändert | Wie Peppol-TaxSubtotal |
Wie Peppol-TaxSubtotal |
| Positionen | FaWiersz |
FaWiersz |
FaWiersz |
| XSD-Validierung | Voll | Voll | Voll |
Nächste Schritte
- KSeF verbinden — Mit KSeF verbinden.
- Konvertieren — Validieren und konvertieren.
- Per SFTP senden — Senden und Empfangen per SFTP.