BR-CO-15: Invoice total with VAT (BT-112)
Severity: fatal · Syntax: CII, UBL
Official message
Invoice total amount with VAT (BT-112) = Invoice total amount without VAT (BT-109) + Invoice total VAT amount (BT-110).
What this means
BT-112 = BT-109 + BT-110. The UBL assertion also requires exactly one TaxTotal/TaxAmount in the invoice currency and compares TaxInclusiveAmount with TaxExclusiveAmount plus that tax amount, rounded to two decimal places. Official text: Invoice total amount with VAT (BT-112) = Invoice total amount without VAT (BT-109) + Invoice total VAT amount (BT-110).
Typical cause
The gross total added a tax amount in a second currency, or the tax amount is repeated.
How to fix it
Calculate the named BT fields in the same currency and set the header amounts to the result of the assertion. The check helps you find the difference.
UBL
<cbc:TaxExclusiveAmount currencyID="EUR">100.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="EUR">119.00</cbc:TaxInclusiveAmount>CII
<ram:TaxBasisTotalAmount>100.00</ram:TaxBasisTotalAmount>
<ram:GrandTotalAmount>119.00</ram:GrandTotalAmount>
Business term
BT-112, BT-109, BT-110
Related rules
Context and assertion
UBL /ubl:Invoice | /cn:CreditNote
CII /rsm:CrossIndustryInvoice
UBL
every $Currency in cbc:DocumentCurrencyCode satisfies (count(cac:TaxTotal/xs:decimal(cbc:TaxAmount[@currencyID=$Currency])) eq 1) and (cac:LegalMonetaryTotal/xs:decimal(cbc:TaxInclusiveAmount) = round( (cac:LegalMonetaryTotal/xs:decimal(cbc:TaxExclusiveAmount) + cac:TaxTotal/xs:decimal(cbc:TaxAmount[@currencyID=$Currency])) * 10 * 10) div 100)CII
every $Currency in /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:InvoiceCurrencyCode satisfies ( ( count(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:TaxTotalAmount[@currencyID = $Currency]) = 1 and xs:decimal((/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:GrandTotalAmount)[1]) = round( ( xs:decimal((/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:TaxBasisTotalAmount)[1]) + xs:decimal((/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementHeaderMonetarySummation/ra …
Check a file now, free of charge
curl -F "file=@rechnung.xml" https://checkxrechnung.com/v1/validate
Questions
What does BR-CO-15 actually check?
BT-112 = BT-109 + BT-110. The UBL assertion also requires exactly one TaxTotal/TaxAmount in the invoice currency and compares TaxInclusiveAmount with TaxExclusiveAmount plus that tax amount, rounded to two decimal places. Official text: Invoice total amount with VAT (BT-112) = Invoice total amount without VAT (BT-109) + Invoice total VAT amount (BT-110).
How do I fix BR-CO-15?
Calculate the named BT fields in the same currency and set the header amounts to the result of the assertion. The check helps you find the difference.
If BR-CO-15 passes, is the invoice legally compliant?
No. This page helps you read this one Schematron assertion. A pass is not a statement about tax law, portal acceptance, or bank overlays.