Erori e-FacturaBR-31

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 inseamna

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

Asa pica

<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>

Asa 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>

In practica nu ajungi sa vezi codul regulii: valoarea e respinsa mai devreme, de schema XML, iar mesajul arata cum scrie mai sus. Regula exista si ea, dar prinde doar cazurile pe care schema le lasa sa treaca.

Verificat. Am pus fiecare din cele doua fragmente intr-o factura completa si le-am trecut prin validatorul oficial ANAF, versiunea ro16931-ubl-1.0.9. Factura cu fragmentul din stanga a fost respinsa cu mesajul de mai sus; cea cu fragmentul din dreapta a trecut fara nicio eroare. Verificarea s-a facut pe 14.09.2026.
Regula asa cum e scrisa in schematronul oficial

Textul oficial, in engleza

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

Unde se aplica

$Document_level_allowances

Conditia care trebuie sa fie adevarata

$BR-31
Ce nu rezulta 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.