Generar CURP

/** * generaCurp() * Función principal que genera el CURP. * @param {object} param - Objeto que tiene los parámetros necesarios para poder generar el curp, * @param boolean search - La clave omonima y digito verificador como guiones bajos, * Las propiedasdes del objeto param son: * @param {string} nombre - Nombre(s). * @param {string} apellido_paterno - Apellido materno. * @param {string} apellido_materno - Apellido materno. * En caso de haber conjunciones en los apellidos, estas deben ir aqui. * @param {string} sexo - Sexo. H para hombre, M para mujer. * @param {string} estado - Estado, usando las abreviaturas oficiales. * @param {array} fecha_nacimiento - Arreglo con [ día, mes, año ], cada uno como numero. * @param {string} [homonimia] - Opcional. Valor usado para evitar repeticiones, es asignado por gobernación. * Por default es 0 si la fecha de nacimiento es menor o igual a 1999, o A, si es igual o mayor a 2000. */ var getCURP = function (param, search) { /** * filtraInconvenientes() * Filtra palabras altisonantes en los primeros 4 caracteres del CURP * @param {string} str - Los primeros 4 caracteres del CURP */ function filtraInconvenientes(str) { var inconvenientes = ['BACA', 'LOCO', 'BUEI', 'BUEY', 'MAME', 'CACA', 'MAMO', 'CACO', 'MEAR', 'CAGA', 'MEAS', 'CAGO', 'MEON', 'CAKA', 'MIAR', 'CAKO', 'MION', 'COGE', 'MOCO', 'COGI', 'MOKO', 'COJA', 'MULA', 'COJE', 'MULO', 'COJI', 'NACA', 'COJO', 'NACO', 'COLA', 'PEDA', 'CULO', 'PEDO', 'FALO', 'PENE', 'FETO', 'PIPI', 'GETA', 'PITO', 'GUEI', 'POPO', 'GUEY', 'PUTA', 'JETA', 'PUTO', 'JOTO', 'QULO', 'KACA', 'RATA', 'KACO', 'ROBA', 'KAGA', 'ROBE', 'KAGO', 'ROBO', 'KAKA', 'RUIN', 'KAKO', 'SENO', 'KOGE', 'TETA', 'KOGI', 'VACA', 'KOJA', 'VAGA', 'KOJE', 'VAGO', 'KOJI', 'VAKA', 'KOJO', 'VUEI', 'KOLA', 'VUEY', 'KULO', 'WUEI', 'LILO', 'WUEY', 'LOCA']; if (inconvenientes.indexOf(str) > -1) { str = str.replace(/^(\w)\w/, '$1X'); } return str; } /** * ajustaCompuesto() * Cuando el nombre o los apellidos son compuestos y tienen * proposiciones, contracciones o conjunciones, se deben eliminar esas palabras * a la hora de calcular el CURP. * @param {string} str - String donde se eliminarán las partes que lo hacen compuesto */ function ajustaCompuesto(str) { var compuestos = [/\bDA\b/, /\bDAS\b/, /\bDE\b/, /\bDEL\b/, /\bDER\b/, /\bDI\b/, /\bDIE\b/, /\bDD\b/, /\bEL\b/, /\bLA\b/, /\bLOS\b/, /\bLAS\b/, /\bLE\b/, /\bLES\b/, /\bMAC\b/, /\bMC\b/, /\bVAN\b/, /\bVON\b/, /\bY\b/]; compuestos.forEach(function (compuesto) { if (compuesto.test(str)) { str = str.replace(compuesto, ''); } }); return str; } /** * zeropad() * Rellena con ceros un string, para que quede de un ancho determinado. * @param {number} ancho - Ancho deseado. * @param {number} num - Numero que sera procesado. */ function zeropad(ancho, num) { var pad = Array.apply(0, Array.call(0, ancho)).map(function () { return 0; }).join(''); return (pad + num).replace(new RegExp('^.*([0-9]{' + ancho + '})$'), '$1'); } var pad = zeropad.bind(null, 2); /** * primerConsonante() * Saca la primer consonante interna del string, y la devuelve. * Si no hay una consonante interna, devuelve X. * @param {string} str - String del cual se va a sacar la primer consonante. */ function primerConsonante(str) { str = str.trim().substring(1).replace(/[AEIOU]/ig, '').substring(0, 1); return (str === '') ? 'X' : str; } /** * filtraCaracteres() * Filtra convirtiendo todos los caracteres no alfabeticos a X. * @param {string} str - String el cual sera convertido. */ function filtraCaracteres(str) { return str.toUpperCase().replace(/[\d_\-\.\/\\,]/g, 'X'); } /** * estadoValido() * Valida si el estado esta en la lista de estados, de acuerdo a la RENAPO. * @param {string} str - String con el estado. */ function estadoValido(str) { var estado = ['AS', 'BC', 'BS', 'CC', 'CS', 'CH', 'CL', 'CM', 'DF', 'DG', 'GT', 'GR', 'HG', 'JC', 'MC', 'MN', 'MS', 'NT', 'NL', 'OC', 'PL', 'QT', 'QR', 'SP', 'SL', 'SR', 'TC', 'TS', 'TL', 'VZ', 'YN', 'ZS', 'NE']; return (estado.indexOf(str.toUpperCase()) > -1); } /** * normalizaString() * Elimina los acentos, eñes y diéresis que pudiera tener el nombre. * @param {string} str - String con el nombre o los apellidos. */ function normalizaString(str) { var origen, destino, salida; origen = ['Ã', 'À', 'Á', 'Ä', 'Â', 'È', 'É', 'Ë', 'Ê', 'Ì', 'Í', 'Ï', 'Î', 'Ò', 'Ó', 'Ö', 'Ô', 'Ù', 'Ú', 'Ü', 'Û', 'ã', 'à', 'á', 'ä', 'â', 'è', 'é', 'ë', 'ê', 'ì', 'í', 'ï', 'î', 'ò', 'ó', 'ö', 'ô', 'ù', 'ú', 'ü', 'û', 'Ñ', 'ñ', 'Ç', 'ç']; destino = ['A', 'A', 'A', 'A', 'A', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'a', 'a', 'a', 'a', 'a', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'n', 'n', 'c', 'c']; str = str.split(''); salida = str.map(function (char) { var pos = origen.indexOf(char); return (pos > -1) ? destino[pos] : char; }); return salida.join(''); } /** * agregaDigitoVerificador() * Agrega el dígito que se usa para validar el CURP. * @param {string} curp_str - String que contiene los primeros 17 caracteres del CURP. */ function agregaDigitoVerificador(curp_str) { // Convierte el CURP en un arreglo var curp, caracteres, curpNumerico, suma, digito; curp = curp_str.substring(0, 17).toUpperCase().split(''); caracteres = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'Ñ', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' ]; // Convierte el curp a un arreglo de números, usando la posición de cada // carácter, dentro del arreglo `caracteres`. curpNumerico = curp.map(function (caracter) { return caracteres.indexOf(caracter); }); suma = curpNumerico.reduce(function (prev, valor, indice) { return prev + (valor * (18 - indice)); }, 0); digito = (10 - (suma % 10)); if (digito === 10) { digito = 0; } return curp_str + digito; } var inicial_nombre, vocal_apellido, posicion_1_4, posicion_14_16, curp; if (!estadoValido(param.estado || '__')) { param.estado = '__'; } param.nombre = ajustaCompuesto(normalizaString(param.nombre.toUpperCase())).trim(); param.apellido_paterno = ajustaCompuesto(normalizaString(param.apellido_paterno.toUpperCase())).trim(); param.apellido_materno = ajustaCompuesto(normalizaString(param.apellido_materno.toUpperCase())).trim(); // La inicial del primer nombre, o, si tiene mas de 1 nombre Y el primer // nombre es uno de la lista de nombres comunes, la inicial del segundo nombre inicial_nombre = (function (nombre) { var comunes, nombres, primerNombreEsComun; comunes = ['MARIA', 'MA', 'MA.', 'JOSE', 'J', 'J.']; nombres = nombre.toUpperCase().trim().split(/\s+/); primerNombreEsComun = (nombres.length > 1 && comunes.indexOf(nombres[0]) > -1); if (primerNombreEsComun) { return nombres[1].substring(0, 1); } if (!primerNombreEsComun) { return nombres[0].substring(0, 1); } }(param.nombre)); vocal_apellido = param.apellido_paterno.trim().substring(1).replace(/[^AEIOU]/g, '').substring(0, 1); vocal_apellido = (vocal_apellido === '') ? 'X' : vocal_apellido; posicion_1_4 = [ param.apellido_paterno.substring(0, 1), vocal_apellido, param.apellido_materno.substring(0, 1), inicial_nombre ].join(''); posicion_1_4 = filtraInconvenientes(filtraCaracteres(posicion_1_4)); posicion_14_16 = [ primerConsonante(param.apellido_paterno), primerConsonante(param.apellido_materno), primerConsonante(param.nombre) ].join(''); var fecha_nacimiento = ['__', '__', '__']; if (param.fecha_nacimiento) { fecha_nacimiento = $.format.date(param.fecha_nacimiento, 'yy-MM-dd').split('-'); } param.sexo = param.sexo || '_'; curp = [ posicion_1_4, fecha_nacimiento[0], fecha_nacimiento[1], fecha_nacimiento[2], param.sexo.toUpperCase(), param.estado.toUpperCase(), posicion_14_16 ]; if (!param.fecha_nacimiento || search !== true) { curp.push('__'); return curp.join(''); } curp.push(param.homonimia || ((param.fecha_nacimiento || new Date()).getYear() > 1999 ? 'A' : 0)); return agregaDigitoVerificador(curp.join('')); };

10 Responses

Disculpa puedes mostrar un ejemplo de como utilizarlo en PHP? como se llama a la funcion?
@Erik Chincoya Perdona Erik, si ves el código esta en JavaScript, para PHP te recomiendo le hagas la transformación necesaria de código.
@Henry Galvez Hola, gracias de hecho después de intentar hacerlo funcionar me di cuenta que se puede ejecutar directamente con parámetros javascript, gracias muy útil, para php si hay que hacer ajustes, saludos.
Hola, tienes el algoritmo en prueba de escritorio para obtener los ultimos dos digitos(Digito verificador o homoclave)
Hola! Quería consultar si sabías qué pasa con el CURP en caso de que, por ejemplo, el nombre de pila no tenga una segunda consonante.

Si te llamas "Pia" o "Mia", no se puede buscar la consonante interna del nombre de pila, sabés qué letra en este caso?

Mil gracias!!
No lo se, no encontré referencia en la documentación para manejo de esos casos.

Write a comment

You can use [html][/html], [css][/css], [php][/php] and more to embed the code. Urls are automatically hyperlinked. Line breaks and paragraphs are automatically generated.