Les SIRET et SIREN incluent un dispositif de somme de contrôle qui permet d’en vérifier l’exactitude de manière algorithmique. Il existe un grand nombre d’exemples d’implémentations qui ne fonctionnent que pour le SIRET ou le SIREN.
Les explications qui suivent s’appliquent à la vérification de la validité d’un SIREN ou d’un SIRET.
Les données en entrée :
un numéro SIREN : 8 chiffres + 1 chiffre faisant office de somme de contrôle = 9 chiffres
un numéro SIRET : 13 chiffres + 1 chiffre faisant office de somme de contrôle = 14 chiffres
La définition tirée de Wikipedia (reformulée) :
Pour chaque caractère de la chaîne à contrôler, on détermine la position en partant de la fin (important).
Si la position est impaire on multiplie par 1, si la position est paire par 2.
On concatène toutes ces sommes.
Pour terminer, on additionne 1 à 1 tous les chiffres de la chaine obtenue,
la somme doit être un multiple de 10.
L’exemple d’implémentation suivant diffère un peu de la définition puisque la somme de contrôle est directement calculée pendant le parcours de la chaîne.
Implémentation testée sur une base de plus de 1000 SIREN + SIRET avec 44 erreurs de contrôle sur des identifiants SIREN / SIRET visiblement faux.
static function controleLuhn($val){
$val = preg_replace('/[^0-9]/', '', $val);
$len = strlen($val);
$sum = 0;
for($i = 0; $i < $len; $i++){
$indice = ($len - $i); // donne l'indice en partant de la fin indice de 1 à n
/*
$indice impaire : $indice%2 => 1, 2 - 1 = 1,
$indice paire : $indice%2 => 0, 2 - 0 = 2
*/
$tmp = (2 - ($indice%2)) * $val[$i];
// si nb à 2 chiffres, somme des 2 chiffres 11 => 2, 12 => 3
if($tmp >= 10) $tmp -= 9;
$sum += $tmp;
}
return (($sum%10) == 0);
}
Les ressources sur Internet à ce sujet
La plupart des exemples trouvés sur l’Internet ne prennent pas en compte le fait qu’on considère le rang à partir de la fin ce qui n’a aucun impact pour le calcul de la somme de contrôle sur le SIREN qui a 9 chiffre (les positions sont paires ou impaires de la même manière qu’on prenne la position dans un sens ou dans l’autre).
L’article sur le SIREN sur Wikipedia. La définition est juste si on lit bien « de rang impair à partir de la droite« .
L’article sur le SIRET sur Wikipedia.
Le même sujet traité sur le site de l’INSEE qui propose une implémentation XSLT de l’algorithme de Luhn malheureusement pas adaptée à ce cas précis puisqu’elle détecte une erreur de contrôle sur tous les SIREN de la même base de test.