Verificacion de nº de la Seguridad Social en españa

mira360
03 de Diciembre del 2008
Gracias por adelantado, a tod@s por vuestra colaboracion.
Parece ser que no hay solucion publicada referente a la verificacion de nº de SS en España, increible. Intentemos que este sea el primero.

La teoria la tengo, pero en la practica me falla y no se exactamente porque, supongo que seara por los tipos de valores con las que se hacen los calculos , por lo que incluyo gettype($valor) para su testeo.

La formula a aplicar par el calculo del nº de la seguridad social en españa es en teoria:

/*Validar un número de la Seguridad Social (España)
sábado, 07 de octubre de 2006

El número de afiliación a la Seguridad Social en españa, lleva asociados un par de dígitos de control que sirven para evitar errores de transcripción.
El número de afiliación a la seguridad social consta de tres partes:

aa/bbbbbbbb/cc

Los primeros dígitos (a) son un indicativo de la provincia. Los dígitos centrales (b) son el nº del asegurado dentro de cada provincia. Los dígitos finales son dígitos de control.

A menudo, el número de la seguridad social se escribe sin barras, siendo la parte a los dos primeros dígitos, la parte c los dos últimos y la parte b los dígitos centrales que queden:

aabbbbbbbbcc

Los dígitos de control (c) se obtienen a partir de las otras dos partes (a) y (b) de la siguiente forma:

si (b<10000000)
entonces d=b+a*10000000
si no d=valor de ( a concatenado con b ) //con b sin ceros a la izquierda
c= d mod 97 //resto de la división entera
*/

Y EN LA PRACTICA EN PHP ES (no me funciona algunos numeros):

<?
//dos numeros reales que contemplan los dos casos que se pueden dar
$numero = 280421646361;//nss donde b que empieza por 0 ($b<10000000)
$numero = 461050199640; //nss donde b que empieza por 1
SI NO ($b<10000000)
//ahora la verificacion
echo $numero." de tipo ".gettype($d);
$a= substr($numero,0,2); //a los dos primeros numeros
echo "<br>A los dos primeros numeros= ".$a." de tipo ".gettype($a);;
$c= substr($numero,-2);//a los dos ultimos
echo "<br>C los dos ultimos= ". $c." de tipo ".gettype($c);;
$b= substr($numero,2,-2);// al resto
echo "<br>B al resto= ".$b." de tipo ".gettype($b);"<br>";

if ($b<10000000)
{
$d=(int)$b+(int)$a*10000000;
echo "<br>D b<10.000.000 ahora vale = ".$d." de tipo ".gettype($d);//ESTA LA HACE BIEN
} else {
//$bb=int($b);
$d=$a.$b;
echo "<br>D b NO <10.000.000 ahora vale = ".$d." de tipo ".gettype($d); // ESTA LA HACE MAL
}
echo "<br> valor de d (a+b)= ".$d." de tipo ".gettype($d);
$cc=((double)$c);
$dd=((double)$d);
echo "<br> valor de DD= ".$dd." de tipo ".gettype($dd);
$resto=((double)$dd)%97;
$resultado=round( ( ($dd/97)-round($dd/97) )*97 );
echo "<BR>RESULTADO = ".$resultado;
echo "<br> el resto es ==== ".$resto." de tipo ".gettype($resto);
//COMPARACION
echo "<br>A COMPARA CON VAlor de C = ".$cc." de tipo ".gettype($cc);
if ($cc==((double)$resto))
{
echo "<br>CORRECTO";
} else {
echo "<br>NO CORRECTO deberia de ser ".$resto;
}
if ( ($cc==$resultado) or ($cc==((double)$resto)) )
{
echo "<br><font color=red size=3>CORRECTO";
} else {
echo "<br><font color=red size=3>NO CORRECTO deberia de ser ".$resto;
}
?>

A ver si entre todos lo sacamos, Gracias.

mira360
03 de Diciembre del 2008
Alguien puede ayudar? Por favor.