RegEx: Европейские номера НДС

Европейское налоговое законодательство гласит, что когда зарегистрированный на НДС бизнес (ваш клиент), расположенный в одной стране ЕС, покупает товар у продавца (вашей компании) в другой стране ЕС, продавец не должен взимать НДС (налог на добавленную стоимость). Если покупатель не зарегистрирован в качестве плательщика НДС, продавец должен начислить НДС и перечислить его в местное налоговое управление. Продавец должен использовать регистрационный номер НДС покупателя в качестве доказательства для налогового управления, что НДС не подлежит уплате. Это означает, что для продавца очень важно проверить номер НДС покупателя, прежде чем приступать к освобожденной от налога продаже.

Наиболее частой причиной недействительных номеров НДС являются простые опечатки покупателя. Чтобы сделать процесс оформления заказа более быстрым и дружелюбным, вам следует использовать регулярное выражение для проверки номера НДС непосредственно во время заполнения покупателем формы онлайн-заказа. Это можно сделать с помощью JavaScript на стороне клиента или в CGI-скрипте на вашем веб-сервере, который получает форму заказа. Если номер не соответствует регулярному выражению, клиент может сразу же исправить опечатку.

Чтобы упростить реализацию, это решение разделено на две части. Сначала мы удаляем пробелы и знаки препинания. Затем мы проверяем то, что осталось.

Удалите пробельные символы и знаки препинания

Получите номер НДС, введенный клиентом, и сохраните его в переменной. Перед выполнением проверки на наличие действительного номера замените все совпадения этого регулярного выражения на пустой текст замены:

Мы предположили, что клиент не будет вводить никаких знаков препинания, кроме дефисов, точек и пробелов. Любые другие посторонние символы будут отловлены предстоящей проверкой.

Проверить номер

Это регулярное выражение, в котором удалены пробелы и знаки препинания, проверяет, действителен ли номер НДС в любой из 27 стран ЕС:

В приведенном выше регулярном выражении используется режим свободного интервала, что облегчает его последующее редактирование. Время от времени в Европейский союз вступают новые страны, и страны-участницы меняют свои правила в отношении номеров НДС. К сожалению, JavaScript не поддерживает свободный интервал. В этом случае вы будете вынуждены поместить все в одну строку:

Удаление пробельных символов и знаков препинания

Чтобы номера НДС было легче читать, люди часто вводят их с дополнительными знаками препинания, чтобы разделить цифры на группы. Например, клиент из Германии может ввести свой номер НДС DE123456789 как DE 123.456.789.

Создать одно регулярное выражение, которое будет соответствовать номерам НДС из 27 стран в любых возможных обозначениях, - непосильная задача. Поскольку знаки препинания нужны только для удобства чтения, гораздо проще сначала убрать все знаки препинания, а затем проверить полученный голый номер НДС.

Регулярное выражение '[-. ]' соответствует символу, который является дефисом, точкой или пробелом. Замена всех совпадений этого регулярного выражения ничем эффективно удаляет знаки препинания, обычно используемые в номерах НДС.
Совет

Номера НДС состоят только из букв и цифр. Вместо того чтобы использовать '[-. ]' для удаления только обычных знаков препинания, можно использовать '[^A-Z0-9]' для удаления всех недопустимых символов.

Проверка номера

Два регулярных выражения для проверки номера идентичны. Разница лишь в том, что в первом из них используется синтаксис свободного интервала, чтобы сделать регулярное выражение более читабельным и указать страны. JavaScript не поддерживает свободный интервал, если только вы не используете библиотеку XRegExp. Остальные варианты дают вам возможность выбора.

В регулярном выражении используется чередование, чтобы учесть номера НДС всех 27 стран ЕС. Основные форматы приведены в таблице ниже.

Страна Формат номера НДС
Австрия U99999999
Бельгия 999999999
Болгария 999999999 or 9999999999
Кипр 99999999L
Чешская Республика 99999999, 999999999, or 9999999999
Германия 999999999
Дания 99999999
Эстония 999999999
Греция 999999999
Испания X9999999X
Финляндия 99999999
Франция XX999999999
Великобритания 999999999, 999999999999, or XX999
Венгрия 99999999
Ирландия 9S99999L
Италия 99999999999
Литва 999999999 or 99999999999
Люксембург 99999999
Латвия 99999999999
Мальта 99999999
Нидерланды 999999999B99
Польша 999999999
Португалия 999999999
Румыния 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, or 9999999999
Швеция 99999999999
Словения 99999999
Словакия 999999999

