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:
Prefiks Grecji (
ELzamiastGR):
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.Litera
Uw numerze austriackim (ATU):
Po prefiksie kraju w Austrii zawsze występuje wielka literaU, po której następuje 8 cyfr. Wpisanie samych cyfr jest najczęstszym błędem użytkowników.Francuski klucz kontrolny modulo 97:
Dwa pierwsze znaki po prefiksieFRsą 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.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ę prefiksemXI.
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);
}
Top comments (0)