2010-08-30 15 views
9

Estoy escribiendo una pequeña aplicación con diferentes entradas de un archivo (como código de país, número de IVA, etc.) y tengo que validar que los números de IVA están en el formato correcto.Validar el número de IVA fuera de línea

He intentado esto: http://www.codeproject.com/KB/webservices/VATchecker.aspx - y funciona ... pero, y sí, siempre hay un pero :-), tengo que comprobar en cualquier lugar de 100 - 500 números de IVA y es demasiado lento para eso . Además, no estoy seguro de que me aprecian martillar su sitio de esa manera.

¿Alguien sabe de un vat-validater sin conexión que puedo incorporar a mi programa C#?

+0

Es hay algo mal con la optimización del código de trabajo? – leppie

+0

¿Quiere decir el código VATchecker, o? Según VIES, su sistema está diseñado para solicitudes únicas y no para solicitudes por lotes. – Thomas

+0

¿Por qué no intentas ejecutarlo en varios hilos? No ayuda a no martillar, pero puede acelerar su aplicación por un factor de 4 a 8. – Steven

Respuesta

1

Si mira al sitio this, sí especifica la estructura de los números de IVA para cada uno de los estados miembros. Posiblemente, podría hacer un control para que sus números estén en la estructura correcta primero, lo que podría evitar tener que hacer algunas de las solicitudes.

Aparte de eso, creo que tendrá que usar este servicio web para validar los números. El servicio web no se vincula a una única base de datos, sino que se conecta a la base de datos de cada estado para verificar el número, por lo que no hay una única base de datos que pueda descargar (quizás algunos estados tengan descargas de todos los números de IVA válidos que pueda descargar, pero dudo y deberías asegurarte de que esté actualizado, etc.).

Como Steven sugiere en su comentario, puede acelerarlo haciendo múltiples solicitudes al mismo tiempo. No hubiera pensado que esto sería un problema, pero siempre podría enviar un correo electrónico a la dirección mencionada en P16 en esa página y preguntarles si eso está bien.

+0

Sí, estaba mirando eso. Probablemente tenga que hacer una función para verificar cada número de IVA con el formato, según el código de país. Lamentablemente, no creo que buscar cientos de números de IVA en su sitio web sea la mejor manera de hacerlo. Sería mucho más fácil para mí, pero creo que tengo que hacerlo de la manera difícil y verificarlos manualmente para ver si el formato es correcto :( – Thomas

+0

@Thomas: Bueno, depende de por qué estás haciendo este control. Si tú " va a vender algo IVA y no cobra IVA porque el cliente le dio un número de IVA, y luego ese número de IVA no era válido, creo que podría terminar teniendo que pagar el IVA que nunca ha cobrado, por lo que en ese caso podría valer la pena usar el servicio web para verificar lo más cuidadosamente posible. –

+0

Eso es cierto. Olvidé escribir, que las variables de entrada vienen de nuestra Navision, por lo que los números de IVA _ deberían ser válidos. El problema es que tenemos bastantes Entradas "placeholder" en nuestras bases de datos de Navision, que están vacías o no tienen "NINGÚN IVA" Estas son realmente las entradas que debo verificar. Nuestro departamento de contabilidad verifica los números de IVA manualmente cuando crean clientes Sé que esto puede sonar un poco confuso, pero básicamente me preguntaba si alguien había escrito una función que pudiera validar el formato de los números de IVA, de acuerdo con Q16 en VIES :) – Thomas

8

En nuestras tiendas en línea, lo estoy haciendo de forma similar a la solución en el artículo de Code Project.

Antes de enviarlo a los servicios web, realizo una pequeña comprobación de cordura de expresión regular para filtrar identificaciones de IVA incorrectas "sintácticamente" y, por lo tanto, reducir el número de llamadas SOAP que debo realizar.

Este es un extracto de la mesa que estoy usando para almacenar las expresiones regulares, tal vez esto te ayuda, si va algo similar:

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

He creado una esencia de estos regexes , actualizado con las correcciones de @BigM: http://stackoverflow.com/a/36942179/3057236 – geoforce

+0

[Este es el enlace a la esencia de @ 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

Sobre la base de respuesta de @Uwe Keim (obsoleta) Hice el regex'es de 2014, con las siguientes reglas: 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}$ 

Alguien que pueda necesitar.

+1

Al menos el patrón rumano es incorrecto. La longitud del número podría ser de 2 a 10 dígitos. El patrón correcto sería^RO [1-9] {1,1} [0-9] {1,9} $. – Monsignor

+1

He vuelto a comprobar otros patrones, parecen correctos. – Monsignor

+1

No se definió un mínimo para Rumanía donde busqué, así que supuse que usarían todos los dígitos. Lo corregí, gracias por tu comentario – BigM

0

Si se trata de una opción para usted, usted puede usar js-lib (mi también):

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

(CIF de verificación jsvat dos veces - con la expresión regular y con el cálculo matemático)

Cuestiones relacionadas