Classe de contrôle et de validation de RIB français

Rechercher

Classe de contrôle et de validation de RIB français

  • Par Emacs
  • 2 commentaires
  • 25084 lectures
  • RSS -  Atom

Ce court tutoriel vous présente une classe qui permet de créer des objets encapsulant les données d'un numéro de RIB. Elle peut s'utiliser de deux manières différentes : soit créer des objets RIB ou bien servir comme système de validation des informations bancaires grâce à ses méthodes statiques. Bien que très peu extraordinaire en soit, cette source s'avère particulièrement pratique et efficace dans lors du développement d'applications de comptabilité par exemple.

Présentation de la source

Cette courte et simple classe permet de créer des objets de type RIBValidator pour valider les informations d'un compte bancaire. Comme vous le savez sans doute, un RIB est constitué de quatre composantes : le code unique de la banque, le code unique de l'agence qui tient le compte, le numéro du compte et la clé RIB. Ce que vous ignorez peut-être en revanche, c'est que cette série de chiffres et de lettres n'est pas construite au hasard. En effet, le grand secret d'un RIB réside dans la clé qui est calculée à partir d'un algorithme utilisant les trois autres parties du RIB.

Cette classe s'appuie sur cet algorithme de calcul de clé RIB que vous pouvez découvrir sur Wikipédia à l'adresse suivante : http://fr.wikipedia.org/wiki/Cl%C3%A9_RIB. Entrons dans le vif du sujet et présentons le code de la classe RIB_FR. Nous verrons ensuite quelques exemples d'utilisation.

Code source de la classe RIBValidator

<?php
class RIBValidator
{
private $bankCode;
private $agencyCode;
private $accountNumber;
private $ribKey;
public function __construct($bankCode, $agencyCode, $accountNumber, $ribKey)
{
$this->bankCode = (int) $bankCode;
$this->agencyCode = (int) $agencyCode;
$this->accountNumber = (string) $accountNumber;
$this->ribKey = (int) $ribKey;
}
public function isValid()
{
$account = (int) strtr(strtoupper($this->accountNumber), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', '12345678912345678923456789');
$key = 97 - ((89 * $this->bankCode + 15 * $this->agencyCode + 3 * $account) % 97);
return $key === $this->ribKey;
}
}

Utilisation de la classe

<?php
$validator = new RIBValidator('00123', '00123', '000012536ML', '64');
if ($validator->isValid()) {
echo 'Account number is valid.';
} else {
echo 'Account number is not valid.';
}

Tests unitaires avec PHPUnit

<?php
require __DIR__.'/../RIBValidator.php';
class RIBValidatorTest extends PHPUnit_Framework_TestCase
{
/** @dataProvider provideAccountNumbers */
public function testValidAccountNumbers($bank, $agency, $account, $key)
{
$validator = new RIBValidator($bank, $agency, $account, $key);
$this->assertTrue($validator->isValid());
}
public function testInvalidAccountNumber()
{
$validator = new RIBValidator('00123', '00123', '000012536ML', '65');
$this->assertFalse($validator->isValid());
}
public function provideAccountNumbers()
{
return array(
// add a list of valid account numbers here...
array('00123', '00123', '000012536ML', '64'),
);
}
}

 



Les commentaires

1. Par Julien le 26/09/2008 12:08

bonjour,

J'utilise se bout de code depuis quelques temps maintenant. ( Merci très pratique ).
Mais j'ai eu a plusieur reprise des clé RIB Valide qui ne passait pas.
Je me suis donc penché sur la question. Et j'ai été obligé de transformé une partie du code.
------------------------------------
Code d'origine
------------------------------------
if($iCleRib<0)
{
$sCleRib = '0'. (string)iCleRib;
}
else
{
$sCleRib = (string) $iCleRib;
}
------------------------------------
Code Modifié
------------------------------------
if(strlen($iCleRib ) < 2)
{
$sCleRib = '0'. (string)$iCleRib;
}
else
{
$sCleRib = (string) $iCleRib;
}
------------------------------------
Je pense qu'il y a une partie du code dont je n'ai pas saisi le fonctionnement.
Notamment l'utilisation de $iCleRib
dans se cas de figure. A moins que le test soit fait avec 10 au lieu de 0 pour vérifier que $iCleRib soit composer de 2 caractères.
Merci de m'éclairé.
Bonne continuation.

2. Par RobertVonTagada le 04/03/2009 10:53

Bonjour !

Merci pour cette class bien utils !

Même problème que Julien, les RIB avec une clef commençant par 0 sont "invalide".

En faite, c'est la comparaison $sCleRib === self::calculerCleRib($sCodeBanque, $sCodeGuichet, $sNumeroCompte) qui n'est pas "bonne".

En gros, les deux valeurs testé n'ont pas le même type, donc soit on cast soit on se contente de tester les valeurs et pas le type par un simple ==

--------------
if($sCleRib == self::calculerCleRib($sCodeBanque, $sCodeGuichet, $sNumeroCompte))
{
$bCorrect = true;
}