Zum Inhalt springen

Ironfang Finance - Regelreferenz

PEPPOL-EN16931-R120: Einen Nettobetrag der Position korrigieren, der sich nicht aus Menge, Preis, Zuschlägen und Nachlässen ergibt

Jeder Nettobetrag einer Position muss Menge x (Nettopreis / Basismenge) + Zuschläge der Position - Nachlässe der Position entsprechen, mit einer Toleranz von 0.02.

Peppol BIS BillingFehler: Das Dokument ist ungültigPositionen und PreiseNachlässe und Zuschläge

Auf dieser Seite

Die kurze Antwort

PEPPOL-EN16931-R120 schlägt fehl, wenn das cbc:LineExtensionAmount einer Position um mehr als 0.02 von Menge x (Nettopreis / Basismenge des Preises) + Zuschläge der Position - Nachlässe der Position abweicht. Berechnen Sie die Position aus den Werten im XML neu, finden Sie den Wert, der nicht zum Quellvorgang passt, und korrigieren Sie ihn.

Typische Fehler sind eine Menge oder ein Preis, die sich geändert haben, ohne dass der Positionsbetrag neu berechnet wurde, ein Preis je 100 oder je 1000 ohne passendes cbc:BaseQuantity und ein Positionsrabatt, der sowohl in den Preis eingerechnet als auch als Nachlass der Position übermittelt wird.

Was die Regel prüft

Die Regel läuft einmal für jede cac:InvoiceLine oder cac:CreditNoteLine. Der erwartete Wert ist Menge x (cbc:PriceAmount / cbc:BaseQuantity), plus die Summe von cbc:Amount über die cac:AllowanceCharge-Elemente der Position mit cbc:ChargeIndicator gleich true, minus dieselbe Summe für die mit false.

Der Nettobetrag der Position besteht, wenn er höchstens 0.02 von diesem Wert abweicht. Die Grenze ist eingeschlossen. Bei einer Menge von 2 und einem Positionsbetrag von 25.00 akzeptiert der Validator einen Preis von 12.51 (erwartet 25.02) und 12.49 und lehnt 12.511 (erwartet 25.022), 12.489 und 12.515 ab.

Gerundet werden nur die beiden Summen: Die Zuschläge werden addiert und auf zwei Nachkommastellen gerundet, ebenso die Nachlässe. Menge x Preis wird nicht gerundet und der endgültige erwartete Wert auch nicht; deshalb zählt 25.022 oben als 0.022 Abweichung. Da Beträge von Nachlässen und Zuschlägen der Position ohnehin nicht mehr als zwei Nachkommastellen haben dürfen, ändert die Rundung der Summen nichts an einem Dokument, das die Dezimalregeln von EN 16931 besteht.

Die Basismenge des Preises teilt den Preis. Ein Preis von 125 mit einer Basismenge von 10 und einer Menge von 2 ergibt 25.00 und besteht; ein Preis von 12.5 mit einer Basismenge von 10 ergibt 2.50 und schlägt fehl. Ein fehlendes cbc:BaseQuantity wird als 1 gelesen, ebenso eine Basismenge von 0, die PEPPOL-EN16931-R121 gesondert meldet.

Der Rabatt innerhalb von cac:Price ist nicht Teil der Formel. Der Nettopreis versteht sich bereits nach diesem Rabatt, daher wird nur cbc:PriceAmount verwendet.

Der festgeschriebene Test hat auch Ersatzwerte für andere fehlende Elemente: Eine fehlende Menge wird als 1 gelesen, ein fehlender Preis als 0 und ein fehlender Nettobetrag der Position als 0. Entfernt man die Menge aus der aufgezeichneten Position, werden neben dieser Regel BR-22 und BR-23 gemeldet, weil 1 x 12.5 nicht 25.00 ist.

BegriffBedeutungUBL-Element
BT-131Nettobetrag der Rechnungspositioncac:InvoiceLine/cbc:LineExtensionAmount
BT-129In Rechnung gestellte Mengecac:InvoiceLine/cbc:InvoicedQuantity
BT-146Nettopreis des Artikelscac:InvoiceLine/cac:Price/cbc:PriceAmount
BT-149Basismenge zum Artikelpreiscac:InvoiceLine/cac:Price/cbc:BaseQuantity
BT-136Betrag des Nachlasses auf Ebene der Rechnungspositioncac:InvoiceLine/cac:AllowanceCharge[cbc:ChargeIndicator = false]/cbc:Amount
BT-141Betrag des Zuschlags auf Ebene der Rechnungspositioncac:InvoiceLine/cac:AllowanceCharge[cbc:ChargeIndicator = true]/cbc:Amount

