DEV Community

Alice Klein
Alice Klein

Posted on

webdev, api, fintech, programming

Weryfikacja europejskich numerów identyfikacji podatkowej (VAT-UE) w systemie VIES (VAT Information Exchange System) to kluczowy element każdego systemu e-commerce, platformy SaaS oraz oprogramowania finansowo-księgowego obsługującego transakcje transgraniczne (B2B) w Unii Europejskiej.

Zastosowanie preferencyjnej stawki 0% VAT przy Wewnątrzwspólnotowej Dostawie Towarów (WDT) lub procedury odwrotnego obciążenia (reverse charge) przy świadczeniu usług wymaga bezwzględnego potwierdzenia, że kontrahent posiada aktywny numer w rejestrze VIES.

Przed wysłaniem zapytania do unijnego API kluczowa jest lokalna walidacja składniowa. Poniżej przedstawiamy zestawienie struktur i algorytmów numerów VAT w poszczególnych państwach członkowskich UE.


Tabela formatów numerów VAT w Unii Europejskiej

Każde z 27 państw członkowskich stosuje własny standard tworzenia numeru identyfikacji podatkowej. Poniższa tabela przedstawia strukturę wymaganą przez unijną bazę VIES:

Państwo Kod kraju (Prefiks) Długość i format znaków Przykład struktury
Austria AT U + 8 cyfr ATU12345678
Belgia BE 10 cyfr (zaczyna się od 0 lub 1) BE0123456789
Czechy CZ 8, 9 lub 10 cyfr CZ12345678
Dania DK 8 cyfr DK12345678
Estonia EE 9 cyfr EE123456789
Finlandia FI 8 cyfr FI12345678
Francja FR 2 znaki (cyfry/litery) + 9 cyfr FRXX123456789
Grecja EL 9 cyfr (uwaga: prefiks EL) EL123456789
Hiszpania ES 9 znaków (litera na początku/końcu) ESX1234567X
Holandia NL 9 cyfr + B + 2 cyfry NL123456789B01
Irlandia IE 7 cyfr + 1-2 litery IE1234567T
Litwa LT 9 lub 12 cyfr LT123456789
Łotwa LV 11 cyfr LV12345678901
Niemcy DE Dokładnie 9 cyfr DE123456789
Polska PL Dokładnie 10 cyfr PL1234567890
Szwecja SE 12 cyfr (kończy się 01) SE123456789001
Włochy IT Dokładnie 11 cyfr IT12345678901

Kompletne zestawienie wszystkich 27 państw członkowskich oraz aktualną specyfikację techniczną udostępnia serwis viesvat, który pozwala zweryfikować dokładne reguły walidacji algorytmicznej dla poszczególnych jurysdykcji podatkowych.


Kluczowe pułapki implementacyjne

Programiści integrujący formularze zamówień i walidatory NIP najczęściej napotykają na następujące specyficzne wyjątki:

  1. Prefiks Grecji (EL zamiast GR):
    Zgodnie z unijną specyfikacją techniczną Grecja posługuje się kodem EL, podczas gdy międzynarodowy kod ISO państwa to GR. Formularz musi automatycznie mapować ten wyjątek.

  2. Litera U w numerze austriackim (ATU):
    Po prefiksie kraju w Austrii zawsze występuje wielka litera U, po której następuje 8 cyfr. Wpisanie samych cyfr jest najczęstszym błędem użytkowników.

  3. Francuski klucz kontrolny modulo 97:
    Dwa pierwsze znaki po prefiksie FR są wyliczane na podstawie algorytmu: [12 + 3 * (SIREN modulo 97)] modulo 97. Jeśli wynik jest mniejszy niż 10, prefiks uzupełnia się cyfrą zero lub literami.

  4. Wielka Brytania i Irlandia Północna:
    Po Brexicie numery z Wielkiej Brytanii (GB) nie podlegają walidacji w VIES. Wyjątkiem jest Irlandia Północna dla obrotu towarowego, która posługuje się prefiksem XI.


Walidacja wstępna (RegEx) w JavaScript

Aby zmniejszyć obciążenie sieciowe i ograniczyć liczbę zbędnych zapytań do zewnętrznych serwerów, dobrą praktyką jest wstępna walidacja wyrażeniem regularnym przed wysłaniem żądania API:


javascript
// Przykładowy słownik podstawowych formatów RegEx dla wybranych krajów UE
const vatPatterns = {
  PL: /^PL[0-9]{10}$/,
  DE: /^DE[0-9]{9}$/,
  AT: /^ATU[0-9]{8}$/,
  FR: /^FR[A-Z0-9]{2}[0-9]{9}$/,
  ES: /^ES[A-Z0-9][0-9]{7}[A-Z0-9]$/,
  IT: /^IT[0-9]{11}$/,
  NL: /^NL[0-9]{9}B[0-9]{2}$/
};

function validateVatFormat(countryCode, vatNumber) {
  const sanitized = vatNumber.replace(/[\s.-]/g, '').toUpperCase();
  const pattern = vatPatterns[countryCode];

  if (!pattern) {
    return false; // Nieobsługiwany kod kraju
  }

  return pattern.test(sanitized);
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)