Строго говоря, двухбуквенный код страны является частью номера НДС. Однако люди часто опускают его, поскольку в адресе выставления счета уже указана страна. Регулярное выражение будет принимать номера НДС с кодом страны и без него. Если вы хотите, чтобы код страны был обязательным, удалите из регулярного выражения все вопросительные знаки. При этом в сообщении об ошибке, сообщающем пользователю, что номер НДС недействителен, укажите, что код страны обязателен.

Если вы принимаете заказы только из определенных стран, вы можете убрать страны, которые не отображаются в выборе страны в форме заказа. При удалении альтернативы не забудьте также удалить оператор '|', который отделяет альтернативу от следующей или предыдущей. В противном случае в регулярном выражении появится '||'. '||' вставляет альтернативу, которая соответствует пустой строке, что означает, что ваша форма заказа примет отсутствие номера НДС за действительный номер НДС.

27 альтернатив группируются вместе. Группа помещается между каретой и знаком доллара, которые привязывают регулярное выражение к началу и концу проверяемой строки. Все вводимые данные должны быть подтверждены как номер НДС.

Если вы ищете номера НДС в большом объеме текста, замените якоря на границы слов '\b'.

Вариации

Преимущество использования одного регулярного выражения для проверки всех 27 стран заключается в том, что вам нужно добавить только одну проверку regex в форму заказа. Вы можете улучшить форму заказа, используя 27 отдельных регулярных выражений. Сначала проверьте страну, которую клиент указал в адресе для выставления счета. Затем найдите соответствующее регулярное выражение в соответствии со страной в таблице:

Страна Регулярное выражение номера НДС
Австрия ‹^(AT)?U[0-9]{8}$›
Бельгия ‹^(BE)?0[0-9]{9}$›
Болгария ‹^(BG)?[0-9]{9,10}$›
Кипр ‹^(CY)?[0-9]{8}L$›
Чешская Республика ‹^(CZ)?[0-9]{8,10}$›
Германия ‹^(DE)?[0-9]{9}$›
Дания ‹^(DK)?[0-9]{8}$›
Эстония ‹^(EE)?[0-9]{9}$›
Греция ‹^(EL|GR)?[0-9]{9}$›
Испания ‹^(ES)?[0-9A-Z][0-9]{7}[0-9A-Z]$›
Финляндия ‹^(FI)?[0-9]{8}$›
Франция ‹^(FR)?[0-9A-Z]{2}[0-9]{9}$›
Великобритания ‹^(GB)?([0-9]{9}([0-9]{3})?|[A-Z]{2}[0-9]{3})$›
Венгрия ‹^(HU)?[0-9]{8}$›
Ирландия ‹^(IE)?[0-9]S[0-9]{5}L$›
Италия ‹^(IT)?[0-9]{11}$›
Литва ‹^(LT)?([0-9]{9}|[0-9]{12})$›
Люксембург ‹^(LU)?[0-9]{8}$›
Латвия ‹^(LV)?[0-9]{11}$›
Мальта ‹^(MT)?[0-9]{8}$›
Нидерланды ‹^(NL)?[0-9]{9}B[0-9]{2}$›
Польша ‹^(PL)?[0-9]{10}$›
Португалия ‹^(PT)?[0-9]{9}$›
Румыния ‹^(RO)?[0-9]{2,10}$›
Швеция ‹^(SE)?[0-9]{12}$›
Словения ‹^(SI)?[0-9]{8}$›
Словакия ‹^(SK)?[0-9]{10}$›

Чтобы проверить номер НДС на соответствие выбранному регулярному выражению. Это позволит определить, действителен ли номер для страны, в которой, по утверждению клиента, он проживает.

Основное преимущество использования отдельных регулярных выражений заключается в том, что вы можете заставить номер НДС начинаться с правильного кода страны, не прося клиента ввести его. Когда регулярное выражение совпадет с указанным номером, проверьте содержимое первой группы захвата. В рецепте 3.9 объясняется, как это сделать. Если первая группа захвата пуста, значит, клиент не ввел код страны в начале номера НДС. Вы можете добавить код страны перед сохранением подтвержденного номера в базе данных заказов.

Греческие номера НДС допускают два кода страны. Традиционно для греческих номеров НДС используется EL, но GR - это код страны ISO для Греции.

См. также

Регулярное выражение просто проверяет, похож ли номер на действительный номер НДС. Этого достаточно, чтобы отсеять добросовестные ошибки. Регулярное выражение, очевидно, не может проверить, принадлежит ли номер НДС предприятию, разместившему заказ. Европейский союз предоставляет веб-страницу https://ec.europa.eu/taxation_customs/vies/#/vat-validation, где можно проверить, какому предприятию принадлежит тот или иной номер НДС, если таковой имеется.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий