<?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>";
  }

?>
