Skip to content

Instantly share code, notes, and snippets.

@fitorec
Created April 28, 2022 19:48
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fitorec/02638492300d361cd2451a8a03d99522 to your computer and use it in GitHub Desktop.
Save fitorec/02638492300d361cd2451a8a03d99522 to your computer and use it in GitHub Desktop.
Extracción de meta-datos a partir del RFC Mexicano
const altisonantes = [
'BACA', 'BAKA', 'BUEI', 'BUEY', 'CACA', 'CACO', 'CAGA', 'CAGO', 'CAKA',
'CAKO', 'COGE', 'COGI', 'COJA', 'COJE', 'COJI', 'COJO', 'COLA', 'CULO',
'FALO', 'FETO', 'GETA', 'GUEI', 'GUEY', 'JETA', 'JOTO', 'KACA', 'KACO',
'KAGA', 'KAGO', 'KAKA', 'KAKO', 'KOGE', 'KOGI', 'KOJA', 'KOJE', 'KOJI',
'KOJO', 'KOLA', 'KULO', 'LILO', 'LOCA', 'LOCO', 'LOKA', 'LOKO', 'MAME',
'MAMO', 'MEAR', 'MEAS', 'MEON', 'MIAR', 'MION', 'MOCO', 'MOKO', 'MULA',
'MULO', 'NACA', 'NACO', 'PEDA', 'PEDO', 'PENE', 'PIPI', 'PITO', 'POPO',
'PUTA', 'PUTO', 'QULO', 'RATA', 'ROBA', 'ROBE', 'ROBO', 'RUIN', 'SENO',
'TETA', 'VACA', 'VAGA', 'VAGO', 'VAKA', 'VUEI', 'VUEY', 'WUEI', 'WUEY'
]
const quitarAltisonante = (palabra) => {
if (altisonantes.includes(palabra)) {
return palabra.replace(/^(\w)\w/, '$1X')
}
return palabra
}
const msgLongitudError = (rfcPart = '') => {
const msgs = [
'× 👈 Inicial del 1er apellido',
'•× 👈 1er vocal interna del 1er apellido',
'••× 👈 Inicial del 2do apellido',
'•••× 👈 1er vocal interna del 2do apellido',
'••••×× 👈 Año de nacimiento (2 digitos)',
'••••×× 👈 Año de nacimiento (2 digitos)',
'••••••×× 👈 Mes de nacimiento (2 digitos)',
'••••••×× 👈 Mes de nacimiento (2 digitos)',
'••••••••×× 👈 Día del mes de nacimiento (2 digitos)',
'••••••••×× 👈 Día del mes de nacimiento (2 digitos)',
'••••••••••××× 👈 homoclave (3 caracteres)'
]
if (rfcPart.length < msgs.length) {
return msgs[rfcPart.length]
}
return 'Error de formato'
}
/*
* Se encarga de validar y extraer meta información del RFC:
*
* @link: https://www.elcontribuyente.mx/rfc/
*/
const metaRFC = (rfcInputTxt) => {
const rfcInputText = String(rfcInputTxt).toUpperCase()
const regex = /^([a-z]{3,4})(\d{2})(\d{2})(\d{2})([0-9a-z]{3})$/i
const metaInfo = {
rfc_input: rfcInputText,
nombre_parte: null,
fecha_nacimiento_anio: null,
fecha_nacimiento_mes: null,
fecha_nacimiento_dia: null,
homoclave: null
}
const metaKeys = Object.keys(metaInfo)
metaInfo.tipo_persona = null // moral | físico
// obtiene los datos
const values = rfcInputText.match(regex)
metaInfo.valido = (values !== null)
if (metaInfo.valido) {
for (const i in metaKeys) {
metaInfo[metaKeys[i]] = values[i]
}
const nombre = metaInfo.nombre_parte
metaInfo.nombre_parte = quitarAltisonante(nombre)
metaInfo.valido = (nombre === metaInfo.nombre_parte)
metaInfo.tipo_persona = (rfcInputText.length === 13) ? 'física' : 'moral'
metaInfo.longitud = rfcInputText.length
}
if (metaInfo.valido) {
metaInfo.msg = '✅ RFC valido'
}
metaInfo.msg = msgLongitudError(rfcInputText)
return metaInfo
}
export default metaRFC
@fitorec
Copy link
Author

