- BR-23, fatal „An Invoice line (BG-25) shall have an Invoiced quantity unit of measure code (BT-130).” Pozycja musi mieć jednostkę.
- BR-CL-23, fatal „Unit code MUST be coded according to the UN/ECE Recommendation 20 with Rec 21 extension” Jednostka musi być kodem z listy.
- PEPPOL-EN16931-R130, fatal „Unit code of price base quantity MUST be same as invoiced quantity.” Jeśli cena dotyczy ilości bazowej, jej jednostka jest taka sama jak jednostka pozycji.
Dwie pierwsze pochodzą z EN 16931 (Schematron validation-1.3.17). Trzecia pochodzi z Peppol BIS (3.0.22), a XRechnung również ją stosuje.

Skąd Odoo bierze kod
Kod, który Odoo zapisuje w pliku, pochodzi z różnych miejsc zależnie od wersji:
- Odoo 17, 18 i 19: tabela przypisuje jednostkom Odoo (po identyfikatorze zewnętrznym) kody UN/ECE. Jednostka utworzona przez Ciebie nie znajduje się w tabeli i trafia jako C62, sztuka.
- Odoo 20: każda jednostka miary ma własne pole kodu UN/ECE i ten kod trafia do pliku. Odoo zamienia go na wielkie litery, ale nie porównuje go z listą.
BR-CL-23 zgłasza błąd, gdy kod w pliku nie znajduje się na liście. W Odoo 20 wystarczy źle wpisany kod w jednostce miary. W Odoo 17 do 19 tabela zawsze podaje kod z listy, więc reguła zadziała tylko wtedy, gdy kod dotrze inną drogą, na przykład przez moduł, który go zmienia.
Istnieje też problem, którego żadna reguła nie wykrywa: jednostka własna („paleta”, „karton po dwanaście”), którą Odoo 17 do 19 zamienia na C62 bez ostrzeżenia. Plik przechodzi BR-CL-23, bo C62 jest na liście, ale Twój klient dostaje „sztuki” tam, gdzie sprzedawałeś kartony.
Dla odbiorcy faktury kod ma znaczenie: jego program odczytuje go, by dopasować pozycję do zamówienia i przyjęcia towaru. Jeśli zamówił kartony, a faktura mówi o sztukach, ilość nie zgadza się z tym, co otrzymał, mimo że kwota jest ta sama, i faktura utyka w jego weryfikacji.
Z naszym modułem XRechnung i ZUGFeRD
Moduł zawiera własną, edytowalną tabelę jednostek Odoo na kody UN/ECE, dzięki czemu każda Twoja jednostka otrzymuje swój kod w BT-130. Jednostka, której nie ma w tej tabeli, trafia jako C62, tak jak w Odoo 17 do 19, a jedyne ostrzeżenie pojawia się w logu serwera, którego nie widać z poziomu faktury. Pozycja bez jednostki również trafia jako C62.

W Odoo 18, 19 i 20, przy subskrypcji FlexigoTech Cloud, każda faktura XRechnung i każda ZUGFeRD EN 16931 jest walidowana regułami KoSIT, a kod spoza listy pojawia się jako BR-CL-23 w Validation Errors. W Odoo 17 opublikowana wersja nie przechodzi walidacji.
Co sprawdzić
- Zobacz, jaką jednostkę ma pozycja w XML (atrybut unitCode).
- W Odoo 20 otwórz jednostkę miary i ustaw jej kod UN/ECE.
- W Odoo 17, 18 i 19, jeśli używasz jednostek własnych, pamiętaj, że trafią jako C62. Z naszym modułem, w każdej wersji, dodaj każdą z nich do jego tabeli: brakujące również trafią jako C62.
- Jeśli cena dotyczy ilości bazowej (na przykład za każde sto sztuk), jej jednostka musi być taka sama jak jednostka pozycji.
- Wygeneruj plik ponownie i sprawdź atrybut unitCode każdej pozycji przed wysłaniem.
Czytaj dalej
Sprawdzone w kodzie źródłowym modułu (wersja 17.0 i 20.0) i w podlinkowanych źródłach
Źródła
- 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_
- Kod modułu: flexigo_germany_xrechnung 20.0 (446f2f68): models/xrechnung_uom_mapping.py
- Kod modułu: flexigo_germany_xrechnung 20.0 (446f2f68): models/xrechnung_cloud.py
- Kod modułu: 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/
