2010-08-30 2 views
9

Я пишу небольшое приложение с различными входами из файла (например, код страны, номер ватта и т. Д.), И я должен проверить, что номера ваттов находятся в правильном формате.Подтверждение номера НДС в автономном режиме

Я пробовал этот: http://www.codeproject.com/KB/webservices/VATchecker.aspx - и это работает .. но, да, всегда есть но :-), я должен проверять где-нибудь от 100 до 500 ватных номеров, и это слишком медленно для этого , Кроме того, я не уверен, что они ценят, как я забиваю их сайт.

Кто-нибудь знает о автономном vat-validater, который я могу встроить в свою программу на C#?

+0

Is что-то не так с оптимизацией рабочего кода? – leppie

+0

Вы имеете в виду код VATchecker, или? Согласно VIES, их система предназначена для одноразовых запросов, а не для пакетных запросов. – Thomas

+0

Почему бы вам не попробовать запустить его на нескольких потоках. Это не помогает не забивать, но может ускорить ваше применение в 4-4 раза. – Steven

ответ

1

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

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

Как Стивен предлагает в своем комментарии, однако, вы можете ускорить его, выполнив несколько запросов одновременно. Я бы не подумал, что это будет проблемой, но вы всегда можете отправить адрес электронной почты, указанный в Q16 на этой странице, и спросить их, нормально ли это.

+0

Да, я смотрел на это. Я, вероятно, должен будет выполнить функцию проверки каждого номера НДС по отношению к формату на основе кода страны. К сожалению, я не думаю, что поиск сотен номеров НДС на их веб-сайте - лучший способ пойти. Было бы намного легче для меня, но я предполагаю, что мне нужно сделать это жестко и проверить их вручную, чтобы узнать, правильный ли формат :( – Thomas

+0

@Thomas: Ну, в зависимости от того, почему вы делаете эту проверку. вы собираетесь продавать что-то VATable, и вы не платите НДС, потому что клиент дал вам номер НДС, а затем этот номер НДС был недействительным, я думаю, вы могли бы заплатить НДС, который вы никогда не собирали, поэтому в этом случае он возможно, стоит использовать webservice для проверки как можно тщательнее. –

+0

Это правда. Я забыл написать, что входные переменные приходят из нашего Navision, поэтому номера НДС _should_ действительны. Проблема в том, что у нас довольно много «placeholder» в наших навигационных базах данных, которые пусты или имеют «НЕТ НДС». Это действительно те записи, которые мне нужно проверить. Наш бухгалтерский отдел проверяет номера НДС вручную, когда они создают клиентов. Я знаю, это может показаться немного запутанным, но в основном мне просто интересно, кто-нибудь написал функцию, которая могла бы подтвердить формат номеров НДС, согласно Q16 на VIES :) – Thomas

8

В наших интернет-магазинах я делаю это похоже на решение в статье проекта Code.

Перед отправкой в ​​веб-службы я делаю небольшую проверку правильности выражения, чтобы отфильтровать «синтаксически» неправильные идентификаторы НДС и, следовательно, уменьшить количество вызовов SOAP, которые я должен выполнить.

Это отрывок из таблицы я использую для хранения регулярных выражений, может быть, это поможет вам, если вы планируете что-то подобное:

Code2 VatIDRegex 
---------------------------------------------------------- 
at  ^ATU[A-Z0-9]{8,8}$ 
be  ^BE[0-9]{9,9}$ 
cy  ^CY[0-9]{9,9}$ 
cz  ^CZ[0-9]{8,10}$ 
de  ^DE[0-9]{9,9}$ 
dk  ^DK[0-9]{8,8}$ 
ee  ^EE[0-9]{9,9}$ 
es  ^ES[A-Z0-9]{1,1}[0-9]{7,7}[A-Z0-9]{1,1}$ 
fi  ^FI[0-9]{8,8}$ 
fr  ^FR[A-Z0-9]{2,2}[0-9]{9,9}$ 
gb  ^GB[0-9]{9,9}$|^GB[0-9]{12,12}$|^GBGD[0-9]{3,3}$ 
hu  ^HU[0-9]{8,8}$ 
ie  ^IE[A-Z0-9]{8,8}$ 
it  ^IT[0-9]{11,11}$ 
lt  ^LT[0-9]{9,9}$|^LT[0-9]{12,12}$ 
lu  ^LU[0-9]{8,8}$ 
lv  ^LV[0-9]{11,11}$ 
mt  ^MT[0-9]{8,8}$ 
nl  ^NL[A-Z0-9]{9,9}B[A-Z0-9]{2,2}$ 
pl  ^PL[0-9]{10,10}$ 
pt  ^PT[0-9]{9,9}$ 
se  ^SE[0-9]{12,12}$ 
si  ^SI[0-9]{8,8}$ 
sk  ^SK[0-9]{10,10}$ 
+1

