Skip to content

Instantly share code, notes, and snippets.

@dahool
Forked from woile/get_cuil_cuit.js
Created April 28, 2016 17:46
Show Gist options
  • Save dahool/5ba6a990c7904014d26aebac30aaa746 to your computer and use it in GitHub Desktop.
Save dahool/5ba6a990c7904014d26aebac30aaa746 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 get_cuil_cuit(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';
var HOMBRE = ['HOMBRE', 'M', 'MALE'],
MUJER = ['MUJER', 'F', 'FEMALE'],
SOCIEDAD = ['SOCIEDAD', 'S', 'SOCIETY'];
var 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.
*/
var multiplicadores = [3, 2, 7, 6, 5, 4, 3, 2];
// Realizo las dos primeras multiplicaciones por separado.
var 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(var i=0;i<8;i++) {
calculo += (parseInt(document_number.charAt(i)) * multiplicadores[i]);
}
// Calculo el resto.
var 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;
}
// Show example
console.log([AB, document_number, C].join('-'));
// Generate cuit
var cuil_cuit = [AB, document_number, C].join('');
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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment