<?php // Licence Publique Générale GNU (GNU General Publique License), Copyright 2005-2008 Geffrotin Yann

  
  /* Calcul du NSIN (National Securities Identifying Number)
    http://en.wikipedia.org/wiki/NSIN */
  
  $SansCléNSIN = rand(10000000, 99999999); // 8 char
  $CléNSIN = "10";
 
  do{
    
    if($CléNSIN != 0){
      $CléNSIN = $CléNSIN - 1;
    }else{
      $SansCléNSIN = rand(10000000, 99999999); // 8 char
      $CléNSIN = "9";
    }
    
    $NSIN = $SansCléNSIN.$CléNSIN; //9 caractères (lettres et/ou chiffres)
    
    $taille = strlen($NSIN); //extraction de la taille de la chaine
    $Chaine = $NSIN;
    
    //echo "NSIN ".$NSIN."</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 "Fin Tpaire ".$Tpaire."</br>";
    //echo "Fin Timpaire ".$Timpaire."</br>";
    //Etape 3 : Somme des chiffres Paires et Impaires pris séparement
      
      $ListeChaine = $Tpaire.$Timpaire;
      $TailleListeChaine = strlen($ListeChaine);
      
      $SomChaine = 0 ;
      for($l=0;$l<=$TailleListeChaine-1;$l++){
        $SomChaine = $SomChaine + $ListeChaine[$l];
      }
      //echo "som ".$SomChaine."</br>";
    // Etape 4 : Modulo 10 de la somme de l'ISIN 
    
      if(0 == substr($SomChaine, 1, 1)){
        $CléChaineCalc = 0 ;
      }else{
        $CléChaineCalc = 10 - bcmod($SomChaine, '10');
      }
    
    //echo "clé devrait etre ".$CléChaineCalc."</br>"; 
    
    
  }while($CléNSIN != $CléChaineCalc);
  
  $NSIN = $SansCléNSIN.$CléNSIN; //9 caractères (lettres et/ou chiffres)
  
  
?>
