Belgium EN 16931 Check
Deep Peppol BIS 3.0 business-rule validation for the Belgian B2B mandate
Belgium made structured B2B e-invoicing over the Peppol network mandatory on 1 January 2026 (sanction tolerance to 31 March 2026; repeat breaches up to EUR 5 000). Belgian invoices travel as Peppol BIS Billing 3.0 UBL — a CIUS of EN 16931 — and a Belgian access point runs the document against the official EN 16931 + Peppol-EN16931 Schematron before it will route it. This module runs that same body of business rules inside Odoo, so a non-compliant invoice is caught up front instead of being bounced downstream.
Real EN 16931 rule engine
The calculation chain (BR-CO)
- Line net = qty × (price / base qty) − allowances + charges
- Sum of invoice line net amounts (BT-106)
- Document allowance / charge totals (BT-107 / BT-108)
- Tax-exclusive total (BT-109) and per-category VAT math (BT-116/117)
- Total VAT (BT-110), grand total (BT-112)
- Amount-due chain — prepaid / rounding / payable (BT-113/114/115)
Every check uses the EN 16931 ±0.02 rounding tolerance.
VAT categories done right
- BR-S standard rated — positive rate + seller VAT id
- BR-Z zero rated · BR-E exempt
- BR-AE reverse charge — buyer VAT id required
- BR-G export · BR-O out of scope
- BR-IC/K intra-community supply
- Mandatory VAT exemption reason (BT-120 / BT-121) with the standard VATEX code
Belgian VAT-category classifier
Beyond the naive mapping
A naive connector maps “rate > 0 → S, rate = 0 → Z” and ships invoices a Belgian access point rejects. A 0 % line can legitimately be Z, E, AE, K, G or O — and each demands a different exemption reason. This module inspects the Belgian 21/12/6/0 % rates and the partner context (domestic, EU B2B, EU B2C, export; VAT-registered or not) to assign the correct category and reason.
Decimal & payment-terms rules
- BR-DEC — at most two decimals on monetary amounts
- BR-CO-25 — a positive amount due needs a due date or payment terms
- PEPPOL-EN16931 — one VAT breakdown per category/rate; allowance/charge reasons
Workflow
- One-click Validate EN 16931 on every customer invoice
- Per-invoice status: Valid / Valid-with-Warnings / Invalid
- Error & warning counters and a report tab citing each BR-* rule
- Optional batch cron to pre-flight posted documents
- Company settings: enable, block-on-error, strict-warnings
Built on the e-Invoice Core Engine
This validator layers on the shared e-Invoice Core Engine
framework and the Belgium Peppol CIUS rule pack (both
installed automatically as dependencies). The EN 16931 rules are
real, deterministic algorithms — not stubs — and are
unit tested with plain python.
Privacy: validation runs entirely inside your own Odoo database. No data is transmitted to Belgian authorities, to Peppol, or to any third party; transport stays with your existing access point.
Compatible with Odoo 18 and Odoo 19.
Screenshots
Invoice With En 16931 Deep V
Customer Invoices List En 16
Update date: 2026-07-02