- BR-23, fatal «An Invoice line (BG-25) shall have an Invoiced quantity unit of measure code (BT-130).» La línia ha de dur unitat.
- BR-CL-23, fatal «Unit code MUST be coded according to the UN/ECE Recommendation 20 with Rec 21 extension» La unitat ha de ser un codi de la llista.
- PEPPOL-EN16931-R130, fatal «Unit code of price base quantity MUST be same as invoiced quantity.» Si el preu va per una quantitat base, la seva unitat és la mateixa que la de la línia.
Les dues primeres són d'EN 16931 (Schematron validation-1.3.17). La tercera és de Peppol BIS (3.0.22) i XRechnung també l'aplica.

D'on treu Odoo el codi
El codi que Odoo escriu al fitxer surt d'un lloc diferent segons la versió:
- Odoo 17, 18 i 19: té una taula que relaciona les unitats d'Odoo (pel seu identificador extern) amb codis UN/ECE. Una unitat que has creat tu no és a la taula i surt com a C62, unitat.
- Odoo 20: cada unitat de mesura té el seu propi camp de codi UN/ECE, i és aquest codi el que va al fitxer. Odoo el passa a majúscules, però no el compara amb la llista.
BR-CL-23 salta quan el codi del fitxer no és a la llista. A Odoo 20 n'hi ha prou amb un codi mal escrit a la unitat de mesura. A Odoo 17 a 19 la taula sempre dona un codi de la llista, així que la regla només salta si el codi arriba per un altre camí, com un mòdul que el canviï.
Hi ha també un problema que cap regla veu: una unitat pròpia («palet», «caixa de dotze») que a Odoo 17 a 19 es converteix en C62 sense avisar. El fitxer passa BR-CL-23, perquè C62 és a la llista, però el teu client rep «unitats» on tu venies caixes.
Per a qui rep la factura, el codi compta: el seu programari el llegeix per casar la línia amb la seva comanda i amb l'entrada de mercaderia. Si va demanar caixes i la factura diu unitats, la quantitat no quadra amb el que va rebre encara que l'import sigui el mateix, i la factura es queda aturada en la seva revisió.
Amb el nostre mòdul XRechnung i ZUGFeRD
El mòdul porta la seva pròpia taula, editable, d'unitats d'Odoo a codis UN/ECE, perquè cada unitat teva tingui el seu codi a BT-130. Una unitat que no sigui a aquesta taula surt com a C62, igual que a Odoo 17 a 19, i l'únic avís queda al registre del servidor, que no es veu des de la factura. Una línia sense unitat també surt com a C62.

A Odoo 18, 19 i 20, amb la subscripció a FlexigoTech Cloud, cada XRechnung i cada ZUGFeRD EN 16931 es valida amb les regles de KoSIT i un codi fora de la llista apareix com a BR-CL-23 a Validation Errors. A Odoo 17 la versió publicada no valida.
Què revisar
- Mira quina unitat porta la línia al XML (atribut unitCode).
- A Odoo 20, obre la unitat de mesura i posa-hi el seu codi UN/ECE.
- A Odoo 17, 18 i 19, si fas servir unitats pròpies, ten en compte que sortiran com a C62. Amb el nostre mòdul, en qualsevol versió, afegeix cada una a la seva taula: les que hi falten també surten com a C62.
- Si el preu va per quantitat base (per exemple, per cada cent unitats), que la seva unitat sigui la mateixa que la de la línia.
- Genera el fitxer de nou i comprova l'atribut unitCode de cada línia abans d'enviar-lo.
Continua llegint
Comprovat al codi del mòdul (versió 17.0 i 20.0) i a les fonts enllaçades
Fonts
- github.com/odoo/odoo/blob/6f00fdadb875342de2d14a179f25431f93cd63c9/addons/account_edi_ubl_
- 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_uom_mapping.py
- Codi del mòdul: flexigo_germany_xrechnung 20.0 (446f2f68): models/xrechnung_cloud.py
- Codi del mòdul: flexigo_germany_xrechnung 17.0 (ad05de8f): __manifest__.py
- github.com/itplr-kosit/xrechnung-schematron/releases/tag/v2.6.0
- github.com/ConnectingEurope/eInvoicing-EN16931/releases/tag/validation-1.3.17
- docs.peppol.eu/poacc/billing/3.0/rules/ubl-peppol/PEPPOL-EN16931-R130/
