Пример #1
0
def organizaDados():
    dados = leArquivos.leXls_Xlsx()
    posicoesCampos = {}
    listaDados = []
    listaDaLinha = {}

    for dado in dados:
        # lê o cabeçalho
        if str(dado[0]).upper().count('NOME DO FAVORECIDO') > 0:
            posicoesCampos.clear()
            for numPosicaoCampo, nomeCampo in enumerate(dado):
                nomeCampo = str(nomeCampo).upper()
                posicoesCampos[nomeCampo] = numPosicaoCampo
        else:
            posicaoNomeFornecedor = funcoesUteis.buscaPosicaoCampo(
                posicoesCampos, "Nome do favorecido", 1)
            posicaoCNPJFornecedor = funcoesUteis.buscaPosicaoCampo(
                posicoesCampos, "CPF/CNPJ", 2)
            posicaoTipoPagamento = funcoesUteis.buscaPosicaoCampo(
                posicoesCampos, "Tipo de pagamento", 3)
            posicaoDataPagamento = funcoesUteis.buscaPosicaoCampo(
                posicoesCampos, "Data de pagamento", 5)
            posicaoValorPagamento = funcoesUteis.buscaPosicaoCampo(
                posicoesCampos, "Valor do pagamento (R$)", 6)
            posicaoStatusPagamento = funcoesUteis.buscaPosicaoCampo(
                posicoesCampos, "Status", 7)

            nomeFornecedor = funcoesUteis.trataCampoTexto(
                dado[posicaoNomeFornecedor])
            CNPJFornecedor = funcoesUteis.trataCampoNumero(
                dado[posicaoCNPJFornecedor])
            tipoPagamento = funcoesUteis.trataCampoTexto(
                dado[posicaoTipoPagamento])
            dataPagamento = funcoesUteis.transformaCampoDataParaFormatoBrasileiro(
                funcoesUteis.retornaCampoComoData(dado[posicaoDataPagamento]))
            valorPagamento = funcoesUteis.trataCampoDecimal(
                dado[posicaoValorPagamento])
            statusPagamento = funcoesUteis.trataCampoTexto(
                dado[posicaoStatusPagamento])

            # se não for um pagamento válido pula de linha
            if dataPagamento == None:
                continue

            listaDaLinha.clear()

            listaDaLinha['nomeFornecedor'] = nomeFornecedor
            listaDaLinha['CNPJFornecedor'] = CNPJFornecedor
            listaDaLinha['tipoPagamento'] = tipoPagamento
            listaDaLinha['dataPagamento'] = dataPagamento
            listaDaLinha['valorPagamento'] = valorPagamento
            listaDaLinha['statusPagamento'] = statusPagamento

            listaDados.append(listaDaLinha.copy())

            #print(listaDados)

    #listaDados = sorted(listaDados, key=itemgetter('nomeFornecedor'))
    return listaDados
Пример #2
0
def organizaExtrato(saida="temp\\baixas.csv"):
    saida = open(saida, "w", encoding='utf-8')
    saida.write(
        "Data;Documento;Historico;Historico Complementar;Valor;Operacao\n")

    lista_arquivos = leLinhasExtrato()

    for linhas in lista_arquivos.values():

        posicao_data = 0
        posicao_documento = 0
        posicao_historico = 0
        posicao_valor = 0

        data = datetime.datetime.strptime("01/01/1900", "%d/%m/%Y").date()
        data = data.strftime("%d/%m/%Y")
        documento = ""
        historico = ""
        valor = 0
        operador = ""
        fornecedor_cliente = ""

        for num_row, row in enumerate(linhas):

            # ---- pega as posições onde estão os dados ----
            posicao_data_temp = row.upper().find("DATA")
            if posicao_data_temp > 0:
                posicao_data = posicao_data_temp

            posicao_documento_temp = row.upper().find("DOCUMENTO")
            if posicao_documento_temp > 0:
                posicao_documento = posicao_documento_temp

            posicao_historico_temp = row.upper().find("HISTÓRICO")
            if posicao_historico_temp > 0:
                posicao_historico = posicao_historico_temp

            posicao_valor_temp = row.upper().find("VALOR")
            if posicao_valor_temp > 0:
                posicao_valor = posicao_valor_temp - 10  # pega 10 posições atrás da palavra valor
            # ---- termina de pegar os dados das posições

            # ---- começa o tratamento de cada campo ----
            data_temp = row[posicao_data:posicao_data + 10]
            data_temp = funcoesUteis.retornaCampoComoData(data_temp)
            if data_temp is not None:
                data = funcoesUteis.transformaCampoDataParaFormatoBrasileiro(
                    data_temp)
            if data == "01/01/1900":
                continue

            documento_temp = funcoesUteis.trataCampoTexto(
                row[posicao_documento:posicao_documento + 12])
            if documento_temp != "" and data_temp is not None:
                documento = documento_temp

            historico_temp = funcoesUteis.trataCampoTexto(
                row[posicao_historico:posicao_historico + 56])
            if data_temp is not None and historico_temp != "":
                historico = historico_temp
            if historico_temp.count("SALDO") > 0:
                continue

            valor_temp = funcoesUteis.removerAcentosECaracteresEspeciais(
                row[posicao_valor:posicao_valor + 20])
            try:
                operador_temp = valor_temp[-1]
            except Exception:
                operador_temp = ""
            valor_temp = funcoesUteis.trataCampoDecimal(valor_temp)
            if valor_temp > 0 and data_temp is not None:
                valor = valor_temp
                operador = operador_temp
                if operador == "D":
                    operador = "-"
                else:
                    operador = "+"

            # lê a próxima linha pra saber se é uma linha com complementação dos dados da atual ou não
            try:
                proxima_linha = linhas[num_row + 1]
            except Exception:
                proxima_linha = ""

            data_temp_proxima_linha = proxima_linha[posicao_data:posicao_data +
                                                    10]
            data_temp_proxima_linha = funcoesUteis.retornaCampoComoData(
                data_temp_proxima_linha)

            valor_temp_proxima_linha = funcoesUteis.removerAcentosECaracteresEspeciais(
                proxima_linha[posicao_valor:posicao_valor + 20])
            valor_temp_proxima_linha = funcoesUteis.trataCampoDecimal(
                valor_temp_proxima_linha)

            # primeira geração dos dados quando todas as informações estão em uma linha apenas
            if data_temp is not None and data_temp_proxima_linha is not None:
                saida.write(
                    f"{data};{documento};{historico};;{valor:.2f};{operador}\n"
                )

            # limpa dados do fornecedor_cliente
            if data_temp is not None:
                fornecedor_cliente = ""

            # segunda geração dos dados quando as informações complementares está em APENAS uma LINHA ABAIXO
            if data_temp is None and valor_temp == 0 and historico_temp != "" and data_temp_proxima_linha is None and valor_temp_proxima_linha == 0:
                fornecedor_cliente = fornecedor_cliente + " " + historico_temp

                # analisa se na verdade é um histórico válido, pois pode ser uma linha que contenha um tanto de carecter que não serve pra nada. Então considera como
                # histórico somente se conter o historico_temp válido
                historico_temp_inicio = funcoesUteis.trataCampoTexto(
                    row[0:posicao_historico])
                if len(historico_temp_inicio) > 0:
                    fornecedor_cliente = ""

            # terceira geração dos dados quando as informações complementares está em MAIS de uma LINHA ABAIXO
            if data_temp is None and valor_temp == 0 and historico_temp != "" and data_temp_proxima_linha is not None and valor_temp_proxima_linha > 0:
                fornecedor_cliente = fornecedor_cliente + " " + historico_temp
                fornecedor_cliente = fornecedor_cliente.strip()

                # analisa se na verdade é um histórico válido, pois pode ser uma linha que contenha um tanto de carecter que não serve pra nada. Então considera como
                # histórico somente se conter o historico_temp válido
                historico_temp_inicio = funcoesUteis.trataCampoTexto(
                    row[0:posicao_historico])
                if len(historico_temp_inicio) > 0:
                    fornecedor_cliente = ""

                saida.write(
                    f"{data};{documento};{historico};{fornecedor_cliente};{valor:.2f};{operador}\n"
                )

    saida.close()
Пример #3
0
def organizaExtratoSicoob(linhas):
    linhasExtrato = []

    posicao_historico = 0
    posicao_data = 0

    data = datetime.datetime.strptime("01/01/1900", "%d/%m/%Y").date()
    data = data.strftime("%d/%m/%Y")
    documento = ""
    valor = 0
    operador = ""
    fornecedor_cliente = ""
    historico = ""

    conta_corrente = ""

    for num_row, row in enumerate(linhas):

        row = str(row)

        conta_corrente_temp = row.strip().split(':')
        if conta_corrente_temp[0] == 'CONTA':
            conta_corrente = conta_corrente_temp[1].split('-')
            conta_corrente = funcoesUteis.trataCampoTexto(conta_corrente[0])

        # DAQUI PRA BAIXO analisando a complementação do depósito
        posicao_historico_temp = row.upper().find("HISTÓRICO")
        if posicao_historico_temp > 0:
            posicao_historico = posicao_historico_temp - 10  # pega 10 posições a menos pra questão de 'segurança'

        historico_temp = funcoesUteis.trataCampoTexto(
            row[posicao_historico:posicao_historico + 65])

        # ignora as linhas que são referente à saldos
        if historico_temp.count("SALDO") > 0:
            continue

        posicao_data_temp = str(row).upper().find("DATA")
        if posicao_data_temp > 0:
            if posicao_data_temp > 5:
                posicao_data = posicao_data_temp - 5
            else:
                posicao_data = 0

        # lê a próxima linha pra saber se é uma linha com complementação dos dados da atual ou não
        try:
            proxima_linha = linhas[num_row + 1]
        except Exception:
            proxima_linha = ""

        data_temp_proxima_linha = proxima_linha[posicao_data:posicao_data + 17]
        data_temp_proxima_linha = funcoesUteis.retornaCampoComoData(
            data_temp_proxima_linha)

        # ---- começa o tratamento de cada campo ----
        data_temp = row[posicao_data:posicao_data + 17]
        data_temp = funcoesUteis.retornaCampoComoData(data_temp)
        # verifica se é uma data válida pra começar os tratamentos de cada campo
        if data_temp is not None:
            data = funcoesUteis.transformaCampoDataParaFormatoBrasileiro(
                data_temp)

            # ignora linhas que não são de pagamentos
            if data == "01/01/1900":
                continue

            # retira os espaços excessivos
            row = funcoesUteis.trataCampoTexto(row)

            # divide as linhas em espaço pois as posições do BB variam muito, então vamos pegar os dados de acordo a posição base deles (agencia e tipo_operacao(D,C) )
            row_dividida = row.split()
            #print(row_dividida)

            tamanho_linha = len(row_dividida) - 1

            documento_temp = funcoesUteis.trocaCaracteresTextoPraLetraX(
                row_dividida[1])

            # serve pra sabermos onde começar o processamento do histórico
            posicao_inicio_historico = 0
            if documento_temp.count('X') > 0:
                posicao_inicio_historico = 1
                documento = ""
            else:
                posicao_inicio_historico = 2
                documento = funcoesUteis.trataCampoTexto(row_dividida[1])

            historico = ""
            for i in range(posicao_inicio_historico, tamanho_linha):
                historico = historico + " " + funcoesUteis.trataCampoTexto(
                    row_dividida[i])
            historico = historico.strip()

            valor = funcoesUteis.removerAcentosECaracteresEspeciais(
                row_dividida[tamanho_linha])
            try:
                operador = valor[-1]
            except Exception:
                operador = ""
            valor = funcoesUteis.trataCampoDecimal(valor)
            if operador == "D":
                operador = "-"
            else:
                operador = "+"

            fornecedor_cliente = ""

            valor_imprimir = str(f"{valor:.2f}")
            valor_imprimir = valor_imprimir.replace('.', ',')

            # primeira geração dos dados quando todas as informações estão em uma linha apenas, ou seja, a próxima linha também já outro campo com data
            if data_temp_proxima_linha is not None and valor > 0:
                linhasExtrato.append(
                    f"756;{conta_corrente};;{data};{operador};{valor_imprimir};{documento};{historico};{fornecedor_cliente}\n"
                )

        # segunda geração dos dados quando as informações complementares está em APENAS uma LINHA ABAIXO
        if data_temp is None and historico_temp != "" and data_temp_proxima_linha is None and valor > 0:
            fornecedor_cliente = fornecedor_cliente + " " + historico_temp

            # analisa se na verdade é um histórico válido, pois pode ser uma linha que contenha um tanto de carecter que não serve pra nada. Então considera como
            # histórico somente se conter o historico_temp válido
            historico_temp_inicio = funcoesUteis.trataCampoTexto(
                row[0:posicao_historico])
            if len(historico_temp_inicio) > 0:
                fornecedor_cliente = ""

        # segundo geração dos dados quando as informações complementares está na LINHA ABAIXO
        if data_temp is None and historico_temp != "" and data_temp_proxima_linha is not None and valor > 0:
            fornecedor_cliente = fornecedor_cliente + " " + historico_temp
            fornecedor_cliente = fornecedor_cliente.strip()

            # analisa se na verdade é um histórico válido, pois pode ser uma linha que contenha um tanto de carecter que não serve pra nada. Então considera como
            # histórico somente se conter o historico_temp válido
            historico_temp_inicio = funcoesUteis.trataCampoTexto(
                row[0:posicao_historico])
            if len(historico_temp_inicio) > 0:
                fornecedor_cliente = ""

            linhasExtrato.append(
                f"756;{conta_corrente};;{data};{operador};{valor_imprimir};{documento};{historico};{fornecedor_cliente}\n"
            )

    return linhasExtrato
Пример #4
0
def organizaExtratoBB(linhas):
    linhasExtrato = []

    posicao_historico = 0
    posicao_data = 0

    data = datetime.datetime.strptime("01/01/1900", "%d/%m/%Y").date()
    data = data.strftime("%d/%m/%Y")
    documento = ""
    valor = 0
    operador = ""
    fornecedor_cliente = ""
    historico = ""
    conta_corrente = ""
    posicao_conta_corrente = 0

    for num_row, row in enumerate(linhas):

        row = str(row)

        conta_corrente_temp = row.strip().split(' ')
        try:
            if conta_corrente_temp[0] == 'CONTA' or conta_corrente_temp[
                    1] == 'CORRENTE':
                for key, conta_corrente in enumerate(conta_corrente_temp):
                    if (key >= 2 and conta_corrente != ''):
                        conta_corrente = conta_corrente_temp[key]
                        break
                conta_corrente = funcoesUteis.trataCampoTexto(conta_corrente)
        except Exception:
            pass

        posicao_data_temp = str(row).upper().find("DT.")
        if posicao_data_temp > 0:
            if posicao_data_temp > 5:
                posicao_data = posicao_data_temp - 5
            else:
                posicao_data = 0

        # lê a próxima linha pra saber se é uma linha com complementação dos dados da atual ou não
        try:
            proxima_linha = linhas[num_row + 1]
        except Exception:
            proxima_linha = ""

        data_temp_proxima_linha = proxima_linha[posicao_data:posicao_data + 17]
        data_temp_proxima_linha = funcoesUteis.retornaCampoComoData(
            data_temp_proxima_linha)

        # ---- começa o tratamento de cada campo ----
        data_temp = row[posicao_data:posicao_data + 17]
        data_temp = funcoesUteis.retornaCampoComoData(data_temp)
        # verifica se é uma data válida pra começar os tratamentos de cada campo
        if data_temp is not None:
            data = funcoesUteis.transformaCampoDataParaFormatoBrasileiro(
                data_temp)

            # ignora linhas que não são de pagamentos
            if data == "01/01/1900":
                continue

            # retira os espaços excessivos
            row = funcoesUteis.trataCampoTexto(row)

            # divide as linhas em espaço pois as posições do BB variam muito, então vamos pegar os dados de acordo a posição base deles (agencia e tipo_operacao(D,C) )
            row_dividida = row.split()
            #print(row_dividida)

            # vai servir apenas pra identificar em qual posição está a agência
            data_movimento = row_dividida[1]
            data_movimento = funcoesUteis.retornaCampoComoData(data_movimento)

            # serve pra sabermos onde começar o processamento do histórico
            posicao_agencia = 0
            if data_movimento is None:
                posicao_agencia = 1
            else:
                posicao_agencia = 2

            # ------ INICIO POSICAO_OPERACAO - serve pra sabermos até onde o histórico vai
            try:
                posicao_operacao_debito = row_dividida.index('D')
            except Exception:
                posicao_operacao_debito = 0
            try:
                posicao_operacao_credito = row_dividida.index('C')
            except Exception:
                posicao_operacao_credito = 0

            posicao_operacao = 0

            if posicao_operacao_debito > 0:
                if posicao_operacao_credito == 0:
                    posicao_operacao = posicao_operacao_debito
                else:
                    if posicao_operacao_debito <= posicao_operacao_credito:
                        posicao_operacao = posicao_operacao_debito
                    else:
                        posicao_operacao = posicao_operacao_credito
            if posicao_operacao_credito > 0:
                if posicao_operacao_debito == 0:
                    posicao_operacao = posicao_operacao_credito
                else:
                    if posicao_operacao_credito <= posicao_operacao_debito:
                        posicao_operacao = posicao_operacao_credito
                    else:
                        posicao_operacao = posicao_operacao_debito
            # ------------- FIM POSICAO_OPERACAO

            primeiro_campo_historico = funcoesUteis.trocaCaracteresTextoPraLetraX(
                row_dividida[posicao_agencia + 2])
            if primeiro_campo_historico.count('X') > 0:
                posicao_inicio = posicao_agencia + 2
            else:
                posicao_inicio = posicao_agencia + 3

            historico = ""
            for i in range(posicao_inicio, posicao_operacao - 2):
                historico = historico + " " + funcoesUteis.trataCampoTexto(
                    row_dividida[i])
            historico = historico.strip()

            # ignora as linhas que são referente à saldos
            if historico.count("SALDO") > 0:
                continue

            documento = funcoesUteis.trataCampoTexto(
                row_dividida[posicao_operacao - 2])

            valor = funcoesUteis.trataCampoDecimal(
                row_dividida[posicao_operacao - 1])

            valor_imprimir = str(f"{valor:.2f}")
            valor_imprimir = valor_imprimir.replace('.', ',')

            operador = row_dividida[posicao_operacao]
            if operador == "D":
                operador = "-"
            else:
                operador = "+"

            fornecedor_cliente = ""

            # primeira geração dos dados quando todas as informações estão em uma linha apenas, ou seja, a próxima linha também já outro campo com data
            if data_temp_proxima_linha is not None and valor > 0:
                linhasExtrato.append(
                    f"1;{conta_corrente};;{data};{operador};{valor_imprimir};{documento};{historico};{fornecedor_cliente}\n"
                )

        # DAQUI PRA BAIXO analisando a complementação do depósito
        posicao_historico_temp = funcoesUteis.removerAcentos(
            row.upper()).find("HISTORICO")
        if posicao_historico_temp > 0:
            posicao_historico = posicao_historico_temp - 10  # pega 10 posições a menos pra questão de 'segurança'

        historico_temp = funcoesUteis.trataCampoTexto(
            row[posicao_historico:posicao_historico + 65])

        fornecedor_cliente_temp = ""
        # segunda geração dos dados quando as informações complementares está em APENAS uma LINHA ABAIXO
        if data_temp is None and historico_temp != "" and data_temp_proxima_linha is None and valor > 0:
            fornecedor_cliente_temp = fornecedor_cliente_temp + " " + historico_temp
            fornecedor_cliente_temp = fornecedor_cliente_temp.strip()

            if historico.count('TED') > 0 or historico.count(
                    'TRANSF') > 0 or historico.count('DOC CR') > 0:
                fornecedor_cliente_dividido = fornecedor_cliente_temp.split()

                for campo in fornecedor_cliente_dividido:
                    if funcoesUteis.trocaCaracteresTextoPraLetraX(campo).count(
                            'X') > 0:
                        fornecedor_cliente = fornecedor_cliente + " " + campo

                fornecedor_cliente = fornecedor_cliente.strip()
            else:
                fornecedor_cliente = fornecedor_cliente_temp

            # analisa se na verdade é um histórico válido, pois pode ser uma linha que contenha um tanto de carecter que não serve pra nada. Então considera como
            # histórico somente se conter o historico_temp válido
            historico_temp_inicio = funcoesUteis.trataCampoTexto(
                row[0:posicao_historico])
            if len(historico_temp_inicio) > 0:
                fornecedor_cliente = ""

        # terceira geração dos dados quando as informações complementares está em MAIS DE UMA LINHA ABAIXO
        if data_temp is None and historico_temp != "" and data_temp_proxima_linha is not None and valor > 0:
            fornecedor_cliente_temp = fornecedor_cliente_temp + " " + historico_temp
            fornecedor_cliente_temp = fornecedor_cliente_temp.strip()

            if historico.count('TED') > 0 or historico.count(
                    'TRANSF') > 0 or historico.count('DOC CR') > 0:
                fornecedor_cliente_dividido = fornecedor_cliente_temp.split()

                for campo in fornecedor_cliente_dividido:
                    if funcoesUteis.trocaCaracteresTextoPraLetraX(campo).count(
                            'X') > 0:
                        fornecedor_cliente = fornecedor_cliente + " " + campo

                fornecedor_cliente = fornecedor_cliente.strip()
            else:
                fornecedor_cliente = fornecedor_cliente_temp

            # analisa se na verdade é um histórico válido, pois pode ser uma linha que contenha um tanto de carecter que não serve pra nada. Então considera como
            # histórico somente se conter o historico_temp válido
            historico_temp_inicio = funcoesUteis.trataCampoTexto(
                row[0:posicao_historico])
            if len(historico_temp_inicio) > 0:
                fornecedor_cliente = ""

            linhasExtrato.append(
                f"1;{conta_corrente};;{data};{operador};{valor_imprimir};{documento};{historico};{fornecedor_cliente}\n"
            )

    return linhasExtrato
Пример #5
0
def organizaExtrato(saida="temp\\baixas.csv"):
    saida = open(saida, "w", encoding='utf-8')
    saida.write(
        "Data;Documento;Historico;Historico Complementar;Valor;Operacao\n")

    lista_arquivos = leLinhasExtrato()

    for linhas in lista_arquivos.values():
        linha_ja_impressa = {}

        posicao_historico = 0
        posicao_data = 0
        posicao_documento = 0

        data = datetime.datetime.strptime("01/01/1900", "%d/%m/%Y").date()
        data = data.strftime("%d/%m/%Y")
        documento = ""
        valor = 0
        operador = ""
        fornecedor_cliente = ""
        historico = ""
        ano_extrato = 0

        for num_row, row in enumerate(linhas):

            row = str(row)

            try:
                linha_ja_impressa[num_row] = linha_ja_impressa[num_row]
            except Exception:
                linha_ja_impressa[num_row] = 0

            posicao_data_temp = row.upper().find("DATA")
            if posicao_data_temp > 0:
                if posicao_data_temp > 5:
                    posicao_data = posicao_data_temp - 5
                else:
                    posicao_data = 0

            posicao_documento_temp = row.upper().find("DOCUMENTO")
            if posicao_documento_temp > 0:
                posicao_documento = posicao_documento_temp

            # DAQUI PRA BAIXO analisando a complementação do depósito
            posicao_historico_temp = row.upper().find("HISTORICO")
            if posicao_historico_temp > 0:
                # serve pra identificar onde o historico começa, visto que algumas vezes não tem o documento no PDF
                if posicao_documento == 0:
                    posicao_historico = posicao_historico_temp - posicao_data_temp + 8  # pega 8 posições a menos pra questão de 'segurança'
                else:
                    posicao_historico = posicao_historico_temp - 10  # pega 10 posições a menos pra questão de 'segurança'
                if posicao_historico > posicao_historico_temp:
                    posicao_historico = posicao_historico_temp

            historico_temp = funcoesUteis.trataCampoTexto(
                row[posicao_historico:posicao_historico + 65])

            # ignora as linhas que são referente à saldos
            if historico_temp.count("SALDO") > 0:
                historico_temp = " "

            # serve pros extratos que não tem a data com o ano, e sim apenas com o dia e mês
            periodo_temp = row.strip().split(':')
            if periodo_temp[0] == 'PERIODO':
                ano_extrato = periodo_temp[1].split('-')
                ano_extrato = funcoesUteis.trataCampoTexto(ano_extrato[0])
                ano_extrato = ano_extrato[-4:]

            # serve pra identificar o tamanho das datas
            if posicao_documento == 0:
                qtd_char_data = posicao_historico - posicao_data
                if qtd_char_data > 17:
                    qtd_char_data = 17
            else:
                qtd_char_data = posicao_documento - posicao_data
                if qtd_char_data > 17:
                    qtd_char_data = 17

            # lê a próxima linha pra saber se é uma linha com complementação dos dados da atual ou não
            try:
                proxima_linha = linhas[num_row + 1]
            except Exception:
                proxima_linha = ""

            data_temp_proxima_linha = proxima_linha[posicao_data:posicao_data +
                                                    qtd_char_data - 1]
            data_temp_proxima_linha = data_temp_proxima_linha.strip()
            # caso a data esteja apenas no forma DD/MM ele coloca o ano
            if len(data_temp_proxima_linha) == 5:
                data_temp_proxima_linha = (
                    f'{data_temp_proxima_linha}/{ano_extrato}')
            data_temp_proxima_linha = funcoesUteis.retornaCampoComoData(
                data_temp_proxima_linha)

            # ---- começa o tratamento de cada campo ----
            data_temp = row[posicao_data:posicao_data + qtd_char_data - 1]
            data_temp = data_temp.strip()
            # caso a data esteja apenas no forma DD/MM ele coloca o ano
            if len(data_temp) == 5:
                data_temp = (f'{data_temp}/{ano_extrato}')
            data_temp = funcoesUteis.retornaCampoComoData(data_temp)

            historico_temp_proxima_linha = funcoesUteis.trataCampoTexto(
                proxima_linha[posicao_historico:posicao_historico + 65])

            # ignora as linhas que são referente à saldos
            if historico_temp_proxima_linha.count("SALDO") > 0:
                historico_temp_proxima_linha = 1
            else:
                historico_temp_proxima_linha = 0

            # verifica se é uma data válida pra começar os tratamentos de cada campo
            if data_temp is not None:
                data = funcoesUteis.transformaCampoDataParaFormatoBrasileiro(
                    data_temp)

                # ignora linhas que não são de pagamentos
                if data == "01/01/1900":
                    continue

                # retira os espaços excessivos
                row = funcoesUteis.trataCampoTexto(row)

                # divide as linhas em espaço pois as posições do BB variam muito, então vamos pegar os dados de acordo a posição base deles (agencia e tipo_operacao(D,C) )
                row_dividida = row.split()
                #print(row_dividida)

                tamanho_linha = len(row_dividida) - 1

                documento_temp = funcoesUteis.trocaCaracteresTextoPraLetraX(
                    row_dividida[1])

                # serve pra sabermos onde começar o processamento do histórico
                posicao_inicio_historico = 0
                if documento_temp.count('X') > 0:
                    posicao_inicio_historico = 1
                    documento = ""
                else:
                    posicao_inicio_historico = 2
                    documento = funcoesUteis.trataCampoTexto(row_dividida[1])

                historico = ""
                for i in range(posicao_inicio_historico, tamanho_linha):
                    historico = historico + " " + funcoesUteis.trataCampoTexto(
                        row_dividida[i])
                historico = historico.strip()

                valor = funcoesUteis.removerAcentosECaracteresEspeciais(
                    row_dividida[tamanho_linha])
                try:
                    operador = valor[-1]
                except Exception:
                    operador = ""
                valor = funcoesUteis.trataCampoDecimal(valor)
                if operador == "D":
                    operador = "-"
                else:
                    operador = "+"

                fornecedor_cliente = ""

                if historico_temp_proxima_linha == 1:
                    linha_ja_impressa[num_row + 1] = 1

                # primeira geração dos dados quando todas as informações estão em uma linha apenas, ou seja, a próxima linha também já outro campo com data
                if (data_temp_proxima_linha is not None
                        or historico_temp_proxima_linha == 1) and valor > 0:
                    saida.write(
                        f"{data};{documento};{historico};{fornecedor_cliente};{valor:.2f};{operador}\n"
                    )

            # segunda geração dos dados quando as informações complementares está em APENAS uma LINHA ABAIXO
            if data_temp is None and historico_temp != "" and data_temp_proxima_linha is None and valor > 0 and linha_ja_impressa[
                    num_row] == 0:
                fornecedor_cliente = fornecedor_cliente + " " + historico_temp

                # analisa se na verdade é um histórico válido, pois pode ser uma linha que contenha um tanto de carecter que não serve pra nada. Então considera como
                # histórico somente se conter o historico_temp válido
                historico_temp_inicio = funcoesUteis.trataCampoTexto(
                    row[0:posicao_historico])
                if len(historico_temp_inicio) > 0:
                    fornecedor_cliente = ""

            # segundo geração dos dados quando as informações complementares está na LINHA ABAIXO
            if data_temp is None and historico_temp != "" and data_temp_proxima_linha is not None and valor > 0 and linha_ja_impressa[
                    num_row] == 0:
                fornecedor_cliente = fornecedor_cliente + " " + historico_temp
                fornecedor_cliente = fornecedor_cliente.strip()

                # analisa se na verdade é um histórico válido, pois pode ser uma linha que contenha um tanto de carecter que não serve pra nada. Então considera como
                # histórico somente se conter o historico_temp válido
                historico_temp_inicio = funcoesUteis.trataCampoTexto(
                    row[0:posicao_historico])
                if len(historico_temp_inicio) > 0:
                    fornecedor_cliente = ""

                saida.write(
                    f"{data};{documento};{historico};{fornecedor_cliente};{valor:.2f};{operador}\n"
                )

    saida.close()
def organizaExtratoSantander(linhas):
    linhasExtrato = []

    data = datetime.datetime.strptime("01/01/1900", "%d/%m/%Y").date()
    data = data.strftime("%d/%m/%Y")
    documento = ""
    valor = 0
    operador = ""
    fornecedor_cliente = ""
    historico = ""
    conta_corrente = ""
    posicao_conta_corrente = 0

    for num_row, row in enumerate(linhas):

        row = str(row)
        row = funcoesUteis.trataCampoTexto(row)

        posicao_conta_corrente = row.upper().find("CONTA:")
        if posicao_conta_corrente > 0:
            conta_corrente = row[posicao_conta_corrente + 6:]
            conta_corrente = funcoesUteis.trataCampoTexto(conta_corrente)

        # divide as linhas em espaço pois as posições do BB variam muito, então vamos pegar os dados de acordo a posição base deles (agencia e tipo_operacao(D,C) )
        row_dividida = row.split()

        # vai servir apenas pra identificar em qual posição está a agência
        data = f"{row_dividida[0]}"
        data = funcoesUteis.retornaCampoComoData(data)
        data = funcoesUteis.transformaCampoDataParaFormatoBrasileiro(data)

        valor = funcoesUteis.trataCampoTexto(row_dividida[-1])

        # este valor 2 tem pois muitas das vezes no extrato Santander tem duas colunas de valores, sendo uma saldo e outro do valor em si
        try:
            valor2 = funcoesUteis.trataCampoTexto(row_dividida[-2])
        except Exception:
            valor2 = '0'
        # o if abaixo avalia se a penúltima posição do arquivo é valor, caso seja, ele que é a operação
        if valor2.count(',') > 0:
            valor = valor2
            posicao_valor = len(row_dividida) - 2
        else:
            valor = valor
            posicao_valor = len(row_dividida) - 1

        # analisa se a operação é soma ou subtrai
        if valor.count('-') > 0:
            operador = "-"
        else:
            operador = "+"
        valor = funcoesUteis.trataCampoDecimal(valor)

        historico = ""
        for i in range(1, posicao_valor):
            historico = historico + " " + funcoesUteis.trataCampoTexto(
                row_dividida[i])
        historico = historico.strip()

        # ignora as linhas que são referente à saldos
        if historico.count("SALDO") > 0:
            continue

        valor_imprimir = str(f"{valor:.2f}")
        valor_imprimir = valor_imprimir.replace('.', ',')

        if data is not None:
            linhasExtrato.append(
                f"33;{conta_corrente};;{data};{operador};{valor_imprimir};{documento};{historico};{fornecedor_cliente}\n"
            )

    return linhasExtrato
def organizaExtratoItau(linhas):
    linhasExtrato = []

    data = datetime.datetime.strptime("01/01/1900", "%d/%m/%Y").date()
    data = data.strftime("%d/%m/%Y")
    documento = ""
    valor = 0
    operador = ""
    fornecedor_cliente = ""
    historico = ""
    ano_extrato = 0
    conta_corrente = ""

    for num_row, row in enumerate(linhas):

        row = str(row)
        row = funcoesUteis.trataCampoTexto(row)

        posicao_conta_corrente = row.upper().find("AGENCIA/CONTA")
        if posicao_conta_corrente > 0:
            conta_corrente = row[posicao_conta_corrente + 14:]
            conta_corrente = conta_corrente.split('/')
            conta_corrente = funcoesUteis.trataCampoTexto(conta_corrente[1])

        if row[0:10] == "EXTRATO DE":
            ano_extrato = row[10:21].strip()
            ano_extrato = ano_extrato.split('/')
            ano_extrato = ano_extrato[2]

        # divide as linhas em espaço pois as posições do BB variam muito, então vamos pegar os dados de acordo a posição base deles (agencia e tipo_operacao(D,C) )
        row_dividida = row.split()

        # vai servir apenas pra identificar em qual posição está a agência
        data = f"{row_dividida[0]}/{ano_extrato}"
        data = funcoesUteis.retornaCampoComoData(data)
        data = funcoesUteis.transformaCampoDataParaFormatoBrasileiro(data)

        historico = ""
        for i in range(1, len(row_dividida) - 1):
            historico = historico + " " + funcoesUteis.trataCampoTexto(
                row_dividida[i])
        historico = historico.strip()

        # ignora as linhas que são referente à saldos
        if historico.count("SALDO") > 0 or historico.count("SDO CT") > 0:
            continue

        valor = funcoesUteis.trataCampoTexto(row_dividida[-1])
        if valor.count('-') > 0:
            operador = "-"
        else:
            operador = "+"
        valor = funcoesUteis.trataCampoDecimal(valor)

        valor_imprimir = str(f"{valor:.2f}")
        valor_imprimir = valor_imprimir.replace('.', ',')

        if data is not None:
            linhasExtrato.append(
                f"341;{conta_corrente};;{data};{operador};{valor_imprimir};{documento};{historico};{fornecedor_cliente}\n"
            )

    return linhasExtrato
Пример #8
0
def organizaExtrato(saida="temp\\baixas.csv"):
    saida = open(saida, "w", encoding='utf-8')
    saida.write(
        "Data;Documento;Historico;Historico Complementar;Valor;Operacao\n")

    lista_arquivos = leLinhasExtrato()

    for linhas in lista_arquivos.values():

        posicao_historico = 0
        posicao_data = 0

        data = datetime.datetime.strptime("01/01/1900", "%d/%m/%Y").date()
        data = data.strftime("%d/%m/%Y")
        documento = ""
        valor = 0
        operador = ""
        fornecedor_cliente = ""
        historico = ""

        for num_row, row in enumerate(linhas):

            posicao_data_temp = str(row).upper().find("DT.")
            if posicao_data_temp > 0:
                if posicao_data_temp > 5:
                    posicao_data = posicao_data_temp - 5
                else:
                    posicao_data = 0

            # lê a próxima linha pra saber se é uma linha com complementação dos dados da atual ou não
            try:
                proxima_linha = linhas[num_row + 1]
            except Exception:
                proxima_linha = ""

            data_temp_proxima_linha = proxima_linha[posicao_data:posicao_data +
                                                    17]
            data_temp_proxima_linha = funcoesUteis.retornaCampoComoData(
                data_temp_proxima_linha)

            # ---- começa o tratamento de cada campo ----
            data_temp = row[posicao_data:posicao_data + 17]
            data_temp = funcoesUteis.retornaCampoComoData(data_temp)
            # verifica se é uma data válida pra começar os tratamentos de cada campo
            if data_temp is not None:
                data = funcoesUteis.transformaCampoDataParaFormatoBrasileiro(
                    data_temp)

                # ignora linhas que não são de pagamentos
                if data == "01/01/1900":
                    continue

                # retira os espaços excessivos
                row = funcoesUteis.trataCampoTexto(row)

                # divide as linhas em espaço pois as posições do BB variam muito, então vamos pegar os dados de acordo a posição base deles (agencia e tipo_operacao(D,C) )
                row_dividida = row.split()
                #print(row_dividida)

                # vai servir apenas pra identificar em qual posição está a agência
                data_movimento = row_dividida[1]
                data_movimento = funcoesUteis.retornaCampoComoData(
                    data_movimento)

                # serve pra sabermos onde começar o processamento do histórico
                posicao_agencia = 0
                if data_movimento is None:
                    posicao_agencia = 1
                else:
                    posicao_agencia = 2

                # ------ INICIO POSICAO_OPERACAO - serve pra sabermos até onde o histórico vai
                try:
                    posicao_operacao_debito = row_dividida.index('D')
                except Exception:
                    posicao_operacao_debito = 0
                try:
                    posicao_operacao_credito = row_dividida.index('C')
                except Exception:
                    posicao_operacao_credito = 0

                posicao_operacao = 0

                if posicao_operacao_debito > 0:
                    if posicao_operacao_credito == 0:
                        posicao_operacao = posicao_operacao_debito
                    else:
                        if posicao_operacao_debito <= posicao_operacao_credito:
                            posicao_operacao = posicao_operacao_debito
                        else:
                            posicao_operacao = posicao_operacao_credito
                if posicao_operacao_credito > 0:
                    if posicao_operacao_debito == 0:
                        posicao_operacao = posicao_operacao_credito
                    else:
                        if posicao_operacao_credito <= posicao_operacao_debito:
                            posicao_operacao = posicao_operacao_credito
                        else:
                            posicao_operacao = posicao_operacao_debito
                # ------------- FIM POSICAO_OPERACAO

                # quando o posicao_agencia+2 não conseguir passar quer dizer que não é uma linha válida, pois ela é muito pequena, então ele passa pra próxima através do except
                try:
                    primeiro_campo_historico = funcoesUteis.trocaCaracteresTextoPraLetraX(
                        row_dividida[posicao_agencia + 2])
                    if primeiro_campo_historico.count('X') > 0:
                        posicao_inicio = posicao_agencia + 2
                    else:
                        posicao_inicio = posicao_agencia + 3
                except Exception:
                    posicao_inicio = posicao_agencia + 2
                    next

                historico = ""
                for i in range(posicao_inicio, posicao_operacao - 2):
                    historico = historico + " " + funcoesUteis.trataCampoTexto(
                        row_dividida[i])
                historico = historico.strip()

                # ignora as linhas que são referente à saldos
                if historico.count("SALDO") > 0:
                    continue

                documento = funcoesUteis.trataCampoTexto(
                    row_dividida[posicao_operacao - 2])

                valor = funcoesUteis.trataCampoDecimal(
                    row_dividida[posicao_operacao - 1])

                operador = row_dividida[posicao_operacao]
                if operador == "D":
                    operador = "-"
                else:
                    operador = "+"

                fornecedor_cliente = ""

                # primeira geração dos dados quando todas as informações estão em uma linha apenas, ou seja, a próxima linha também já outro campo com data
                if data_temp_proxima_linha is not None and valor > 0:
                    saida.write(
                        f"{data};{documento};{historico};{fornecedor_cliente};{valor:.2f};{operador}\n"
                    )

            # DAQUI PRA BAIXO analisando a complementação do depósito
            posicao_historico_temp = row.upper().find("HISTÓRICO")
            if posicao_historico_temp > 0:
                posicao_historico = posicao_historico_temp - 10  # pega 10 posições a menos pra questão de 'segurança'

            historico_temp = funcoesUteis.trataCampoTexto(
                row[posicao_historico:posicao_historico + 65])

            fornecedor_cliente_temp = ""
            # segunda geração dos dados quando as informações complementares está em APENAS uma LINHA ABAIXO
            if data_temp is None and historico_temp != "" and data_temp_proxima_linha is None and valor > 0:
                fornecedor_cliente_temp = fornecedor_cliente_temp + " " + historico_temp
                fornecedor_cliente_temp = fornecedor_cliente_temp.strip()

                if historico.count('TED') > 0 or historico.count(
                        'TRANSF') > 0 or historico.count('DOC CR') > 0:
                    fornecedor_cliente_dividido = fornecedor_cliente_temp.split(
                    )

                    for campo in fornecedor_cliente_dividido:
                        if funcoesUteis.trocaCaracteresTextoPraLetraX(
                                campo).count('X') > 0:
                            fornecedor_cliente = fornecedor_cliente + " " + campo

                    fornecedor_cliente = fornecedor_cliente.strip()
                else:
                    fornecedor_cliente = fornecedor_cliente_temp

                # analisa se na verdade é um histórico válido, pois pode ser uma linha que contenha um tanto de carecter que não serve pra nada. Então considera como
                # histórico somente se conter o historico_temp válido
                historico_temp_inicio = funcoesUteis.trataCampoTexto(
                    row[0:posicao_historico])
                if len(historico_temp_inicio) > 0:
                    fornecedor_cliente = ""

            # terceira geração dos dados quando as informações complementares está em MAIS DE UMA LINHA ABAIXO
            if data_temp is None and historico_temp != "" and data_temp_proxima_linha is not None and valor > 0:
                fornecedor_cliente_temp = fornecedor_cliente_temp + " " + historico_temp
                fornecedor_cliente_temp = fornecedor_cliente_temp.strip()

                if historico.count('TED') > 0 or historico.count(
                        'TRANSF') > 0 or historico.count('DOC CR') > 0:
                    fornecedor_cliente_dividido = fornecedor_cliente_temp.split(
                    )

                    for campo in fornecedor_cliente_dividido:
                        if funcoesUteis.trocaCaracteresTextoPraLetraX(
                                campo).count('X') > 0:
                            fornecedor_cliente = fornecedor_cliente + " " + campo

                    fornecedor_cliente = fornecedor_cliente.strip()
                else:
                    fornecedor_cliente = fornecedor_cliente_temp

                # analisa se na verdade é um histórico válido, pois pode ser uma linha que contenha um tanto de carecter que não serve pra nada. Então considera como
                # histórico somente se conter o historico_temp válido
                historico_temp_inicio = funcoesUteis.trataCampoTexto(
                    row[0:posicao_historico])
                if len(historico_temp_inicio) > 0:
                    fornecedor_cliente = ""

                saida.write(
                    f"{data};{documento};{historico};{fornecedor_cliente};{valor:.2f};{operador}\n"
                )

    saida.close()