2010-08-30 14 views
9

Ich schreibe eine kleine App mit verschiedenen Eingaben aus einer Datei (wie Ländercode, Umsatzsteuer-Identifikationsnummer usw.) und ich muss bestätigen, dass die Umsatzsteuer-Identifikationsnummern im richtigen Format sind.MwSt.-Nummer offline bestätigen

Ich habe dieses versucht: http://www.codeproject.com/KB/webservices/VATchecker.aspx - und es funktioniert .. aber, und ja, es gibt immer ein aber :-), ich muss überall von 100 bis 500 MwSt-Nummern überprüfen, und es ist einfach zu langsam dafür . Außerdem bin ich mir nicht sicher, ob sie es schätzen, wenn ich ihre Seite so hämmere.

Kennt jemand eine Offline-Mehrwertsteuer-Validierung, die ich in mein C# -Programm einbauen kann?

+0

Ist Ist etwas falsch mit der Optimierung des Arbeitscodes? – leppie

+0

Sie meinen den VATchecker-Code, oder? Laut VIES ist ihr System für Single-Requests und nicht für Batch-Requests ausgelegt. – Thomas

+0

Warum versuchen Sie nicht, es auf mehreren Threads auszuführen. Es hilft nicht, nicht zu hämmern, aber könnte Ihre Anwendung um einen Faktor 4 bis 8 beschleunigen. – Steven

Antwort

1

Wenn Sie sich die this Website ansehen, geben sie die Struktur der MwSt-Nummern für jeden der Mitgliedstaaten an. Möglicherweise können Sie zuerst überprüfen, ob Ihre Nummern in der richtigen Struktur sind, wodurch Sie möglicherweise einige der Anfragen vermeiden müssen.

Ansonsten denke ich, dass Sie diesen Webservice verwenden müssen, um die Zahlen zu validieren. Der Webservice verbindet sich nicht mit einer einzelnen Datenbank, sondern verbindet sich mit der Datenbank eines jeden Landes, um die Nummer zu verifizieren, also gibt es keine einzelne Datenbank, die Sie herunterladen könnten (vielleicht haben einige Staaten alle gültigen Umsatzsteuer-Nummern heruntergeladen) es und Sie müssten sicherstellen, dass es auf dem neuesten Stand gehalten wird usw.).

Wie Steven in seinem Kommentar vorschlägt, könnten Sie es jedoch beschleunigen, indem Sie mehrere Anfragen gleichzeitig ausführen. Ich hätte nicht gedacht, dass dies ein Problem wäre, aber Sie könnten immer die Adresse, die in Q16 auf dieser Seite erwähnt wird, per E-Mail schicken und sie fragen, ob das in Ordnung ist.

+0

Ja, ich habe mir das angesehen. Ich würde wahrscheinlich eine Funktion machen müssen, um jede MWST-Nummer anhand des Ländercodes auf das Format zu überprüfen. Leider denke ich nicht, Hunderte von USt-Nummern auf ihrer Website nachzuschlagen ist der beste Weg zu gehen. Wäre viel einfacher für mich, aber ich denke, ich muss es auf die harte Tour machen und sie manuell überprüfen, um zu sehen, ob das Format korrekt ist :( – Thomas

+0

@Thomas: Nun, hängt davon ab, warum du diesen Check machst. Sie verkaufen etwas Mehrwertsteuer, und Sie berechnen keine Mehrwertsteuer, weil der Kunde Ihnen eine Umsatzsteuer-Identifikationsnummer gegeben hat und diese Umsatzsteuer-Identifikationsnummer ungültig war. Ich denke, dass Sie am Ende Mehrwertsteuer zahlen müssen, die Sie nie erhoben haben Vielleicht lohnt es sich, den Webservice so genau wie möglich zu überprüfen –

+0

Das ist wahr, ich habe vergessen zu schreiben, dass die Input-Variablen von unserer Navision kommen, daher sollten die VAT-Nummern _gültig sein "Platzhalter" -Einträge in unseren Navision-Datenbanken, die leer sind oder "NO VAT" haben. Dies sind wirklich die Einträge, nach denen ich suchen muss.Unsere Buchhaltungsabteilung prüft die VAT-Nummern manuell, wenn sie Kunden anlegen. Ich weiß, dass dies ein wenig verwirrend klingen mag, aber im Grunde habe ich mich nur gefragt, ob jemand eine Funktion geschrieben hat, die das Format von Umsatzsteuer-Nummern validieren könnte, nach Q16 auf MIAS :) – Thomas

8

In unseren Online-Shops mache ich es ähnlich wie die Lösung im Code Project Artikel.

Bevor ich sie an die Webdienste weitergebe, führe ich einen kleinen regulären Ausdruck aus, um "syntaktisch" falsche Umsatzsteuer-IDs herauszufiltern und damit die Anzahl der SOAP-Aufrufe zu reduzieren.

Dies ist ein Auszug aus der Tabelle, die die regulären Ausdrücke zu speichern Ich verwende, vielleicht dies hilft Ihnen, wenn Sie etwas Ähnliches planen:

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

Ich habe einen Kern aus diesen Regexes erstellt , aktualisiert mit den Korrekturen von @BigM: http://stackoverflow.com/a/36942179/3057236 – geoforce

+0

[Dies ist der Link zu @ 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

Basierend auf @Uwe Keime (veraltet) Antwort habe ich die regex'es für das Jahr 2014 mit diesen Regeln: 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}$ 

Jemand es benötigen.

+1

Zumindest das rumänische Muster ist falsch. Die Länge der Nummer könnte zwischen 2 und 10 Ziffern betragen. Das korrekte Muster wäre^RO [1-9] {1,1} [0-9] {1,9} $. – Monsignor

+1

Ich habe andere Muster überprüft, sie sehen korrekt aus. – Monsignor

+1

Es gab kein definiertes Minimum für Rumänien, wo ich so aussah, ich nahm an, dass sie nur alle Ziffern verwenden würden. Ich korrigiere es, danke für deinen Kommentar – BigM

0

Wenn es eine Option für Sie, können Sie js-lib (meine auch) verwenden:

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

(jsvat Kontrolle der UID-Nummer zweimal - mit regexp und mit Mathe-Berechnung)