Skip to content

Instantly share code, notes, and snippets.

@woile
Last active September 20, 2022 11:30
Show Gist options
  • Save woile/d1a995e5bffbead7dbc4 to your computer and use it in GitHub Desktop.
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)
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;
}
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)
@sturm3nta
Copy link

simple version of only CUIT in javascript https://gist.github.com/sturmenta/71b54cd79b260237f83720ddb8e11a6b

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