Ver Mensaje Individual
  #25 (permalink)  
Antiguo 18/01/2007, 19:22
Avatar de demiurgo_daemon
demiurgo_daemon
 
Fecha de Ingreso: diciembre-2006
Ubicación: Querétaro
Mensajes: 184
Antigüedad: 17 años, 4 meses
Puntos: 2
Información Re: script que genere la C.U.R.P (para los expertos)

para validar los nombres, ahi les va. esto es un pseudocódigo que parece más javascript que java, pero creo que es mejor que poner garabatos en perl :

Código:
//quitar espacios externos
nombre = nombre.subst(/^\s+|\s+$/,'');
paterno = paterno.subst(/^\s+|\s+$/,'');
materno = materno.subst(/^\s+|\s+$/,'');

//quitar articulos de apellidos
pat_temp = paterno.subst(/\b(de(l)?|la(s)?|los|y|a|mac|von|van)\s+/i,'');
pat_temp = pat_temp.subst(/\bmc/,'');
mat_temp = materno.subst(/\b(de(l)?|la(s)?|los|y|a|mac|von|van)\s+/i,'');
mat_temp = mat_temp.subst(/\bmc/,'');

//quitar nombres comunes, solo si no van solos, ademas de articulos
nom_temp = nombre.subst(/\b(j(ose|\.)?|ma(ria|\.)?)\s+/i,'');
nom_temp = nom_temp.subst(/\b(de(l)?|la(s)?|los|y|a|mac|von|van)\s+/i,'');
nom_temp = nom_temp.subst(/\bmc/,'');

//empezar a construir curp con inicial paterno + primera vocal paterno + inicial materno + inicial nombre
var curp = pat_temp.char(0) + pat_temp.string(1).match(/[aeiou]/i);
curp += mat_temp.char(0);
curp += nom_temp.char(0);

var malas = 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");

//si se encuentra una mala palabra, sustituir la segunda letra con 'X'
if(curp.match(malas.join('|'))) curp = pat_temp.char(0) + 'X' + mat_temp.char(0) + nom_temp.char(0);
después de esto, se sacan datos de fecha, entidad, etc., como lo hace automan

los dígitos verificadores son un animal muy particular:

para el primero, sólo he podido apoyarme en curps que tengo a la mano y el ejemplo que pone HOPEGRACE. en pocas palabras, si el año de nacimiento es menor a 2000, es 0; de lo contrario, A:
Código:
curp += fecha.substring(0,2)=="19"?'0':'A';
nótese que la implementación varía de acuerdo a con qué formato planeen recibir la fecha (y de la tipificación de su lenguaje). personalmente recomiendo iso8601.

el segundo viene casi de la misma tabla que se usa para el verificador del rfc de personas físicas, sólo que no puede ser 'A':

Código:
func tabla(i){
if(i >= '0' && i<= '9') return i-48;
else if (i>= 'A' && i<= 'N') return i-55;
else if (i>= 'O' && i<= 'Z') return i-54;
else return 0;
}

//en este punto, la variable curp tiene todo excepto el ultimo digito verificador
//ejemplo: JIRA0302024MVZMVNA
var dv = 0;
for(var i=0; i<curp.length; i++) dv += tabla(curp.charCodeAt(i))*(18-i);
dv%=10;
curp += dv==0?0:10-dv;
en mi mensaje anterior mencioné que ñ debe devolver 24, pero esto es ocioso porque la cadena curp no puede contenerla, pero es importante que n devuelva 23.

otro detalle es que no sé si la lista de palabras indebidas está completa. háganme saber si falta alguna.

espero su retroalimentación