Skip to content

Instantly share code, notes, and snippets.

@PandaFoss
Created June 26, 2020 21:24
Show Gist options
  • Save PandaFoss/0bf7ec58da4bcd7be634c16c29369e12 to your computer and use it in GitHub Desktop.
Save PandaFoss/0bf7ec58da4bcd7be634c16c29369e12 to your computer and use it in GitHub Desktop.
✨ Script que permite calcular el CUIL/CUIT para habitantes de la República Argentina
#!/bin/bash
#
# Copyright (C) 2020 Max Ferrer <maxi.fg13@gmail.com>
#
# Pequeño script que permite calcular el número de CUIL o CUIT para
# habitantes de la República Argentina. Los datos obtenidos no son
# bajo ninguna circunstancia para uso legal o formal. El único
# propósito es poner a prueba el algoritmo de cálculo del CUIL/CUIT
# usando Bash.
#
# Se permite la copia, modificación y distribución del presente
# código con la debida mención del autor original.
#
# Variables
VERSION="1.0"
SCRIPT="$0"
# chequear_dni ${DNI}
chequear_dni(){
local DNI=$(echo "$1" | tr -d -c 0-9)
local DNI_FINAL=${DNI};
if [[ ${DNI} -lt 1000000 ]] || [[ ${DNI} -gt 99999999 ]]; then
echo "¡DNI inválido! Debe estar entre 1000000 y 99999999."
exit 2
fi
if [[ ${#DNI} -eq 7 ]]; then
DNI_FINAL="0${DNI}"
fi
echo "${DNI_FINAL}" 1>/dev/null
}
# invertir_secuencia ${PARCIAL}
invertir_secuencia(){
# Se asume secuencia de 10 digitos (DNI + tipo)
local SECUENCIA="2345672345";
local SEC_FINAL;
for (( i=${#SECUENCIA}-1; i>=0; i-- )); do
SEC_FINAL="${SEC_FINAL}${SECUENCIA:${i}:1}"
done
echo "${SEC_FINAL}"
}
# Funcion que muestra una pequeña ayuda
ayuda() {
echo -e "\n${SCRIPT} le permite calcular su número de CUIL o CUIT de forma sencilla.\n"
echo -e "\e[1mUSO:\e[0m"
echo -e "\t${SCRIPT} \e[4m[DNI]\e[0m \e[4m[SEXO]\e[0m"
echo -e "\t${SCRIPT} [-i|--interactive|--interactivo]"
echo -e "\t${SCRIPT} [-l|--list|--lista] \e[4m<ARCHIVO>\e[0m"
echo -e "\t${SCRIPT} [-h|--help|-a|--ayuda]"
echo -e "\n\e[1mNOTACIÓN:\e[0m"
echo -e "Las opciones no pueden mezclarse entre sí.\n\e[4m[DNI]\e[0m es un numero de la forma \"12345678\" o bien \"12.345.678\" y representa tanto el documento nacional de identidad de la persona como el numero de identificación de la empresa.\n\e[4m[SEXO]\e[0m está representado por un sólo caracter que puede ser 'm' o 'M' para una persona de sexo masculino, 'f' o 'F' para una persona de sexo femenino y 'e' o 'E' para una empresa.\n\e[4m<ARCHIVO>\e[0m hace referencia a un archivo de texto válido cuyo formato debe ser '[DNI] [SEXO]', con separaciones de salto de línea."
echo -e "\n\e[1mEJEMPLOS:\e[0m"
echo -e " - Una persona de sexo masculino y DNI 12345678:"
echo -e "\t\$ ${SCRIPT} 12345678 M"
echo -e " - Ejecutar el modo interactivo:"
echo -e "\t\$ ${SCRIPT} -i"
echo -e " - Calcular un lsitado de CUIL/CUIT contenido en el archivo lista.txt:"
echo -e "\t\$ ${SCRIPT} -l lista.txt"
echo -e "\n\e[1mINFO:\e[0m"
echo -e " - Version: ${VERSION}"
echo -e " - Creado con \e[31m<3\e[0m por Max Ferrer"
}
# Modo interactivo
interactivo() {
echo -e ":: Calculadora de CUIL/CUIT\n"
read -p "- Ingrese sexo ('M' o 'F') si es persona física o 'E' si es empresa: " SEXO_I
read -p "- Ingrese número de DNI o número de sociedad: " DNI_I
main "${DNI_I}" "${SEXO_I}"
echo -e "\n┌───────────────────────────────────────────────┐"
echo -e "│\tSu CUIL/CUIT es: ${SEXO}-${DNI}-${VERIFICADOR}\t\t│"
echo -e "└───────────────────────────────────────────────┘"
}
# listar <archivo>
listar() {
LIST_FLAG='true'
while IFS= read -r LINE; do
L_DNI=$(echo "${LINE}" | awk '{print $1}')
L_SEXO=$(echo "${LINE}" | awk '{print $2}')
main "${L_DNI}" "${L_SEXO}"
echo "${SEXO}-${DNI}-${VERIFICADOR}"
unset SEXO DNI VERIFICADOR L_DNI L_SEXO
done < "$1"
}
# main ${DNI} ${SEXO}
main () {
chequear_dni "$1"
if [[ $? -ne 0 ]]; then
exit 1;
fi
DNI=$(echo $_ | tr -d -c 0-9)
ACUMULADO=0
# Chequeo tipo
case "$2" in
M|m) [[ ${SEXO} ]] || SEXO=20
;;
F|f) [[ ${SEXO} ]] || SEXO=27
;;
E|e) [[ ${SEXO} ]] || SEXO=30
;;
*) echo -e "No se ha indicado sexo o el mismo es erróneo.\nAyuda:\n\t'M' o 'm' -> Masculino\n\t'F' o 'f' -> Femenino\n\t'E' o 'e' -> Empresa"; exit 1
;;
esac
# PARCIAL = XX-${DNI}
PARCIAL="${SEXO}${DNI}"
# La secuencia que necesitamos para generar el verificador
SECUENCIA="$(invertir_secuencia "${PARCIAL}")"
# Iteramos para generar el acumulado
LIMIT=$((${#PARCIAL}-1))
for i in $(seq 0 ${LIMIT}); do
TEMP=$((${PARCIAL[@]:${i}:1}*${SECUENCIA[@]:${i}:1}))
ACUMULADO=$((TEMP+ACUMULADO))
done
# Obtenemos el dígito verificador
VERIFICADOR=$((11-ACUMULADO%11))
# Chequeamos que el verificador sea correcto (no puede ser 10)
if [[ ${VERIFICADOR} -eq 10 ]]; then
if [[ ${SEXO} -eq 20 ]] || [[ ${SEXO} -eq 27 ]]; then
export SEXO=23
elif [[ ${SEXO} -eq 30 ]]; then
export SEXO=33
fi
main "$1" "$2"
elif [[ ${VERIFICADOR} -eq 11 ]]; then
export VERIFICADOR=0
fi
# Exportamos variables
export SEXO="${SEXO}"
export DNI="${DNI}"
export VERIFICADOR="${VERIFICADOR}"
}
while [[ $# -gt 0 ]]; do
key="$1"
case $key in
-h|-a|--help|--ayuda)
ayuda
exit 0
;;
-i|--interactive|--interactivo)
interactivo
exit 0
;;
-l|--list|--lista)
LISTA="$2"
listar "${LISTA}"
exit 0
;;
*)
main "$1" "$2"
echo "${SEXO}-${DNI}-${VERIFICADOR}"
exit 0
;;
esac
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment