calcula-rfc
Version:
Librería para calcular el RFC (Registro Federal de Contribuyentes) mexicano con homoclave de personas físicas
1 lines • 27.5 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../src/index.js"],"sourcesContent":["'use strict';\nimport dayjs from 'dayjs';\nimport customParseFormat from 'dayjs/plugin/customParseFormat';\n\ndayjs.extend(customParseFormat);\n\n/**\n * Librería para calcular el RFC (Registro Federal de Contribuyentes) mexicano\n * incluyendo la homoclave de personas físicas basado en el algoritmo oficial.\n *\n * Basado en el documento \"IFAI 0610100135506 065 Algoritmo\" del SAT.\n *\n * @author Gerardo Lucero (basado en trabajo de Javier Islas García)\n * @version 2.0.0\n */\n\n// Constantes del algoritmo\nconst VOCALES = ['A', 'E', 'I', 'O', 'U'];\n\nconst PALABRAS_OBSCENAS = [\n 'BUEI', 'BATO', 'BOFE', 'BUEY', 'CACA', 'CACO', 'CAGO', 'CAKO', 'CAGA', 'CAKA',\n 'COGI', 'COJA', 'COJI', 'COJO', 'COLA', 'CULO', 'COGE', 'COJE', 'FALO', 'FOCA',\n 'FETO', 'GATA', 'GETA', 'GUEI', 'GUEY', 'JETA', 'JOTO', 'KAKA', 'KAGA', 'KACA',\n 'KOGE', 'KOGI', 'KOJA', 'KOJE', 'KOJI', 'KACO', 'KOLA', 'KAGO', 'KOJO', 'KULO',\n 'LILO', 'LOBA', 'LOCA', 'LOKA', 'LOKO', 'LORA', 'LORO', 'LOCO', 'MALA', 'MAMA',\n 'MEAR', 'MEON', 'MIAR', 'MOCO', 'MOKO', 'MULA', 'MULO', 'MAMO', 'MAME', 'MEAS',\n 'MION', 'NACA', 'NACO', 'PEDA', 'PIPI', 'PITO', 'POPO', 'PEDO', 'PUTA', 'QULO',\n 'RUIN', 'PENE', 'PUTO', 'RATA', 'ROBA', 'ROBE', 'ROBO', 'SAPO', 'SENO', 'SOPE',\n 'TETA', 'VACA', 'VAGA', 'VAGO', 'VUEI', 'VUEY', 'WUEI', 'WUEY'\n];\n\nconst SUFIJOS_NOMBRES = ['MARIA', 'JOSE', 'DE', 'DEL', 'LOS', 'LAS', 'LA', 'MA', 'MA.', 'J.', 'J'];\n\nconst SUFIJOS_APELLIDOS = ['DE', 'LA', 'LAS', 'MC', 'VON', 'DEL', 'LOS', 'Y', 'MAC', 'VAN'];\n\nconst EQUIVALENCIAS_NOMBRE_NUMERICO = {\n 'A': '11', 'B': '12', 'C': '13', 'D': '14', 'E': '15', 'F': '16', 'G': '17',\n 'H': '18', 'I': '19', 'J': '21', 'K': '22', 'L': '23', 'M': '24', 'N': '25',\n 'O': '26', 'P': '27', 'Q': '28', 'R': '29', 'S': '32', 'T': '33', 'U': '34',\n 'V': '35', 'W': '36', 'X': '37', 'Y': '38', 'Z': '39', '&': '10', '%': '10'\n};\n\nconst EQUIVALENCIAS_COCIENTE_RESIDUO = [\n '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',\n 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',\n 'W', 'X', 'Y', 'Z'\n];\n\n/**\n * Normaliza texto removiendo acentos y caracteres especiales\n * @param {string} str - Texto a normalizar\n * @returns {string} Texto normalizado\n */\nfunction normalizeText(str) {\n const map = {\n 'a': 'á|à|ã|â|À|Á|Ã|Â',\n 'e': 'é|è|ê|É|È|Ê',\n 'i': 'í|ì|î|Í|Ì|Î',\n 'o': 'ó|ò|ô|õ|Ó|Ò|Ô|Õ',\n 'u': 'ú|ù|û|ü|Ú|Ù|Û|Ü',\n 'c': 'ç|Ç',\n 'n': 'ñ|Ñ'\n };\n\n let normalized = str.toLowerCase();\n for (const [replacement, pattern] of Object.entries(map)) {\n normalized = normalized.replace(new RegExp(pattern, 'g'), replacement);\n }\n\n return normalized;\n}\n\n/**\n * Limpia y formatea texto para el cálculo del RFC\n * @param {string} value - Texto a limpiar\n * @returns {string} Texto limpio en mayúsculas\n */\nfunction cleanText(value) {\n if (!value || typeof value !== 'string') return '';\n\n return normalizeText(value)\n .replace(/[/\\-Ü]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n .toUpperCase();\n}\n\n/**\n * Valida los parámetros de entrada\n * @param {string} nombres - Nombres de la persona\n * @param {string} apellidoPaterno - Apellido paterno\n * @param {string} apellidoMaterno - Apellido materno\n * @param {string} fechaNacimiento - Fecha de nacimiento\n * @throws {Error} Si algún parámetro es inválido\n */\nfunction validarParametros(nombres, apellidoPaterno, apellidoMaterno, fechaNacimiento) {\n if (!nombres || typeof nombres !== 'string' || nombres.trim() === '') {\n throw new Error('El parámetro [nombres] es requerido y no puede estar vacío');\n }\n\n if (!apellidoPaterno && !apellidoMaterno) {\n throw new Error('Al menos uno de los apellidos (paterno o materno) debe ser proporcionado');\n }\n\n if (!fechaNacimiento || typeof fechaNacimiento !== 'string') {\n throw new Error('El parámetro [fechaNacimiento] es requerido');\n }\n\n // Validar formato de fecha - probar múltiples formatos\n const formatos = ['MM/DD/YYYY', 'YYYY-MM-DD', 'DD/MM/YYYY', 'MM-DD-YYYY', 'DD-MM-YYYY'];\n let fecha = null;\n\n for (const formato of formatos) {\n fecha = dayjs(fechaNacimiento, formato, true);\n if (fecha.isValid()) {\n break;\n }\n }\n\n // Si ningún formato funciona, intentar parsing automático\n if (!fecha || !fecha.isValid()) {\n fecha = dayjs(fechaNacimiento);\n }\n\n if (!fecha.isValid()) {\n throw new Error('La fecha de nacimiento debe tener un formato válido (ej: MM/DD/YYYY, YYYY-MM-DD, DD/MM/YYYY)');\n }\n}\n\n/**\n * Obtiene la primera letra de una cadena\n * @param {string} value - Cadena de texto\n * @returns {string} Primera letra o 'X' si está vacía\n */\nfunction getPrimerLetra(value) {\n return value && value.length > 0 ? value.charAt(0) : 'X';\n}\n\n/**\n * Obtiene la segunda letra de una cadena\n * @param {string} value - Cadena de texto\n * @returns {string} Segunda letra o 'X' si no existe\n */\nfunction getSegundaLetra(value) {\n return value && value.length > 1 ? value.charAt(1) : 'X';\n}\n\n/**\n * Encuentra la primera vocal interna de una palabra\n * @param {string} value - Palabra a analizar\n * @returns {string} Primera vocal interna o 'X' si no existe\n */\nfunction getPrimerVocalInterna(value) {\n if (!value || value.length <= 1) return 'X';\n\n for (let i = 1; i < value.length; i++) {\n if (VOCALES.includes(value.charAt(i))) {\n return value.charAt(i);\n }\n }\n return 'X';\n}\n\n/**\n * Verifica si una palabra es obscena según la lista del SAT\n * @param {string} palabra - Palabra a verificar\n * @returns {boolean} True si es obscena\n */\nfunction esPalabraObscena(palabra) {\n return PALABRAS_OBSCENAS.includes(palabra);\n}\n\n/**\n * Remueve sufijos de nombres que no deben considerarse\n * @param {string} nombres - Nombres completos\n * @returns {string} Nombres sin sufijos\n */\nfunction removerSufijosNombres(nombres) {\n let nombre = nombres;\n\n while (nombre.includes(' ')) {\n const posicion = nombre.indexOf(' ');\n const palabra = nombre.substring(0, posicion);\n\n if (!SUFIJOS_NOMBRES.includes(palabra)) {\n break;\n }\n nombre = nombre.substring(posicion + 1);\n }\n\n return nombre;\n}\n\n/**\n * Remueve sufijos de apellidos que no deben considerarse\n * @param {string} apellidos - Apellidos completos\n * @returns {string} Apellidos sin sufijos\n */\nfunction removerSufijosApellidos(apellidos) {\n let apellido = apellidos;\n\n while (apellido.includes(' ')) {\n const posicion = apellido.indexOf(' ');\n const palabra = apellido.substring(0, posicion);\n\n if (!SUFIJOS_APELLIDOS.includes(palabra)) {\n break;\n }\n apellido = apellido.substring(posicion + 1);\n }\n\n return apellido;\n}\n\n/**\n * Genera las primeras 4 letras del RFC\n * @param {string} nombre - Nombre limpio\n * @param {string} apellidoPaterno - Apellido paterno limpio\n * @param {string} apellidoMaterno - Apellido materno limpio\n * @returns {string} Primeras 4 letras del RFC\n */\nfunction generarLetrasRFC(nombre, apellidoPaterno, apellidoMaterno) {\n let letras = '';\n\n if (!apellidoMaterno) {\n // Solo apellido paterno\n letras += getPrimerLetra(apellidoPaterno);\n letras += getSegundaLetra(apellidoPaterno);\n letras += getPrimerLetra(nombre);\n letras += getSegundaLetra(nombre);\n } else if (!apellidoPaterno) {\n // Solo apellido materno\n letras += getPrimerLetra(apellidoMaterno);\n letras += getSegundaLetra(apellidoMaterno);\n letras += getPrimerLetra(nombre);\n letras += getSegundaLetra(nombre);\n } else {\n // Ambos apellidos\n letras += getPrimerLetra(apellidoPaterno);\n\n if (apellidoPaterno.length <= 2) {\n letras += getPrimerLetra(apellidoMaterno);\n letras += getPrimerLetra(nombre);\n letras += getSegundaLetra(nombre);\n } else {\n letras += getPrimerVocalInterna(apellidoPaterno);\n letras += getPrimerLetra(apellidoMaterno);\n letras += getPrimerLetra(nombre);\n }\n }\n\n // Verificar si es palabra obscena\n if (esPalabraObscena(letras)) {\n letras = `${letras.substring(0, 3)}X`;\n }\n\n return letras;\n}\n\n/**\n * Convierte fecha de nacimiento al formato del RFC (YYMMDD)\n * @param {string} fechaNacimiento - Fecha de nacimiento\n * @returns {string} Fecha en formato YYMMDD\n */\nfunction generarFechaRFC(fechaNacimiento) {\n // Usar la misma lógica de validación que en validarParametros\n const formatos = ['MM/DD/YYYY', 'YYYY-MM-DD', 'DD/MM/YYYY', 'MM-DD-YYYY', 'DD-MM-YYYY'];\n let fecha = null;\n\n for (const formato of formatos) {\n fecha = dayjs(fechaNacimiento, formato, true);\n if (fecha.isValid()) {\n break;\n }\n }\n\n // Si ningún formato funciona, intentar parsing automático\n if (!fecha || !fecha.isValid()) {\n fecha = dayjs(fechaNacimiento);\n }\n\n return fecha.format('YYMMDD');\n}\n\n/**\n * Obtiene equivalencia numérica de un carácter\n * @param {string} caracter - Carácter a convertir\n * @returns {string} Equivalencia numérica\n */\nfunction getEquivalenciaNumerica(caracter) {\n if (EQUIVALENCIAS_NOMBRE_NUMERICO[caracter]) {\n return EQUIVALENCIAS_NOMBRE_NUMERICO[caracter];\n }\n\n if (caracter >= '0' && caracter <= '9') {\n return caracter.padStart(2, '0');\n }\n\n if (caracter === ' ') {\n return '00';\n }\n\n return null;\n}\n\n/**\n * Calcula la homoclave del RFC\n * @param {string} nombres - Nombres originales\n * @param {string} apellidoPaterno - Apellido paterno original\n * @param {string} apellidoMaterno - Apellido materno original\n * @returns {string} Homoclave de 2 caracteres\n */\nfunction calcularHomoclave(nombres, apellidoPaterno, apellidoMaterno) {\n const nombreCompleto = `${apellidoPaterno || ''} ${apellidoMaterno || ''} ${nombres}`.trim();\n\n // Convertir a equivalencia numérica\n let nombreNumerico = '0';\n for (let i = 0; i < nombreCompleto.length; i++) {\n const equivalencia = getEquivalenciaNumerica(nombreCompleto.charAt(i));\n if (equivalencia !== null) {\n nombreNumerico += equivalencia;\n }\n }\n\n // Calcular suma ponderada\n let suma = 0;\n for (let i = 0; i < nombreNumerico.length - 1; i++) {\n const digito1 = parseInt(nombreNumerico.charAt(i), 10);\n const digito2 = parseInt(nombreNumerico.charAt(i + 1), 10);\n suma += ((digito1 * 10) + digito2) * digito2;\n }\n\n // Calcular homoclave\n const base = suma % 1000;\n const cociente = Math.floor(base / 34);\n const residuo = base % 34;\n\n return EQUIVALENCIAS_COCIENTE_RESIDUO[cociente] + EQUIVALENCIAS_COCIENTE_RESIDUO[residuo];\n}\n\n/**\n * Calcula el dígito verificador del RFC\n * @param {string} rfc - RFC sin dígito verificador (12 caracteres)\n * @returns {string} Dígito verificador\n */\nfunction calcularDigitoVerificador(rfc) {\n const valores = {\n '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,\n 'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14, 'F': 15, 'G': 16, 'H': 17, 'I': 18,\n 'J': 19, 'K': 20, 'L': 21, 'M': 22, 'N': 23, 'O': 25, 'P': 26, 'Q': 27, 'R': 28,\n 'S': 29, 'T': 30, 'U': 31, 'V': 32, 'W': 33, 'X': 34, 'Y': 35, 'Z': 36, ' ': 37\n };\n\n let suma = 0;\n for (let i = 0; i < 12; i++) {\n const caracter = i < rfc.length ? rfc.charAt(i) : ' ';\n const valor = valores[caracter] || 0;\n suma += valor * (13 - i);\n }\n\n const residuo = suma % 11;\n\n if (residuo === 0) return '0';\n if (residuo === 1) return 'A';\n return (11 - residuo).toString();\n}\n\n/**\n * Calcula el RFC completo de una persona física\n * @param {string} nombres - Nombres de la persona\n * @param {string} apellidoPaterno - Apellido paterno\n * @param {string} apellidoMaterno - Apellido materno\n * @param {string} fechaNacimiento - Fecha de nacimiento (formatos: MM/DD/YYYY, YYYY-MM-DD, etc.)\n * @returns {string} RFC completo con homoclave y dígito verificador\n * @throws {Error} Si los parámetros son inválidos\n *\n * @example\n * // RFC con ambos apellidos\n * calculaRFC('JUAN CARLOS', 'PEREZ', 'GOMEZ', '01/15/1985');\n * // Retorna: 'PEGJ850115AB1'\n *\n * @example\n * // RFC con un solo apellido\n * calculaRFC('MARIA', 'LOPEZ', '', '12/25/1990');\n * // Retorna: 'LOMA901225XY2'\n */\nfunction calculaRFC(nombres, apellidoPaterno = '', apellidoMaterno = '', fechaNacimiento) {\n try {\n // Validar parámetros\n validarParametros(nombres, apellidoPaterno, apellidoMaterno, fechaNacimiento);\n\n // Limpiar y normalizar datos\n const nombreLimpio = cleanText(nombres);\n const apellidoPaternoLimpio = cleanText(apellidoPaterno);\n const apellidoMaternoLimpio = cleanText(apellidoMaterno);\n\n // Remover sufijos\n const nombreSinSufijos = removerSufijosNombres(nombreLimpio);\n const apellidoPaternoSinSufijos = removerSufijosApellidos(apellidoPaternoLimpio);\n const apellidoMaternoSinSufijos = removerSufijosApellidos(apellidoMaternoLimpio);\n\n // Generar componentes del RFC\n const letras = generarLetrasRFC(nombreSinSufijos, apellidoPaternoSinSufijos, apellidoMaternoSinSufijos);\n const fecha = generarFechaRFC(fechaNacimiento);\n const homoclave = calcularHomoclave(nombreLimpio, apellidoPaternoLimpio, apellidoMaternoLimpio);\n\n // RFC sin dígito verificador\n const rfcSinDigito = letras + fecha + homoclave;\n\n // Calcular dígito verificador\n const digitoVerificador = calcularDigitoVerificador(rfcSinDigito);\n\n return rfcSinDigito + digitoVerificador;\n\n } catch (error) {\n throw new Error(`Error al calcular RFC: ${error.message}`);\n }\n}\n\nexport default calculaRFC;\n"],"names":["dayjs","extend","customParseFormat","VOCALES","PALABRAS_OBSCENAS","SUFIJOS_NOMBRES","SUFIJOS_APELLIDOS","EQUIVALENCIAS_NOMBRE_NUMERICO","EQUIVALENCIAS_COCIENTE_RESIDUO","normalizeText","str","map","normalized","toLowerCase","replacement","pattern","Object","entries","replace","RegExp","cleanText","value","trim","toUpperCase","validarParametros","nombres","apellidoPaterno","apellidoMaterno","fechaNacimiento","Error","formatos","fecha","formato","isValid","getPrimerLetra","length","charAt","getSegundaLetra","getPrimerVocalInterna","i","includes","esPalabraObscena","palabra","removerSufijosNombres","nombre","posicion","indexOf","substring","removerSufijosApellidos","apellidos","apellido","generarLetrasRFC","letras","generarFechaRFC","format","getEquivalenciaNumerica","caracter","padStart","calcularHomoclave","nombreCompleto","nombreNumerico","equivalencia","suma","digito1","parseInt","digito2","base","cociente","Math","floor","residuo","calcularDigitoVerificador","rfc","valores","valor","toString","calculaRFC","nombreLimpio","apellidoPaternoLimpio","apellidoMaternoLimpio","nombreSinSufijos","apellidoPaternoSinSufijos","apellidoMaternoSinSufijos","homoclave","rfcSinDigito","digitoVerificador","error","message"],"mappings":"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"}