Foros del Web » Programando para Internet » PHP »

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

Estas en el tema de Verificacion de nº de la Seguridad Social en España en el foro de PHP en Foros del Web. 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, ...
  #1 (permalink)  
Antiguo 02/12/2008, 08:22
 
Fecha de Ingreso: diciembre-2008
Mensajes: 6
Antigüedad: 15 años, 4 meses
Puntos: 0
Verificacion de nº de la Seguridad Social en España

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

Tal vez la asignacion de tipos a las variables no la estoy haciendo correctamente, voy a estudiar la posibilidad de hacerlo con settype($valor, "integer"), aver si asi me realiza las operaciones y comprobaciones correctamente.

A ver si entre todos lo sacamos, Gracias.
  #2 (permalink)  
Antiguo 02/12/2008, 08:25
 
Fecha de Ingreso: mayo-2005
Ubicación: Muy lejos de aquí
Mensajes: 367
Antigüedad: 18 años, 11 meses
Puntos: 0
Respuesta: Verificacion de nº de la Seguridad Social en España

¿Has probado las expresiones regulares?
__________________
Saludos!
  #3 (permalink)  
Antiguo 02/12/2008, 08:41
Avatar de Carxl
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: Bogotá
Mensajes: 2.993
Antigüedad: 17 años, 8 meses
Puntos: 70
Respuesta: Verificacion de nº de la Seguridad Social en España

Por qué dices que está mal??

Código PHP:
echo "<br>D b NO <10.000.000 ahora vale = ".$d." de tipo ".gettype($d); // ESTA LA HACE MAL 
El tipo de dato o el resultado?? Porqué necesitas un tipo de dato específico? PHP maneja los tipos de datos automáticamente...

http://www.gratiszona.com/apuntes/ph...tos_en_php.htm

El resultado te lo arroja correctamente?

Saludos
__________________
Hay 10 tipos de personas, los que entienden binario y los que no. (Anónimo)
www.programandoweb.com
  #4 (permalink)  
Antiguo 02/12/2008, 08:55
 
Fecha de Ingreso: diciembre-2008
Mensajes: 6
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Verificacion de nº de la Seguridad Social en España

En primer lugar gracias por vuestra colaboracion...

Pogo que la hace mal porque en el caso de que empieze el numero por 1 (quitando los dos primeros que se refieren a la provincia) no me reliza bien el calculo y la comprobacion, en cambio en el que empieza por 0 si los comprueba bien.

Ref a expresiones regulares, no no lo probado. He visto algo en el manual al hacerle referencia, el PHP no es mi fuerte y no entiendo muy bien como puede ayudar, te agradeceria me ilustraras un poco con algun ejemplo.

Muchas Gracias.
  #5 (permalink)  
Antiguo 02/12/2008, 09:10
 
Fecha de Ingreso: diciembre-2008
Mensajes: 6
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Verificacion de nº de la Seguridad Social en España

Perdon, se me olvidaba. En contextacion a Carlx.

El tipo de dato o el resultado?? Porqué necesitas un tipo de dato específico? PHP maneja los tipos de datos automáticamente...

He intentado forzar los tipos de datos, poruqe no me realizaba bien la comprobacion (sobre todo en el mod) y supuse que era por este motivo.
  #6 (permalink)  
Antiguo 02/12/2008, 09:43
 
Fecha de Ingreso: diciembre-2008
Mensajes: 6
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Verificacion de nº de la Seguridad Social en España

Si no forzara el tipo para hacer la verificacion el codigo seria:

Código PHP:
//$numero = 280421646361;//Si empieza por 0 y SI FUNCIONA O VERIFICA COMO CORRECTO
$numero=461050199640;// no empieza por 0, NO ME LO DA COMO CORRECTO
echo $numero." de tipo ".gettype($d);
$asubstr($numero,0,2); //a los dos primeros numeros
echo "<br>A los dos primeros numeros= ".$a." de tipo ".gettype($a);;
$csubstr($numero,-2);//a los dos ultimos
echo "<br>C los dos ultimos= "$c." de tipo ".gettype($c);;
$bsubstr($numero,2,-2);// al resto
echo "<br>B al resto= ".$b." de tipo ".gettype($b);"<br>";

if (
$b<10000000)
    {
        
$d=$b+$a*10000000;
        echo 
"<br>D b<10.000.000 ahora vale = ".$d." de tipo ".gettype($d);
    } 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);
$resto=$d%97;// Mod resto de la división entera 
echo "<br> el resto es ==== ".$resto." de tipo ".gettype($resto);

// Ahora COMPARAMOS
echo "<br>A COMPARA CON VAlor de C (DC de los dos ultimos numeros) = ".$c." de tipo ".gettype($cc);
if (
$c==$resto)
    {
    echo 
"<br>CORRECTO";
    } else {
    echo 
"<br>NO CORRECTO deberia de ser ".$resto;
    }
?> 
Los dos numeros de seguridad social son de verdad, por lo que el resultado deberia de ser correcto.

En le caso de el numero: 280421646361 que es ($b<10000000) me da como correcto. Por lo tanto la verificacion es correcta.

Pero en el caso de del nº: 461050199640 que no es menor de 10000000 no me da como correcto, nos se si porque.
  #7 (permalink)  
Antiguo 02/12/2008, 18:01
 
Fecha de Ingreso: diciembre-2008
Mensajes: 6
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Verificacion de nº de la Seguridad Social en España

Alguien me puede ayudar? por favor!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:44.