Contrôle d'un RIB

Contrôle d'un RIB

Maj 04/08/2018

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