De formules, zoals het Schematron ze schrijft
| Regel | Tekst van EN 16931 (Schematron validation-1.3.17) |
|---|---|
| BR-CO-15 | Invoice total amount with VAT (BT-112) = Invoice total amount without VAT (BT-109) + Invoice total VAT amount (BT-110). |
| BR-CO-14 | Invoice total VAT amount (BT-110) = Σ VAT category tax amount (BT-117). |
| BR-CO-16 | Amount due for payment (BT-115) = Invoice total amount with VAT (BT-112) -Paid amount (BT-113) +Rounding amount (BT-114). |
| BR-CO-17 | VAT category tax amount (BT-117) = VAT category taxable amount (BT-116) x (VAT category rate (BT-119) / 100), rounded to two decimals. |
| BR-S-08 | For 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-09 | The 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). |
Alle zes zijn fataal. Lees ze als één keten: de regels tellen op tot de basis van elk tarief (BR-S-08), elke basis maal zijn tarief geeft de btw van dat tarief (BR-CO-17 en BR-S-09), de btw per tarief telt op tot de totale btw (BR-CO-14), basis plus btw geeft het totaal (BR-CO-15), en het totaal min wat is betaald plus afronding geeft wat nog openstaat (BR-CO-16).

Welke regels één cent opmerken
Niet alle tellen centen mee. BR-CO-17 en BR-S-09 vergelijken de btw van elk tarief (BT-117) met basis maal tarief, maar het Schematron geeft ze in beide richtingen €1 speelruimte. BR-S-08 vergelijkt bases, dus de afronding van de btw speelt daar geen rol. BR-CO-14, BR-CO-15 en BR-CO-16 vergelijken sommen die op twee decimalen zijn afgerond, zonder speelruimte: daar is één cent al een fout.
De cent verschijnt wanneer er twee manieren zijn om de btw te berekenen. Odoo rekent die uit volgens de instelling Tax Calculation Rounding Method van het bedrijf:
| Odoo-versie | Opties | Standaard |
|---|---|---|
| Odoo 17 en 18 | Round per Line of Round Globally | Per regel |
| Odoo 19 en 20 | Round per Tax of Round per Line | Per belasting |
Bij afronding per regel rondt Odoo de btw van elke regel af en telt die dan op. Op een factuur met veel kleine regels kan die som één cent afwijken van de btw die over de basis van elk tarief is berekend. Als alle cijfers in het bestand uit dezelfde berekening komen, kloppen de sommen. Als het bestand de totale btw van Odoo naast een per tarief opnieuw berekende uitsplitsing zet, faalt BR-CO-14; als het het totaal met btw van Odoo naast een opnieuw berekende btw zet, faalt BR-CO-15. Om BR-CO-17 te laten afgaan, moet het verschil meer dan €1 bedragen.
De afrondingsmethode is een bedrijfsinstelling, geen instelling per factuur: wijzigen werkt door op de belastingen die vanaf dat moment worden berekend. Doe dat tussen twee facturen door, nooit met een factuur halverwege.
Wat de Factur-X van Odoo doet
In de Factur-X (CII) van Odoo 18, 19 en 20 wordt het totaal met btw (BT-112) geschreven als de som van de basis (BT-109) en de btw (BT-110) die al in het bestand staan, precies om BR-CO-15 te halen. Dat zekert de somregel; de rest van de keten hangt nog steeds af van een kloppende uitsplitsing.
Met onze XRechnung- en ZUGFeRD-module
De module bouwt de XML met eigen code en mengt nu beide berekeningen. De btw van elk tarief (BT-117) berekent hij als basis maal tarief, en het totaal met btw (in UBL) of de totale btw (in CII) kopieert hij van de Odoo-factuur. Bij afronding per regel is één cent verschil genoeg: de XML komt er met BR-CO-15 in XRechnung UBL uit en met BR-CO-14 in XRechnung CII, het standaardformaat van de module. We hebben het gecontroleerd met de validator van KoSIT. In Odoo 17 en 18 is afronding per regel de standaard.
Bij een gedeeltelijke betaling faalt BR-CO-16: het te betalen bedrag (BT-115) is wat in Odoo nog openstaat, maar het bestand bevat niet het al betaalde bedrag (BT-113).

In Odoo 18, 19 en 20 gaat elke XRechnung en elke ZUGFeRD EN 16931 die de module met het abonnement op FlexigoTech Cloud genereert door de KoSIT-regels, en die omvatten deze zes. Als er één faalt, wordt dat op de factuur genoteerd, onder Validation Errors, en wordt de factuur niet als Ready to send gemarkeerd. In Odoo 17 valideert de gepubliceerde versie niet: het bestand gaat uit met de fout en zonder waarschuwing.
Wat te doen
- Kijk in het rapport welke regel eerst faalt: BR-S-08 wijst naar de bases, BR-CO-14 naar de uitsplitsing, BR-CO-15 naar het totaal en BR-CO-17 naar de btw van één tarief.
- Controleer de afrondingsmethode van het bedrijf en, als je veel e-facturen met veel regels uitgeeft, bespreek afronding per belasting dan met je accountant.
- BR-CO-16 verschijnt bij gedeeltelijke betalingen of contante afronding: het betaalde bedrag en het afrondingsbedrag moeten in het bestand staan. Genereer met onze module de XRechnung voordat je een betaling registreert.
- Corrigeer en genereer opnieuw; bewerk de XML niet met de hand.
Lees verder
Gecontroleerd in de broncode van de module (versie 17.0 en 20.0) en in de gelinkte bronnen
Bronnen
- github.com/ConnectingEurope/eInvoicing-EN16931/releases/tag/validation-1.3.17
- Broncode van de module: flexigo_germany_xrechnung 20.0 (446f2f68): lib/generators/ubl_generator.py
- Broncode van de module: flexigo_germany_xrechnung 20.0 (446f2f68): lib/generators/cii_generator.py
- Broncode van de module: flexigo_germany_xrechnung 20.0 (446f2f68): models/res_company.py
- github.com/odoo/odoo/blob/6f00fdadb875342de2d14a179f25431f93cd63c9/addons/account/models/c
- github.com/odoo/odoo/blob/2982b5f44af03fae6a9888f20632c1cc19f623ba/addons/account/models/c
- github.com/odoo/odoo/blob/4d2d4b5895db70596863df941d9a1f0beeb117f8/addons/account/models/c
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/account/models/c
- github.com/odoo/odoo/blob/2982b5f44af03fae6a9888f20632c1cc19f623ba/addons/account_edi_ubl_
- github.com/odoo/odoo/blob/4d2d4b5895db70596863df941d9a1f0beeb117f8/addons/account_edi_ubl_
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/account_edi_ubl_
- Broncode van de module: flexigo_germany_xrechnung 20.0 (446f2f68): models/xrechnung_cloud.py
- Broncode van de module: flexigo_germany_xrechnung 20.0 (446f2f68): models/account_move.py
- Broncode van de module: flexigo_germany_xrechnung 17.0 (ad05de8f): __manifest__.py
