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 >>>>> >>>>> >>>>>>>>>>> ## ou > 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 tois partie 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 :
Test
{
Test_main()
{
AssertEq(RIBValid?('15459 45000 0411700920U 62'),true)
AssertEq(RIBValid?('10207 00026 04026011770 83'),true)
AssertEq(RIBValid?('30002 06971 0000072002D 05'),false)
}
}
Les RIB testés ci-dessus ne sont plus actifs, mais si vous voulez faire un gros virement sur un RIB actif, je peut vous communiquer le mien ,-)
