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.

Maj 04/08/2018 par jeanluc - Photo en-tête : Arcachon, Gironde, France

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 Jessihash


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 Jessihash and updated in 2018 by jeanluc

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 Jessihash and updated in 2018 by jeanluc

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 >>>>> >>>>> >>>>>>>>>>> ##> 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 ;-)