Last active
April 29, 2022 18:08
-
-
Save fitorec/fc8e42c5db5e2d5ec42094617da7d4c0 to your computer and use it in GitHub Desktop.
ALGORITMO para calcular el checksum del RFC
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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:
Ejemplo de uso (Javascript):
Ejemplo de uso (Python):