- BR-23, fatal «An Invoice line (BG-25) shall have an Invoiced quantity unit of measure code (BT-130).» La riga deve riportare un'unità.
- BR-CL-23, fatal «Unit code MUST be coded according to the UN/ECE Recommendation 20 with Rec 21 extension» L'unità deve essere un codice della lista.
- PEPPOL-EN16931-R130, fatal «Unit code of price base quantity MUST be same as invoiced quantity.» Se il prezzo è riferito a una quantità base, la sua unità è la stessa di quella della riga.
Le prime due provengono da EN 16931 (Schematron validation-1.3.17). La terza è di Peppol BIS (3.0.22) e XRechnung la applica anch'essa.

Da dove prende Odoo il codice
Il codice che Odoo scrive nel file proviene da un punto diverso a seconda della versione:
- Odoo 17, 18 e 19: una tabella collega le unità di Odoo (tramite il loro identificativo esterno) ai codici UN/ECE. Un'unità creata da te non è in tabella e viene esportata come C62, unità.
- Odoo 20: ogni unità di misura ha un proprio campo per il codice UN/ECE, ed è quel codice a finire nel file. Odoo lo converte in maiuscolo, ma non lo confronta con la lista.
BR-CL-23 scatta quando il codice nel file non è nella lista. In Odoo 20 basta un codice scritto male sull'unità di misura. In Odoo 17 a 19 la tabella fornisce sempre un codice della lista, quindi la regola scatta solo se il codice arriva per un'altra strada, per esempio da un modulo che lo modifica.
C'è poi un problema che nessuna regola rileva: un'unità personalizzata («pallet», «cartone da dodici») che in Odoo 17 a 19 diventa C62 senza avvisi. Il file supera BR-CL-23, perché C62 è in lista, ma il tuo cliente riceve «unità» dove tu vendevi cartoni.
Per chi riceve la fattura il codice conta: il suo software lo legge per abbinare la riga al proprio ordine e alla merce ricevuta. Se ha ordinato cartoni e la fattura dice unità, la quantità non torna con quanto ha ricevuto anche se l'importo è lo stesso, e la fattura si blocca nella sua verifica.
Con il nostro modulo XRechnung e ZUGFeRD
Il modulo include una propria tabella modificabile che collega le unità di Odoo ai codici UN/ECE, così ogni tua unità ottiene il suo codice in BT-130. Un'unità assente da quella tabella viene esportata come C62, come in Odoo 17 a 19, e l'unico avviso finisce nel registro del server, che non è visibile dalla fattura. Anche una riga senza unità esce come C62.

In Odoo 18, 19 e 20, con l'abbonamento a FlexigoTech Cloud, ogni XRechnung e ogni ZUGFeRD EN 16931 viene validato con le regole di KoSIT, e un codice fuori lista compare come BR-CL-23 in Validation Errors. In Odoo 17 la versione pubblicata non effettua la validazione.
Cosa verificare
- Controlla quale unità riporta la riga nel XML (attributo unitCode).
- In Odoo 20, apri l'unità di misura e imposta il suo codice UN/ECE.
- In Odoo 17, 18 e 19, se usi unità personalizzate, tieni presente che escono come C62. Con il nostro modulo, su qualsiasi versione, aggiungine ciascuna alla sua tabella: quelle mancanti escono anch'esse come C62.
- Se il prezzo è riferito a una quantità base (per esempio, ogni cento unità), fai in modo che la sua unità sia la stessa della riga.
- Genera di nuovo il file e controlla l'attributo unitCode di ogni riga prima di inviarlo.
Continua a leggere
Verificato nel codice del modulo (versione 17.0 e 20.0) e nelle fonti collegate
Fonti
- 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_
- Codice del modulo: flexigo_germany_xrechnung 20.0 (446f2f68): models/xrechnung_uom_mapping.py
- Codice del modulo: flexigo_germany_xrechnung 20.0 (446f2f68): models/xrechnung_cloud.py
- Codice del modulo: 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/
