2010-08-30 23 views
9

Tôi đang viết một ứng dụng nhỏ với các đầu vào khác nhau từ một tệp (như mã quốc gia, số vat v.v.) và tôi phải xác thực rằng số vat ở định dạng chính xác.Xác thực số VAT ngoại tuyến

Tôi đã thử cái này: http://www.codeproject.com/KB/webservices/VATchecker.aspx - và nó hoạt động .. nhưng, và có, luôn luôn có một nhưng :-), tôi phải kiểm tra bất cứ nơi nào từ 100 - 500 số vat và nó chỉ là quá chậm cho rằng . Bên cạnh đó, tôi không chắc họ đánh giá cao việc tôi đang đập trang web của họ như thế.

Có ai biết về trình xác thực giá trị không hợp lệ mà tôi có thể xây dựng vào chương trình C# của tôi không?

+0

Is có điều gì sai trái khi tối ưu hóa mã làm việc không? – leppie

+0

Bạn có nghĩa là mã VATchecker, hoặc? Theo VIES, hệ thống của chúng được thiết kế cho các yêu cầu đơn lẻ và không yêu cầu hàng loạt. – Thomas

+0

Tại sao bạn không thử chạy nó trên nhiều chủ đề. Nó không giúp đỡ trong việc không búa, nhưng có thể tăng tốc độ ứng dụng của bạn bởi một yếu tố 4-8. – Steven

Trả lời

1

Nếu bạn xem this trang web họ chỉ định cấu trúc số VAT cho từng quốc gia thành viên. Có thể bạn có thể kiểm tra các con số của bạn đang ở trong cấu trúc chính xác đầu tiên mà có thể tránh phải thực hiện một số yêu cầu.

Ngoài ra, tôi nghĩ bạn sẽ phải sử dụng dịch vụ web này để xác thực các số. Webservice không liên kết với một cơ sở dữ liệu duy nhất mà là kết nối tới cơ sở dữ liệu của mỗi tiểu bang để xác minh số, vì vậy không có cơ sở dữ liệu duy nhất mà bạn có thể tải xuống (có thể một số tiểu bang sẽ tải xuống tất cả số VAT hợp lệ mà bạn có thể tải xuống. nó và bạn phải chắc chắn rằng nó được cập nhật vv).

Như Steven đề xuất trong nhận xét của mình, mặc dù bạn có thể tăng tốc nó bằng cách thực hiện nhiều yêu cầu cùng một lúc. Tôi sẽ không nghĩ rằng đây sẽ là một vấn đề nhưng bạn luôn có thể gửi email cho địa chỉ được đề cập trong Q16 trên trang đó và hỏi xem liệu có ổn không.

+0

Vâng, tôi đã nhìn vào cái đó. Tôi có lẽ sẽ phải thực hiện một chức năng để kiểm tra từng số VAT theo định dạng, dựa trên mã quốc gia. Rất tiếc, tôi không nghĩ rằng việc tra cứu hàng trăm số VAT trên trang web của họ là cách tốt nhất để đi. Sẽ dễ dàng hơn nhiều đối với tôi, nhưng tôi đoán tôi phải làm điều đó một cách khó khăn và kiểm tra chúng theo cách thủ công để xem định dạng có đúng không :( – Thomas

+0

@Thomas: Vâng, phụ thuộc vào lý do bạn thực hiện kiểm tra này. sẽ bán VAT và bạn không tính VAT vì khách hàng đã cung cấp cho bạn số VAT và sau đó số VAT đó không hợp lệ, tôi nghĩ bạn có thể phải trả VAT mà bạn chưa bao giờ thu, vì vậy trong trường hợp đó –

+0

Đó là sự thật Tôi quên viết, các biến đầu vào đến từ Navision của chúng ta, vì vậy các số VAT _should_ là hợp lệ. Vấn đề là chúng ta có khá một vài "giữ chỗ" -entries trong Navision-cơ sở dữ liệu của chúng tôi, có sản phẩm nào hoặc có "NO VAT" Đây thực sự là những mục tôi cần phải kiểm tra. Bộ phận kế toán của chúng tôi kiểm tra mã số VAT theo cách thủ công khi họ tạo khách hàng Tôi biết điều này nghe có vẻ hơi khó hiểu, nhưng về cơ bản tôi đã tự hỏi liệu có ai đã viết một hàm có thể xác thực định dạng số VAT không, theo Q16 trên VIES :) – Thomas

8

Trong các cửa hàng trực tuyến của chúng tôi, tôi đang làm nó tương tự như giải pháp trong bài viết Dự án mã.

Trước khi gửi cho dịch vụ web, tôi thực hiện kiểm tra độ chính xác biểu thức nhỏ để lọc ra ID VAT sai "cú pháp" và do đó giảm số lượng cuộc gọi SOAP mà tôi phải thực hiện.

Đây là một đoạn trích từ bảng Tôi đang sử dụng để lưu trữ các biểu thức thông thường, có lẽ điều này sẽ giúp bạn, nếu bạn có kế hoạch gì đó tương tự:

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

tôi đã tạo ra một ý chính từ các regex này , được cập nhật với các chỉnh sửa của @BigM: http://stackoverflow.com/a/36942179/3057236 – geoforce

+0

[Đây là liên kết tới Gist của geoforce] (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

Dựa trên @Uwe Keim của (cũ) trả lời tôi đã regex'es cho năm 2014 với những quy tắc: 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}$ 

Ai đó có thể cần nó.

+1

Ít nhất là mẫu Rumani không chính xác. Độ dài của số có thể từ 2 đến 10 chữ số. Mẫu đúng sẽ là^RO [1-9] {1,1} [0-9] {1,9} $. – Monsignor

+1

Tôi đã kiểm tra lại các mẫu khác, chúng trông chính xác. – Monsignor

+1

Không có định nghĩa tối thiểu cho Romania, nơi tôi nhìn như vậy tôi giả định họ sẽ chỉ sử dụng tất cả các chữ số. Tôi đã sửa nó, cảm ơn vì bình luận của bạn – BigM

0

Nếu đó là một lựa chọn cho bạn, bạn có thể sử dụng js-lib (cũng của tôi):

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

(số thuế GTGT jsvat kiểm tra của hai lần - với regexp và với tính toán)

Các vấn đề liên quan