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.
<cac:LegalMonetaryTotal>
<cbc:TaxInclusiveAmount currencyID="EUR">1115.51</cbc:TaxInclusiveAmount>
<cbc:PayableAmount currencyID="EUR">615.51</cbc:PayableAmount>
</cac:LegalMonetaryTotal><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.
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