ValidateFin

UBL Invoice — BR-CO-17, VAT amount does not equal base x rate

Un riepilogo IVA che non torna: una base di 2.000,00 al 19 % fa 380,00 di IVA, ma la fattura dichiara 395,00. BR-CO-17 verifica che l’imposta della categoria = imponibile × aliquota / 100, con il margine ufficiale di una unità monetaria: un centesimo di arrotondamento è tollerato, questo scarto di 15,00 no. Tutti gli altri totali seguono la cifra sbagliata: è così che un bug di arrotondamento arriva in produzione.

UBL 2.1 Invoice — Non valido

Un riepilogo IVA che non torna: una base di 2.000,00 al 19 % fa 380,00 di IVA, ma la fattura dichiara 395,00. BR-CO-17 verifica che l’imposta della categoria = imponibile × aliquota / 100, con il margine ufficiale di una unità monetaria: un centesimo di arrotondamento è tollerato, questo scarto di 15,00 no. Tutti gli altri totali seguono la cifra sbagliata: è così che un bug di arrotondamento arriva in produzione.

Fattura UBL (Peppol BIS 3.0) UBL 2.1 Invoice EN 16931 / Peppol BIS 3.0Risultato atteso: Non valido — 3 errori

Cosa mostra questo file

Un riepilogo IVA che non torna: una base di 2.000,00 al 19 % fa 380,00 di IVA, ma la fattura dichiara 395,00. BR-CO-17 verifica che l’imposta della categoria = imponibile × aliquota / 100, con il margine ufficiale di una unità monetaria: un centesimo di arrotondamento è tollerato, questo scarto di 15,00 no. Tutti gli altri totali seguono la cifra sbagliata: è così che un bug di arrotondamento arriva in produzione.

Transazioni2
Totale2395,00 €

I difetti che contiene

  • BR-CO-17BR-CO-17: VAT category tax amount (395.00) at rate 19% must equal base × rate / 100 (380.00, margin ±1.00).

Citato alla lettera dal validatore, non parafrasato.

Ultima verifica: Licenza: CC-BY-4.0

Tutte le parti, gli IBAN e gli importi qui sotto sono fittizi. Gli IBAN sono strutturalmente validi — superano il mod-97 — ma non corrispondono ad alcun conto reale.

Contenuto del file

<?xml version="1.0" encoding="UTF-8"?>
<!--
  ValidateFin sample file — UBL invoice, Peppol BIS Billing 3.0 (EN 16931).
  DELIBERATELY BROKEN — BR-CO-17.
  The VAT breakdown declares a taxable base of 2 000.00 at 19 %, which is 380.00 of VAT,
  but the VAT category tax amount says 395.00. Every other total is consistent WITH THAT
  WRONG FIGURE (BT-110 = 395.00, BT-112 = 2 395.00, BT-115 = 2 395.00), so BR-CO-14,
  BR-CO-15 and BR-CO-16 all pass: the file isolates BR-CO-17, "VAT category tax amount =
  VAT category taxable amount x VAT rate / 100", checked with the official margin of 1.00.
  This is the shape of a real rounding bug — VAT summed line by line, or a rate applied
  to a base that already included a discount.
  Expected validation result: INVALID — exactly one error, BR-CO-17.

  All parties and account numbers are fictitious.
  Reference page: https://validatefin.com/en/resources/samples/ubl-invoice-broken-vat-rounding
  License: CC-BY-4.0
