Trucs et astuces‎ > ‎

Contrôle d’un RIB

Préambule

Rédigé le 02/01/2008 par Jessihash et extrait de son blog SuneidoFR. Cette contribution astucieuse a depuis été intégrée dans Suneido.

RIBControl est un contrôle Suneido permettant la saisie et la validation d’un Relevé d’Identité Bancaire.

Le code de RIBControl

PatternControl
   {
   Name: "RIB"
   New(width= 23, mandatory= false)
   {
   super('>>>>> >>>>> >>>>>>>>>>> ##',
   width : width,
   mandatory : mandatory,
   status: 'RIB')
   .mandatory = mandatory
   }
   Valid?()
   {
   value = .Get()
   if (.mandatory is false and value is '')
   return true
   return super.Valid?() and RIBValid?(value)
   }
   }

Le code de RIBValid ?

function (rib)
   {
   rib = rib.Tr(" " )
   dict = #("0":0, "1":1, "2":2, "3":3, "4":4, "5":5, "6":6, "7":7, "8":8, "9":9, A:1, B:2, C:3, D:4, E:5, F:6, G:7, H:8, I:9,J:1, K:2, L:3, M:4, N:5, O:6, P:7, Q:8, R:9,S:2, T:3, U:4, V:5, W:6, X:7, Y:8, Z:9)
   num = ""
   for (i=0; i<= rib.Size()-1; ++i)
   {
   num $= dict[rib.Substr(i,1)]
   }
   cle = num.Substr(-2)
   if (Number(cle)<1 or Number(cle)>97)
   {
   return false
   }
   a = num.Substr(0,7)
   b = num.Substr(7,7)
   c = num.Substr(14,7)
   verifcle = 97-((62*a+34*b+3*c)%97)
   return Number(cle) == verifcle
   }

Le code code de RIBValidTest

Test
   {
   Test_main()
   {
   AssertEq(RIBValid?('15459 45000 0411700920U 62'),true)
   AssertEq(RIBValid?('10207 00026 04026011770 83'),true)
   AssertEq(RIBValid?('30002 06971 0000072002D 05'),false)
   }
   }

Explications

RIBControl est un PatternControl avec comme masque de saisie >>>>> >>>>> >>>>>>>>>>> ## > représente un chiffre ou une lettre majuscule et # un chiffre.

Les données entrées avec ce masque sont alors vérifiées avec la fonction RIBValid ?

function (rib)
RIBValid ? est une fonction prenant en paramètre d’entrée un RIB
   {
   rib = rib.Tr(" " )

on enlève du RIB tous les espaces

   dict = #("0":0, "1":1, "2":2, "3":3, "4":4, "5":5, "6":6, "7":7, "8":8, "9":9,A:1, B:2, C:3, D:4, E:5, F:6, G:7, H:8, I:9,J:1, K:2, L:3, M:4, N:5, O:6, P:7, Q:8, R:9,S:2, T:3, U:4, V:5, W:6, X:7, Y:8, Z:9)

On créé un dictionnaire nommé dict contenant la correspondance entre chaque caractère possible du RIB avec une valeur numérique

num = ""

On initialise la variable num

for (i=0; i<= rib.Size()-1; ++i)

Pour chaque caractère du RIB

   {
   num $= dict[rib.Substr(i,1)]

On concatène à num la valeur correspondante du caractère encours dans le dictionnaire (par ex : U donne 4)

   }
   cle = num.Substr(-2)

On détermine la clé (ce sont les deux derniers caractères du RIB d’où le -2)

if (Number(cle)<1 or Number(cle)>97)

Si la clé n’est pas comprise entre 1 et 97 alors le RIB n’est pas valide

   {
   return false
   }

Sinon, on décompose le nouveau « RIB » entièrement numérique num en trois parties de 7 caractères

        a = num.Substr(0,7)
   b = num.Substr(7,7)
   c = num.Substr(14,7)

On calcule la clé de vérification verifcle

verifcle = 97-((62*a+34*b+3*c)%97)

Le RIB est juste si la clé du RIB est égale à verifcle (on utilise Number(cle) pour convertir la clé qui est une sous chaîne de la chaîne RIB en valeur numérique, sinon il y a un conflit de type)

   return Number(cle) == verifcle
   }

Et voilà votre RIB est validé.

Et comme d’habitude on met en place un ensemble de tests pour valider le tout [1] :

   
Test
   {
   Test_main()
   {
   AssertEq(RIBValid?('15459 45000 0411700920U 62'),true)
   AssertEq(RIBValid?('10207 00026 04026011770 83'),true)
   AssertEq(RIBValid?('30002 06971 0000072002D 05'),false)
   }
   }

Notes

[1] Les RIB testés ci-dessous ne sont plus actifs, mais si vous voulez faire un gros virement sur un RIB actif, je peux vous communiquer le mien ;-)