Skip to content

Instantly share code, notes, and snippets.

@geovanisouza92
Created September 4, 2014 16:42
Show Gist options
  • Select an option

  • Save geovanisouza92/e081b9f979efe3f56566 to your computer and use it in GitHub Desktop.

Select an option

Save geovanisouza92/e081b9f979efe3f56566 to your computer and use it in GitHub Desktop.
Calcula preço de importação de produtos (aprox.)
#!/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