Skip to main content
EN 16931 · totals

Error BR-CO-15 in an e-invoice: total with VAT is not net plus VAT

BR-CO-15 is the EN 16931 rule that checks the simplest sum on an invoice: total with VAT equals total without VAT plus VAT. It comes with BR-CO-14, BR-CO-16, BR-CO-17 and, for the standard rate, BR-S-08 and BR-S-09, and XRechnung, Factur-X and Peppol BIS all apply them. A rounding cent is enough to break BR-CO-14 or BR-CO-15; BR-CO-17 and BR-S-09 allow up to €1 of difference.

FlexigoTech · Editor in charge: Víctor Gómez · Updated 4 November 2026

Key facts

Versions
Odoo 17, 18, 19 and 20
Checked
in the module's source code, version 17.0 and 20.0 · against the sources linked at the end
Reading time
4 min

The formulas, as the Schematron writes them

RuleEN 16931 text (Schematron validation-1.3.17)
BR-CO-15Invoice total amount with VAT (BT-112) = Invoice total amount without VAT (BT-109) + Invoice total VAT amount (BT-110).
BR-CO-14Invoice total VAT amount (BT-110) = Σ VAT category tax amount (BT-117).
BR-CO-16Amount due for payment (BT-115) = Invoice total amount with VAT (BT-112) -Paid amount (BT-113) +Rounding amount (BT-114).
BR-CO-17VAT category tax amount (BT-117) = VAT category taxable amount (BT-116) x (VAT category rate (BT-119) / 100), rounded to two decimals.
BR-S-08For each different value of VAT category rate (BT-119) where the VAT category code (BT-118) is "Standard rated", the VAT category taxable amount (BT-116) in a VAT breakdown (BG-23) shall equal the sum of Invoice line net amounts (BT-131) plus the sum of document level charge amounts (BT-99) minus the sum of document level allowance amounts (BT-92) where the VAT category code (BT-151, BT-102, BT-95) is "Standard rated" and the VAT rate (BT-152, BT-103, BT-96) equals the VAT category rate (BT-119).
BR-S-09The VAT category tax amount (BT-117) in a VAT breakdown (BG-23) where VAT category code (BT-118) is "Standard rated" shall equal the VAT category taxable amount (BT-116) multiplied by the VAT category rate (BT-119).

All six are fatal. Read them as a chain: the lines add up to the base of each rate (BR-S-08), each base times its rate gives that rate's VAT (BR-CO-17 and BR-S-09), the VAT per rate adds up to the total VAT (BR-CO-14), base plus VAT gives the total (BR-CO-15), and the total minus what was paid plus rounding gives the amount still due (BR-CO-16).

Card for the EN 16931 total rules
BR-CO-15 with BR-CO-14, BR-CO-16, BR-CO-17, BR-S-08 and BR-S-09: the chain of sums on an invoice.

Which rules notice one cent

Not all of them count cents. BR-CO-17 and BR-S-09 compare the VAT of each rate (BT-117) with base times rate, but the Schematron gives them €1 of leeway either way. BR-S-08 compares bases, so VAT rounding does not affect it. BR-CO-14, BR-CO-15 and BR-CO-16 compare sums rounded to two decimals, with no leeway: there, one cent is already an error.

The cent appears when there are two ways of computing the VAT. Odoo computes it according to the company's Tax Calculation Rounding Method:

Odoo versionOptionsDefault
Odoo 17 and 18Round per Line or Round GloballyPer line
Odoo 19 and 20Round per Tax or Round per LinePer tax

With per-line rounding, Odoo rounds the VAT of each line and then adds them up. On an invoice with many small lines, that sum can end up one cent away from the VAT computed on the base of each rate. If every figure in the file comes from the same calculation, the sums add up. If the file carries Odoo's total VAT next to a breakdown recomputed per rate, BR-CO-14 fails; if it carries Odoo's total with VAT next to a recomputed VAT, BR-CO-15 fails. For BR-CO-17 to fire, the gap has to exceed €1.

The rounding method is a company setting, not a per-invoice one: changing it affects the taxes computed from that moment on. Do it between invoices, never with one half done.

What Odoo's Factur-X does

In Odoo's Factur-X (CII) on Odoo 18, 19 and 20, the total with VAT (BT-112) is written as the sum of the base (BT-109) and the VAT (BT-110) already in the file, precisely to meet BR-CO-15. That secures the sum rule; the rest of the chain still depends on the breakdown adding up.

With our XRechnung and ZUGFeRD module

The module builds the XML with its own code, and today it mixes both calculations. It computes the VAT of each rate (BT-117) as base times rate, and copies the total with VAT (in UBL) or the total VAT (in CII) from the Odoo invoice. With per-line rounding, one cent of difference is enough: the XML comes out with BR-CO-15 in XRechnung UBL and with BR-CO-14 in XRechnung CII, the module's default format. We checked it with the KoSIT validator. On Odoo 17 and 18, per-line rounding is the default.

With a partial payment, BR-CO-16 fails: the amount due (BT-115) is what is still open in Odoo, but the file does not carry the amount already paid (BT-113).

Odoo 20 invoice with the XRechnung / ZUGFeRD tab of the module
Validation result and Ready to send box on the invoice. Odoo 20 screenshot with demo data; the report in the screenshot is a test one.

On Odoo 18, 19 and 20, with the FlexigoTech Cloud subscription, every XRechnung and every ZUGFeRD EN 16931 the module generates goes through the KoSIT rules, which include these six. If one fails, it is written on the invoice, under Validation Errors, and the invoice is not marked Ready to send. On Odoo 17 the published version does not validate: the file goes out with the error and no warning.

What to do

  1. Look at which rule fails first in the report: BR-S-08 points at the bases, BR-CO-14 at the breakdown, BR-CO-15 at the total and BR-CO-17 at the VAT of one rate.
  2. Check the company rounding method and, if you issue e-invoices with many lines, discuss per-tax rounding with your accountant.
  3. BR-CO-16 appears with partial payments or cash rounding: the paid amount and the rounding amount have to be in the file. With our module, generate the XRechnung before registering any payment.
  4. Fix it and generate again; do not edit the XML by hand.

Keep reading

Errors BR-E-10, BR-AE-10, BR-IC-10 and BR-G-10: the VAT exemption reasonBR-E-10, BR-AE-10, BR-IC-10, BR-G-10 and BR-O-10 require a VAT exemption reason; BR-S-10 and BR-Z-10 forbid it. How Odoo 17, 18, 19 and 20 set it.Errors BR-09 and BR-11: seller or buyer address without a country codeBR-09 and BR-11 require the country code in the seller and buyer addresses; BR-08 and BR-10, the address itself. The Odoo 17, 18, 19 and 20 message and what to fill in.XRechnung errors BR-DE-1, BR-61 and BR-DE-23: the payment instructionsBR-DE-1 asks XRechnung for payment instructions (BG-16) and BR-61 for the account when paying by credit transfer. What Odoo 17, 18, 19 and 20 write and how to fix it.
Checked in the module's source code (version 17.0 and 20.0) and the linked sources

Sources