Skip to content

BR-CO – Conditions and calculations

BR-CO-16: amount due (BT-115) does not add up

ErrorEN 16931 business rule (CEN)

The rule's own wording

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

Source: CEN EN 16931, version 1.3.16

The fix in the XML

Enter the prepayment in cbc:PrepaidAmount and any rounding in cbc:PayableRoundingAmount, and set cbc:PayableAmount to BT-112 minus BT-113 plus BT-114. The early payment discount stays out; it is described in the payment terms, not deducted.

Before – invalid
<cac:LegalMonetaryTotal>
  <cbc:TaxInclusiveAmount currencyID="EUR">1115.51</cbc:TaxInclusiveAmount>
  <cbc:PayableAmount currencyID="EUR">615.51</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
After – corrected
<cac:LegalMonetaryTotal>
  <cbc:TaxInclusiveAmount currencyID="EUR">1115.51</cbc:TaxInclusiveAmount>
  <cbc:PrepaidAmount currencyID="EUR">500.00</cbc:PrepaidAmount>
  <cbc:PayableAmount currencyID="EUR">615.51</cbc:PayableAmount>
</cac:LegalMonetaryTotal>

Meaning of the rule

The amount your invoice states as due does not fit the other totals. The norm calculates: total with VAT, minus the amount already paid, plus the rounding amount, gives the amount due. A missing prepayment or rounding counts as zero. The error often arises when a prepayment is only mentioned in the text but not entered as a paid amount, or when an early payment discount was deducted in advance although it does not belong in the amount due.

What usually goes wrong

  • A prepayment was deducted from the amount due but not entered in BT-113.
  • An early payment discount was calculated into the amount due.
  • A rounding was applied but not shown in BT-114.

Questions and answers

How do I state an early payment discount correctly?

As text in the payment terms BT-20, in XRechnung with the pattern #SKONTO#TAGE=14#PROZENT=2.00#. The amount due remains the full amount.

May the amount due be negative?

Yes, for example when a prepayment exceeds the invoice amount; then the issuer owes the difference. The calculation rule applies unchanged.

EN 16931 fields

  • BT-115
  • BT-112
  • BT-113
  • BT-114
  • BG-22

See also

Check your invoice

The EN 16931 validator reports this rule with the line number and location – right in your browser, without upload.

Open the EN 16931 validator

The rule in detail
UBL · Context (XPath)
cac:LegalMonetaryTotal
UBL · Schematron test
(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 · Context (XPath)
//ram:SpecifiedTradeSettlementHeaderMonetarySummation
CII · Schematron test
(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))
CII · Context (XPath)
//ram:SpecifiedTradeSettlementHeaderMonetarySummation
CII · Schematron test
(xs:decimal(ram:DuePayableAmount) = xs:decimal(ram:GrandTotalAmount) - xs:decimal(ram:TotalPrepaidAmount) + xs:decimal(ram:RoundingAmount)) or ((xs:decimal(ram:DuePayableAmount) = xs:decimal(ram:GrandTotalAmount) + xs:decimal(ram:RoundingAmount)) and not (xs:decimal(ram:TotalPrepaidAmount))) or ((xs:decimal(ram:DuePayableAmount) = xs:decimal(ram:GrandTotalAmount) - xs:decimal(ram:TotalPrepaidAmount)) and not (xs:decimal(ram:RoundingAmount))) or ((xs:decimal(ram:DuePayableAmount) = xs:decimal(ram:GrandTotalAmount)) and not (xs:decimal(ram:TotalPrepaidAmount)) and not (xs:decimal(ram:RoundingAmount)))

Explanation written on 14 September 2026