BR-CO-17VAT category tax amount (BT-117) = VAT category taxable amount (BT-116) x (VAT category rate (BT-119) / 100), rounded to two decimals.

Offizieller Regeltext

Je Steuerkategorie muss der Steuerbetrag (BT-117) der Bemessungsgrundlage (BT-116) multipliziert mit dem Steuersatz (BT-119) entsprechen — mit einer Toleranz von einer ganzen Einheit der Währung nach oben und unten. Das steht so nicht im Regeltext, aber im Ausdruck, den der Prüfer auswertet: er vergleicht mit „− 1 <“ und „+ 1 >“, nicht auf den Cent.

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-17 auf?

Weil die Toleranz einen Euro beträgt, ist ein Rundungsfehler von ein paar Cent gerade nicht die Ursache — der meldet BR-CO-14 und BR-CO-15, die exakt prüfen. BR-CO-17 schlägt an, wenn etwas Größeres schiefgegangen ist: der falsche Steuersatz auf die Bemessungsgrundlage angewendet, eine Kategorie mit dem Satz einer anderen gerechnet, oder eine Position, die in der Aufschlüsselung in der falschen Kategorie gelandet ist. Bei einem Steuersatz von 0 greift ein anderer Zweig des Ausdrucks: dort verlangt er nur, dass der Steuerbetrag gerundet 0 ergibt. Für steuerfreie, innergemeinschaftliche und Reverse-Charge-Kategorien ist BR-CO-17 also eine Nullprüfung, keine Multiplikation.

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
(round(cac:TaxCategory[cac:TaxScheme/normalize-space(upper-case(cbc:ID))='VAT']/xs:decimal(cbc:Percent)) = 0 and (round(xs:decimal(cbc:TaxAmount)) = 0)) or (round(cac:TaxCategory[cac:TaxScheme/normalize-space(upper-case(cbc:ID))='VAT']/xs:decimal(cbc:Percent)) != 0 and ((abs(xs:decimal(cbc:TaxAmount)) - 1 < round(abs(xs:decimal(cbc:TaxableAmount)) * (cac:TaxCategory[cac:TaxScheme/normalize-space(upper-case(cbc:ID))='VAT']/xs:decimal(cbc:Percent) div 100) * 10 * 10) div 100 ) and (abs(xs:decimal(cbc:TaxAmount)) + 1 > round(abs(xs:decimal(cbc:TaxableAmount)) * (cac:TaxCategory[cac:TaxScheme/normalize-space(upper-case(cbc:ID))='VAT']/xs:decimal(cbc:Percent) div 100) * 10 * 10) div 100 ))) or (not(exists(cac:TaxCategory[cac:TaxScheme/normalize-space(upper-case(cbc:ID))='VAT']/xs:decimal(cbc:Percent))) and (round(xs:decimal(cbc:TaxAmount)) = 0))
CII
(round(.[normalize-space(upper-case(ram:TypeCode)) = 'VAT']/xs:decimal(ram:RateApplicablePercent)) = 0 and (round(xs:decimal(ram:CalculatedAmount)) = 0)) or (round(.[normalize-space(upper-case(ram:TypeCode)) = 'VAT']/xs:decimal(ram:RateApplicablePercent)) != 0 and ((abs(xs:decimal(ram:CalculatedAmount)) - 1 <= round(abs(xs:decimal(ram:BasisAmount)) * (.[normalize-space(upper-case(ram:TypeCode)) = 'VAT']/xs:decimal(ram:RateApplicablePercent) div 100) * 10 * 10) div 100 ) and (abs(xs:decimal(ram:CalculatedAmount)) + 1 >= round(abs(xs:decimal(ram:BasisAmount)) * (.[normalize-space(upper-case(ram:TypeCode)) = 'VAT']/xs:decimal(ram:RateApplicablePercent) div 100) * 10 * 10) div 100 ))) or (not(exists(.[normalize-space(upper-case(ram:TypeCode))='VAT']/xs:decimal(ram:RateApplicablePercent))) and (round(xs:decimal(ram:CalculatedAmount)) = 0))

Quelle: Regelwerk v2026-08-31

Wie behebt man BR-CO-17?

Gruppieren Sie die Positionen nach Steuerkategorie, summieren Sie die Nettobeträge zur Bemessungsgrundlage BT-116 und berechnen Sie die Steuer einmal daraus: BT-116 × BT-119 / 100. Prüfen Sie dabei zuerst, ob der Satz zur Kategorie passt — bei einer Abweichung in dieser Größenordnung stimmt fast immer der Satz nicht, nicht die Rundung. Bei den Kategorien mit Regelsatz meldet sich BR-S-09 gemeinsam mit dieser Regel.

Im XML

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

Fehlerhaft
<cac:TaxSubtotal>
  <cbc:TaxableAmount currencyID="EUR">1000.00</cbc:TaxableAmount>
  <cbc:TaxAmount currencyID="EUR">70.00</cbc:TaxAmount>
  <cac:TaxCategory>
    <cbc:ID>S</cbc:ID>
    <cbc:Percent>19</cbc:Percent>
    <cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme>
  </cac:TaxCategory>
</cac:TaxSubtotal>
Korrigiert
<cac:TaxSubtotal>
  <cbc:TaxableAmount currencyID="EUR">1000.00</cbc:TaxableAmount>
  <cbc:TaxAmount currencyID="EUR">190.00</cbc:TaxAmount>
  <cac:TaxCategory>
    <cbc:ID>S</cbc:ID>
    <cbc:Percent>19</cbc:Percent>
    <cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme>
  </cac:TaxCategory>
</cac:TaxSubtotal>

Verwandte Regeln

NormAPI liefert technische Validierung, keine Steuer- oder Rechtsberatung.