einvoice / EN 16931 / XRechnung rule reference
BR-IC-04
What this rule means and how to fix it
An Invoice with an Intra-community supply (K) Document level charge (BT-102) shall carry a VAT-scoped Seller identifier AND the Buyer VAT identifier.
Enthält eine Rechnung einen Zuschlag auf Dokumentenebene (BG-21), bei dem der Code der Umsatzsteuerkategorie des Zuschlags auf Dokumentenebene (BT-102) „innergemeinschaftliche Lieferung“ lautet, so muss die Rechnung „Umsatzsteuer-Identifikationsnummer des Verkäufers“ (BT-31) oder „Umsatzsteuer-Identifikationsnummer des Steuervertreters des Verkäufers“ (BT-63) und „Umsatzsteuer-Identifikationsnummer des Erwerbers“ (BT-48) enthalten.
Deutsche Fassung: Übersetzung der gleichen BT/BG-Semantik (translation — not the official assert).
- Requires
- An Invoice that contains a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "Intra-community supply" shall contain the Seller VAT Identifier (BT-31) or the Seller tax representative VAT identifier (BT-63) and the Buyer VAT identifier (BT-48).
- Business terms
BG-21BT-31BT-48BT-63BT-102- Syntax
- Binds the UBL-2.1 Invoice / CreditNote syntax and the UN/CEFACT-CII syntax
- Location (UBL-2.1 path)
cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory[cbc:ID='K']- Fix
- Adjust the VAT breakdown at `cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory[cbc:ID='K']` so that An Invoice that contains a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "Intra-community supply" shall contain the Seller VAT Identifier (BT-31) or the Seller tax representative VAT identifier (BT-63) and the Buyer VAT identifier (BT-48).
- Fix (Deutsch)
- Ergänzen Sie das erforderliche Element bei `cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory[cbc:ID='K']`: Enthält eine Rechnung einen Zuschlag auf Dokumentenebene (BG-21), bei dem der Code der Umsatzsteuerkategorie des Zuschlags auf Dokumentenebene (BT-102) „innergemeinschaftliche Lieferung“ lautet, so muss die Rechnung „Umsatzsteuer-Identifikationsnummer des Verkäufers“ (BT-31) oder „Umsatzsteuer-Identifikationsnummer des Steuervertreters des Verkäufers“ (BT-63) und „Umsatzsteuer-Identifikationsnummer des Erwerbers“ (BT-48) enthalten.
- Severity
- fatal
- Provenance source
en16931-ubl- Provenance assert
An Invoice that contains a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "Intra-community supply" shall contain the Seller VAT Identifier (BT-31) or the Seller tax representative VAT identifier (BT-63) and the Buyer VAT identifier (BT-48).
The Location above is a UBL-2.1 path, and no UN/CEFACT-CII path for this rule is published here; Fix and Fix (Deutsch), verbatim from remediation_catalog.json and not reworded here; the UN/CEFACT-CII binding of this rule is differentially proven against the official CEN EN 16931 1.3.16 Schematron.
Where to check the fix: paste the corrected invoice into the browser validator at /einvoice/validate/ — it runs this same engine locally in your browser, with no upload, and stops reporting BR-IC-04 once the edit lands.
Korrektur prüfen: Laden Sie die geänderte Rechnung in den Browser-Validator unter /einvoice/validate/ — er führt dieselbe Engine lokal im Browser aus, ohne Upload, und meldet BR-IC-04 nicht mehr, sobald die Korrektur greift.
The same invoice, failing and fixed
Neither block below is hand-written, and neither is an illustration: both are cut verbatim out of corpus/cen-en16931/test/Invoice-unit-UBL/BR-IC-04.xml, the vendored unit test the CEN EN 16931 project ships for this rule. The people who wrote the Schematron wrote these two documents and labelled them <error>BR-IC-04</error> and <success>BR-IC-04</success>. They are published here only because this engine agreed with that labelling: it reported BR-IC-04 for the first document and did not report it for the second, under --profile en16931.
UBL Invoice — fails
<Invoice
xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2">
<cac:AccountingSupplierParty>
<cac:Party>
<cac:PartyTaxScheme>
<!-- <cbc:CompanyID>NO123456789</cbc:CompanyID>-->
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
</cac:Party>
</cac:AccountingSupplierParty>
<cac:AccountingCustomerParty>
<cac:Party>
<cac:PartyTaxScheme>
<cbc:CompanyID>987654321MVA</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
</cac:Party>
</cac:AccountingCustomerParty>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>true</cbc:ChargeIndicator>
<cac:TaxCategory>
<cbc:ID>K</cbc:ID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:AllowanceCharge>
</Invoice>
UBL Invoice — passes
<Invoice
xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2">
<cac:AccountingSupplierParty>
<cac:Party>
<cac:PartyTaxScheme>
<cbc:CompanyID>NO123456789</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
</cac:Party>
</cac:AccountingSupplierParty>
<cac:AccountingCustomerParty>
<cac:Party>
<cac:PartyTaxScheme>
<cbc:CompanyID>987654321MVA</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
</cac:Party>
</cac:AccountingCustomerParty>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>true</cbc:ChargeIndicator>
<cac:TaxCategory>
<cbc:ID>K</cbc:ID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:AllowanceCharge>
</Invoice>
What the engine reports for the failing document
{
"element": "cac:AllowanceCharge/cac:TaxCategory/cbc:ID",
"field": "cac:AllowanceCharge/cac:TaxCategory/cbc:ID",
"fix_hint": "Adjust the VAT breakdown at `cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory[cbc:ID='K']` so that An Invoice that contains a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is \"Intra-community supply\" shall contain the Seller VAT Identifier (BT-31) or the Seller tax representative VAT identifier (BT-63) and the Buyer VAT identifier (BT-48).",
"location": "cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory[cbc:ID='K']",
"message": "An Invoice with an Intra-community supply (K) Document level charge (BT-102) shall contain the Seller VAT Identifier (BT-31) or the Seller tax representative VAT identifier (BT-63) AND the Buyer VAT identifier (BT-48).",
"rule": "BR-IC-04",
"severity": "fatal",
"terms": [
"BG-21",
"BT-31",
"BT-48",
"BT-63",
"BT-102"
],
"title": "An Invoice with an Intra-community supply (K) Document level charge (BT-102) shall carry a VAT-scoped Seller identifier AND the Buyer VAT identifier."
}
Rule ids reported for the failing document: BR-01 BR-02 BR-03 BR-04 BR-05 BR-06 BR-07 BR-08 BR-10 BR-16 BR-36 BR-38 BR-CO-09 BR-CO-18 BR-CO-22 BR-CO-26 BR-IC-01 BR-IC-04 BR-IC-07. For the corrected document: BR-01 BR-02 BR-03 BR-04 BR-05 BR-06 BR-07 BR-08 BR-10 BR-16 BR-36 BR-38 BR-CO-09 BR-CO-18 BR-CO-22 BR-IC-01 BR-IC-07.
Read that pair of lists honestly. A unit case is not a complete invoice: the upstream suite strips the document down to the elements this rule reads, so the engine also reports every mandatory element the fragment leaves out — 18 other rule ids here. Those are noise for this page. The signal is the difference: BR-IC-04 is reported for the failing document and gone for the corrected one (so are BR-CO-26, which the same edit also clears).
Reproduce it yourself: save the failing block as invoice.xml and run einvoice validate invoice.xml --profile en16931 --format json, or paste it into the browser validator, which runs this same engine locally with no upload. Then apply the edit the passing block shows and run it again.
Everything here is free and open source — pick up whatever helps, at your own pace:
- Licensing — free and open source under Apache-2.0 for everyone, including closed-source embedding: use, modify and ship it inside a commercial product with no fee and no license key.
- German remediation (
--lang de) — the German fix for this rule is in the section above; the CLI surfaces it in place of the English message with--lang de. - Quickstart / free on-ramp — the README, a copy-paste CI-gate recipe, and a 5-minute worked walkthrough.