BR-CO-16Amount due for payment (BT-115) = Invoice total amount with VAT (BT-112) -Paid amount (BT-113) +Rounding amount (BT-114).

Offizieller Regeltext

Der Zahlbetrag (BT-115) muss rechnerisch aufgehen: Bruttobetrag (BT-112) minus bereits gezahlter Betrag (BT-113) plus Rundungsbetrag (BT-114).

Schweregrad
Fehler
Gilt für
CII, UBL
Regelwerk
v2026-08-31
Geprüft am

Geschrieben und gegen das offizielle KoSIT-Regelwerk geprüft von Dmytro Yalanskyi, NormAPI.

Warum tritt BR-CO-16 auf?

Der Ausdruck prüft vier Fälle, je nachdem ob ein Anzahlungsbetrag (BT-113) und ein Rundungsbetrag (BT-114) im Dokument stehen. Ohne beide bleibt schlicht BT-115 = BT-112 übrig — wer dort danebenliegt, hat den Zahlbetrag unabhängig berechnet statt ihn abzuleiten. Erst mit Anzahlung wird gerundet, und dort ist der klassische Gleitkommafehler die häufigste Ursache: ein Cent Abweichung, sichtbar erst in der Prüfung.

Was der Validator prüft

Der Ausdruck, den das offizielle KoSIT-Regelwerk auswertet — nicht paraphrasiert, sondern aus der ausgelieferten Schematron-Datei gelesen. UBL und CII adressieren verschiedene Dokumentbäume, deshalb steht dieselbe Regel je Syntax anders da.

UBL
(exists(cbc:PrepaidAmount) and not(exists(cbc:PayableRoundingAmount)) and (xs:decimal(cbc:PayableAmount) = (round((xs:decimal(cbc:TaxInclusiveAmount) - xs:decimal(cbc:PrepaidAmount)) * 10 * 10) div 100))) or (not(exists(cbc:PrepaidAmount)) and not(exists(cbc:PayableRoundingAmount)) and xs:decimal(cbc:PayableAmount) = xs:decimal(cbc:TaxInclusiveAmount)) or (exists(cbc:PrepaidAmount) and exists(cbc:PayableRoundingAmount) and ((round((xs:decimal(cbc:PayableAmount) - xs:decimal(cbc:PayableRoundingAmount)) * 10 * 10) div 100) = (round((xs:decimal(cbc:TaxInclusiveAmount) - xs:decimal(cbc:PrepaidAmount)) * 10 * 10) div 100))) or (not(exists(cbc:PrepaidAmount)) and exists(cbc:PayableRoundingAmount) and ((round((xs:decimal(cbc:PayableAmount) - xs:decimal(cbc:PayableRoundingAmount)) * 10 * 10) div 100) = xs:decimal(cbc:TaxInclusiveAmount)))
CII
(xs:decimal(ram:DuePayableAmount[1]) = xs:decimal(ram:GrandTotalAmount[1]) - xs:decimal(ram:TotalPrepaidAmount[1]) + xs:decimal(ram:RoundingAmount[1])) or ((xs:decimal(ram:DuePayableAmount[1]) = xs:decimal(ram:GrandTotalAmount[1]) + xs:decimal(ram:RoundingAmount[1])) and not(ram:TotalPrepaidAmount)) or ((xs:decimal(ram:DuePayableAmount[1]) = xs:decimal(ram:GrandTotalAmount[1]) - xs:decimal(ram:TotalPrepaidAmount[1])) and not(ram:RoundingAmount)) or ((xs:decimal(ram:DuePayableAmount[1]) = xs:decimal(ram:GrandTotalAmount[1])) and not(ram:TotalPrepaidAmount) and not(ram:RoundingAmount))

Quelle: Regelwerk v2026-08-31

Wie behebt man BR-CO-16?

Rechnen Sie Beträge durchgängig mit Dezimalarithmetik, nicht mit float oder double, und runden Sie erst bei der Ausgabe auf zwei Nachkommastellen. Prüfen Sie außerdem, ob ein Anzahlungsbetrag (BT-113) gesetzt ist, den Ihre Berechnung nicht berücksichtigt.

Im XML

Ausschnitt in UBL. Der CII-Pfad steht oben im Text — dieselbe Änderung, andere Elementnamen.

Fehlerhaft
<cac:LegalMonetaryTotal>
  <cbc:TaxInclusiveAmount currencyID="EUR">1190.00</cbc:TaxInclusiveAmount>
  <cbc:PrepaidAmount currencyID="EUR">200.00</cbc:PrepaidAmount>
  <cbc:PayableAmount currencyID="EUR">1190.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
Korrigiert
<cac:LegalMonetaryTotal>
  <cbc:TaxInclusiveAmount currencyID="EUR">1190.00</cbc:TaxInclusiveAmount>
  <cbc:PrepaidAmount currencyID="EUR">200.00</cbc:PrepaidAmount>
  <cbc:PayableAmount currencyID="EUR">990.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>

Beispielrechnung herunterladen, die BR-CO-16 auslöst ↓

Verwandte Regeln

NormAPI liefert technische Validierung, keine Steuer- oder Rechtsberatung.