UBL Invoice — BR-CO-17, VAT amount does not equal base x rate
Une ventilation de TVA qui ne tombe pas juste : une base de 2 000,00 à 19 % fait 380,00 de TVA, mais la facture déclare 395,00. BR-CO-17 vérifie que le montant de TVA de la catégorie = base × taux / 100, avec la marge officielle d’une unité monétaire — un vrai centime d’arrondi est donc toléré, cet écart de 15,00 non. Tous les autres totaux collent au chiffre faux : c’est ainsi qu’un bug d’arrondi survit jusqu’en production.
UBL 2.1 Invoice — Invalide
Une ventilation de TVA qui ne tombe pas juste : une base de 2 000,00 à 19 % fait 380,00 de TVA, mais la facture déclare 395,00. BR-CO-17 vérifie que le montant de TVA de la catégorie = base × taux / 100, avec la marge officielle d’une unité monétaire — un vrai centime d’arrondi est donc toléré, cet écart de 15,00 non. Tous les autres totaux collent au chiffre faux : c’est ainsi qu’un bug d’arrondi survit jusqu’en production.
Ce que montre ce fichier
Une ventilation de TVA qui ne tombe pas juste : une base de 2 000,00 à 19 % fait 380,00 de TVA, mais la facture déclare 395,00. BR-CO-17 vérifie que le montant de TVA de la catégorie = base × taux / 100, avec la marge officielle d’une unité monétaire — un vrai centime d’arrondi est donc toléré, cet écart de 15,00 non. Tous les autres totaux collent au chiffre faux : c’est ainsi qu’un bug d’arrondi survit jusqu’en production.
| Transactions | 2 |
|---|---|
| Total | 2 395,00 € |
Les défauts qu’il porte
- BR-CO-17BR-CO-17: VAT category tax amount (395.00) at rate 19% must equal base × rate / 100 (380.00, margin ±1.00).
Cité mot pour mot depuis le validateur, sans reformulation.
Toutes les parties, IBAN et montants ci-dessous sont fictifs. Les IBAN sont structurellement valides — ils passent le mod-97 — mais ne correspondent à aucun compte réel.
Contenu du fichier
<?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.
Comment nous savons que ces résultats tiennent
Chaque fichier de cette bibliothèque passe dans le validateur du site à chaque build. Le résultat attendu annoncé ci-dessus est vérifié par un test automatisé : si un fichier cessait de correspondre à ce que cette page affirme, le build échouerait. Deux fixtures héritées ont été réparées ainsi avant publication : trois IBAN échouaient au mod-97 et plusieurs libellés utilisaient des caractères hors du jeu SEPA de base.
Facture UBL (Peppol BIS 3.0)
- UBL Invoice — valid Peppol BIS 3.0
- UBL Credit Note — valid Peppol BIS 3.0
- UBL Invoice — BR-CO-10 violation
- UBL Invoice — malformed seller VAT identifier
- UBL Invoice — allowances and charges, line and document level
- UBL Invoice — reverse charge (VAT category AE)
- UBL Invoice — VAT exempt (category E) with exemption reason
- UBL Invoice — intra-Community supply (VAT category K)
- UBL Invoice — two VAT rates, one breakdown per rate
- UBL Invoice — BR-CO-10, line sum does not equal BT-106
- UBL Invoice — exempt VAT without an exemption reason (BR-E-10) and a wrong exempt base (BR-E-08)