Ver Mensaje Individual
  #1737  
Antiguo 02-10-2021
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.766
Reputación: 8
ermendalenda Va por buen camino
Cita:
Empezado por Sistel Ver Mensaje
Yo, desde hace muchos años, uso las mismas funciones para comprobar si un documento (NIF, NIE o CIF) expedido en España es válido.
En PHP, llamando a la función COMPROBAR_DOCUMENTO($nif) :
Código PHP:
<?php
function COMPROBAR_DOCUMENTO($nif){
    
// Limpia
    
$nif = LIMPIAR_NIF($nif);
    
// Comprueba NIF, CIF o NIE
    
if(stristr("XYZ", $nif[0])) $salida = COMPROBAR_NIE($nif);
    if(
stristr("ABCDEFGHJKLMNPQRSUVW", $nif[0])) $salida = COMPROBAR_CIF($nif);
    if(
stristr("0123456789", $nif[0])) $salida = COMPROBAR_NIF($nif);
    
// Si la comprobación ha dado errónea se devuelve texto
    
if($salida <> '1') return "Error en documento (CIF/NIF/NIE)";
    return 
"";
}
/***************************************************************************************************************/
function COMPROBAR_NIE($nie){
    if(
$nie[0] == "X") $nie = "0".substr($nie, 1);
    if(
$nie[0] == "Y") $nie = "1".substr($nie, 1);
    if(
$nie[0] == "Z") $nie = "2".substr($nie, 1);
    
$dni = substr($nie, 0, -1);
    if(
LETRA_NIF($dni) <> substr($nie, -1, 1)) return "Error: NIE erróneo";
    return 
1;
}
/***********************************************************************************/
function COMPROBAR_NIF($nif){
    
$nif = str_replace(" ", "", $nif);
    
$nif = str_replace(".", "", $nif);
    
$nif = str_replace("-", "", $nif);
    
$nif = str_replace("_", "", $nif);
    
$nif = str_replace(",", "", $nif);
    
$dni = substr($nif, 0, -1);
    if(
LETRA_NIF($dni) <> strtoupper(substr($nif, -1, 1))) return "Error: NIF erróneo";
    return 
1;
}
/***************************************************************************************************************/
function COMPROBAR_CIF($cif){
    
$cif = str_replace(" ", "", $cif);
    
$cif = str_replace(".", "", $cif);
    
$cif = str_replace("-", "", $cif);
    if(
strlen($cif) <> 9) return "Error: Número de caracteres del CIF no es 9";
    
$validos = "ABCDEFGHJKLMNPQRSUVW";
    if(!
strstr($validos, substr($cif, 0, 1))) return "Error: Primera letra del CIF errónea";
    if(!
ctype_digit(substr($cif, 1, 7))) return "Error: Dígitos no numéricos en el CIF";

    
// Cálculo del dígito final
    
$a = $cif[2] + $cif[4] + $cif[6];
    for(
$i=1; $i<=7; $i=$i+2){
        
$x = $cif[$i] * 2;
        
$x = sprintf('%02d', $x);
        
$b += $x[0] + $x[1];
    }
    
$c = $a + $b;
    
$c = sprintf('%02d', $c);
    
$d = 10 - $c[1];
    if(
$d == 10) $d = 0;
    
$letras = array("J","A","B","C","D","E","F","G","H","I");
    if(
$cif[8] <> $d && $cif[8] <> $letras[$d]) return "Error: CIF erróneo";
    return 
1;
}
/***************************************************************************************************************/
function LIMPIAR_NIF($nif){
    
$nif = str_replace(' ', '', $nif);
    
$nif = str_replace('-', '', $nif);
    
$nif = str_replace('/', '', $nif);
    
$nif = str_replace('_', '', $nif);
    
$nif = str_replace('.', '', $nif);
    
$nif = str_replace(',', '', $nif);        
    
$nif = strtoupper($nif);            
    return 
$nif;
}
/***************************************************************************************************************/
function LETRA_NIF($dni){
    
$dni = str_replace(" ", "", $dni);
    
$dni = str_replace(".", "", $dni);
    
$resto = (int) ($dni % 23);
    
$letras = "TRWAGMYFPDXBNJZSQVHLCKE";
    
$letra = substr ($letras, $resto, 1);
    return 
$letra;
}
?>
Saludos
Gracias me faltaba la parte dell algoritmo para comprobar los NIE (Offline), con esto listo.

Una cosa menos.
Responder Con Cita