Ejemplo n.º 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
def leTxt(arquivos=buscaArquivosEmPasta(caminho=f"{caminho_leitura}temp",
                                        extensao=(".TMP"))):
    lista_arquivos = {}
    lista_linha = []

    for arquivo in arquivos:
        nome_arquivo = os.path.basename(arquivo)
        saida = f"{caminho_leitura}temp\\" + str(
            nome_arquivo[0:len(nome_arquivo) - 4]) + ".txt"
        saida = open(saida, "w", encoding='utf-8')

        # pra cada arquivo criar uma posição no dicionário
        lista_arquivos[arquivo] = lista_linha[:]

        # le o arquivo e grava num vetor
        with open(arquivo, 'rt', encoding='utf-8') as txtfile:
            for linha in txtfile:
                linha = funcoesUteis.trataCampoTexto(linha)
                if linha == "":
                    continue
                lista_linha.append(linha)
                saida.write(f'{linha}\n')
            lista_arquivos[arquivo] = lista_linha[:]
            lista_linha.clear()
        txtfile.close()

        saida.close()

    return lista_arquivos
Ejemplo n.º 3
0
def leLinhasPDF(arquivos=funcoesUteis.buscaArquivosEmPasta(
    caminho=f"{caminho_base}temp", extensao=(".TXT"))):
    lista_arquivos = {}
    lista_linha = []

    extratos = f"{caminho_base}temp\\extrato_cartao_temp.csv"
    extratos = open(extratos, "a", encoding='utf-8')

    for arquivo in arquivos:
        # pra cada arquivo criar uma posição no dicionário
        lista_arquivos[arquivo] = lista_linha[:]

        # le o arquivo e grava num vetor
        with open(arquivo, 'rt') as txtfile:
            for linha in txtfile:
                linha = funcoesUteis.removerAcentos(
                    str(linha).upper().replace("\n", ""))
                # linha = linha.strip()
                # ignora linhas totalmente em branco
                if (funcoesUteis.trataCampoTexto(linha) == ""):
                    continue
                lista_linha.append(linha)
                extratos.write(f"{linha}\n")
            lista_arquivos[arquivo] = lista_linha[:]
            lista_linha.clear()
        txtfile.close()

    extratos.close()

    return lista_arquivos
Ejemplo n.º 4
0
def dividePDFUmaPaginaCada(caminho=f"{caminho_pasta}entrada"):
    for root, dirs, files in os.walk(caminho):
        for file in files:
            caminho_pdf = os.path.join(root, file)
            name_file = funcoesUteis.trataCampoTexto(str(file[0:len(file) -
                                                              4]))
            with open(caminho_pdf, 'rb') as arquivo_pdf:
                leitor = PyPDF2.PdfFileReader(arquivo_pdf)
                num_paginas = leitor.getNumPages()

                for num_pagina in range(num_paginas):
                    escritor = PyPDF2.PdfFileWriter()
                    pagina_atual = leitor.getPage(num_pagina)
                    escritor.addPage(pagina_atual)

                    with open(
                            f'{caminho_pasta}temp\\{name_file}-PAGINA {num_pagina+1}.pdf',
                            'wb') as novo_pdf:
                        escritor.write(novo_pdf)
Ejemplo n.º 5
0
def leLinhasExtrato(arquivos=buscaArquivosEmPasta(caminho="temp", extensao=(".TXT"))):
    lista_arquivos = {}
    lista_linha = []
    
    for arquivo in arquivos:
        # pra cada arquivo criar uma posição no dicionário
        lista_arquivos[arquivo] = lista_linha[:]
        
        # le o arquivo e grava num vetor
        with open(arquivo, 'rt') as txtfile:
            for linha in txtfile:
                linha = str(linha).replace("\n", "")
                # ignora linhas totalmente em branco
                if(funcoesUteis.trataCampoTexto(linha) == ""):
                    continue
                lista_linha.append(linha)
            lista_arquivos[arquivo] = lista_linha[:]
            lista_linha.clear()
        txtfile.close()

    return lista_arquivos
Ejemplo n.º 6
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()
Ejemplo n.º 7
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
Ejemplo n.º 8
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
def leXls_Xlsx(arquivos=funcoesUteis.buscaArquivosEmPasta("entrada",
                                                          extensao=(".XLS",
                                                                    "XLSX"))):
    lista_dados = []
    dados_linha = []
    for arquivo in arquivos:

        nome_arquivo = funcoesUteis.trataCampoTexto(
            str(os.path.basename(arquivo)))
        saida = "temp\\" + nome_arquivo[0:len(nome_arquivo) - 4] + ".csv"
        saida = open(saida, "w", encoding='utf-8')

        try:
            arquivo = xlrd.open_workbook(arquivo,
                                         logfile=open(os.devnull, 'w'))
        except Exception:
            arquivo = xlrd.open_workbook(arquivo,
                                         logfile=open(os.devnull, 'w'),
                                         encoding_override='Windows-1252')

    # guarda todas as planilhas que tem dentro do arquivo excel
        planilhas = arquivo.sheet_names()

        # lê cada planilha
        for p in planilhas:

            # pega o nome da planilha
            planilha = arquivo.sheet_by_name(p)

            # pega a quantidade de linha que a planilha tem
            max_row = planilha.nrows
            # pega a quantidade de colunca que a planilha tem
            max_column = planilha.ncols

            # lê cada linha e coluna da planilha e imprime
            for i in range(0, max_row):

                valor_linha = planilha.row_values(rowx=i)

                # ignora linhas em branco
                if valor_linha.count("") == max_column:
                    continue

                # lê as colunas
                for j in range(0, max_column):

                    # as linhas abaixo analisa o tipo de dado que está na planilha e retorna no formato correto, sem ".0" para números ou a data no formato numérico
                    tipo_valor = planilha.cell_type(rowx=i, colx=j)
                    valor_celula = removerAcentosECaracteresEspeciais(
                        str(planilha.cell_value(rowx=i, colx=j)))
                    if tipo_valor == 2:
                        valor_casas_decimais = valor_celula.split('.')
                        valor_casas_decimais = valor_casas_decimais[1]
                        if int(valor_casas_decimais) == 0:
                            valor_celula = valor_celula.split('.')
                            valor_celula = valor_celula[0]
                    elif tipo_valor == 3:
                        valor_celula = float(
                            planilha.cell_value(rowx=i, colx=j))
                        valor_celula = xlrd.xldate.xldate_as_datetime(
                            valor_celula, datemode=0)
                        valor_celula = valor_celula.strftime("%d/%m/%Y")

                    # retira espaços e quebra de linha da célula
                    valor_celula = str(valor_celula).strip().replace('\n', '')

                    # gera o resultado num arquivo
                    resultado = valor_celula + ';'
                    resultado = resultado.replace('None', '')
                    saida.write(resultado)

                    # adiciona o valor da célula na lista de dados_linha
                    dados_linha.append(valor_celula)

                # faz uma quebra de linha para passar pra nova linha
                saida.write('\n')

                # copia os dados da linha para o vetor de lista_dados
                lista_dados.append(dados_linha[:])

                # limpa os dados da linha para ler a próxima
                dados_linha.clear()

        # fecha o arquivo
        saida.close()

    # retorna uma lista dos dados
    return lista_dados
Ejemplo n.º 10
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()
Ejemplo n.º 11
0
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
Ejemplo n.º 12
0
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
Ejemplo n.º 13
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()