コード例 #1
0
def atualizar_indices():
    """Atualiza os índices dos indexadores cadastrados. Obtém os índices atualizados desde a 
    última data de referência importada da API do Banco Central.
    """
    # Instancia a classe de negócios responsável pela gestão de cadastros da API
    objGestaoCadastro = GestaoCadastro()

    try:
        # Solicita a atualização dos índices
        contadorTotal = objGestaoCadastro.atualizar_indices()
    except BusinessException as be:
        raise be
    except Exception as e:
        raise ServerException(e)

    # Verifica a quantidade de registros atualizados para retornar mensagem mais adequada
    if contadorTotal == 0:
        statusCode = 204
        mensagem = "Banco Central não retornou novos registros a serem atualizados."
    elif contadorTotal > 0:
        statusCode = 201
        mensagem = "Índices atualizados com sucesso! Total de {} registro(s) atualizado(s).".format(
            contadorTotal)

    resposta = {'mensagem': mensagem}
    resposta.update({'indexadores': objGestaoCadastro.get_indexadores()})
    return _success(resposta, statusCode), statusCode, {
        'Access-Control-Allow-Origin': '*'
    }
コード例 #2
0
def list_dias_uteis():
    """ Retorna lista com os dias úteis referentes a um período
        
    Argumentos:
        dataInicial: data inicial do período para consulta de dias úteis
        dataFinal: data de vencimento do período para consulta de dias úteis
    Retorno:
            Retorna uma lista contendo os dias úteis do período informado
    """
    # Obtém argumentos
    queryParameters = request.args
    # ------------------------------------------------------------------------------ #
    # Resgata e valida os dados de entrada
    # ------------------------------------------------------------------------------ #
    # Validação - dataInicial
    if 'dataInicial' not in queryParameters:
        mensagem = "Você deve informar a data inicial do período para consulta de dias úteis. Formato esperado: AAAA-MM-DD"
        raise InputException('dataInicial', mensagem)
    elif _is_date(queryParameters.get('dataInicial'), "%Y-%m-%d") == False:
        mensagem = "Data inicial do período para consulta de dias úteis inválida. Formato esperado: AAAA-MM-DD"
        raise InputException('dataInicial', mensagem)
    else:
        dataInicial = datetime.strptime(queryParameters.get('dataInicial'),
                                        "%Y-%m-%d").date()

    # Validação - dataFinal
    if 'dataFinal' not in queryParameters:
        mensagem = "Você deve informar a data final do período para consulta de dias úteis. Formato esperado: AAAA-MM-DD"
        raise InputException('dataFinal', mensagem)
    elif _is_date(queryParameters.get('dataFinal'), '%Y-%m-%d') == False:
        mensagem = "Data final do período para consulta de dias úteis inválida. Formato esperado: AAAA-MM-DD"
        raise InputException('dataFinal', mensagem)
    else:
        dataFinal = datetime.strptime(queryParameters.get('dataFinal'),
                                      "%Y-%m-%d").date()

    try:
        # Obtém a lista de dias úteis no mês
        diasUteis = Calendario.listDiasUteis(dataInicial, dataFinal)

    except BusinessException as be:
        raise be
    except Exception as e:
        raise ServerException(e)
    else:
        resposta = {
            'mensagem': 'Consulta aos dias úteis realizada com sucesso'
        }
        resposta.update({'diasUteis': diasUteis})
        return _success(resposta, 200), 200, {
            'Access-Control-Allow-Origin': '*'
        }
