/xXSDHub

BR-O-01: Outside-scope VAT needs a breakdown

Outside-scope VAT needs a breakdown; restore the VAT breakdown for the same tax category.

What the rule says

[BR-O-01]-An Invoice that contains an Invoice line (BG-25), a Document level allowance (BG-20) or a Document level charge (BG-21) where the VAT category code (BT-151, BT-95 or BT-102) is "Not subject to VAT" shall contain exactly one VAT breakdown group (BG-23) with the VAT category code (BT-118) equal to "Not subject to VAT".

Official en16931 source, version 1.3.16. EUPL 1.2; sources, licences and notices. Syntax and business checks are separate; this is not certification.

Outside-scope VAT needs a breakdown

Outside-scope VAT needs a breakdown. The controlled example changes the specific field or group named by this rule. Remove only /*/cac:TaxTotal/cac:TaxSubtotal[1].

Business terms: BT-102, BT-118, BT-151, BT-95.

Restore the VAT breakdown for the same tax category.

Reproduced failure and correction

Tested on 2 November 2026 with the production SaxonC-HE 13.1 / saxonche 13.1.1 engine, en16931 mode, UBL. The XSD passes; the report then contains BR-O-01. Restoring this fragment makes the complete original invoice pass the selected checks.

[BR-O-01]-An Invoice that contains an Invoice line (BG-25), a Document level allowance (BG-20) or a Document level charge (BG-21) where the VAT category code (BT-151, BT-95 or BT-102) is "Not subject to VAT" shall contain exactly one VAT breakdown group (BG-23) with the VAT category code (BT-118) equal to "Not subject to VAT".

Additional triggered rules: 1. BR-CO-18. Counts include distinct error and warning codes; the target code is excluded.

Precise mutated XPath: /*/cac:TaxTotal/cac:TaxSubtotal[1].

Before: triggers this rule

<cac:TaxTotal xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:ubl="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">
        <cbc:TaxAmount currencyID="EUR">0.00</cbc:TaxAmount>
        </cac:TaxTotal>
    

After: passes

<cac:TaxTotal xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:ubl="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">
        <cbc:TaxAmount currencyID="EUR">0.00</cbc:TaxAmount>
        <cac:TaxSubtotal>
            <cbc:TaxableAmount currencyID="EUR">100.00</cbc:TaxableAmount>
            <cbc:TaxAmount currencyID="EUR">0.00</cbc:TaxAmount>
            <cac:TaxCategory>
                <cbc:ID>O</cbc:ID>
                <cbc:TaxExemptionReason>Not subject to VAT</cbc:TaxExemptionReason><cac:TaxScheme>
                    <cbc:ID>VAT</cbc:ID>
                </cac:TaxScheme>
            </cac:TaxCategory>
        </cac:TaxSubtotal>
    </cac:TaxTotal>
    

The context shown is part of a complete invoice; it is not a standalone invoice. Mutation: remove at /*/cac:TaxTotal/cac:TaxSubtotal[1]. The passing baseline is validated with the selected pinned package. UBL examples use a controlled single-line adaptation of the official XRechnung example; the CII example uses the official EN 16931 baseline.

Download complete failing invoice · Download complete passing invoice

Check your corrected invoice →

Check the rest of the invoice

Repair the source data and exporter, then validate the complete invoice again with the same package. Review every remaining error and warning; a passing rule is not a guarantee of recipient acceptance.

EN 16931 syntax and business checks · XRechnung profile requirements · Pro/Team batch checks.