Tester numéro tva intra-communautaire

Soyez le premier à donner votre avis sur cette source.

Snippet vu 91 319 fois - Téléchargée 31 fois


Contenu du snippet

Voici une fonction permettant de tester la structure d'un numéro de TVA intra communautaire.

Nous ne pouvons pas aller beaucoup plus loin dans va vérification étant donné qu'il n?existe aucun algorithme accessible aux entreprises permettant de calculer automatiquement les numéros de TVA intracommunautaire et pouvant être intégré dans des systèmes informatiques de gestion.

Les structures testées suivent les conventions du 1er juin 2005 pour les 25 Etats membres

Source / Exemple :


' =====================================================================================================
'   isIntraComValide : Teste que la structure du numéro de TVA intra communautaire soit valide.
'
'     num     : numéro de TVA intra Com.
'     [siren] : cas pour la France afin d'afiner la vérification
'
'     Return  : True/False
'
' =====================================================================================================
'
' Il n?existe aucun algorithme accessible aux entreprises permettant
' de calculer automatiquement les numéros de TVA intracommunautaire et
' pouvant être intégré dans des systèmes informatiques de gestion.
'
'  Mise à jour : 1er juin 2005 pour les 25 Etats membres

Private Function isIntraComValide(ByVal num As String, Optional ByVal siren As String) As Boolean

  'Nettoyer la chaine
  num = UCase(Replace(num, " ", ""))

  If Len(num) < 3 Then  ' Il n'existe pas de code de moins de 3 char
    isIntraComValide = False
    Exit Function
  End If

  ' Découpage des données
  Dim cle      As String: cle = Mid(num, 1, 2)
  Dim fin      As String: fin = Mid(num, 3)
  Dim finLength As Integer: finLength = Len(fin)

  ' Vérifier à partir de la clé Pays
  Select Case cle
    Case "IE": isIntraComValide = (finLength = 8)  ' Irlande

    Case "DK": isIntraComValide = (finLength = 8) And IsNumeric(fin)  ' Danemark
    Case "FI": isIntraComValide = (finLength = 8) And IsNumeric(fin)  ' Finlande
    Case "LU": isIntraComValide = (finLength = 8) And IsNumeric(fin)  ' Luxembourg
    Case "MT": isIntraComValide = (finLength = 8) And IsNumeric(fin)  ' Malte
    Case "SI": isIntraComValide = (finLength = 8) And IsNumeric(fin)  ' Slovénie
    Case "HU": isIntraComValide = (finLength = 8) And IsNumeric(fin)  ' Hongrie

    Case "CZ": isIntraComValide = (finLength >= 8 And finLength <= 10) And IsNumeric(fin)  'République tchèque

    Case "ES": isIntraComValide = (finLength = 9)  ' Espagne
    Case "CY": isIntraComValide = (finLength = 9)  ' Chypre : CY + 8 caractères numériques + 1 caractères alphabétiques

    Case "DE": isIntraComValide = (finLength = 9) And IsNumeric(fin)  ' Allemagne
    Case "EL": isIntraComValide = (finLength = 9) And IsNumeric(fin)  ' Grèce
    Case "GR": isIntraComValide = (finLength = 9) And IsNumeric(fin)  ' Grèce
    Case "PT": isIntraComValide = (finLength = 9) And IsNumeric(fin)  ' Portugal
    Case "EE": isIntraComValide = (finLength = 9) And IsNumeric(fin)  ' Estonie

    Case "SK": isIntraComValide = ((finLength = 9) Or (finLength = 10)) And IsNumeric(fin)  ' Slovaquie
    Case "LT": isIntraComValide = ((finLength = 9) Or (finLength = 12)) And IsNumeric(fin)  ' Lituanie

    Case "GB": isIntraComValide = (((finLength = 9) Or (finLength = 4 And Mid(fin, 1, 1) = "9")) _
                                   And IsNumeric(fin)) Or (finLength = 5 And IsNumeric(Mid(fin, 3))) 'Grande-Bretagne

    Case "AT": isIntraComValide = (finLength = 9 And (Mid(fin, 1, 1) = "U") _
                                   And IsNumeric(Mid(fin, 2)))  'Autriche

    Case "PL": isIntraComValide = (finLength = 10) And IsNumeric(fin)  ' Pologne
    Case "BE": isIntraComValide = (finLength = 10) And IsNumeric(fin) _
                                  And (Mid(fin, 1, 1) = "0")  ' Belgique

    Case "LV": isIntraComValide = (finLength = 11)  ' Lettonie
    Case "IT": isIntraComValide = (finLength = 11) And IsNumeric(fin)  ' Italie
    Case "FR": isIntraComValide = (finLength = 11) And IsNumeric(fin) _
                                  And IIf(Len(siren), Mid(fin, 3) = siren, True)  ' France

    Case "NL": isIntraComValide = (finLength = 12)  ' Pays-Bas
    Case "SE": isIntraComValide = (finLength = 12) And IsNumeric(fin)  ' Suède
  End Select