コード例 #3
0
def list_feriados():
    """ Retorna lista com os feriados referentes a um período
        
    Argumentos:
        dataInicial: data inicial do período para consulta de feriados
        dataFinal: data de vencimento do período para consulta de feriados
    Retorno:
            Retorna uma lista contendo os feriados do período informado
    """
    # Obtém argumentos
    queryParameters = request.args
    # ------------------------------------------------------------------------------ #
    # Resgata e valida os dados de entrada
    # ------------------------------------------------------------------------------ #
    # Validação - dataInicial
    if 'dataInicial' not in queryParameters:
        mensagem = "Você deve informar a data inicial do período para consulta de feriados. Formato esperado: AAAA-MM-DD"
        raise InputException('dataInicial', mensagem)
    elif _is_date(queryParameters.get('dataInicial'), "%Y-%m-%d") == False:
        mensagem = "Data inicial do período para consulta de feriados inválida. Formato esperado: AAAA-MM-DD"
        raise InputException('dataInicial', mensagem)
    else:
        dataInicial = datetime.strptime(queryParameters.get('dataInicial'),
                                        "%Y-%m-%d").date()

    # Validação - dataFinal
    if 'dataFinal' not in queryParameters:
        mensagem = "Você deve informar a data final do período para consulta de feriados. Formato esperado: AAAA-MM-DD"
        raise InputException('dataFinal', mensagem)
    elif _is_date(queryParameters.get('dataFinal'), '%Y-%m-%d') == False:
        mensagem = "Data final do período para consulta de feriados inválida. Formato esperado: AAAA-MM-DD"
        raise InputException('dataFinal', mensagem)
    else:
        dataFinal = datetime.strptime(queryParameters.get('dataFinal'),
                                      "%Y-%m-%d").date()

    try:
        # Instancia a classe de negócios responsável pela gestão de cadastros da API
        objGestaoCadastro = GestaoCadastro()
        # Obtém a lista de indexadores cadastrados
        feriados = objGestaoCadastro.get_feriados(dataInicial, dataFinal)

    except BusinessException as be:
        raise be
    except Exception as e:
        raise ServerException(e)
    else:
        resposta = {'mensagem': 'Consulta aos feriados realizada com sucesso'}
        resposta.update({'feriados': feriados})
        return _success(resposta, 200), 200, {
            'Access-Control-Allow-Origin': '*'
        }
コード例 #4
0
def get_indexador(id):
    """Retorna o indexador solicitado
    """
    try:
        # Instancia a classe de negócios responsável pela gestão de cadastros da API
        objGestaoCadastro = GestaoCadastro()
        # Obtém o indexadores através do id
        indexador = objGestaoCadastro.get_indexador(id)
    except BusinessException as be:
        raise be
    except Exception as e:
        raise ServerException(e)
    else:
        resposta = {'mensagem': 'Consulta ao indexador realizada com sucesso'}
        resposta.update({'indexador': indexador})
        return _success(resposta, 200), 200, {
            'Access-Control-Allow-Origin': '*'
        }
コード例 #5
0
def post_indexadores():
    """Carga inicial das entidades que representarão os indexadores.
    """
    # if request.method == 'POST':
    #     data = request.form.to_dict(flat=True)
    try:
        # Instancia o a classe de negócio GestaoCadastro
        objGestaoCadastro = GestaoCadastro()
        # Realiza a carga inicial dos indexadores
        objGestaoCadastro.put_indexadores()
    except BusinessException as be:
        raise be
    except Exception as e:
        raise ServerException(e)
    else:
        return _success(
            {'mensagem': 'Indexadores incluidos/atualizados com sucesso!'},
            201), 201, {
                'Access-Control-Allow-Origin': '*'
            }
コード例 #6
0
def list_indexadores():
    """ Retorna lista com todos os indexadores cadastrados
    """
    try:
        # Instancia a classe de negócios responsável pela gestão de cadastros da API
        objGestaoCadastro = GestaoCadastro()
        # Obtém a lista de indexadores cadastrados
        indexadores = objGestaoCadastro.get_indexadores()
        # indexadores = list(map(lambda item: _converter_datas_dict(item, datas_converter), indexadores))
    except BusinessException as be:
        raise be
    except Exception as e:
        raise ServerException(e)
    else:
        resposta = {
            'mensagem': 'Consulta aos indexadores realizada com sucesso'
        }
        resposta.update({'indexadores': indexadores})
        return _success(resposta, 200), 200, {
            'Access-Control-Allow-Origin': '*'
        }