Wie es in einer Integration dazu kommt

Mögliche Ursachen, abgeleitet aus der Form der Regel und nicht aus gemessener Nutzung:

  • Menge oder Preis wurden geändert, nachdem der Positionsbetrag gespeichert war, und der gespeicherte Betrag wird unverändert übermittelt.
  • Der Stückpreis gilt im Quellsystem je 100 oder je 1000 Einheiten, und das XML trägt ihn ohne cbc:BaseQuantity oder mit einer Basismenge von 1.
  • Ein Positionsrabatt ist bereits im Nettopreis berücksichtigt und wird zusätzlich als cac:AllowanceCharge auf Positionsebene übermittelt, sodass er im erwarteten Wert zweimal abgezogen wird.
  • Der Positionsbetrag wird aus einem Preis mit mehr Nachkommastellen berechnet als der serialisierte Preis, und bei einer großen Menge übersteigt die Lücke 0.02.
  • Der Positionsbetrag enthält Umsatzsteuer, oder ein Zuschlag der Position fehlt darin, oder ein Nachlass der Position wird mit cbc:ChargeIndicator gleich true ausgegeben, sodass er addiert statt abgezogen wird.

So korrigieren Sie das Dokument

  1. Berechnen Sie die fehlerhafte Position aus ihrem eigenen XML neu: Menge x (cbc:PriceAmount / cbc:BaseQuantity) + Zuschläge der Position - Nachlässe der Position, mit Dezimalarithmetik.
  2. Vergleichen Sie jeden Eingangswert mit dem Quellvorgang, um den falschen zu finden. Überschreiben Sie den Positionsbetrag nicht einfach mit dem Ergebnis der Formel, es sei denn, der Positionsbetrag ist wirklich der falsche Wert.
  3. Gilt der Preis für mehrere Einheiten, übermitteln Sie die Anzahl der Einheiten in cbc:BaseQuantity. Gilt er je Einheit, übermitteln Sie 1 oder lassen Sie das Element weg. Ein unitCode an der Basismenge, der sich von dem an der Menge unterscheidet, wird als PEPPOL-EN16931-R130 gemeldet.
  4. Serialisieren Sie den Nettopreis mit so vielen Nachkommastellen, wie die Berechnung verwendet hat. Diese Regel beschränkt den Preis nicht auf zwei Nachkommastellen, und ein auf zwei Nachkommastellen gekürzter Preis kann nach der Multiplikation mit einer großen Menge über 0.02 hinaus abweichen.
  5. Ändert sich der Nettobetrag der Position, berechnen Sie die Summe der Nettobeträge der Positionen, die Umsatzsteueraufschlüsselung und die Gesamtbeträge des Dokuments neu. BR-CO-10 prüft als Nächstes die erste davon.

Die aufgezeichnete Rechnungsposition hat einen Nettopreis von 12.5 je 1 Einheit, keine Nachlässe oder Zuschläge der Position und einen Nettobetrag der Position von 25.00. Die dritte Zeile zeigt eine Position aus der umfangreicheren gültigen Beispieldatei mit einem Zuschlag und einem Nachlass der Position.

Fehlerhaft: 3 x (12.5 / 1) + 0.00 - 0.00 = 37.50, Nettobetrag der Position 25.00, Differenz 12.50
Korrigiert: 2 x (12.5 / 1) + 0.00 - 0.00 = 25.00, Nettobetrag der Position 25.00, Differenz 0.00
Mit Zuschlag und Nachlass: 3 x (19.995 / 1) + 0.01 - 2.00 = 57.995, Nettobetrag der Position 58.00, Differenz 0.005, besteht

Korrigierte Rechnung prüfen

Vorher und nachher

Dies sind Ausschnitte, keine vollständigen Dokumente. Die vollständigen synthetischen Dokumente, aus denen sie stammen, sind unten verlinkt.

Ausschnitt der fehlerhaften Rechnung: 3 Einheiten zu 12.5 ergeben 37.50, der Nettobetrag der Position lautet aber 25.00

