Zum Inhalt springen

BR-CO – Bedingungen und Berechnungen

BR-CO-17: Steuerbetrag (BT-117) passt nicht zum Steuersatz

FehlerGeschäftsregel EN 16931 (CEN)

Originaltext der Regel

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

Quelle: CEN EN 16931, Version 1.3.16

Bedeutung der Regel

In einer Aufschlüsselung Ihrer Rechnung stimmt der ausgewiesene Steuerbetrag nicht mit dem Ergebnis aus Bemessungsgrundlage mal Steuersatz überein. Die Norm rechnet je Steuerkategorie nach: Grundbetrag mal Satz geteilt durch hundert, kaufmännisch auf zwei Nachkommastellen gerundet. Ein Cent Unterschied genügt für eine Abweisung, denn der Empfänger bucht den Steuerbetrag genau so, wie er in der Rechnung steht. Meist entsteht der Fehler, wenn die Steuer je Position gerundet und dann summiert wird.

Woran es meist liegt

  • Die Steuer wurde je Position gerundet und addiert, statt auf die Summe der Kategorie berechnet.
  • Bemessungsgrundlage oder Steuerbetrag wurden nach einer Änderung nicht neu berechnet.
  • Der Steuersatz in der Aufschlüsselung weicht von dem der Positionen ab.

Korrektur im XML

Berechnen Sie je Aufschlüsselung den Steuerbetrag aus der Bemessungsgrundlage der Kategorie und dem Satz, gerundet auf zwei Stellen, und tragen Sie ihn in cbc:TaxAmount ein. Positionsbeträge dienen nur der Kontrolle, nicht der Summe.

Vorher – fehlerhaft
<cac:TaxSubtotal>
  <cbc:TaxableAmount currencyID="EUR">937.40</cbc:TaxableAmount>
  <cbc:TaxAmount currencyID="EUR">178.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>
Nachher – korrigiert
<cac:TaxSubtotal>
  <cbc:TaxableAmount currencyID="EUR">937.40</cbc:TaxableAmount>
  <cbc:TaxAmount currencyID="EUR">178.11</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>

Fragen und Antworten

Warum darf ich die Steuer nicht je Position berechnen und summieren?

Weil die Norm die Steuer je Kategorie aus der Summe der Grundbeträge berechnet. Je Position gerundete Beträge weichen in der Summe oft um einen Cent ab.

Welcher Rundungsweg ist gemeint?

Kaufmännisch auf zwei Nachkommastellen: ab 0,005 wird aufgerundet. Abschneiden oder Bankers Rounding führen zu Abweichungen und damit zu BR-CO-17.

Felder der EN 16931

  • BT-117
  • BT-116
  • BT-119
  • BG-23

Siehe auch

  • BR-AF-09
  • BR-AG-09
  • BR-S-09

Rechnung prüfen

Der XRechnung-Validator meldet diese Regel mit Zeilennummer und Fundstelle – direkt in Ihrem Browser, ohne Upload.

Zum XRechnung-Validator

Die Regel im Detail
UBL · Kontext (XPath)
cac:TaxTotal/cac:TaxSubtotal
UBL · Schematron-Test
(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 · Kontext (XPath)
//ram:ApplicableHeaderTradeSettlement/ram:ApplicableTradeTax
CII · Schematron-Test
(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))

Erklärung erstellt am 14.09.2026