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 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()
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
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 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
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()