Erori e-Factura

EN16931

Discountul pe factură trebuie să aibă suma completată

Codul regulii este BR-31.

Mesajul exact din validatorul ANAF

org.xml.sax.SAXParseException; lineNumber: 137; columnNumber: 181; cvc-complex-type.2.4.a: Invalid content was found starting with element '{"urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2":TaxCategory}'. One of '{"urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2":AllowanceChargeReason, "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2":MultiplierFactorNumeric, "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2":PrepaidIndicator, "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2":SequenceNumeric, "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2":Amount}' is expected.

Ce înseamnă

Când acorzi o reducere care se aplică pe toată factura, nu pe o singură linie, ea se scrie în grupul AllowanceCharge de la nivel de document (BG-20). Regula BR-31 cere ca acest grup să conțină obligatoriu suma reducerii, BT-92, adică elementul cbc:Amount. Fără sumă, ANAF nu poate verifica totalurile facturii și fișierul se respinge.

Cum repari

În programul de facturare, la discountul pe factură completează câmpul sumă (BT-92). Dacă suma se schimbă, actualizează în același pas totalul reducerilor (BT-107), baza impozabilă (BT-109), TVA-ul (BT-110) și totalul de plată (BT-115), altfel factura pică pe alte reguli de aritmetică. Dacă discountul rămâne fără sumă, șterge complet grupul AllowanceCharge.

Exemplu

Așa pică

<ubl:Invoice xmlns:ubl="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">
  <cac:PaymentTerms>
    <cbc:Note>Plata la 30 de zile de la emitere.</cbc:Note>
  </cac:PaymentTerms>
  <cac:AllowanceCharge>
    <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
    <cbc:AllowanceChargeReason>Discount comercial acordat pe factura</cbc:AllowanceChargeReason>
    <cac:TaxCategory>
      <cbc:ID>S</cbc:ID>
      <cbc:Percent>19.00</cbc:Percent>
      <cac:TaxScheme>
        <cbc:ID>VAT</cbc:ID>
      </cac:TaxScheme>
    </cac:TaxCategory>
  </cac:AllowanceCharge>
  <cac:TaxTotal>
    <cbc:TaxAmount currencyID="RON">171.00</cbc:TaxAmount>
    <cac:TaxSubtotal>
      <cbc:TaxableAmount currencyID="RON">900.00</cbc:TaxableAmount>
      <cbc:TaxAmount currencyID="RON">171.00</cbc:TaxAmount>
      <cac:TaxCategory>
        <cbc:ID>S</cbc:ID>
        <cbc:Percent>19.00</cbc:Percent>
        <cac:TaxScheme>
          <cbc:ID>VAT</cbc:ID>
        </cac:TaxScheme>
      </cac:TaxCategory>
    </cac:TaxSubtotal>
  </cac:TaxTotal>
  <cac:LegalMonetaryTotal>
    <cbc:LineExtensionAmount currencyID="RON">1000.00</cbc:LineExtensionAmount>
    <cbc:TaxExclusiveAmount currencyID="RON">900.00</cbc:TaxExclusiveAmount>
    <cbc:TaxInclusiveAmount currencyID="RON">1071.00</cbc:TaxInclusiveAmount>
    <cbc:AllowanceTotalAmount currencyID="RON">100.00</cbc:AllowanceTotalAmount>
    <cbc:PayableAmount currencyID="RON">1071.00</cbc:PayableAmount>
  </cac:LegalMonetaryTotal>
</ubl:Invoice>

Așa trece

<ubl:Invoice xmlns:ubl="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">
  <cac:PaymentTerms>
    <cbc:Note>Plata la 30 de zile de la emitere.</cbc:Note>
  </cac:PaymentTerms>
  <cac:AllowanceCharge>
    <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
    <cbc:AllowanceChargeReason>Discount comercial acordat pe factura</cbc:AllowanceChargeReason>
    <cbc:Amount currencyID="RON">100.00</cbc:Amount>
    <cac:TaxCategory>
      <cbc:ID>S</cbc:ID>
      <cbc:Percent>19.00</cbc:Percent>
      <cac:TaxScheme>
        <cbc:ID>VAT</cbc:ID>
      </cac:TaxScheme>
    </cac:TaxCategory>
  </cac:AllowanceCharge>
  <cac:TaxTotal>
    <cbc:TaxAmount currencyID="RON">171.00</cbc:TaxAmount>
    <cac:TaxSubtotal>
      <cbc:TaxableAmount currencyID="RON">900.00</cbc:TaxableAmount>
      <cbc:TaxAmount currencyID="RON">171.00</cbc:TaxAmount>
      <cac:TaxCategory>
        <cbc:ID>S</cbc:ID>
        <cbc:Percent>19.00</cbc:Percent>
        <cac:TaxScheme>
          <cbc:ID>VAT</cbc:ID>
        </cac:TaxScheme>
      </cac:TaxCategory>
    </cac:TaxSubtotal>
  </cac:TaxTotal>
  <cac:LegalMonetaryTotal>
    <cbc:LineExtensionAmount currencyID="RON">1000.00</cbc:LineExtensionAmount>
    <cbc:TaxExclusiveAmount currencyID="RON">900.00</cbc:TaxExclusiveAmount>
    <cbc:TaxInclusiveAmount currencyID="RON">1071.00</cbc:TaxInclusiveAmount>
    <cbc:AllowanceTotalAmount currencyID="RON">100.00</cbc:AllowanceTotalAmount>
    <cbc:PayableAmount currencyID="RON">1071.00</cbc:PayableAmount>
  </cac:LegalMonetaryTotal>
</ubl:Invoice>

În practică nu ajungi să vezi codul regulii: valoarea e respinsă mai devreme, de schema XML, iar mesajul arată cum scrie mai sus. Regula există și ea, dar prinde doar cazurile pe care schema le lasă să treacă.

Verificat. Am pus fiecare din cele două fragmente într-o factură completă și le-am trecut prin validatorul oficial ANAF, versiunea ro16931-ubl-1.0.9. Factura cu fragmentul din stânga a fost respinsă cu mesajul de mai sus; cea cu fragmentul din dreapta a trecut fără nicio eroare. Verificarea s-a făcut pe 14.09.2026.
Regula așa cum e scrisă în schematronul oficial

Textul oficial, în engleză

Each Document level allowance (BG-20) shall have a Document level allowance amount (BT-92).

Unde se aplică

$Document_level_allowances

Condiția care trebuie să fie adevărată

$BR-31
Ce nu rezultă din textul oficial al regulii

Valoarea discountului (100,00 RON) și sumele recalculate din exemplu (bază 900,00; TVA 171,00; total 1.071,00) sunt alese rotund pentru verificare din cap; în factura ta pui discountul real și recalculezi toate totalurile. Ordinea elementelor din AllowanceCharge (ChargeIndicator, AllowanceChargeReason, Amount, TaxCategory) respectă secvența UBL, dar nu am putut confirma aici dacă validatorul ANAF cere suplimentar și un cod de motiv în locul textului liber.