Ce înseamnă
UBL 2.1 definește o ordine strictă pentru elementele copil ale fiecărui
container. Dacă pui un element corect dar în poziție greșită — de exemplu
<cac:LegalMonetaryTotal> înainte de <cac:TaxTotal> — validatorul XSD
respinge XML-ul.
Mesajele tipice variază în funcție de parser:
cvc-complex-type.2.4.d: Invalid content was found starting with element ...
Element '{...}LegalMonetaryTotal': This element is not expected.
De ce contează ordinea
UBL folosește xsd:sequence în schemă, nu xsd:all — asta înseamnă că
elementele trebuie să apară fix în ordinea declarată. E o particularitate
a XSD-ului care surprinde mulți dezvoltatori (HTML, JSON și majoritatea
formatelor moderne nu impun ordine).
Cum se rezolvă
- Compară XML-ul tău cu un exemplu valid (vezi mai jos) și mută elementele în ordinea așteptată
- Verifică schema
UBL-Invoice-2.1.xsdsauUBL-CreditNote-2.1.xsdpentru ordinea exactă a<xsd:sequence> - Generatoarele de XML (cum ar fi Factureanu) respectă automat ordinea — majoritatea problemelor de ordonare apar la XML scrise manual sau compuse de scripturi care nu cunosc schema
Ordinea de nivel superior pentru Invoice
cbc:UBLVersionID
cbc:CustomizationID
cbc:ProfileID
cbc:ID
cbc:IssueDate
cbc:DueDate
cbc:InvoiceTypeCode
cbc:Note
cbc:DocumentCurrencyCode
cac:OrderReference (opțional)
cac:BillingReference (obligatoriu pentru CreditNote)
cac:AccountingSupplierParty
cac:AccountingCustomerParty
cac:PaymentMeans
cac:PaymentTerms
cac:AllowanceCharge
cac:TaxTotal
cac:LegalMonetaryTotal
cac:InvoiceLine (1..n)
Pentru CreditNote, înlocuiește InvoiceTypeCode cu CreditNoteTypeCode
și InvoiceLine cu CreditNoteLine. BillingReference devine obligatoriu.