-
Notifications
You must be signed in to change notification settings - Fork 0
Algoritmos
Los dígitos verificadores de América Latina se parecen entre sí pero nunca son iguales. Esta página documenta los que están implementados, para que corregir un bug o sumar un país no implique leer papers de organismos tributarios.
Todos operan sobre la salida de strip, o sea sobre dígitos.
Pesos 2, 3, 4, 5, 6, 7 aplicados de derecha a izquierda y repetidos en ciclo.
suma = Σ (dígito[i] × peso[ciclo])
resto = 11 − (suma mod 11)
resto = 11 → verificador '0'
resto = 10 → verificador 'K'
otro → verificador String(resto)
El K es lo que obliga a onlyDigitsAndK en lugar de onlyDigits. cl.rut.getCheckDigit
expone este cálculo como función pública.
Pesos 5, 4, 3, 2, 7, 6, 5, 4, 3, 2 sobre los primeros diez dígitos.
suma = Σ (dígito[i] × peso[i])
resto = 11 − (suma mod 11)
resto = 11 → verificador 0
resto = 10 → INVÁLIDO, devolver false
otro → verificador = resto
El caso resto = 10 no tiene representación: ningún CUIT válido lo produce, así que validate
devuelve false en vez de forzar un dígito.
Además se verifica el prefijo de dos dígitos, que solo puede ser 20, 23, 24, 27, 30,
33 o 34.
Pesos 71, 67, 59, 53, 47, 43, 41, 37, 29, 23, 19, 17, 13, 7, 3. Se usan los últimos N para un
cuerpo de N dígitos.
suma = Σ (dígito[i] × peso alineado a la derecha)
resto = suma mod 11
resto = 0 → verificador 0
resto = 1 → verificador 1
otro → verificador = 11 − resto
La alineación a la derecha es la parte que se suele equivocar: los pesos se toman del final de la tabla, no del principio.
Dos pasadas, una por cada dígito verificador.
primer dígito:
suma = Σ dígito[i] × (10 − i), para i de 0 a 8
resto = (suma × 10) mod 11
si resto es 10 u 11 → 0
segundo dígito:
suma = Σ dígito[i] × (11 − i), para i de 0 a 9
resto = (suma × 10) mod 11
si resto es 10 u 11 → 0
Antes de calcular se rechazan los once dígitos repetidos (11111111111 y compañía): pasan la
aritmética pero no son documentos reales.
El CNPJ usa la misma idea con catorce dígitos y otra secuencia de pesos.
Pesos alternados 2, 1 sobre los primeros nueve dígitos; los productos de dos cifras se
reducen restando 9.
producto = dígito × peso
si producto ≥ 10 → producto − 9
suma = Σ productos
resto = suma mod 10
verificador = resto = 0 ? 0 : 10 − resto
Se valida además el código de provincia en los dos primeros dígitos, que va de 01 a 24 más
30 para ecuatorianos en el exterior, y que el tercer dígito no supere 5.
Trece dígitos, con reglas distintas según el tipo de contribuyente:
| tercer dígito | tipo | verificación | terminación |
|---|---|---|---|
0 a 5
|
persona natural | los diez primeros dígitos son una cédula válida | 001 |
6 |
entidad pública | módulo 11 con pesos 3,2,7,6,5,4,3,2, verificador en la posición 9 |
0001 |
9 |
sociedad privada | módulo 11 con pesos 4,3,2,7,6,5,4,3,2, verificador en la posición 10 |
001 |
Cualquier otro tercer dígito es inválido.
No lleva verificador; el detalle está en el agrupamiento, que se hace desde la derecha.
split = largo − 6
resultado = d[0..split] . d[split..split+3] . d[split+3..]
Con 1234567 da 1.234.567.
Cada algoritmo vive en el archivo del documento que lo usa, no en un módulo compartido. Un
error en el CUIT se arregla en src/ar/cuit.ts y en ningún otro lado. Si dos países comparten
un algoritmo, cada uno lo implementa: la duplicación acá es más barata que una abstracción
que se rompe cuando un país cambia su regla.
Ver también: Arquitectura, Agregar un país.
Empezar
Referencia
Colaborar
Enlaces