Last active
September 20, 2022 11:30
-
-
Save woile/d1a995e5bffbead7dbc4 to your computer and use it in GitHub Desktop.
Permite calcular / generar el cuil / cuit de una persona. Testeado con 3800 muestras, de las cuales fallaron solo 22 (casos exepcionales)
This file contains hidden or 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
function getCuilCuit(document_number, gender) { | |
/** | |
* Cuil format is: AB - document_number - C | |
* Author: Nahuel Sanchez, Woile | |
* | |
* @param {str} document_number -> string solo digitos | |
* @param {str} gender -> debe contener HOMBRE, MUJER o SOCIEDAD | |
* | |
* @return {str} | |
**/ | |
"use strict"; | |
const HOMBRE = ["HOMBRE", "M", "MALE"], | |
MUJER = ["MUJER", "F", "FEMALE"], | |
SOCIEDAD = ["SOCIEDAD", "S", "SOCIETY"]; | |
let AB, C; | |
/** | |
* Verifico que el document_number tenga exactamente ocho numeros y que | |
* la cadena no contenga letras. | |
*/ | |
if (document_number.length != 8 || isNaN(document_number)) { | |
if (document_number.length == 7 && !isNaN(document_number)) { | |
document_number = "0".concat(document_number); | |
} else { | |
// Muestro un error en caso de no serlo. | |
throw "El numero de document_number ingresado no es correcto."; | |
} | |
} | |
/** | |
* De esta manera permitimos que el gender venga en minusculas, | |
* mayusculas y titulo. | |
*/ | |
gender = gender.toUpperCase(); | |
// Defino el valor del prefijo. | |
if (HOMBRE.indexOf(gender) >= 0) { | |
AB = "20"; | |
} else if (MUJER.indexOf(gender) >= 0) { | |
AB = "27"; | |
} else { | |
AB = "30"; | |
} | |
/* | |
* Los numeros (excepto los dos primeros) que le tengo que | |
* multiplicar a la cadena formada por el prefijo y por el | |
* numero de document_number los tengo almacenados en un arreglo. | |
*/ | |
const multiplicadores = [3, 2, 7, 6, 5, 4, 3, 2]; | |
// Realizo las dos primeras multiplicaciones por separado. | |
let calculo = parseInt(AB.charAt(0)) * 5 + parseInt(AB.charAt(1)) * 4; | |
/* | |
* Recorro el arreglo y el numero de document_number para | |
* realizar las multiplicaciones. | |
*/ | |
for (let i = 0; i < 8; i++) { | |
calculo += parseInt(document_number.charAt(i)) * multiplicadores[i]; | |
} | |
// Calculo el resto. | |
let resto = parseInt(calculo) % 11; | |
/* | |
* Llevo a cabo la evaluacion de las tres condiciones para | |
* determinar el valor de C y conocer el valor definitivo de | |
* AB. | |
*/ | |
if (SOCIEDAD.indexOf(gender) < 0 && resto == 1) { | |
if (HOMBRE.indexOf(gender) >= 0) { | |
C = "9"; | |
} else { | |
C = "4"; | |
} | |
AB = "23"; | |
} else if (resto === 0) { | |
C = "0"; | |
} else { | |
C = 11 - resto; | |
} | |
const example = `${AB}-${document_number}-${C}`; | |
// Show example | |
console.log(example); | |
// Generate cuit | |
const cuil_cuit = `${AB}${document_number}${C}`; | |
return cuil_cuit; | |
} |
This file contains hidden or 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
class WrongDniException(Exception): | |
pass | |
def get_cuil(document_number, gender): | |
"""Cuil format is: AB - document_number - C- | |
Author: Nahuel Sanchez, Woile | |
@param {str} document_number -> containing only digits | |
@param {str} gender -> 'F' or 'M' or 'S' | |
@return {str} | |
""" | |
MALE = ('M', 'MALE', 'HOMBRE') | |
FEMALE = ('F', 'FEMALE', 'MUJER') | |
SOCIETY = ('S', 'SOCIETY', 'SOCIEDAD') | |
if len(document_number) != 8 and document_number.isdigit(): | |
if len(document_number) == 7: | |
document_number = ''.join(['0', document_number]) | |
else: | |
raise WrongDniException(u"document_number incorrect") | |
gender = gender.upper() | |
if gender in MALE: | |
AB = '20' | |
elif gender in FEMALE: | |
AB = '27' | |
else: | |
AB = '30' | |
############# | |
# Los numeros (excepto los dos primeros) que le tengo que | |
# multiplicar a la cadena formada por el prefijo y por el | |
# numero de documento los tengo almacenados en un arreglo. | |
############# | |
multipliers = [3, 2, 7, 6, 5, 4, 3, 2] | |
# Realizo las dos primeras multiplicaciones por separado. | |
calculation = (int(AB[0]) * 5) + (int(AB[1]) * 4) | |
for i, digit in enumerate(document_number): | |
calculation += (int(digit) * multipliers[i]) | |
# Mod is calculated here | |
rest = calculation % 11 | |
############# | |
# Llevo a cabo la evaluacion de las tres condiciones para | |
# determinar el valor de C y conocer el valor definitivo de | |
# AB. | |
############# | |
if gender not in SOCIETY and rest == 1: | |
if gender in MALE: | |
C = '9' | |
else: | |
C = '4' | |
AB = '23' | |
elif rest == 0: | |
C = '0' | |
else: | |
C = 11 - rest | |
print "{0}-{1}-{2}".format(AB, document_number, C) | |
return "{0}{1}{2}".format(AB, document_number, C) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
simple version of only CUIT in javascript https://gist.github.com/sturmenta/71b54cd79b260237f83720ddb8e11a6b