Error codes

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.