Skip to content

Instantly share code, notes, and snippets.

@fitorec
Last active April 29, 2022 18:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fitorec/fc8e42c5db5e2d5ec42094617da7d4c0 to your computer and use it in GitHub Desktop.
Save fitorec/fc8e42c5db5e2d5ec42094617da7d4c0 to your computer and use it in GitHub Desktop.
ALGORITMO para calcular el checksum del RFC
const checksumCharRFC = (rfcInput = 'COSC8001137NA') => {
if (rfcInput.lenght < 12) {
throw new Error(`RFC(${rfcInput}) con Longitud incorrecta`)
}
const diccionario = '0123456789ABCDEFGHIJKLMN&OPQRSTUVWXYZ #'
const chars = rfcInput.replaceAll(/[Ñ|ñ]/g , '#').toUpperCase()
const len = rfcInput.length
const resultado = {
charInput: chars.charAt(len - 1),
charResult: null,
valido: false
}
let sum = (12 === len) ? 481 : 0 // Inicia en 481 para morales, 0 para físicas
for (let i = 0; i < (len -1); i += 1) {
const posChar = diccionario.indexOf(chars.charAt(i))
const factor = len -i
sum += posChar * factor
}
const mod11 = sum % 11
if (mod11 === 0) {
resultado.charResult = '0'
} else if (mod11 === 1) {
resultado.charResult = 'A'
} else {
resultado.charResult = String(11 - mod11)
}
resultado.valido = resultado.charInput === resultado.charResult
return resultado
}
@fitorec
Copy link
Author

fitorec commented Apr 29, 2022

Este algoritmo me base de una implementación en PHP con la contribuí hace un par de días:

https://github.com/phpcfdi/rfc/blob/main/src/CheckSum.php

siguiente documento:

Para conocer un poco mas al respecto puedes revisar el documento en linea:

https://www.mariovaldez.net/files/IFAI%200610100135506%20065%20Algoritmo%20para%20generar%20el%20RFC%20con%20homoclave%20para%20personas%20fisicas%20y%20morales.odt

Ejemplo de uso (Javascript):

checksumCharRFC('AÑÑ801231JK0')
checksumCharRFC('COSC8001137NA')

Ejemplo de uso (Python):

Implementación pendiente

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