-->
<Invoice xmlns="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">
  <cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0</cbc:CustomizationID>
  <cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID>
  <cbc:ID>KES-2026-0190</cbc:ID>
  <cbc:IssueDate>2026-03-18</cbc:IssueDate>
  <cbc:DueDate>2026-04-17</cbc:DueDate>
  <cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
  <cbc:Note>VAT amount does not match base x rate — see BR-CO-17.</cbc:Note>
  <cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>
  <cbc:BuyerReference>PO-2026-9207</cbc:BuyerReference>

  <cac:AccountingSupplierParty>
    <cac:Party>
      <cbc:EndpointID schemeID="9930">DE123456789</cbc:EndpointID>
      <cac:PartyName>
        <cbc:Name>Nordwind Logistik GmbH</cbc:Name>
      </cac:PartyName>
      <cac:PostalAddress>
        <cbc:StreetName>Speicherstrasse 12</cbc:StreetName>
        <cbc:CityName>Hamburg</cbc:CityName>
        <cbc:PostalZone>20457</cbc:PostalZone>
        <cac:Country>
          <cbc:IdentificationCode>DE</cbc:IdentificationCode>
        </cac:Country>
      </cac:PostalAddress>
      <cac:PartyTaxScheme>
        <cbc:CompanyID>DE123456789</cbc:CompanyID>
        <cac:TaxScheme>
          <cbc:ID>VAT</cbc:ID>
        </cac:TaxScheme>
      </cac:PartyTaxScheme>
      <cac:PartyLegalEntity>
        <cbc:RegistrationName>Nordwind Logistik GmbH</cbc:RegistrationName>
        <cbc:CompanyID>HRB 98765</cbc:CompanyID>
      </cac:PartyLegalEntity>
      <cac:Contact>
        <cbc:Name>Rechnungsstelle</cbc:Name>
        <cbc:Telephone>+49 40 555 0100</cbc:Telephone>
        <cbc:ElectronicMail>[email protected]</cbc:ElectronicMail>
      </cac:Contact>
    </cac:Party>
  </cac:AccountingSupplierParty>

  <cac:AccountingCustomerParty>
    <cac:Party>
      <cbc:EndpointID schemeID="9930">DE987654321</cbc:EndpointID>
      <cac:PartyName>
        <cbc:Name>Kessler Handel GmbH</cbc:Name>
      </cac:PartyName>
      <cac:PostalAddress>
        <cbc:StreetName>Marktplatz 3</cbc:StreetName>
        <cbc:CityName>Leipzig</cbc:CityName>
        <cbc:PostalZone>04109</cbc:PostalZone>
        <cac:Country>
          <cbc:IdentificationCode>DE</cbc:IdentificationCode>
        </cac:Country>
      </cac:PostalAddress>
      <cac:PartyTaxScheme>
        <cbc:CompanyID>DE987654321</cbc:CompanyID>
        <cac:TaxScheme>
          <cbc:ID>VAT</cbc:ID>
        </cac:TaxScheme>
      </cac:PartyTaxScheme>
      <cac:PartyLegalEntity>
        <cbc:RegistrationName>Kessler Handel GmbH</cbc:RegistrationName>
      </cac:PartyLegalEntity>
    </cac:Party>
  </cac:AccountingCustomerParty>

  <cac:PaymentMeans>
    <cbc:PaymentMeansCode>30</cbc:PaymentMeansCode>
    <cbc:PaymentID>KES-2026-0190</cbc:PaymentID>
    <cac:PayeeFinancialAccount>
      <cbc:ID>DE89370400440532013000</cbc:ID>
      <cbc:Name>Nordwind Logistik GmbH</cbc:Name>
    </cac:PayeeFinancialAccount>
  </cac:PaymentMeans>

  <cac:PaymentTerms>
    <cbc:Note>Net 30 days.</cbc:Note>
  </cac:PaymentTerms>

  <!-- 2000.00 x 19 % = 380.00, not 395.00 -->
  <cac:TaxTotal>
    <cbc:TaxAmount currencyID="EUR">395.00</cbc:TaxAmount>
    <cac:TaxSubtotal>
      <cbc:TaxableAmount currencyID="EUR">2000.00</cbc:TaxableAmount>
      <cbc:TaxAmount currencyID="EUR">395.00</cbc:TaxAmount>
      <cac:TaxCategory>
        <cbc:ID>S</cbc:ID>
        <cbc:Percent>19</cbc:Percent>
        <cac:TaxScheme>
          <cbc:ID>VAT</cbc:ID>
        </cac:TaxScheme>
      </cac:TaxCategory>
    </cac:TaxSubtotal>
  </cac:TaxTotal>

  <cac:LegalMonetaryTotal>
    <cbc:LineExtensionAmount currencyID="EUR">2000.00</cbc:LineExtensionAmount>
    <cbc:TaxExclusiveAmount currencyID="EUR">2000.00</cbc:TaxExclusiveAmount>
    <cbc:TaxInclusiveAmount currencyID="EUR">2395.00</cbc:TaxInclusiveAmount>
    <cbc:PayableAmount currencyID="EUR">2395.00</cbc:PayableAmount>
  </cac:LegalMonetaryTotal>

  <cac:InvoiceLine>
    <cbc:ID>1</cbc:ID>
    <cbc:InvoicedQuantity unitCode="C62">8</cbc:InvoicedQuantity>
    <cbc:LineExtensionAmount currencyID="EUR">1200.00</cbc:LineExtensionAmount>
    <cac:Item>
      <cbc:Description>Warehouse trolley, 300 kg capacity</cbc:Description>
      <cbc:Name>Warehouse trolley</cbc:Name>
      <cac:ClassifiedTaxCategory>
        <cbc:ID>S</cbc:ID>
        <cbc:Percent>19</cbc:Percent>
        <cac:TaxScheme>
          <cbc:ID>VAT</cbc:ID>
        </cac:TaxScheme>
      </cac:ClassifiedTaxCategory>
    </cac:Item>
    <cac:Price>
      <cbc:PriceAmount currencyID="EUR">150.00</cbc:PriceAmount>
    </cac:Price>
  </cac:InvoiceLine>

  <cac:InvoiceLine>
    <cbc:ID>2</cbc:ID>
    <cbc:InvoicedQuantity unitCode="C62">20</cbc:InvoicedQuantity>
    <cbc:LineExtensionAmount currencyID="EUR">800.00</cbc:LineExtensionAmount>
    <cac:Item>
      <cbc:Description>Safety strap set for pallet loads</cbc:Description>
      <cbc:Name>Safety strap set</cbc:Name>
      <cac:ClassifiedTaxCategory>
        <cbc:ID>S</cbc:ID>
        <cbc:Percent>19</cbc:Percent>
        <cac:TaxScheme>
          <cbc:ID>VAT</cbc:ID>
        </cac:TaxScheme>
      </cac:ClassifiedTaxCategory>
    </cac:Item>
    <cac:Price>

160 / 165 lines shown — the complete file is in the download above.

Come sappiamo che questi risultati reggono

Ogni file di questa libreria passa nel validatore del sito a ogni build. Il risultato atteso indicato sopra è verificato da un test automatico: se un file smettesse di corrispondere a quanto afferma questa pagina, la build fallirebbe. Due fixture ereditate sono state riparate così prima della pubblicazione: tre IBAN non superavano il mod-97 e diversi nomi usavano caratteri fuori dal set SEPA di base.

Fattura UBL (Peppol BIS 3.0)