Created
June 26, 2020 21:24
-
-
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
This file contains 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
#!/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