<?php // Licence Publique Générale GNU (GNU General Publique License), Copyright 2005-2008 Geffrotin Yann
/* ISO 6166, ISIN : International Securities Identification Number
(http://en.wikipedia.org/wiki/International_Securities_Identifying_Number) */
include("ISIN_gen.php");
echo "ISIN ".$ISIN."</br>";
$ISINdep = $ISIN ; // "BO4574127199"
//Etape 0 : Enlever les caractères indésirables (espaces)
$ISINdep = str_replace(" ", "", $ISINdep);
//echo "ISIN ".$ISINdep."</br>";
//Vérification de validité du pays
$CodeDuPays = substr($ISINdep, 0, 2); //extraction code pays
include("ISO_3166_1_alpha_2.php"); //ISO 3166-1 alpha-2
$trouve_pays = false; //recherche du pays ds le tableau
$z = -1;
do{
$z = $z + 1;
if($CodeDuPays == $ISO_3166_1_alpha_2[$z]){
$trouve_pays = true;
}
}while($trouve_pays != true && $z != 243);
if($trouve_pays == true)
{
//echo "Code Pays ".$CodeDuPays."</br>";
$ISIN = $ISINdep;
//National Securities Identifying Number
$NSIN = substr($ISIN, 2, strlen($ISINdep)-3); //9 caractères (lettres et/ou chiffres)
//echo "NSIN ".$NSIN."</br>";
$CléNSIN = substr($NSIN, strlen($NSIN)-1, 1); //la clé de contrôle
//echo "clé NSIN ".$CléNSIN."</br>";
$CléISIN = substr($ISINdep, strlen($ISINdep)-1, 1); //la clé de contrôle
//echo "clé ISIN ".$CléISIN."</br></br>";
$TabIN = array ($NSIN, $ISIN);
$TCléIN = array ($CléNSIN, $CléISIN);
for($i=0;$i<=1;$i++){
//Etape 1 : Convertir toutes les lettres en nombres via une table de conversion (A=10, B=11, C=12 etc)
$taille = strlen($TabIN[$i]); //extraction de la taille de la chaine
$Chaine = $TabIN[$i];
for($j='0';$j<=$taille-1;$j++)
{
if (ereg ("[A-Z]", $Chaine[$j])){ // Trouve si lettre existe et réassemble le tout
$Chaine = substr($Chaine, 0, $j).base_convert($Chaine[$j], 36, 10).substr($Chaine, $j+1, $taille);
$taille = $taille + 1 ; // La lettre est codé sur 2 chiffres
$j = $j + 1 ;
}
}
//echo "nombre ".$Chaine."</br>";
//Etape 2 : Doubler les valeurs des chiffres paires
$Tpaire = $Timpaire = "" ;
for($k=0;$k<=$taille-1;$k++){
if(bcmod($k, '2') == 0){
$Tpaire = $Tpaire.($Chaine[$k]*2);
}else{
$Timpaire = $Timpaire.$Chaine[$k];
}
}
//echo "paire ".$Tpaire ."</br>";
//echo "impaire ".$Timpaire."</br>";
//Etape 3 : Somme des chiffres Paires et Impaires pris séparement
$ListeChaine = $Tpaire.$Timpaire;
$TailleListeChaine = strlen($ListeChaine);
//echo "liste ".$ListeChaine."</br>";
$SomChaine = 0 ;
for($l=0;$l<=$TailleListeChaine-1;$l++){
$SomChaine = $SomChaine + $ListeChaine[$l];
}
//echo "somme ".$SomChaine."</br>";
// Etape 4 : Modulo 10 de la somme de l'ISIN
// (si le résultat termine par 0 (30, 40..) alors le ckeck digit vaut 0
if(0 == substr($SomChaine, 1, 1)){
$CléChaineCalc = 0 ;
}else{
$CléChaineCalc = 10 - bcmod($SomChaine, '10');
}
if($TCléIN[$i] == $CléChaineCalc){
$valid = true;
if(0 == $i){
//echo "valide NSIN</br>";
}else{
echo "valide ISIN</br>";
}
}else{
$valid = false;
if(0 == $i){
//echo "invalide NSIN ".$CléChaineCalc."</br>";
}else{
echo "invalide ISIN ".$CléChaineCalc."</br>";
}
}
}
}else{
echo "Ce pays n'existe pas.</br>";
}
?>