コード例 #7
0
def list_indices(id):
    """Retorna lista de índices referente ao indexador e período solicitado

    Argumentos path:
        indexador: código do indexador. Ex.: ipca, poupanca, cdi.
    Argumentos Query string:
        dataInicial: data inicial do período de índices a ser consultado.
        dataFinal: data final do período de índices a ser consultado.
    Retorno:
        Lista de índices com data e valor
    """
    # Obtém argumentos
    queryParameters = request.args
    # Loga os estado atual do indexador
    logger.info("Parâmetros recebidos para retorno dos índices: {}".format(
        queryParameters))

    # Validação - indexador
    if id is None:
        mensagem = "Você deve informar o indexador para consulta aos índices."
        raise InputException('indexador', mensagem)
    else:
        indexador = id.lower()

    # Validação - dataInicial
    if 'dataInicial' not in queryParameters:
        mensagem = "Você deve informar a data inicial do período de índices a serem retornados. Formato esperado: AAAA-MM-DD"
        raise InputException('dataInicial', mensagem)
    elif _is_date(queryParameters.get('dataInicial'), '%Y-%m-%d') == False:
        mensagem = "Data inicial do período inválida. Formato esperado: AAAA-MM-DD"
        raise InputException('dataInicial', mensagem)
    else:
        dataInicial = datetime.strptime(queryParameters.get('dataInicial'),
                                        "%Y-%m-%d").date()

    # Validação - dataFinal
    if 'dataFinal' not in queryParameters:
        mensagem = "Você deve informar a data final do período de índices a serem retornados. Formato esperado: AAAA-MM-DD"
        raise InputException('dataFinal', mensagem)
    elif _is_date(queryParameters.get('dataFinal'), '%Y-%m-%d') == False:
        mensagem = "Data final do período inválida. Formato esperado: AAAA-MM-DD"
        raise InputException('dataFinal', mensagem)
    else:
        dataFinal = datetime.strptime(queryParameters.get('dataFinal'),
                                      "%Y-%m-%d").date()

    try:
        # Instancia a classe de negócios responsável pela gestão de cadastros da API
        objGestaoCadastro = GestaoCadastro()
        # Obtém o indexadores através do id
        indices = objGestaoCadastro.list_indices(indexador, dataInicial,
                                                 dataFinal)
    except BusinessException as be:
        raise be
    except Exception as e:
        raise ServerException(e)
    else:
        resposta = {'mensagem': 'Consulta aos índices realizada com sucesso'}
        resposta.update({'indices': indices})
        return _success(resposta, 200), 200, {
            'Access-Control-Allow-Origin': '*'
        }
コード例 #8
0
def calcular_investimento():
    """Calcula a evolução do investimento a partir de um valor inicial aplicando os indices referentes 
    ao período, indexador e taxa informados.
    
    Argumentos:
        tipoInvestimento: tipo de investimento (ex.: CDB, LCI, LCA, Poupanca)
        tipoRendimento: 
           pre: pré-fixado (7% a.a) - requer campo taxaPrefixada
           pos: pós-fixado (120% do CDI) - requer campo taxa
           hibrido: misto de pré-fixado e pós-fixado (ex.: IPCA + 7% a.a.) - requer campos taxa e taxaPrefixada
        valor: valor inicial do investimento
        indexador: nome identificador do indexador (ex.: ipca, selic)
        taxa: percentual aplicado sobre o índice (ex.: 130 (130% do cdi))
        taxaPrefixada: percentual prefixado anual para investimentos prerfixados ou híbridos (ex.: Préfixado - 7% a.a ou Híbrido - 7% a.a. + IPCA (IPCA + 7%))
        dataInicial: data inicial do investimento
        dataFinal: data de vencimento do investimento
    Retorno:
            Retorna uma lista contendo dictionaries referentes aos valores 
            de saldo e rentabilidade do investimento além de uma sublista 
            da evolução do valor inicial em função do tempo (período informado)
    """
    # Obtém argumentos
    queryParameters = request.args

    # Loga os estado atual do indexador
    logger.info("Parâmetros recebidos para cálculo do investimento: {}".format(
        queryParameters))
    # Define a precisão da classe Decimal para 9 casas decimais
    getcontext().prec = 9
    # ------------------------------------------------------------------------------ #
    # Resgata e valida os dados de entrada para cálculo da evolução do investimento
    # ------------------------------------------------------------------------------ #
    # Validação - indexador
    if 'tipoInvestimento' not in queryParameters:
        mensagem = "Você deve informar o tipo de investimento."
        raise InputException('tipoInvestimento', mensagem)
    else:
        tipoInvestimento = queryParameters.get('tipoInvestimento')

    # TODO: Verificar se é um tipo de investimento válido

    # Validação - tipoRendimento
    if 'tipoRendimento' not in queryParameters:
        mensagem = "Você deve informar o tipo de rendimento (pré-fixado, pós-fixado ou híbrido)."
        raise InputException('tipoRendimento', mensagem)
    else:
        tipoRendimento = queryParameters.get('tipoRendimento')

    # Validação - valor
    if 'valor' not in queryParameters:
        mensagem = "Você deve informar o valor inicial do investimento."
        raise InputException('valor', mensagem)
    elif _is_number(queryParameters.get('valor')) == False:
        mensagem = "O valor inicial do investimento é inválido. Utilizar ponto ao invés de virgula para casas decimais."
        raise InputException('valor', mensagem)
    else:
        valInvestimentoInicial = Decimal(queryParameters.get('valor'))

    taxaPrefixada = Decimal(0)
    if tipoRendimento.lower() == 'pre' or tipoRendimento.lower() == 'hibrido':
        # Validação - taxa
        if 'taxaPrefixada' not in queryParameters:
            mensagem = "Você deve informar a taxa pré-fixada."
            raise InputException('taxaPrefixada', mensagem)
        elif _is_number(queryParameters.get('taxaPrefixada')) == False:
            mensagem = "Taxa pré-fixada é inválida. Utilizar ponto ao invés de virgula para casas decimais."
            raise InputException('taxaPrefixada', mensagem)
        else:
            taxaPrefixada = Decimal(queryParameters.get('taxaPrefixada'))

    # Validação - indexador
    indexador = None
    if tipoRendimento.lower() != 'pre':
        if 'indexador' not in queryParameters:
            mensagem = "Você deve informar o indexador do investimento."
            raise InputException('indexador', mensagem)
        else:
            indexador = queryParameters.get('indexador')

    # TODO: Verificar se é um indexador válido

    # Validação - taxa
    taxa = Decimal(100)
    if tipoRendimento.lower() != 'pre':
        if 'taxa' not in queryParameters:
            mensagem = "Você deve informar a taxa relativa ao indexador do investimento."
            raise InputException('taxa', mensagem)
        elif _is_number(queryParameters.get('taxa')) == False:
            mensagem = "Taxa relativa ao indexador do investimento é inválida. Utilizar ponto ao invés de virgula para casas decimais."
            raise InputException('taxa', mensagem)
        else:
            taxa = Decimal(queryParameters.get('taxa'))

    # taxaPrefixada = Decimal(100)
    # # Validação - taxaPrefixada
    # if 'taxaPrefixada' not in queryParameters:
    #     mensagem  = "Você deve informar a taxa prefixada ."
    #     raise InputException('taxa', mensagem)
    # elif _is_number(queryParameters.get('taxa')) == False:
    #     mensagem  = "Taxa relativa ao indexador do investimento é inválida. Utilizar ponto ao invés de virgula para casas decimais."
    #     raise InputException('taxa', mensagem)
    # else:
    #     taxa = Decimal(queryParameters.get('taxa'))

    # Validação - dataInicial
    if 'dataInicial' not in queryParameters:
        mensagem = "Você deve informar a data inicial do investimento. Formato esperado: AAAA-MM-DD"
        raise InputException('dataInicial', mensagem)
    elif _is_date(queryParameters.get('dataInicial'), "%Y-%m-%d") == False:
        mensagem = "Data inicial do investimento inválida. Formato esperado: AAAA-MM-DD"
        raise InputException('dataInicial', mensagem)
    else:
        dataInicial = datetime.strptime(queryParameters.get('dataInicial'),
                                        "%Y-%m-%d").date()

    # Validação - dataFinal
    if 'dataFinal' not in queryParameters:
        # mensagem  = "Você deve informar a data final do investimento. Formato esperado: AAAA-MM-DD"
        # raise InputException('dataFinal', mensagem)
        # Quando não informada assumir data atual
        dataFinal = datetime.now().date()
    elif _is_date(queryParameters.get('dataFinal'), '%Y-%m-%d') == False:
        mensagem = "Data final do investimento inválida. Formato esperado: AAAA-MM-DD"
        raise InputException('dataFinal', mensagem)
    else:
        dataFinal = datetime.strptime(queryParameters.get('dataFinal'),
                                      "%Y-%m-%d").date()

    try:
        # Instancia a classe de negócio Investimento
        objInvest = Investimento(tipoInvestimento=tipoInvestimento,
                                 tipoRendimento=tipoRendimento,
                                 valInvestimentoInicial=valInvestimentoInicial,
                                 indexador=indexador,
                                 taxa=taxa,
                                 taxaPrefixada=taxaPrefixada,
                                 dataInicial=dataInicial,
                                 dataFinal=dataFinal)
        # Realiza o cálculo de evolução do investimento
        resultadoInvestimento = objInvest.calcular_investimento()
    except BusinessException as be:
        raise be
    except Exception as e:
        raise ServerException(e)
    else:
        return _success(
            {
                'mensagem': 'Cálculo do investimento realizado com sucesso!',
                'resultadoInvestimento': resultadoInvestimento
            }, 200), 200, {
                'Access-Control-Allow-Origin': '*'
            }