Contrôle d'un RIB
Contrôle d'un RIB
Contribution de Jessihash (voir son blog SuneidoFR) mise à jour par jeanluc le 13/04/2018.
RIBControl est un contrôle Suneido permettant de vérifier et de valider la saisie d’un RIB (Relevé d’Identité Bancaire) complet et correct.
Préambule
En France un RIB a 23 caractères : code banque (5 chiffres) + code guichet (5 chiffres) + numéro de compte (11 chiffres et/ou lettres) + clé RIB (2 chiffres entre 01 et 97). La clé RIB est vérifiée avec un calcul modulo 97 .
Le code de RIBControl
// Copyright (C) 2003 Suneido Software Corp. All rights reserved worldwide.
// Contributed by Jean-Charles Hoarau
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?
// Copyright (C) 2003 Suneido Software Corp. All rights reserved worldwide.
// Contributed by Jean-Charles Hoarau and updated in 2018 by Jean-Luc Chervais
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[i]]
}
cle = Number (num[21 .. 23])
if (Number(cle) < 1 or Number(cle) > 97)
{
return false
}
a = Number (num[0 .. 7])
b = Number (num[7 .. 14])
c = Number (num[14 .. 21])
verifcle = 97 - ((62 * a + 34 * b + 3 * c) % 97)
return (cle) is verifcle
}
Le code code de RIBValidTest
// Copyright (C) 2003 Suneido Software Corp. All rights reserved worldwide.
// Contributed by Jean-Charles Hoarau and updated in 2018 by Jean-Luc Chervais
Test
{
Test_main()
{
Assert(RIBValid?('15459 45000 0411700920U 62')is true)
Assert(RIBValid?('10207 00026 04026011770 83')is true)
Assert(RIBValid?('30002 06971 0000072002D 05')is false)
}
}
Explications
RIBControl est un PatternControl avec comme masque de saisie >>>>> >>>>> >>>>>>>>>>> ## où > 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.
RIBValid? est une fonction prenant en paramètre d’entrée un RIB :
function (rib)
{
On enlève du RIB tous les espaces :
rib = rib.Tr(" " )
On crée un dictionnaire nommé dict contenant la correspondance entre chaque caractère possible du RIB avec une valeur numérique :
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 initialise la variable num :
num = ""
Pour chaque caractère du RIB, ...
for (i=0; i<= rib.Size()-1; ++i)
... on concatène à num la valeur correspondante du caractère traité dans le dictionnaire (par ex : U donne 4) :
{
num $= dict[rib[i]]
}
On détermine la clé (les deux derniers caractères du RIB) :
cle = Number (num[21 .. 23])
Si la clé n’est pas comprise entre 1 et 97 alors le RIB n’est pas valide :
if (Number(cle) < 1 or Number(cle) > 97)
{
return false
}
Sinon, on décompose le nouveau « RIB » entièrement numérique num en trois parties de 7 caractères (les 11 chiffres du n° de compte ne seraient pas compatibles avec un entier 32 bits) :
a = Number (num[0 .. 7])
b = Number (num[7 .. 14])
c = Number (num[14 .. 21])
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 (cle) is verifcle
}
Et voilà votre RIB est validé.
Et comme d’habitude on met en place un ensemble de tests pour valider le tout :
Test
{
Test_main()
{
Assert(RIBValid?('15459 45000 0411700920U 62')is true)
Assert(RIBValid?('10207 00026 04026011770 83')is true)
Assert(RIBValid?('30002 06971 0000072002D 05')is false)
}
}
Notes
Les RIB testés ci-dessus ne sont plus actifs. Mais si vous voulez faire un gros virement sur un RIB actif, je peux vous communiquer le mien ;-)