End Function

Conclusion :


Pour la France, il est préférable de passer le siren en parametre afin de completer la vérification.
Pour tout autre pays, il suffit de passer le numéro à tester à la fonction.

Pour consulter une base de données officielle afin de vérifier la concordance entre le nom d?une entreprise et son numéro de TVA intracommunautaire : http://www.europa.eu.int/comm/taxation_customs/vies/fr/vieshome.htm

++

Zlub

A voir également

Ajouter un commentaire

Commentaires

katsankat
Messages postés
577
Date d'inscription
vendredi 30 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2012
3 -
J'aime. Et c'est du bon VB.
Deux remarques:
Il faut affiner le Royaume-Uni.
Ce qui serait intéressant serait un client HTTP qui vérifie en ligne: autant bénéficier de la base de données actualisée en temps réel.
econs
Messages postés
4030
Date d'inscription
mardi 13 mai 2003
Statut
Modérateur
Dernière intervention
23 décembre 2008
19 -
Pour ceux qui voudraient écrire beaucoup moins de lignes de code, il est possible de regrouper les pays qui nécessitent les mêmes actions.


Comme ces actions-ci :


Case "DE": isIntraComValide (finLength 9) And IsNumeric(fin) ' Allemagne
Case "EL": isIntraComValide (finLength 9) And IsNumeric(fin) ' Grèce
Case "GR": isIntraComValide (finLength 9) And IsNumeric(fin) ' Grèce
Case "PT": isIntraComValide (finLength 9) And IsNumeric(fin) ' Portugal
Case "EE": isIntraComValide (finLength 9) And IsNumeric(fin) ' Estonie

qui se regroupent comme ceci :

Case "DE","EL","GR","PT","EE": isIntraComValide (finLength 9) And IsNumeric(fin)

On peut ainsi enlever dix lignes de ton code.
Chacun fait comme il préfère. Ce n'est en aucun cas une critique de ta source qui est propre et facile à lire.
Zlub
Messages postés
815
Date d'inscription
mercredi 11 octobre 2000
Statut
Membre
Dernière intervention
29 septembre 2010
2 -
Salut,

Merci pour vos commentaires.

KatSankat > en effet, j'ai prévu de m'occuper de ça. En l'état c'est une version "autonome" donc sans connexion au Net. Mais l'idée de vraiment vérifier me plait bien et je vais sans doute bosser dessus.

ECONS > C'est vonlontairement que j'ai fait ainsi en hésitant sur ce point. J'ai opté pour cette solution pour faciliter les modifications au cas où les codes d'un pays changerait. Je me renseigne sur ce point et le cas échéant, je réduirais le nombres de lignes.

++

Zlub
katsankat
Messages postés
577
Date d'inscription
vendredi 30 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2012
3 -
Salut si tu veux on le fait ensemble car je vais faire le client en C sous linux: la méthode est la même.
econs
Messages postés
4030
Date d'inscription
mardi 13 mai 2003
Statut
Modérateur
Dernière intervention
23 décembre 2008
19 -
Zlub > Y'a pas de problème, tu peux laisser comme c'est là. Y'a pas de faute de programmation.

Je me demandais : le Case "GB" ne serait-il pas de la forme :
isIntraComValide = (Angleterre_valide Or Ecosse_Valide Or Pays_de_Galles_Valide) ?
C'est pour çà que tu l'as appelé GB ?

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.