Tester numéro tva intra-communautaire

Soyez le premier à donner votre avis sur cette source.

Snippet vu 91 408 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

Yurck
Messages postés
1
Date d'inscription
mardi 18 octobre 2005
Statut
Membre
Dernière intervention
9 juillet 2009

Merci pour ton code.

A noter qu'un contrôle supplémentaire peut être fait sur la tva intra française.

En effet sa structure est ainsi faite

FR XX 999 9999 99Y
Où XX représente une clef informatique dont je ne connais pas la méthode de contrôle
mais Y est une clé de contrôle des 8 chiffres précédents (le tout formant le code SIREN)

Le principe est le suivant : on multiplie les chiffres de rang impair à partir de la droite par 1,
ceux de rang pair par 2 ; la somme des chiffres obtenus doit être un multiple de 10.

exemple : soit le SIREN 732 829 320
pour vérifier : 7 3 2 8 2 9 3 2 0
rang pair x 2 : 6 16 18 4
rang impair x 1 : 7 2 2 3 0
----------------------
somme : 7+6+2+1+6+2+1+8+3+4+0 = 40
Le numéro est exact.

Je ne connais pas le VB alors je laisse le soin à qui en a besoin de faire ce bout de code.
Zlub
Messages postés
815
Date d'inscription
mercredi 11 octobre 2000
Statut
Membre
Dernière intervention
29 septembre 2010
4
NB : ça serait sympas d'indiquer pourquoi vous mettez une mauvaise note afin que je puisse améliorer le code ou clarifier des points. Sinon ça n'a pas de sens.
Zlub
Messages postés
815
Date d'inscription
mercredi 11 octobre 2000
Statut
Membre
Dernière intervention
29 septembre 2010
4
ECONS > je suppose que c'est pour ça. Je n'ai pas trouvé le detail dans la doc. Etant donné que ni Ecosse, ni Pays de Galles ont un code pays, j'imagine que GB les regroupent.
De toute façon, les codes pays sont fixés par les pays membres de UE et ne sont donc pas de moi.
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 ?
katsankat
Messages postés
571
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.

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.