Rule at a Glance
| ID | Severity | Context (XPath) |
|---|---|---|
| Series ref. BR-107 | Schematron ID: ibr-co-15 | Fatal (error) | /ubl:Invoice | /cn:CreditNote |
Assert text: [ibr-co-15]-Invoice total amount with Tax (ibt-112) = Invoice total amount without Tax (ibt-109) + Invoice total Tax amount (ibt-110).
Test: cac:TaxTotal/cbc:TaxIncludedIndicator = true() or (cac:LegalMonetaryTotal/xs:decimal(cbc:TaxInclusiveAmount) = round((cac:LegalMonetaryTotal/xs:decimal(cbc:TaxExclusiveAmount) + cac:TaxTotal/xs:decimal(cbc:TaxAmount[@currencyID=/*/cbc:DocumentCurrencyCode])) * 10 * 10) div 100)
Classification
Transaction Data. The rule sits at the document root and reconciles the three headline figures of the invoice against each other.
What the Rule Is Checking
The tax-inclusive total (IBT-112) must equal the tax-exclusive total (IBT-109) plus the total VAT amount (IBT-110), rounded to two decimals. Two details in the test matter in practice. First, only the TaxAmount expressed in the document currency participates — an invoice issued in USD that also carries the mandatory AED tax amount must add the USD figure here, and a mapping that picks the wrong occurrence fails the rule. Second, the whole check is bypassed when TaxIncludedIndicator is true, the arrangement where line prices already contain VAT and the addition would double-count it.
Why This Rule Exists
These three figures are the ones every downstream consumer reads first: the buyer's AP system posts the gross amount, the seller's AR ledger carries the net, and the FTA's interest is the VAT between them. An invoice where gross minus net disagrees with the declared VAT is ambiguous about the single number that matters most for tax purposes. The exchange network refuses such a document at validation rather than letting two parties and an authority each resolve the ambiguity differently.
UAE Data Example
PASSES ✓
<cac:TaxTotal>
<cbc:TaxAmount currencyID="AED">250.00</cbc:TaxAmount>
</cac:TaxTotal>
<cac:LegalMonetaryTotal>
<cbc:TaxExclusiveAmount currencyID="AED">5000.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="AED">5250.00</cbc:TaxInclusiveAmount>
</cac:LegalMonetaryTotal>
FAILS ✗
<cbc:DocumentCurrencyCode>USD</cbc:DocumentCurrencyCode>
<cac:TaxTotal>
<cbc:TaxAmount currencyID="AED">918.75</cbc:TaxAmount>
</cac:TaxTotal>
<cac:LegalMonetaryTotal>
<cbc:TaxExclusiveAmount currencyID="USD">5000.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="USD">5250.00</cbc:TaxInclusiveAmount>
</cac:LegalMonetaryTotal>
On a USD invoice the test looks for a USD TaxAmount. Supplying only the AED conversion leaves the addition with nothing in document currency to add, and the rule fails even though every individual figure is plausible.
What Your ERP / IT Team Must Ensure
- Serialise a
TaxAmountin the document currency on every invoice, alongside any AED conversion required for foreign-currency documents. - Derive IBT-112 by addition at mapping time rather than mapping gross and net from independent source fields that can round differently.
- Confirm how the source system represents tax-inclusive pricing — the
TaxIncludedIndicatorbypass exists for that model, and using it accidentally suppresses a check you want. - Regression-test foreign-currency invoices specifically; the currency filter in this test is the branch domestic-only test data never exercises.