<cac:InvoiceLine>
  <cbc:ID>1</cbc:ID>
  <cbc:InvoicedQuantity unitCode="C62">3</cbc:InvoicedQuantity>
  <cbc:LineExtensionAmount currencyID="GBP">25.00</cbc:LineExtensionAmount>
  <!-- item omitted from this fragment -->
  <cac:Price>
    <cbc:PriceAmount currencyID="GBP">12.5</cbc:PriceAmount>
    <cbc:BaseQuantity unitCode="C62">1</cbc:BaseQuantity>
  </cac:Price>
</cac:InvoiceLine>

Ausschnitt der korrigierten Rechnung: 2 Einheiten zu 12.5 ergeben 25.00

<cac:InvoiceLine>
  <cbc:ID>1</cbc:ID>
  <cbc:InvoicedQuantity unitCode="C62">2</cbc:InvoicedQuantity>
  <cbc:LineExtensionAmount currencyID="GBP">25.00</cbc:LineExtensionAmount>
  <!-- item omitted from this fragment -->
  <cac:Price>
    <cbc:PriceAmount currencyID="GBP">12.5</cbc:PriceAmount>
    <cbc:BaseQuantity unitCode="C62">1</cbc:BaseQuantity>
  </cac:Price>
</cac:InvoiceLine>

Nur cbc:InvoicedQuantity unterscheidet sich: 3 im fehlerhaften Dokument, 2 im korrigierten. Das fehlerhafte Dokument meldet nur PEPPOL-EN16931-R120, weil der Nettobetrag der Position von 25.00 weiterhin zu den Summen des Dokuments passt. In diesem Beispiel war die Menge der falsche Wert; hätte man stattdessen den Positionsbetrag auf 37.50 geändert, hätte auch jede davon abhängige Summe neu berechnet werden müssen.

Was der Validator gemeldet hat

Aufgezeichnet mit phive 12.1.0 / phive-rules-peppol 4.5.6 / Saxon-HE 12.10, der Engine hinter dem kostenlosen Validator, mit synthetischen Daten. Ein aufgezeichnetes Ergebnis ist ein Regressionsnachweis für diese Dokumente, keine Zertifizierung.

Wo die Regel gilt

  • Gilt für UBL Invoice und CreditNote. In einer Gutschrift ist die Menge cbc:CreditedQuantity und die Position cac:CreditNoteLine; alles andere in der Formel ist gleich. Das aufgezeichnete Gutschriftbeispiel macht denselben Fehler, eine gutgeschriebene Menge von 3 gegenüber einem Nettobetrag der Position von 25.00 bei einem Preis von 12.5, und meldet nur diese Regel. Die Grenze von 0.02 wurde auch für eine Gutschrift bestätigt.
  • Jede Position wird für sich geprüft, in der Dokumentwährung. Die Regel betrachtet weder die Umsatzsteuer noch die Summen des Dokuments.
  • Ein negatives cbc:BaseQuantity macht den Stückpreis in dieser Berechnung negativ; bei der aufgezeichneten Position meldet eine Basismenge von -1 daher diese Regel zusammen mit PEPPOL-EN16931-R121.
  • Die Toleranz von 0.02 gilt je Position und nur für diesen Vergleich. Sie überträgt sich nicht auf BR-CO-10, die die Positionssumme des Dokuments ohne Toleranz mit der auf zwei Nachkommastellen gerundeten Summe der Nettobeträge der Positionen vergleicht.

Umfang und Quelle

Geschrieben für Peppol BIS Billing 3.0.21 (May 2026), EN 16931 1.3.16, angewendet auf Invoice- und CreditNote-Dokumente in UBL 2.1. Andere Profile, Syntaxen und Releases können diese Kennung anders definieren. Version des Hinweiskatalogs 2026-09-24.1: Quelle geprüft am 2026-09-24, Erklärung zuletzt aktualisiert am 2026-09-20.

Die offizielle Definition von PEPPOL-EN16931-R120 (auf Englisch) enthält den normativen Wortlaut und den Test. Diese Seite ist unsere Erklärung dazu, keine Kopie.

Die Erklärung ändert das Urteil der Engine nicht. Dass Sie diesen Befund beheben, heißt nicht, dass das Dokument jeden Prüfschritt besteht. Die Validierung bescheinigt keine rechtliche oder steuerliche Konformität und überträgt kein Dokument über Peppol.