Zum Inhalt springen

Ironfang Finance - Regelreferenz

PEPPOL-EN16931-R046: Einen Nettopreis korrigieren, der nicht Bruttopreis minus Rabatt auf den Preis ist

Gibt der Preis einer Position einen Bruttopreis an, muss der Nettopreis genau Bruttopreis minus Rabatt auf den Preis sein. Eine Toleranz gibt es nicht.

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

Auf dieser Seite

Die kurze Antwort

PEPPOL-EN16931-R046 schlägt fehl, wenn das cac:AllowanceCharge innerhalb von cac:Price in cbc:BaseAmount einen Bruttopreis angibt und cbc:PriceAmount nicht genau dieser Bruttopreis minus dem Rabatt in cbc:Amount ist. Korrigieren Sie diejenige der drei Zahlen, die falsch ist, sodass Nettopreis = Bruttopreis - Rabatt gilt.

Der Vergleich ist exakt. Schon eine Abweichung in der vierten Nachkommastelle schlägt fehl.

Was die Regel prüft

Die Regel läuft für das cac:AllowanceCharge innerhalb von cac:Price, nicht für Nachlässe auf Positions- oder Dokumentenebene.

Hat dieses Element kein cbc:BaseAmount, ist kein Bruttopreis angegeben, und die Regel besteht, ohne etwas zu vergleichen. Mit dem Validator bestätigt.

Andernfalls muss das benachbarte cbc:PriceAmount gleich cbc:BaseAmount minus cbc:Amount sein. Die Werte werden als Dezimalzahlen verglichen, ohne Rundung und ohne Toleranz. Bei einem Rabatt von 2.5 und einem Nettopreis von 12.5 lehnt der Validator einen Bruttopreis von 15.01, 14.99 und 15.0001 ab.

Da numerisch verglichen wird, spielen Nullen am Ende keine Rolle: 12.50 und 15.00 verhalten sich wie 12.5 und 15.

BegriffBedeutungUBL-Element
BT-146Nettopreis des Artikelscac:InvoiceLine/cac:Price/cbc:PriceAmount
BT-147Rabatt auf den Artikelpreiscac:InvoiceLine/cac:Price/cac:AllowanceCharge/cbc:Amount
BT-148Bruttopreis des Artikelscac:InvoiceLine/cac:Price/cac:AllowanceCharge/cbc:BaseAmount

Wie es in einer Integration dazu kommt

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

  • Der Nettopreis wird auf zwei Nachkommastellen gerundet, während Bruttopreis und Rabatt mehr behalten, oder umgekehrt, sodass die Subtraktion nicht mehr genau aufgeht.
  • Der Rabatt wird als Prozentsatz des Bruttopreises berechnet und gerundet, der Nettopreis dagegen getrennt aus ungerundeten Zahlen ermittelt.
  • Der Bruttopreis stammt aus der aktuellen Preisliste, Nettopreis und Rabatt aus dem Auftrag, und der Listenpreis hat sich inzwischen geändert.
  • Ein Rabatt für die gesamte Position wird in den Nachlass auf Preisebene geschrieben, der ein Rabatt je Basismenge des Preises ist.
  • Eine Subtraktion in binärer Gleitkommaarithmetik ergibt einen Wert wie 12.499999, der unverändert serialisiert wird.

So korrigieren Sie das Dokument

  1. Lesen Sie für die Position aus dem Befund cbc:PriceAmount sowie cbc:BaseAmount und cbc:Amount des Nachlasses innerhalb von cac:Price.
  2. Behandeln Sie den Nettopreis als Bezugspunkt: Aus ihm wird der Nettobetrag der Position berechnet. Stimmen die Beträge der Position, ist der Bruttopreis oder der Rabatt der zu korrigierende Wert.
  3. Leiten Sie eine Zahl mit Dezimalarithmetik aus den beiden anderen ab, statt alle drei unabhängig voneinander zu beziehen, zum Beispiel Rabatt = Bruttopreis - Nettopreis, und serialisieren Sie mit so vielen Nachkommastellen, dass nichts verloren geht. Diese Regel beschränkt Preise nicht auf zwei Nachkommastellen.
  4. Kann das Quellsystem keinen verlässlichen Bruttopreis liefern, lassen Sie das cac:AllowanceCharge auf Preisebene weg und übermitteln Sie nur den Nettopreis. Die Position ist auch ohne es gültig.

Das aufgezeichnete Beispiel hat einen Nettopreis von 12.5 und einen Rabatt auf den Preis von 2.5.

Fehlerhaft: Bruttopreis 16 - Rabatt 2.5 = 13.5, übermittelter Nettopreis 12.5
Korrigiert: Bruttopreis 15 - Rabatt 2.5 = 12.5, übermittelter Nettopreis 12.5

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 Rechnungsposition: 16 minus 2.5 ergibt 13.5, nicht den Nettopreis von 12.5

<cac:Price>
  <cbc:PriceAmount currencyID="GBP">12.5</cbc:PriceAmount>
  <cbc:BaseQuantity unitCode="C62">1</cbc:BaseQuantity>
  <cac:AllowanceCharge>
    <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
    <cbc:Amount currencyID="GBP">2.5</cbc:Amount>
    <cbc:BaseAmount currencyID="GBP">16</cbc:BaseAmount>
  </cac:AllowanceCharge>
</cac:Price>

Ausschnitt der korrigierten Rechnungsposition: 15 minus 2.5 ergibt 12.5

<cac:Price>
  <cbc:PriceAmount currencyID="GBP">12.5</cbc:PriceAmount>
  <cbc:BaseQuantity unitCode="C62">1</cbc:BaseQuantity>
  <cac:AllowanceCharge>
    <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
    <cbc:Amount currencyID="GBP">2.5</cbc:Amount>
    <cbc:BaseAmount currencyID="GBP">15</cbc:BaseAmount>
  </cac:AllowanceCharge>
</cac:Price>

Nur der Bruttopreis in cbc:BaseAmount unterscheidet sich: 16 im fehlerhaften Dokument, 15 im korrigierten. Das fehlerhafte Dokument meldet nur PEPPOL-EN16931-R046. Der Nettobetrag der Position von 25.00 wird aus dem Nettopreis von 12.5 und einer Menge von 2 berechnet; der falsche Bruttopreis beeinflusst daher keine andere Summe.

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 den Preis einer cac:InvoiceLine in einer Invoice und einer cac:CreditNoteLine in einer CreditNote. Mit dem Validator für eine Gutschrift bestätigt.
  • Bruttopreis und Rabatt auf den Preis sind informativ. PEPPOL-EN16931-R120 berechnet den Nettobetrag der Position nur aus dem Nettopreis und zieht den Rabatt auf Preisebene nicht noch einmal ab.
  • Innerhalb von cac:Price wird nur ein Nachlass akzeptiert. Wird dort cbc:ChargeIndicator auf true gesetzt, meldet das PEPPOL-EN16931-R044.
  • Die vollständige Prüfkette weist ein cac:AllowanceCharge auf Preisebene ohne cbc:Amount bereits im XSD-Prüfschritt ab, bevor diese Regel läuft.

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-R046 (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.