2010-08-30 14 views
9

Piszę małą aplikację z różnymi danymi wejściowymi z pliku (np. Kod, numer VAT itd.) I muszę potwierdzić, że numery kadzi są w prawidłowym formacie.Zatwierdź numer VAT offline

Próbowałem tego: http://www.codeproject.com/KB/webservices/VATchecker.aspx - i działa .. ale, i tak, zawsze jest, ale :-), muszę sprawdzić w dowolnym miejscu od 100 - 500 vat numerów i jest po prostu zbyt powolny dla tego . Poza tym, nie jestem pewien, czy doceniają mnie, że uderzam w ich stronę.

Czy ktoś wie o trybie offline vat-validater, który mogę wbudować w mój program C#?

+0

Czy coś nie tak z optymalizacją działającego kodu? – leppie

+0

Masz na myśli kod VATCheckera, lub? Według VIES, ich system jest przeznaczony do pojedynczych żądań, a nie do zadań wsadowych. – Thomas

+0

Dlaczego nie spróbować uruchomić go na wielu wątkach. Nie pomaga w nie uderzaniu, ale może przyspieszyć aplikację o współczynnik 4 do 8. – Steven

Odpowiedz

1

Jeśli spojrzysz na stronę this, określają one strukturę numerów VAT dla każdego z państw członkowskich. Być może mógłbyś sprawdzić, czy twoje liczby są we właściwej strukturze, co pozwoli uniknąć konieczności wykonania niektórych z nich.

Poza tym, myślę, że będziesz musiał użyć tej usługi do sprawdzenia poprawności numerów. Usługa nie łączy się z jedną bazą danych, ale łączy się z bazą danych każdego państwa w celu zweryfikowania numeru, więc nie ma jednej bazy danych, którą można pobrać (być może niektóre stany będą pobierać wszystkie ważne numery VAT, które można pobrać, ale wątpię musicie się upewnić, że jest on aktualny itp.).

Jak sugeruje Steven w swoim komentarzu, możesz przyspieszyć, wykonując jednocześnie wiele żądań. Nie pomyślałbym, że to będzie problem, ale zawsze możesz wysłać e-mail z adresem podanym w Q16 na tej stronie i zapytać, czy to jest w porządku.

+0

Tak, patrzyłem na to. Prawdopodobnie musiałbym wykonać funkcję sprawdzania każdego numeru VAT w zależności od formatu, w oparciu o kod kraju. Niestety nie wydaje mi się, że szukanie setek numerów VAT na ich stronach internetowych jest najlepszym sposobem. Byłoby to dla mnie o wiele łatwiejsze, ale myślę, że muszę to zrobić w trudny sposób i sprawdzić je ręcznie, aby sprawdzić, czy format jest prawidłowy :( – Thomas

+0

@Thomas: Cóż, zależy od tego, dlaczego robisz ten czek. zamierzamy sprzedać coś VATable i nie naliczamy podatku VAT, ponieważ klient podał numer VAT, a następnie numer VAT był nieważny, myślę, że mógłbyś w końcu zapłacić VAT, którego nigdy nie zebrałeś, więc w tym przypadku być może warto skorzystać z serwisu, aby sprawdzić tak dokładnie, jak to możliwe –

+0

To prawda, zapomniałem napisać, że zmienne wejściowe pochodzą z naszej Navision, więc numery VAT powinny być ważne. Problem polega na tym, że mamy sporo symbole "placeholder" w naszych bazach danych Navision, które są puste lub mają "BRAK VAT" To są naprawdę wpisy, które muszę sprawdzić, nasz dział księgowy sprawdza numery VAT ręcznie podczas tworzenia klientów. Wiem, że może to zabrzmieć nieco myląco, ale w zasadzie zastanawiałem się, czy ktoś nie napisał funkcji, która mogłaby potwierdzić format numerów VAT, zgodnie z Q16 na VIES :) – Thomas

8

W naszych sklepach internetowych robię to podobnie do rozwiązania w artykule Code Project.

Przed poddaniem go usługom internetowym wykonuję małą kontrolę kondycji, aby odfiltrować "syntaktycznie" błędne identyfikatory VAT, a tym samym zmniejszyć liczbę wywołań SOAP, które muszę wykonać.

ten jest fragmentem tabeli używam do przechowywania wyrażeń regularnych, może to pomaga, jeśli planujesz coś podobnego:

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

Stworzyłem sedno z tych wyrażeń , zaktualizowany poprawkami @BigM: http://stackoverflow.com/a/36942179/3057236 – geoforce

+0

[To jest link do @ 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

podstawie @Uwe Keim'S (nieaktualnych) Odpowiedź zrobiłem regex'es na 2014 rok z tymi zasadami: 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}$ 

Ktoś może go potrzebować.

+1

Przynajmniej wzór rumuński jest nieprawidłowy. Długość liczby może wynosić od 2 do 10 cyfr. Poprawny wzór to^RO [1-9] {1,1} [0-9] {1,9} $. – Monsignor

+1

Sprawdziłem inne wzory, wyglądają poprawnie. – Monsignor

+1

Nie było żadnego minimum zdefiniowanego dla Rumunii, gdzie tak wyglądałem, zakładałem, że użyją po prostu wszystkich cyfr. Poprawiłem to, dziękuję za komentarz – BigM