Я создал суть этих регулярных выражений , обновленный с исправлениями @BigM: http://stackoverflow.com/a/36942179/3057236 – geoforce

+0

[Это ссылка на @ geoforce's Gist] (https://gist.github.com/gl005/e2e656d648a167ac6fed1a412975611c). –

0
if (vatNo.Length == 9) 
      { 
       int calcValue = 0; 
       int index = 0; 
       int checkDigit = Convert.ToInt32(vatNo.Substring(7, 2)); 

       for (int ordinate = 8; ordinate > 1; ordinate--) 
       { 
        calcValue += Convert.ToInt32((vatNo.Substring(index, 1))) * ordinate; 
        index++; 
       } 
       while (calcValue > 0) 
       { 
        calcValue -= 97; 
       } 
       if ((calcValue * -1) != checkDigit) 
       { 
        Error 
       } 

      } 
11

основе (устаревшее) Ответ @Uwe KEIM, я сделал regex'es на 2014 год с этими правилами: http://www.bzst.de/DE/Steuern_International/USt_Identifikationsnummer/Merkblaetter/Aufbau_USt_IdNr.html?nn=23440

AT ^ATU[A-Z0-9]{8,8}$ 
BE ^BE[0-9]{10,10}$ 
BG ^BG[0-9]{9,9}$|^BG[0-9]{10,10}$ 
CY ^CY[0-9]{8,8}[A-Z]{1,1}$ 
CZ ^CZ[0-9]{8,10}$ 
DE ^DE[0-9]{9,9}$ 
DK ^DK[0-9]{8,8}$ 
EE ^EE[0-9]{9,9}$ 
ES ^ES[A-Z0-9]{1,1}[0-9]{7,7}[A-Z0-9]{1,1}$ 
FI ^FI[0-9]{8,8}$ 
FR ^FR[A-Z0-9]{2,2}[0-9]{9,9}$ 
GB ^GB[0-9]{9,9}$|^GB[0-9]{12,12}$|^GBGD[0-9]{3,3}$|^GBHA[0-9]{3,3}$ 
HU ^HU[0-9]{8,8}$ 
IE ^IE[0-9]{1,1}[A-Z0-9]{1,1}[0-9]{5,5}[A-Z]{1,1}$|^IE[0-9]{7,7}[A-W]{1,1}[A-I]{1,1}$ 
IT ^IT[0-9]{11,11}$ 
LT ^LT[0-9]{9,9}$|^LT[0-9]{12,12}$ 
LU ^LU[0-9]{8,8}$ 
LV ^LV[0-9]{11,11}$ 
MT ^MT[0-9]{8,8}$ 
NL ^NL[A-Z0-9]{9,9}B[A-Z0-9]{2,2}$ 
PL ^PL[0-9]{10,10}$ 
PT ^PT[0-9]{9,9}$ 
SE ^SE[0-9]{10,10}01$ 
SI ^SI[0-9]{8,8}$ 
SK ^SK[0-9]{10,10}$ 
RO ^RO[1-9]{1,1}[0-9]{1,9}$ 
EL ^EL[0-9]{9,9}$ 
HR ^HR[0-9]{11,11}$ 

Кто-то может понадобиться.

+1

По крайней мере, румынский шаблон неправильный. Длина номера может составлять от 2 до 10 цифр. Правильный шаблон будет^RO [1-9] {1,1} [0-9] {1,9} $. – Monsignor

+1

Я перепрограммировал другие шаблоны, они выглядят правильно. – Monsignor

+1

Не было минимального для Румынии минимума, где я выглядел так, что я предположил, что они просто будут использовать все цифры. Я исправил его, спасибо за ваш комментарий – BigM

0

Если это вариант для вас, вы можете использовать JS-Lib (мой а):

https://github.com/se-panfilov/jsvat

(номер НДС чека jsvat дважды - с регулярным выражением и с расчетом по математике)

Смежные вопросы