Foros del Web » Programando para Internet » PHP »

Excelente clase para generar el RFC con homoclave

Estas en el tema de Excelente clase para generar el RFC con homoclave en el foro de PHP en Foros del Web. Mi primer aportación al foro: Una clase mejorada para generar el RFC de Hacienda en México, a partir de la que me encontré en otro ...
  #1 (permalink)  
Antiguo 20/02/2010, 18:06
 
Fecha de Ingreso: febrero-2010
Mensajes: 2
Antigüedad: 14 años, 1 mes
Puntos: 0
De acuerdo Excelente clase para generar el RFC con homoclave

Mi primer aportación al foro: Una clase mejorada para generar el RFC de Hacienda en México, a partir de la que me encontré en otro foro (http://ba-k.com/showpost.php?p=4816443&postcount=13).

Código PHP:
<?php
    
function rfcset($a$b) {
        if(!
$a) return $b; else return $a;
    }
    class 
RFC {
        var 
$nombre$apellidoPaterno$apellidoMaterno$fecha$rfc;
        function 
RFC($nombre$apellidoPaterno$apellidoMaterno$fecha$soloHomoclave false) {
            
$this->nombre strtoupper(trim($nombre));
            
$this->apellidoPaterno $this->QuitarArticulos(strtoupper(trim($apellidoPaterno)));
            
$this->apellidoMaterno $this->QuitarArticulos(strtoupper(trim($apellidoMaterno)));
            
$this->rfc substr($this->apellidoPaterno01);
            for(
$i 1$i strlen($this->apellidoPaterno); $i++) {
                
$c $this->apellidoPaterno[$i];
                if(
$this->EsVocal($c)) {
                    
$this->rfc .= $c;
                    break;
                }
            }
            
$this->rfc .= substr($this->apellidoMaterno01) . substr($this->QuitaNombreComun($this->nombre), 0$this->apellidoMaterno 2);
            
$this->rfc $this->QuitaPalabraMala($this->rfc);
            
$efecha explode("-"$fecha);
            
$efecha[0] = substr($efecha[0], 22);
            
$efecha[1] = str_pad($efecha[1], 2'0'STR_PAD_LEFT);
            
$efecha[2] = str_pad($efecha[2], 2'0'STR_PAD_LEFT);
            
$this->rfc .= implode(""$efecha);
            
$homoclave $this->CalcularHomoclave($this->apellidoPaterno " " $this->apellidoMaterno " " $this->nombre);
            if(!
$soloHomoclave$this->rfc .= $homoclave; else $this->rfc $homoclave;
        }
     
        function 
EsVocal($letra) {
            return 
in_array(strtoupper($letra), array("A""E""I""O""U""Á""É""Í""Ó""Ú"));
        }

        function 
QuitarArticulos($palabra) {
            return 
preg_replace('/\b(DE(L)?|LA(S)?|LOS|Y|A|VON|VAN)\s+/i'''$palabra);
        }
        
        function 
QuitaNombreComun($palabra) {
            return 
preg_replace('/\b(DE(L)?|LA(S)?|LOS|Y|A|VON|VAN)\s+/i'''preg_replace('/\b(J(OSE|\.)?|MA(RIA|\.)?)\s+/i'''$palabra));
        }
        
        function 
QuitaPalabraMala($palabra) {
            return 
in_array($palabra, array("BUEI""BUEY""CACA""CACO""CAGA""CAGO""CAKA""CAKO""COGE""COJA""KOGE""KOJO""KAKA""KULO""MAME""MAMO""MEAR""MEAS""MEON""MION""COJE""COJI""COJO""CULO""FETO""GUEY""JOTO""KACA""KACO""KAGA""KAGO""MOCO""MULA""PEDA""PEDO""PENE""PUTA""PUTO""QULO""RATA""RUIN")) ? substr_replace($palabra"X"31) : $palabra;
        }

        function 
CalcularHomoclave($nombreCompleto) {
            
$nombreEnNumero "";
            
$valorSuma 0;
            
$tablaRFC1 = array();
            
$tablaRFC1["&"] = 10$tablaRFC1["Ñ"] = 10$tablaRFC1["A"] = 11$tablaRFC1["B"] = 12$tablaRFC1["C"] = 13;
            
$tablaRFC1["D"] = 14$tablaRFC1["E"] = 15$tablaRFC1["F"] = 16$tablaRFC1["G"] = 17$tablaRFC1["H"] = 18;
            
$tablaRFC1["I"] = 19$tablaRFC1["J"] = 21$tablaRFC1["K"] = 22$tablaRFC1["L"] = 23$tablaRFC1["M"] = 24;
            
$tablaRFC1["N"] = 25$tablaRFC1["O"] = 26$tablaRFC1["P"] = 27$tablaRFC1["Q"] = 28$tablaRFC1["R"] = 29;
            
$tablaRFC1["S"] = 32$tablaRFC1["T"] = 33$tablaRFC1["U"] = 34$tablaRFC1["V"] = 35$tablaRFC1["W"] = 36;
            
$tablaRFC1["X"] = 37$tablaRFC1["Y"] = 38$tablaRFC1["Z"] = 39$tablaRFC1["0"] =  0$tablaRFC1["1"] =  1;
            
$tablaRFC1["2"] =  2$tablaRFC1["3"] =  3$tablaRFC1["4"] =  4$tablaRFC1["5"] =  5$tablaRFC1["6"] =  6;
            
$tablaRFC1["7"] =  7$tablaRFC1["8"] =  8$tablaRFC1["9"] =  9;
            
$tablaRFC2 = array();
            
$tablaRFC2[0]  = "1"$tablaRFC2[1]  = "2"$tablaRFC2[2]  = "3"$tablaRFC2[3]  = "4"$tablaRFC2[4]  = "5";
            
$tablaRFC2[5]  = "6"$tablaRFC2[6]  = "7"$tablaRFC2[7]  = "8"$tablaRFC2[8]  = "9"$tablaRFC2[9]  = "A";
            
$tablaRFC2[10] = "B"$tablaRFC2[11] = "C"$tablaRFC2[12] = "D"$tablaRFC2[13] = "E"$tablaRFC2[14] = "F";
            
$tablaRFC2[15] = "G"$tablaRFC2[16] = "H"$tablaRFC2[17] = "I"$tablaRFC2[18] = "J"$tablaRFC2[19] = "K";
            
$tablaRFC2[20] = "L"$tablaRFC2[21] = "M"$tablaRFC2[22] = "N"$tablaRFC2[23] = "P"$tablaRFC2[24] = "Q";
            
$tablaRFC2[25] = "R"$tablaRFC2[26] = "S"$tablaRFC2[27] = "T"$tablaRFC2[28] = "U"$tablaRFC2[29] = "V";
            
$tablaRFC2[30] = "W"$tablaRFC2[31] = "X"$tablaRFC2[32] = "Y";
            
$tablaRFC3 = array();
            
$tablaRFC3["A"] = 10$tablaRFC3["B"] = 11$tablaRFC3["C"] = 12$tablaRFC3["D"] = 13$tablaRFC3["E"] = 14;
            
$tablaRFC3["F"] = 15$tablaRFC3["G"] = 16$tablaRFC3["H"] = 17$tablaRFC3["I"] = 18$tablaRFC3["J"] = 19;
            
$tablaRFC3["K"] = 20$tablaRFC3["L"] = 21$tablaRFC3["M"] = 22$tablaRFC3["N"] = 23$tablaRFC3["O"] = 25;
            
$tablaRFC3["P"] = 26$tablaRFC3["Q"] = 27$tablaRFC3["R"] = 28$tablaRFC3["S"] = 29$tablaRFC3["T"] = 30;
            
$tablaRFC3["U"] = 31$tablaRFC3["V"] = 32$tablaRFC3["W"] = 33$tablaRFC3["X"] = 34$tablaRFC3["Y"] = 35;
            
$tablaRFC3["Z"] = 36$tablaRFC3["0"] =  0$tablaRFC3["1"] =  1$tablaRFC3["2"] =  2$tablaRFC3["3"] =  3;
            
$tablaRFC3["4"] =  4$tablaRFC3["5"] =  5$tablaRFC3["6"] =  6$tablaRFC3["7"] =  7$tablaRFC3["8"] =  8;
            
$tablaRFC3["9"] =  9$tablaRFC3[""]  = 24$tablaRFC3[" "] = 37;
            
$nombreEnNumero "0"
            for(
$i 0$i strlen($nombreCompleto); $i++) {
                
$c $nombreCompleto[$i];
                
$nombreEnNumero .= rfcset($tablaRFC1[$c], "00");
            }
            for (
$i 0$i strlen($nombreEnNumero) - 1$i++) {
                
$i2 $i 1;
                
$valorSuma += (($nombreEnNumero[$i] * 10) + $nombreEnNumero[$i2]) * $nombreEnNumero[$i2];
            }
            
$div 0$mod 0;
            
$div $valorSuma &#37; 1000;
            
$mod $div 34;
            
$div = ($div $mod) / 34;
            
$hc "" rfcset($tablaRFC2[$div], "Z") . rfcset($tablaRFC2[$mod], "Z");
            
$rfc $this->rfc $hc;
            
$rfcAnumeroSuma 0;
            
$sumaParcial 0;
            for(
$i 0$i strlen($rfc); $i++) {
                if(
$tablaRFC3[$rfc[$i]]) {
                    
$rfcAnumeroSuma $tablaRFC3[$rfc[$i]];
                    
$sumaParcial += ($rfcAnumeroSuma * (14 - ($i 1)));
                }
            }
            
$moduloVerificador $sumaParcial 11;
            if(
$moduloVerificador == 0$hc .= "0";
            else {
                
$sumaParcial 11 $moduloVerificador;
                if (
$sumaParcial == 10$hc .= "A"; else $hc .= $sumaParcial;
            }
            return 
$hc;
        }
    }

?>
<?php
/* Agrega una diagonal al principio de este renglón para cancelar el área de comentario
    $nombres = "JOSE EDUARDO";
    $apellidoPaterno = "CORTES";
    $apellidoMaterno = "GODINEZ";
    $fecha = "1980-01-01";
    $rfc = new RFC ($nombres, $apellidoPaterno, $apellidoMaterno, $fecha); // Agrega 'true' al final para sólo homoclave
    echo $rfc->rfc;
/*///*/
?>
Cabe mencionar que he probado con esta clase varios RFCs que inventé y los comparé con los que genera la página de Recaudanet (https://www.recaudanet.gob.mx/recaudanet/rfc.jsp), que considero más confiable que cualquier programa o página que otras personas y/o empresas han hecho, y también probé y comparé con RFCs que ya tenía para los casos en que la persona no tiene apellido materno, pues la página de Recaudanet no calcula el RFC si no tiene todos los datos.

Se agradecen sus comentarios.

Última edición por KuerboEns; 20/02/2010 a las 18:12
  #2 (permalink)  
Antiguo 20/02/2010, 22:39
Avatar de camsworksinc  
Fecha de Ingreso: julio-2008
Ubicación: Queretaro
Mensajes: 261
Antigüedad: 15 años, 9 meses
Puntos: 11
Respuesta: Excelente clase para generar el RFC con homoclave

Muchas gracias por el aporte!
Si bien este tipo de scripts te puede generar correctamente el RFC en base a tus datos, lamentablemente hay casos en donde, por ejemplo, el RFC de una persona que va a darse de alta, tiene un homonimo (uno que ya existia y que coinciden los datos) y por tanto, Hacienda le tiene que asignar otro distinto, generalmente cambiando la terminacion. Tambien, si las 4 letras del RFC forman una palabra ofensiva, tambien Hacienda lo cambia modificando una de las letras.
Por lo anterior, no se puede considerar como 100% confiable ningun script, y solamente se recomienda utilizarlos como referencia, ya que la unica fuente confiable seguira siendo la base de datos de Hacienda.

Etiquetas: hacienda, mexico, rfc
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 11:44.