fitorec commented Apr 28, 2022

Extraccion de meta información del RFC (México)

Ejemplo de uso:

const rfc = "PENE660720DI6"
metaRFC(rfc)

Resultado

{
  rfc_input: 'PENE660720DI6',
  nombre_parte: 'PXNE',
  fecha_nacimiento_anio: '66',
  fecha_nacimiento_mes: '07',
  fecha_nacimiento_dia: '20',
  homoclave: 'DI6',
  tipo_persona: 'física',
  valido: false,  // <- Notar caso palabra altisonante debería ser PXNE
  longitud: 13,
  msg: 'Error de formato'
}

Este trabajo partió del análisis de una expresión regular ver hilo:

Origen: https://gist.github.com/gerardorochin/5718313

Se alimento con un contenido mas explicado:

Fuente de consulta: https://luisenriquech.blogspot.com/2022/04/expresion-regular-de-rfc-mexico.html

Versión oficial del SAT

^[A-Z&Ñ]{3,4}[0-9]{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])[A-Z0-9]{2}[0-9A]$
Versión reducida de la versión oficial del SAT

^[A-Za-zñÑ&]{3,4}\d{6}\w{3}$

El Registro Federal de Contribuyentes (RFC) se genera con 12 o 13 caracteres alfanuméricos obtenidos del nombre completo o razón social en mayúsculas sin acentos ni diéresis y la fecha de nacimiento de cada persona o creacíón de la empresa, para ello se siguen las instrucciones y excepciones a continuación:

Instrucciones

1.- Espacios 1 al 4 (1 al 3 en caso de empresa) La letra inicial y la primera vocal interna del primer apellido, la letra inicial del segundo apellido y la primera letra del nombre.

2.- 5 al 10 (4 al 9 en caso de empresa) La fecha de nacimiento en el orden de año mes y día. Para el año se tomarán los dos últimos dígitos, cuando el mes o el día sea menor a diez, se antepondrá un cero.

3.- 11 al 13 (10 al 12 en caso de empresa) La homoclave es un conjunto de tres caracteres asignados exclusivamente por el SAT con la finalidad de evitar la duplicidad en el RFC, y así mantener el registro sin claves que puedan generar confusión para identificar a los contribuyentes.

Excepciones

1.- Si la letra inicial de alguno de los apellidos es Ñ, el sistema le asignará una "X" en su lugar.

2.- Cuando el nombre sea compuesto (formado por dos o más palabras), la clave se constituye con la letra inicial de la primera palabra, siempre que no sea MARIA, MA., MA, o JOSE, J, J. en cuyo caso se utilizará la segunda palabra.

3.- Si en los apellidos o en el nombre aparecieran caracteres especiales como diagonal (/), guión (-), o punto (.), se captura tal cual viene en el documento probatorio y se asignará una "X" en caso de que esa posición intervenga para la conformación del RFC.
4.- Apellidos compuestos, formados por más de una palabra, el RFC se conformará con la primera palabra del apellido.
5.- Cuando alguno de los apellidos o nombre es compuesto y la primera palabra de esta composición es una preposición, conjunción, o contracción (DA, DAS, DE, DEL, DER, DI, DIE, DD, EL, LA, LOS, LAS, LE, LES, MAC, MC, VAN, VON, Y) se elimina la primera palabra y se utiliza la siguiente del apellido o nombre.
6.- Si de las cuatro letras resulta una palabra altisonante, la segunda letra será sustituida por una "X".
7.- Con dos apellidos, si el primer apellido no tiene vocal interna, se le asignará una "X" en la segunda posición.
8.- Con un apellido, si no existe el segundo apellido, se asignará una "X" en la tercera posición.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment