Created
September 4, 2014 16:42
-
-
Save geovanisouza92/e081b9f979efe3f56566 to your computer and use it in GitHub Desktop.
Calcula preço de importação de produtos (aprox.)
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
| #!/usr/bin/env python | |
| # -*- coding: utf-8 -*- | |
| # pylint: disable=C0325,W0141 | |
| # | |
| # Para executar o script pelo terminal, execute: | |
| # | |
| # $ chmod 755 cimp.py | |
| # $ mkdir -p ~/.local/bin && cd $_ | |
| # $ ln -s <path to cimp.py> cimp | |
| # | |
| # Feche o terminal e reabra, entã teste: | |
| # | |
| # $ cimp <Valor em US$ do produto> | |
| # | |
| ''' | |
| Calcula o custo de importação de produtos para o Brasil. | |
| A taxa de câmbio é aproximada e varia ao longo do dia. | |
| ''' | |
| import os | |
| import sys | |
| import json | |
| import urllib2 | |
| import datetime | |
| import argparse | |
| ALIQUOTAS = { | |
| 'AC': ('Acre', 17), | |
| 'AL': ('Alagoas', 17), | |
| 'AM': ('Amazonas', 17), | |
| 'AP': ('Amapá', 17), | |
| 'BA': ('Bahia', 17), | |
| 'CE': ('Ceará', 17), | |
| 'DF': ('Distrito Federal', 17), | |
| 'ES': ('Espírito Santo', 17), | |
| 'GO': ('Goiás', 17), | |
| 'MA': ('Maranhão', 17), | |
| 'MT': ('Mato Grosso', 17), | |
| 'MS': ('Mato Grosso do Sul', 17), | |
| 'MG': ('Minas Gerais', 18), | |
| 'PA': ('Pará', 17), | |
| 'PB': ('Paraíba', 17), | |
| 'PR': ('Paraná', 18), | |
| 'PE': ('Pernambuco', 17), | |
| 'PI': ('Piauí', 17), | |
| 'RN': ('Rio Grande do Norte', 17), | |
| 'RS': ('Rio Grande do Sul', 17), | |
| 'RJ': ('Rio de Janeiro', 19), | |
| 'RO': ('Rondônia', 17), | |
| 'RR': ('Roraima', 17), | |
| 'SC': ('Santa Catarina', 17), | |
| 'SP': ('São Paulo', 18), | |
| 'SE': ('Sergipe', 17), | |
| 'TO': ('Tocantins', 17), | |
| } | |
| API_URL = 'http://cashcash.cc/v1/currency.json?from={0}&to={1}&precision=2' | |
| PARSER = argparse.ArgumentParser(description=__doc__) | |
| PARSER.add_argument('preco', nargs='?', type=float, | |
| help='Preço do produto em US$') | |
| PARSER.add_argument('--frete', '-f', type=float, help='Custo de frete em US$') | |
| PARSER.add_argument('--icms', '-i', type=str, | |
| help='UF do estado para calculo do ICMS') | |
| PARSER.add_argument('--ect', '-e', type=float, help='Taxa de retirada da ECT') | |
| PARSER.add_argument('--dolar', '-d', action='store_const', const='dolar', | |
| default=False, help='Buscar taxa do dolar') | |
| def _perguntar(question, default='yes'): | |
| ''' | |
| Faz uma pergunta para o usuário responder 'Sim' ou 'Não' | |
| ''' | |
| sim = set(('sim', 'si', 's', 'yes', 'ye', 'y')) | |
| nao = set(('nao', 'não', 'na', 'nã', 'no', 'n')) | |
| while True: | |
| sys.stdout.write(question) | |
| escolha = raw_input().strip().lower() or default | |
| if escolha in sim: | |
| return True | |
| elif escolha in nao: | |
| return False | |
| else: | |
| sys.stdout.write('Por favor, responda S ou N\n') | |
| def _configurar_config(fd): | |
| ''' | |
| Configuração inicial do script | |
| ''' | |
| incluir_icms = _perguntar('Deseja incluir ICMS no cálculo? [S/n]: ') | |
| incluir_taxa_ect = _perguntar( | |
| 'Deseja incluir a taxa dos Correios (R$ 12,00)? [s/N]: ', default='no') | |
| uf = None | |
| if incluir_icms: | |
| uf = raw_input('Informe a UF do seu estado: ').strip().upper() | |
| while uf not in ALIQUOTAS: | |
| print('UF não encontrada') | |
| uf = input('Informe a UF do seu estado: ') | |
| ect = 12.0 if incluir_taxa_ect else 0.0 | |
| json.dump({'uf': uf, 'ect': ect, 'taxas': {}}, fd) | |
| def _caminho_config(): | |
| ''' | |
| Retorna o nome do arquivo de configuração do script | |
| ''' | |
| return os.path.join(os.path.expanduser('~'), '.cimprc.json') | |
| def _abrir_config(): | |
| ''' | |
| Carrega o arquivo de configurações do script | |
| ''' | |
| config = _caminho_config() | |
| if not os.path.exists(config): | |
| with open(config, 'w') as fd: | |
| _configurar_config(fd) | |
| with open(config) as fd: | |
| return json.load(fd) | |
| def _salvar_config(config): | |
| ''' | |
| Salva o arquivo de configurações do script | |
| ''' | |
| config = _caminho_config() | |
| with open(config, 'w') as fd: | |
| fd.seek(0) | |
| fd.truncate() | |
| json.dump(config, fd) | |
| def _taxa_de_cambio_hoje(from_='USD', to='BRL'): | |
| ''' | |
| Recupera a taxa de câmbio para o dia da web | |
| ''' | |
| url = API_URL.format(from_, to) | |
| res = urllib2.urlopen(url) | |
| if 'OK' == res.msg: | |
| obj = json.loads(res.read()) | |
| return obj['rate'] | |
| return None | |
| def _taxa_de_cambio(config): | |
| ''' | |
| Recupera a taxa de câmbio para o dia do cache | |
| ''' | |
| hoje = datetime.datetime.now().strftime('%Y-%m-%d') | |
| if hoje not in config['taxas']: | |
| taxa = _taxa_de_cambio_hoje() | |
| if not taxa: | |
| return None | |
| config['taxas'][hoje] = taxa | |
| _salvar_config(config) | |
| return config['taxas'][hoje] | |
| def _aliquota(uf): | |
| ''' | |
| Retorna a taxa de alíquota de ICMS para o estado | |
| ''' | |
| return None if not uf else ALIQUOTAS[uf][1] / 100.0 | |
| def calcular(preco, frete=None, icms=None, ect=None): | |
| ''' | |
| Calcula o custo de importação | |
| ''' | |
| config = _abrir_config() | |
| taxa_de_cambio = _taxa_de_cambio(config) | |
| if not taxa_de_cambio: | |
| raise ValueError('Taxa de câmbio não encontrada') | |
| preco_dolar = preco + (frete or 0.0) | |
| # Impostos de importação 60% | |
| impostos = preco_dolar * taxa_de_cambio * 0.6 | |
| # Valor importado em reais + imposto de importação | |
| preco_reais = preco_dolar * taxa_de_cambio | |
| total = preco_reais + impostos | |
| resultado = { | |
| 'produto': round(preco_reais, 2), | |
| 'total': round(total, 2), | |
| 'impostos': round(impostos, 2) | |
| } | |
| preco_frete = round((frete or 0.0) * 1.6, 2) | |
| if preco_frete: | |
| resultado['frete'] = preco_frete | |
| aliquota = _aliquota(icms or config['uf']) | |
| if aliquota: | |
| aliq_neg = 1.0 - aliquota | |
| icms = (total / aliq_neg) * aliquota | |
| resultado['icms'] = round(icms, 2) | |
| resultado['total'] = round(icms + total, 2) | |
| ect = ect or config['ect'] | |
| if ect: | |
| resultado['ect'] = ect | |
| resultado['total'] = round(ect + resultado['total'], 2) | |
| return resultado | |
| def main(): | |
| ''' | |
| Script para calcular preço final de importação de produtos | |
| ''' | |
| args = PARSER.parse_args() | |
| if args.dolar: | |
| print _taxa_de_cambio_hoje() | |
| return | |
| preco = args.preco | |
| if not preco: | |
| raise ValueError('Informe o preco do produto') | |
| frete = args.frete or None | |
| icms = (args.icms or '').strip().upper() | |
| ect = args.ect or None | |
| print calcular(preco, frete=frete, icms=icms, ect=ect) | |
| if __name__ == '__main__': | |
| main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment