ValidateFin

UBL Invoice — malformed seller VAT identifier

Une facture dont le numéro de TVA du vendeur, « FR1234 », est trop court : un numéro français, c’est FR suivi d’une clé de deux caractères et de neuf chiffres. Les erreurs de format sur BT-31 sont attrapées bien avant l’administration fiscale.

UBL 2.1 Invoice — Invalide

Une facture dont le numéro de TVA du vendeur, « FR1234 », est trop court : un numéro français, c’est FR suivi d’une clé de deux caractères et de neuf chiffres. Les erreurs de format sur BT-31 sont attrapées bien avant l’administration fiscale.

Facture UBL (Peppol BIS 3.0) UBL 2.1 Invoice EN 16931 / Peppol BIS Billing 3.0Résultat attendu: Invalide — 1 erreurs

Ce que montre ce fichier

Une facture dont le numéro de TVA du vendeur, « FR1234 », est trop court : un numéro français, c’est FR suivi d’une clé de deux caractères et de neuf chiffres. Les erreurs de format sur BT-31 sont attrapées bien avant l’administration fiscale.

Les défauts qu’il porte

  • VATInvalid VAT ID format for Supplier (FR): FR1234

Cité mot pour mot depuis le validateur, sans reformulation.

Dernière vérification: Licence: CC-BY-4.0

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).
  Expected validation result: INVALID — malformed seller VAT identifier.
  Deliberate defect: the seller VAT number "FR1234" is too short to be a valid
  French VAT identifier (FR + 2 characters + 9 digits).

  All parties and account numbers are fictitious.
  Reference page: https://validatefin.com/en/resources/samples/ubl-invoice-invalid-vat
  License: CC-BY-4.0
-->
<!-- TVA FR valide : FR + 2 caractères alphanum + 9 chiffres = 13 caractères total -->
<!-- Ici : "FR1234" (trop court) pour le fournisseur -->
<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:ID>FA-ERR-VAT-001</cbc:ID>
  <cbc:IssueDate>2026-02-10</cbc:IssueDate>
  <cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
  <cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>

  <cac:AccountingSupplierParty>
    <cac:Party>
      <cac:PartyName>
        <cbc:Name>Société TVA Invalide SARL</cbc:Name>
      </cac:PartyName>
      <cac:PostalAddress>
        <cbc:StreetName>10 rue de la Paix</cbc:StreetName>
        <cbc:CityName>Bordeaux</cbc:CityName>
        <cbc:PostalZone>33000</cbc:PostalZone>
        <cac:Country>
          <cbc:IdentificationCode>FR</cbc:IdentificationCode>
        </cac:Country>
      </cac:PostalAddress>
      <cac:PartyTaxScheme>
        <!-- TVA invalide : trop courte, ne respecte pas le format FR[A-Z0-9]{2}[0-9]{9} -->
        <cbc:CompanyID>FR1234</cbc:CompanyID>
        <cac:TaxScheme>
          <cbc:ID>VAT</cbc:ID>
        </cac:TaxScheme>
      </cac:PartyTaxScheme>
      <cac:PartyLegalEntity>
        <cbc:RegistrationName>Société TVA Invalide SARL</cbc:RegistrationName>
      </cac:PartyLegalEntity>
    </cac:Party>
  </cac:AccountingSupplierParty>

  <cac:AccountingCustomerParty>
    <cac:Party>
      <cac:PartyName>
        <cbc:Name>Client Valide SAS</cbc:Name>
      </cac:PartyName>
      <cac:PostalAddress>
        <cbc:StreetName>5 boulevard Haussmann</cbc:StreetName>
        <cbc:CityName>Paris</cbc:CityName>
        <cbc:PostalZone>75009</cbc:PostalZone>
        <cac:Country>
          <cbc:IdentificationCode>FR</cbc:IdentificationCode>
        </cac:Country>
      </cac:PostalAddress>
      <cac:PartyTaxScheme>
        <cbc:CompanyID>FR45987654321</cbc:CompanyID>
        <cac:TaxScheme>
          <cbc:ID>VAT</cbc:ID>
        </cac:TaxScheme>
      </cac:PartyTaxScheme>
      <cac:PartyLegalEntity>
        <cbc:RegistrationName>Client Valide SAS</cbc:RegistrationName>
      </cac:PartyLegalEntity>
    </cac:Party>
  </cac:AccountingCustomerParty>

  <cac:TaxTotal>
    <cbc:TaxAmount currencyID="EUR">60.00</cbc:TaxAmount>
    <cac:TaxSubtotal>
      <cbc:TaxableAmount currencyID="EUR">300.00</cbc:TaxableAmount>
      <cbc:TaxAmount currencyID="EUR">60.00</cbc:TaxAmount>
      <cac:TaxCategory>
        <cbc:ID>S</cbc:ID>
        <cbc:Percent>20</cbc:Percent>
        <cac:TaxScheme>
          <cbc:ID>VAT</cbc:ID>
        </cac:TaxScheme>
      </cac:TaxCategory>
    </cac:TaxSubtotal>
  </cac:TaxTotal>

  <cac:LegalMonetaryTotal>
    <cbc:LineExtensionAmount currencyID="EUR">300.00</cbc:LineExtensionAmount>
    <cbc:TaxExclusiveAmount currencyID="EUR">300.00</cbc:TaxExclusiveAmount>
    <cbc:TaxInclusiveAmount currencyID="EUR">360.00</cbc:TaxInclusiveAmount>
    <cbc:PayableAmount currencyID="EUR">360.00</cbc:PayableAmount>
  </cac:LegalMonetaryTotal>

  <cac:InvoiceLine>
    <cbc:ID>1</cbc:ID>
    <cbc:InvoicedQuantity unitCode="EA">3</cbc:InvoicedQuantity>
    <cbc:LineExtensionAmount currencyID="EUR">300.00</cbc:LineExtensionAmount>
    <cac:Item>
      <cbc:Description>Forfait maintenance mensuelle</cbc:Description>
      <cbc:Name>Maintenance</cbc:Name>
      <cac:ClassifiedTaxCategory>
        <cbc:ID>S</cbc:ID>
        <cbc:Percent>20</cbc:Percent>
        <cac:TaxScheme>
          <cbc:ID>VAT</cbc:ID>
        </cac:TaxScheme>
      </cac:ClassifiedTaxCategory>
    </cac:Item>
    <cac:Price>
      <cbc:PriceAmount currencyID="EUR">100.00</cbc:PriceAmount>
    </cac:Price>
  </cac:InvoiceLine>
</Invoice>

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)