IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Vérification du n° de TVA belge


Sujet :

JavaScript

  1. #1
    Mvu
    Mvu est déconnecté
    Membre régulier
    Inscrit en
    Septembre 2002
    Messages
    248
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 248
    Points : 105
    Points
    105
    Par défaut Vérification du n° de TVA belge
    Bonjour il y a 4 ans, javatwister m'a écrit le script suivant pour vérifier la validité d'un n° de TVA en Belgique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	<script>
    	document.getElementById("f").addEventListener("submit",function(e){
    		const ch=e.target["tva"].value,// le champ tva
    		ch2=parseInt(ch.slice(1,8));// le champ tva sans le début et la fin
     
    		if(!/^0\d{9}$/.test(ch) || 97-(ch2-(parseInt(ch2/97)*97))!=parseInt(ch.slice(8))){// le test
    			alert("<%=(getMsg(154,WrongVAT))%>");
    			e.preventDefault();// empêche la soumission du formulaire
    		}
    	})
    	</script>
    Le script ci-dessus répondait à la demande suivante: le numéro de TVA commence par 0 et est en 10 chiffes.
    Pour vérifier la validité on laisse tomber le premier chiffre (0) et les deux derniers.
    Exemple:
    0472968436
    4729684 / 97 = 48759,628
    48759 * 97 = 4729623
    4729684 - 4729623 = 61
    97 - 61 = 36
    Cqfd.

    La donne a un peu changé.
    Maintenant, le numéro de TVA peut commencer par 1.
    La méthode de vérification reste inchangée, sauf que maintenant, il faut considérer le premier chiffre (1 ou 0).
    Exemple:
    1003345828
    10033458 / 97 = 103437
    1034397 * 97 = 10033389
    10033458 -- 10033389 = 69
    97 - 69 = 28
    Cqfd

    Comment dois-je modifier le script ci-dessous pour l'adapter à la nouvelle situation ?
    Merci d'avance pour votre aide.
    Marc Van Uytvanck
    Bruxelles

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Bonjour,
    sachant que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    parseInt("0472968436".slice(0,8));
    >> 472968436  // le zéro devant non significatif n'est pas pris en compte
    et que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    parseInt("1003345828".slice(0,8));
    >> 10033458  // le 1 devant est lui pris en compte
    il te faut modifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ch2=parseInt(ch.slice(1,8));// le champ tva sans le début et la fin
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ch2=parseInt(ch.slice(0,8));// le champ tva les huit premier chiffres
    et ton test RegExp devient, à la louche et surement simplifiable, /^[0-1]\d{9}$/.

  3. #3
    Mvu
    Mvu est déconnecté
    Membre régulier
    Inscrit en
    Septembre 2002
    Messages
    248
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 248
    Points : 105
    Points
    105
    Par défaut
    Bonjour,
    Voici mon code maintanant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	<script>
    	document.getElementById("f").addEventListener("submit",function(e){
    		const ch=e.target["tva"].value,// le champ tva
    		ch2=parseInt(ch.slice(0,8));// le champ tva sans le début et la fin
     
    		if(!/^0\d{9}$/.test(ch) || 97-(ch2-(parseInt(ch2/97)*97))!=parseInt(ch.slice(8))){// le test
    			alert("<%=(getMsg(154,WrongVAT))%>");
    			e.preventDefault();// empêche la soumission du formulaire
    		}
    	})
    	</script>
    J'ai testé avec le n° de TVA 0445299383, c'est bon.
    Mais pas avec 1003345828.
    Marc Van Uytvanck
    Bruxelles

  4. #4
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Tu as oublié de modifier :
    Citation Envoyé par NoSmoking
    et ton test RegExp devient, à la louche et surement simplifiable, /^[0-1]\d{9}$/.

  5. #5
    Mvu
    Mvu est déconnecté
    Membre régulier
    Inscrit en
    Septembre 2002
    Messages
    248
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 248
    Points : 105
    Points
    105
    Par défaut
    Re-bonjour,
    Toujours pas malheureusement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	<script>
    	document.getElementById("f").addEventListener("submit",function(e){
    		const ch=e.target["tva"].value,// le champ tva
    		ch2=parseInt(ch.slice(0,8));// le champ tva sans le début et la fin
     
    		if(!/^[0-1]\d{9}$/.test(ch) || 97-(ch2-(parseInt(ch2/97)*97))!=parseInt(ch.slice(8))){// le test
    			alert("<%=(getMsg(154,WrongVAT))%>");
    			e.preventDefault();// empêche la soumission du formulaire
    		}
    	})
    	</script>
    Marc Van Uytvanck
    Bruxelles

  6. #6
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Toujours pas malheureusement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function test(ch) {
      ch2 = parseInt(ch.slice(0, 8));
      if (!/^[0-1]\d{9}$/.test(ch) || 97 - (ch2 - (parseInt(ch2 / 97) * 97)) != parseInt(ch.slice(8))) {
        console.log("ERREUR");
      }
      else {
        console.log("C'est bon");
      }
    }
    test("0445299383"); //>> C'est BON
    test("1003345828"); //>> C'est BON
    test("0472968436"); //>> C'est BON
    test("0472968437"); //>> ERREUR
    test("2472968436"); //>> ERREUR
    aurais-je raté quelque chose !?!

  7. #7
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Je ne vois pas d'erreur et visiblement ça fonctionne. J'aurais écrit [01] au lieu de [0-1] car il n'y a pas de rang de caractères, juste deux caractères possibles, et j'aurais utilisé la pattern pour faire le découpage.

    La division par 97, puis la multiplication de la partie entière par 97 et enfin la soustraction qui suit, ne sont en fait que l'opération modulo 97 mais exprimée avec les opérations courantes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    const TVAForm = document.getElementById('f');
     
    TVAForm.addEventListener('submit', function(e) {
        const ch = e.target['tva'].value,
              pat = /^([01]\d{7})(\d{2})$/,
              m = ch.match(pat);
     
        if (m instanceof Array) {
            let [rad, key] = m.slice(1,3).map((n) => parseInt(n));
     
            if (97 - rad % 97 === key) {
                return;
            }
        }
     
        alert("<%=(getMsg(154,WrongVAT))%>");
        e.preventDefault();
    });
    demo fiddle
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  8. #8
    Mvu
    Mvu est déconnecté
    Membre régulier
    Inscrit en
    Septembre 2002
    Messages
    248
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 248
    Points : 105
    Points
    105
    Par défaut
    Bonjour,
    Je suis désolé de répondre si tard. Mais c'est bon maintenant. Merci à vous.
    Marc Van Uytvanck
    Bruxelles

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Verifier Numéro tva belge
    Par badibad dans le forum VBA Access
    Réponses: 4
    Dernier message: 21/09/2019, 23h48
  2. Déclaration TVA belge
    Par RisingDev dans le forum Odoo (ex-OpenERP)
    Réponses: 1
    Dernier message: 20/04/2015, 11h19
  3. REQ : Algo pour vérification saisie du "Numero TVA"
    Par Eric.H dans le forum Langage
    Réponses: 4
    Dernier message: 28/01/2009, 10h23
  4. besoin d aide et de vrification algo tri bulle
    Par dju.ly dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 30/12/2005, 13h04
  5. Modifier un champs texte avec une fonction PHP (calcul TVA)
    Par Stella2809 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/11/2005, 00h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo