Eroare unitCode lipsa la e-Factura: atributul obligatoriu la cantitate
Eroarea unitCode la e-Factura apare cand atributul unitCode lipseste din elementul InvoicedQuantity. Nu este un element copil, ci un atribut XML. Cauze si fix.
Eroarea apare ca "Atributul unitCode este obligatoriu" sau ca o eroare generica de validare de schema XML la linia care contine InvoicedQuantity. Cauza este simpla: elementul de cantitate din factura nu are specificata unitatea de masura, sau aceasta a fost adaugata gresit ca element copil in loc de atribut.
Ce inseamna aceasta eroare
In XML-ul UBL 2.1 folosit pentru e-Factura, cantitatea facturata este reprezentata de elementul cbc:InvoicedQuantity. Acest element trebuie sa aiba atributul unitCode, care specifica unitatea de masura conform standardului UN/CEFACT.
Diferenta importanta: unitCode este un atribut XML, nu un element copil. In XML, atributele se scriu in interiorul tag-ului de deschidere, nu ca elemente separate. Aceasta distinctie este sursa celei mai frecvente confuzii.
Aceasta eroare este distincta de BR-23, care este regula de business despre prezenta unitatii de masura. Eroarea de schema apare atunci cand structura XML in sine este malformata, nu cand regula de business este incalcata.
De ce apare aceasta eroare
Generare XML manuala fara cunoasterea structurii de atribute. Cei care construiesc XML-ul de la zero, mai ales din limbaje care abstractizeaza XML (JSON, obiecte, ORMs), pot confunda atributele cu elementele. Rezultatul este un XML malformat sau un element fara atribut.
Serializare automata gresita. Daca folosesti o librarie de serializare XML, aceasta poate trata unitCode ca un element copil in loc de atribut, in functie de cum este configurata sau cum sunt adnotate clasele de model.
Template incomplet. Un template de document XML poate sa fi omis atributul unitCode de pe elementul InvoicedQuantity, mai ales daca a fost creat fara a fi testat cu un validator de schema.
Copiere partiala din alt document. Daca copiezi structura XML dintr-un exemplu, este usor sa copiezi valoarea cantitatii dar sa omiti atributul.
Cum o rezolvi
Pasul 1: Gaseste elementul InvoicedQuantity in XML. Cauta in XML-ul facturii toate aparitiile de InvoicedQuantity. Fiecare linie de factura are propriul element.
Pasul 2: Verifica prezenta atributului. Fiecare element cbc:InvoicedQuantity trebuie sa aiba atributul unitCode in tag-ul de deschidere. Daca nu il ai, trebuie sa il adaugi.
XML incorect (atribut lipsa):
<!-- INCORECT: unitCode lipseste complet ca atribut -->
<cbc:InvoicedQuantity>1</cbc:InvoicedQuantity>XML incorect (unitCode ca element in loc de atribut):
<!-- INCORECT: unitCode ca element copil in loc de atribut -->
<cbc:InvoicedQuantity>
<cbc:unitCode>C62</cbc:unitCode>
1
</cbc:InvoicedQuantity>XML corect:
<!-- CORECT: unitCode ca atribut al elementului -->
<cbc:InvoicedQuantity unitCode="C62">1</cbc:InvoicedQuantity>Pasul 3: Alege codul de unitate corect. Codurile de unitate sunt din standardul UN/CEFACT. Cele mai frecvente in Romania:
<!-- Coduri de unitate de masura frecvente -->
<!-- Bucata (piece) --> <cbc:InvoicedQuantity unitCode="C62">1</cbc:InvoicedQuantity>
<!-- Ora (hour) --> <cbc:InvoicedQuantity unitCode="HUR">8</cbc:InvoicedQuantity>
<!-- Zi (day) --> <cbc:InvoicedQuantity unitCode="DAY">5</cbc:InvoicedQuantity>
<!-- Luna (month) --> <cbc:InvoicedQuantity unitCode="MON">1</cbc:InvoicedQuantity>Pasul 4: Corecteaza toate liniile de factura. Eroarea poate aparea la orice linie de factura. Verifica si corecteaza fiecare element InvoicedQuantity din document.
Pasul 5: Retrimite factura. Dupa corectare, retrimite documentul catre ANAF.
Rezolva cu Billyou
Billyou genereaza XML cu atributul unitCode setat corect pe fiecare element InvoicedQuantity. Unitatea de masura este configurabila per produs sau per linie de factura in interfata Billyou. Nu trebuie sa cunosti structura XML sau codurile UN/CEFACT.
Daca folosesti API-ul Billyou, trimiti unitatea de masura ca un camp simplu in JSON (de exemplu unit: "C62") si Billyou se ocupa de generarea corecta a atributului XML. Documentatia la billyou.ro/dev.
Citeste si articolul despre eroarea BR-23 e-Factura, care este regula de business corelata cu unitatea de masura.
Intrebari frecvente
Ce cod unitCode pun pentru servicii?
Depinde de tipul de serviciu. Pentru servicii facturate pe ora, folosesti HUR. Pentru servicii pe zi, DAY. Pentru servicii pe luna, MON. Daca serviciul este facturat ca o suma forfetara fara o unitate specifica de timp, C62 (bucata) este acceptabil si frecvent folosit in practica.
Pot folosi orice cod unitCode sau exista o lista limitata?
Lista completa de coduri acceptate este din standardul UN/CEFACT Recommendation 20. ANAF accepta orice cod valid din aceasta lista. In practica, marea majoritate a facturilor romanesti folosesc C62, HUR, DAY si MON. Daca ai o unitate de masura specifica (tone, litri, metri patrati), exista coduri corespunzatoare in standard.
Eroarea apare si la BaseQuantity sau doar la InvoicedQuantity?
Atributul unitCode este obligatoriu si pe cbc:BaseQuantity, daca acest element este prezent in factura (apare in contextul preturilor). Daca primesti eroarea pentru un element diferit de InvoicedQuantity, aplica aceeasi corectie: adauga atributul unitCode direct in tag-ul elementului.