Algoritmia - Algoritomo homoclave del RFC

 
Vista:

Algoritomo homoclave del RFC

Publicado por Jorza (1 intervención) el 19/12/2002 18:06:20
Alguien me puede proporcionar el algoritmo para determinar la homoclave del RFC...
Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Algoritomo homoclave del RFC

Publicado por JORGE ISMAEL (4 intervenciones) el 14/02/2007 18:23:21
<?php

/*
/// <param name="nombre">Nombre(s) de la persona</param>
/// <param name="apellidoPaterno">Apellido paterno de la persona</param>
/// <param name="apellidoMaterno">Apellido materno de la persona</param>
/// <param name="fecha">Fecha en formato dd/MM/yy (12/10/68)</param>
/// <returns>Regresa el RFC como cadena de caracteres</returns>
*/
function QuitarArticulos($palabra)
{
$palabra=str_replace("DEL ","",$palabra);
$palabra=str_replace("LAS ","",$palabra);
$palabra=str_replace("DE ","",$palabra);
$palabra=str_replace("LA ","",$palabra);
$palabra=str_replace("Y ","",$palabra);
$palabra=str_replace("A ","",$palabra);
return $palabra;
}
function EsVocal($letra)
{
if ($letra == 'A' || $letra == 'E' || $letra == 'I' || $letra == 'O' || $letra == 'U' ||
$letra == 'a' || $letra == 'e' || $letra == 'i' || $letra == 'o' || $letra == 'u')
return 1;
else
return 0;
}
function CalcularRFC($nombre,$apellidoPaterno,$apellidoMaterno,$fecha)
{
/*Cambiamos todo a mayúsculas.
Quitamos los espacios al principio y final del nombre y apellidos*/
$nombre =strtoupper(trim($nombre));
$apellidoPaterno =strtoupper(trim($apellidoPaterno));
$apellidoMaterno =strtoupper(trim($apellidoMaterno));

//RFC que se regresará
$rfc="";

//Quitamos los artículos de los apellidos
$apellidoPaterno = QuitarArticulos($apellidoPaterno);
$apellidoMaterno = QuitarArticulos($apellidoMaterno);

//Agregamos el primer caracter del apellido paterno
$rfc = substr($apellidoPaterno,0, 1);

//Buscamos y agregamos al rfc la primera vocal del primer apellido
$len_apellidoPaterno=strlen($apellidoPaterno);
for($x=1;$x<$len_apellidoPaterno;$x++)
{
$c=substr($apellidoPaterno,$x,1);
if (EsVocal($c))
{
$rfc .= $c;
break;
}
}

//Agregamos el primer caracter del apellido materno
$rfc .= substr($apellidoMaterno,0, 1);

//Agregamos el primer caracter del primer nombre
$rfc .= substr($nombre,0, 1);

//agregamos la fecha yymmdd (por ejemplo: 680825, 25 de agosto de 1968 )
$rfc .= substr($fecha,6, 2).substr($fecha,3, 2).substr($fecha,0, 2);

//Le agregamos la homoclave al rfc
CalcularHomoclave($apellidoPaterno." ".$apellidoMaterno." ".$nombre, $fecha,$rfc);
return $rfc;
}
function CalcularHomoclave($nombreCompleto,$fecha, &$rfc)
{
//Guardara el nombre en su correspondiente numérico
//agregamos un cero al inicio de la representación númerica del nombre
$nombreEnNumero="0";
//La suma de la secuencia de números de nombreEnNumero
$valorSuma = 0;

#region Tablas para calcular la homoclave
//Estas tablas realmente no se porque son como son
//solo las copie de lo que encontré en internet

$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']='00';
$tablaRFC1['1']='01';
$tablaRFC1['2']='02';
$tablaRFC1['3']='03';
$tablaRFC1['4']='04';
$tablaRFC1['5']='05';
$tablaRFC1['6']='06';
$tablaRFC1['7']='07';
$tablaRFC1['8']='08';
$tablaRFC1['9']='09';

$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";
$tablaRFC2[33]="Z";

$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;

//Recorremos el nombre y vamos convirtiendo las letras en
//su valor numérico
$len_nombreCompleto=strlen($nombreCompleto);
for($x=0;$x<$len_nombreCompleto;$x++)
{
$c=substr($nombreCompleto,$x,1);
if (isset($tablaRFC1[$c]))
$nombreEnNumero.=$tablaRFC1[$c];
else
$nombreEnNumero.="00";
}
//Calculamos la suma de la secuencia de números
//calculados anteriormente
//la formula es:
//( (el caracter actual multiplicado por diez)
//mas el valor del caracter siguiente )
//(y lo anterior multiplicado por el valor del caracter siguiente)

$n=strlen($nombreEnNumero)-1;
for ($i = 0; $i < $n; $i++)
{
$prod1 = substr($nombreEnNumero, $i, 2);
$prod2 = substr($nombreEnNumero, $i + 1, 1);
$valorSuma += $prod1 * $prod2;
}
//Lo siguiente no se porque se calcula así, es parte del algoritmo.
//Los magic numbers que aparecen por ahí deben tener algún origen matemático
//relacionado con el algoritmo al igual que el proceso mismo de calcular el
//digito verificador.
//Por esto no puedo añadir comentarios a lo que sigue, lo hice por acto de fe.
$div = 0;
$mod = 0;
$div = $valorSuma % 1000;
$mod = floor($div / 34);//cociente
$div = $div - $mod * 34;//residuo

$hc = $tablaRFC2[$mod];
$hc.= $tablaRFC2[$div];

$rfc .= $hc;

//Aqui empieza el calculo del digito verificador basado en lo que tenemos del RFC
//En esta parte tampoco conozco el origen matemático del algoritmo como para dar
//una explicación del proceso, así que ¡tengamos fe hermanos!.
$sumaParcial = 0;
$n=strlen($rfc);
for ($i = 0; $i < $n; $i++)
{
$c=substr($rfc,$i,1);
if (isset($tablaRFC3[$c]))
{
$sumaParcial += ($tablaRFC3[$c] * (14 - ($i + 1)));
}
}

$moduloVerificador = $sumaParcial % 11;
if ($moduloVerificador == 0)
$rfc .= "0";
else
{
$sumaParcial = 11 - $moduloVerificador;
if ($sumaParcial == 10)
$rfc .= "A";
else
$rfc .= $sumaParcial;
}
}
?>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Algoritomo homoclave del RFC

Publicado por Erick Perea (1 intervención) el 09/03/2011 23:40:15
Buen artículo solo falta agregar en la funcion QuitarArticulos lo siguiente:

$palabra=str_replace("MC ","",$palabra);
$palabra=str_replace("LOS ","",$palabra);
$palabra=str_replace("VON ","",$palabra);
$palabra=str_replace("VAN ","",$palabra);

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Algoritomo homoclave del RFC

Publicado por MARTHA (1 intervención) el 30/11/2008 01:20:49
HOLA S2! A QUE PAG DEBO DE ENTRAR PARA OBTENER LA HOMOCLAVE DE PERSONAS COMUNES
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Algoritomo homoclave del RFC

Publicado por Erick Martinez (1 intervención) el 18/12/2008 10:12:13
Oye cree una clase en php a partir de tu código y parece bastente bien, excepto para algunos nombres, según veo el dígito verificador no es correcto a veces, no entiendo por qué. Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar