Les fórmules, tal com les escriu el Schematron
| Regla | Text d'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). |
Les sis són fatals. Llegeix-les com una cadena: les línies sumen la base de cada tipus (BR-S-08), cada base per el seu tipus dona l'IVA d'aquell tipus (BR-CO-17 i BR-S-09), els IVA per tipus sumen l'IVA total (BR-CO-14), base més IVA dona el total (BR-CO-15) i el total menys el que s'ha pagat més el redondeig dona el que queda per pagar (BR-CO-16).

Quines regles noten un cèntim
No totes compten cèntims. BR-CO-17 i BR-S-09 comparen l'IVA de cada tipus (BT-117) amb la base per el tipus, però el Schematron els deixa un marge d'1 € amunt o avall. BR-S-08 compara bases, així que el redondeig de l'IVA no l'afecta. BR-CO-14, BR-CO-15 i BR-CO-16 comparen sumes arrodonides a dos decimals, sense marge: aquí un cèntim ja és un error.
El cèntim apareix quan hi ha dues maneres de calcular l'IVA. Odoo el calcula segons l'ajust Tax Calculation Rounding Method de l'empresa:
| Versió d'Odoo | Opcions | Per defecte |
|---|---|---|
| Odoo 17 i 18 | Round per Line o Round Globally | Per línia |
| Odoo 19 i 20 | Round per Tax o Round per Line | Per impost |
Amb el redondeig per línia, Odoo arrodoneix l'IVA de cada línia i després suma. En una factura amb moltes línies d'imports petits, aquesta suma pot quedar a un cèntim de l'IVA calculat sobre la base de cada tipus. Si totes les xifres del fitxer surten del mateix càlcul, les sumes quadren. Si el fitxer porta l'IVA total d'Odoo al costat d'un desglossament refet per tipus, falla BR-CO-14; si porta el total amb IVA d'Odoo al costat d'un IVA refet, falla BR-CO-15. Perquè salti BR-CO-17, la diferència ha de passar d'1 €.
El mètode de redondeig és un ajust de l'empresa, no de cada factura: canviar-lo afecta els impostos que es calculin des d'aquell moment. Fes-ho entre factures, mai amb una a mitges.
Què fa el Factur-X d'Odoo
En el Factur-X (CII) d'Odoo 18, 19 i 20, el total amb IVA (BT-112) s'escriu com la suma de la base (BT-109) i de l'IVA (BT-110) que ja van al fitxer, just per complir BR-CO-15. Això assegura la regla de la suma; la resta de la cadena continua depenent que el desglossament quadri.
Amb el nostre mòdul XRechnung i ZUGFeRD
El mòdul genera el XML amb el seu propi codi i avui barreja els dos càlculs. L'IVA de cada tipus (BT-117) el calcula com a base per tipus; el total amb IVA (en UBL) i l'IVA total (en CII) els copia de la factura d'Odoo. Amb el redondeig per línia, un cèntim de diferència n'hi ha prou: el XML surt amb BR-CO-15 a XRechnung UBL i amb BR-CO-14 a XRechnung CII, el format que el mòdul fa servir per defecte. Ho hem comprovat amb el validador de KoSIT. A Odoo 17 i 18, el redondeig per línia és el valor per defecte.
Amb un pagament parcial falla BR-CO-16: l'import a pagar (BT-115) és el que queda pendent a Odoo, però el fitxer no porta l'import ja pagat (BT-113).

A Odoo 18, 19 i 20, amb la subscripció a FlexigoTech Cloud, cada XRechnung i cada ZUGFeRD EN 16931 que genera el mòdul passa per les regles de KoSIT, que inclouen aquestes sis. Si una falla, queda escrita a la factura, a Validation Errors, i la factura no es marca com a Ready to send. A Odoo 17 la versió publicada no valida: el fitxer surt amb el fallo i sense avís.
Què fer
- Mira a l'informe quina regla falla primer: BR-S-08 apunta a les bases, BR-CO-14 al desglossament, BR-CO-15 al total i BR-CO-17 a l'IVA d'un tipus.
- Revisa el mètode de redondeig de l'empresa i, si emets factures electròniques amb moltes línies, valora el redondeig per impost amb el teu assessor.
- BR-CO-16 apareix amb pagaments parcials o amb redondeig de caixa: l'import pagat i el de redondeig han d'anar al fitxer. Amb el nostre mòdul, genera la XRechnung abans de registrar cap pagament.
- Corregeix i genera de nou; no edites el XML a mà.
Continua llegint
Comprovat al codi del mòdul (versió 17.0 i 20.0) i a les fonts enllaçades
Fonts
- github.com/ConnectingEurope/eInvoicing-EN16931/releases/tag/validation-1.3.17
- Codi del mòdul: flexigo_germany_xrechnung 20.0 (446f2f68): lib/generators/ubl_generator.py
- Codi del mòdul: flexigo_germany_xrechnung 20.0 (446f2f68): lib/generators/cii_generator.py
- Codi del mòdul: 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_
- Codi del mòdul: flexigo_germany_xrechnung 20.0 (446f2f68): models/xrechnung_cloud.py
- Codi del mòdul: flexigo_germany_xrechnung 20.0 (446f2f68): models/account_move.py
- Codi del mòdul: flexigo_germany_xrechnung 17.0 (ad05de8f): __manifest__.py
