From 4580fbfb2b12b1ced61266b56789b186ccea2df3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Augusto=20de=20Sousa=20C=C3=A2mara?= Date: Tue, 3 Sep 2024 17:54:16 -0300 Subject: [PATCH] Delete Back directory arquivos obsoletos --- Back/Backend | 1 - Back/Puxador_bens.py | 92 ----------- Back/Puxador_compras.py | 96 ----------- Back/Puxador_convenio.py | 90 ---------- Back/Puxador_credito.py | 85 ---------- Back/Puxador_educacao.py | 155 ------------------ Back/__init__.py | 0 Back/__pycache__/Puxador_bens.cpython-312.pyc | Bin 3676 -> 0 bytes .../Puxador_compras.cpython-312.pyc | Bin 3847 -> 0 bytes .../Puxador_convenio.cpython-312.pyc | Bin 3641 -> 0 bytes .../Puxador_credito.cpython-312.pyc | Bin 3227 -> 0 bytes .../Puxador_educacao.cpython-312.pyc | Bin 4756 -> 0 bytes Back/__pycache__/__init__.cpython-312.pyc | Bin 151 -> 0 bytes Back/__pycache__/puxador_bens.cpython-312.pyc | Bin 3676 -> 0 bytes .../puxador_compras.cpython-312.pyc | Bin 3847 -> 0 bytes 15 files changed, 519 deletions(-) delete mode 100644 Back/Backend delete mode 100644 Back/Puxador_bens.py delete mode 100644 Back/Puxador_compras.py delete mode 100644 Back/Puxador_convenio.py delete mode 100644 Back/Puxador_credito.py delete mode 100644 Back/Puxador_educacao.py delete mode 100644 Back/__init__.py delete mode 100644 Back/__pycache__/Puxador_bens.cpython-312.pyc delete mode 100644 Back/__pycache__/Puxador_compras.cpython-312.pyc delete mode 100644 Back/__pycache__/Puxador_convenio.cpython-312.pyc delete mode 100644 Back/__pycache__/Puxador_credito.cpython-312.pyc delete mode 100644 Back/__pycache__/Puxador_educacao.cpython-312.pyc delete mode 100644 Back/__pycache__/__init__.cpython-312.pyc delete mode 100644 Back/__pycache__/puxador_bens.cpython-312.pyc delete mode 100644 Back/__pycache__/puxador_compras.cpython-312.pyc diff --git a/Back/Backend b/Back/Backend deleted file mode 100644 index d87347f16..000000000 --- a/Back/Backend +++ /dev/null @@ -1 +0,0 @@ -falta colocar pra puxar itens comprados com a query "cujo objeto é a aquisição do item identificado pelo Código" diff --git a/Back/Puxador_bens.py b/Back/Puxador_bens.py deleted file mode 100644 index 1cbf2dd4e..000000000 --- a/Back/Puxador_bens.py +++ /dev/null @@ -1,92 +0,0 @@ -import requests -import re -from typing import List, Dict, Union -from pydantic import BaseModel -from datetime import date - -class DateRange(BaseModel): - published_since: date - published_until: date - -async def puxador_bens(date_range: DateRange) -> Union[List[Dict[str, Union[str, float]]], int]: - # Formatando as datas no formato americano - published_since_str = date_range.published_since.strftime('%Y-%m-%d') - published_until_str = date_range.published_until.strftime('%Y-%m-%d') - # Fazendo a solicitação GET para a API - response = requests.get( - f'https://queridodiario.ok.org.br/api/gazettes?territory_ids=5300108&published_since={published_since_str}&published_until={published_until_str}&querystring=%22EXTRATO%20DO%20CONTRATO%20DE%20AQUISI%C3%87%C3%83O%20DE%20BENS%22&excerpt_size=4000&number_of_excerpts=10000&pre_tags=&post_tags=&size=10000&sort_by=descending_date') - # Verificando se a solicitação foi bem-sucedida - if response.status_code == 200: - - # Convertendo a resposta para JSON - dados = response.json() - - # Acessando a lista de gazettes dentro dos dados - gazettes = dados['gazettes'] - - # Lista para armazenar os dicionários com as informações extraídas - results = [] - - # Conjunto para armazenar as datas já vistas - datas_vistas = set() - - # Iterando sobre cada gazette na lista - for gazette in gazettes: - # Acessando a data de cada gazette - data = gazette['date'] - - # Verificando se a data já foi processada - if data not in datas_vistas: - # Adicionando a data ao conjunto de datas vistas - datas_vistas.add(data) - - # Acessando a lista de excertos de cada gazette - excertos = gazette['excerpts'] - total_diario = 0 - - # Iterando sobre cada excerto - for excerto in excertos: - # Remover quebras de linha no meio das palavras - excerto = re.sub(r'(\w)-\n(\w)', r'\1\2', excerto) - # Remover todas as quebras de linha - excerto = excerto.replace('\n', ' ') - - # Usando expressão regular para encontrar Empresa, CNPJ, Objeto e Valor - empresa_match = re.search(r'(?:FORNECEDOR|empresa)\s+([\w\s\-ÇçÉéÁáÍíÓóÚúÃãÕõâêîôûÂÊÎÔÛäëïöüÄËÏÖÜ]+)\s+.*?CNPJ[\s:nº]*([\d./-]+)', excerto, re.DOTALL) - objeto_match = re.search(r'OBJETO:\s*([^\n,]+?(?:,\s*para atender as demandas)?(?:\s*da Vice-Governadoria)?.*?)\s*VALOR', excerto, re.DOTALL) - valor_match = re.search(r'VALOR (?:DO CONTRATO)?:\s*R\$ ([\d,.]+)', excerto) - - if empresa_match and objeto_match and valor_match: - # Extraindo a empresa e o CNPJ encontrados - empresa = empresa_match.group(1).strip() - cnpj = empresa_match.group(2).strip() - - # Extraindo o objeto encontrado e removendo parte desnecessária - objeto = objeto_match.group(1).strip() - - # Extraindo o valor encontrado - valor = valor_match.group(1) - # Removendo caracteres não numéricos, exceto vírgulas e pontos - valor_limpo = re.sub(r'[^\d,.]', '', valor) - # Removendo pontos extras como separadores de milhar - valor_limpo = valor_limpo.replace('.', '') - # Trocando a vírgula por ponto para ter o formato correto para float - valor_limpo = valor_limpo.replace(',', '.') - # Convertendo o valor para float - valor_float = float(valor_limpo) - total_diario += valor_float - - # Adicionando as informações à lista de resultados - results.append({ - "data": data, - "empresa": empresa, - "cnpj": cnpj, - "objeto": objeto, - "valor": valor_float - }) - # não adicionei o total diário à lista de resultados pois pode ser facilmente feito pelo front na hora de montar os gráficos. - # mas ficaria assim: results.append({"data": data, "total_diario": total_diario}) - return results - else: - # Se a solicitação falhar, retorne o código de status - return response.status_code \ No newline at end of file diff --git a/Back/Puxador_compras.py b/Back/Puxador_compras.py deleted file mode 100644 index 189c9c930..000000000 --- a/Back/Puxador_compras.py +++ /dev/null @@ -1,96 +0,0 @@ -from fastapi import FastAPI -import requests -import re - -from typing import List, Dict, Union -from pydantic import BaseModel -from datetime import date - -class DateRange(BaseModel): - published_since: date - published_until: date - - -async def puxador_compras(date_range: DateRange) -> Union[List[Dict[str, Union[str, float]]], int]: - # Formatando as datas no formato americano - published_since_str = date_range.published_since.strftime('%Y-%m-%d') - published_until_str = date_range.published_until.strftime('%Y-%m-%d') - # Fazendo a solicitação GET para a API - response = requests.get( - f'https://queridodiario.ok.org.br/api/gazettes?territory_ids=5300108&published_since={published_since_str}&published_until={published_until_str}&querystring=%22cujo%20objeto%20%C3%A9%20a%20aquisi%C3%A7%C3%A3o%20do%20item%20identificado%20pelo%20C%C3%B3digo%22&excerpt_size=800&number_of_excerpts=10000&pre_tags=&post_tags=&size=10000&sort_by=ascending_date') - - # Verificando se a solicitação foi bem-sucedida - if response.status_code == 200: - - # Convertendo a resposta para JSON - dados = response.json() - - # Acessando a lista de gazettes dentro dos dados - gazettes = dados['gazettes'] - - # Lista para armazenar os dicionários com as informações extraídas - results = [] - - # Conjunto para armazenar as datas já vistas - datas_vistas = set() - - # Iterando sobre cada gazette na lista - for gazette in gazettes: - # Acessando a data de cada gazette - data = gazette['date'] - - # Verificando se a data já foi impressa - if data not in datas_vistas: - # Adicionando a data ao conjunto de datas vistas - datas_vistas.add(data) - - # Acessando a lista de excertos de cada gazette - excertos = gazette['excerpts'] - total_diario = 0 - - # Iterando sobre cada excerto - for excerto in excertos: - # Remover quebras de linha no meio das palavras - excerto = re.sub(r'(\w)-\n(\w)', r'\1\2', excerto) - excerto = excerto.replace('\n', ' ') - - # Usando expressão regular para encontrar a Empresa, Objeto e Valor - empresa_match = re.search(r'empresa\s+([\w\s\-ÇçÉéÁáÍíÓóÚúÃãÕõâêîôûÂÊÎÔÛäëïöüÄËÏÖÜ]+)\s+-\s+CNPJ:\s+(\d{2}\.\d{3}\.\d{3}/\d{4}-\d{2})', excerto, re.DOTALL) - objeto_match = re.search(r'cujo objeto é a aquisição do item identificado pelo Código SES\s+\d+\s+-\s+([^\n,]+)', excerto, re.DOTALL) - valor_match = re.search(r'valor global de R\$ ([\d,.]+)', excerto) - - if empresa_match and objeto_match and valor_match: - # Extraindo a empresa e o CNPJ encontrados - empresa = empresa_match.group(1).strip() - cnpj = empresa_match.group(2).strip() - - # Extraindo o objeto encontrado e removendo parte desnecessária - objeto = objeto_match.group(1).strip() - objeto = re.sub(r',\s*para atender as necessidades.*', '', objeto) - - # Extraindo o valor encontrado - valor = valor_match.group(1) - # Removendo caracteres não numéricos, exceto vírgulas e pontos - valor_limpo = re.sub(r'[^\d,.]', '', valor) - # Removendo pontos extras como separadores de milhar - valor_limpo = valor_limpo.replace('.', '') - # Trocando a vírgula por ponto para ter o formato correto para float - valor_limpo = valor_limpo.replace(',', '.') - # Convertendo o valor para float - valor_float = float(valor_limpo) - total_diario += valor_float - - # Adicionando as informações à lista de resultados - results.append({ - "data": data, - "empresa": empresa, - "cnpj": cnpj, - "objeto": objeto, - "valor": valor_float - }) - # não adicionei o total diário à lista de resultados pois pode ser facilmente feito pelo front na hora de montar os gráficos. - # mas ficaria assim: results.append({"data": data, "total_diario": total_diario}) - return results - else: - # Se a solicitação falhar, retorne o código de status - return response.status_code diff --git a/Back/Puxador_convenio.py b/Back/Puxador_convenio.py deleted file mode 100644 index 8cc735dc6..000000000 --- a/Back/Puxador_convenio.py +++ /dev/null @@ -1,90 +0,0 @@ -import requests -import re - -from typing import List, Dict, Union -from pydantic import BaseModel -from datetime import date - -class DateRange(BaseModel): - published_since: date - published_until: date - -async def puxador_convenio(date_range: DateRange) -> Union[List[Dict[str, Union[str, float]]], int]: - # Formatando as datas no formato americano - published_since_str = date_range.published_since.strftime('%Y-%m-%d') - published_until_str = date_range.published_until.strftime('%Y-%m-%d') - - # Fazendo a solicitação GET para a API - response = requests.get( - F'https://queridodiario.ok.org.br/api/gazettes?territory_ids=5300108&published_since=2023-06-26&published_until=2023-06-30&querystring=%22RECONHECIMENTO%20DE%20D%C3%8DVIDA%22&excerpt_size=500&number_of_excerpts=100000&pre_tags=&post_tags=&size=10000&sort_by=descending_date' - ) - - # Verificando se a solicitação foi bem-sucedida - if response.status_code == 200: - dados = response.json() - gazettes = dados.get('gazettes', []) - - # Lista para armazenar os dicionários com as informações extraídas - results = [] - - datas_vistas = set() - - for gazette in gazettes: - data = gazette.get('date') - - # Verifica se a data está presente e não é uma string vazia - if data and data not in datas_vistas: - datas_vistas.add(data) - - excertos = gazette.get('excerpts', []) - total_diario = 0 - - for excerto in excertos: - # Normalizando o texto para facilitar a extração - excerto = excerto.replace('\n', ' ').replace('\r', ' ') - - # Ajustando regex para capturar corretamente o interessado e valor - interessado_match = re.search( - r'(?:Interessado:\s*|\bem\s+favor\s+da\s+empresa\s+)([^\.,\n]+(?:[^\.,\n]+)*)', - excerto, re.IGNORECASE) - valor_match = re.search( - r'Valor:\s*R\$(.*?[\d,.]+)|(?:no\s+valor\s+total\s+de\s+R\$(.*?[\d,.]+))', - excerto, re.IGNORECASE) - - if interessado_match and valor_match: - interessado = interessado_match.group(1).strip() - - if valor_match.group(1): - valor = valor_match.group(1).strip() - else: - valor = valor_match.group(2).strip() - - # Limpeza do valor - valor_limpo = re.sub(r'[^\d,]', '', - valor) # Remove todos os caracteres não numéricos, exceto vírgula - valor_limpo = valor_limpo.replace('.', '', valor_limpo.count( - ',') - 1) # Remove pontos de milhar, mantém apenas o último - valor_limpo = valor_limpo.replace(',', '.') # Substitui vírgula por ponto decimal - - try: - valor_float = float(valor_limpo) - total_diario += valor_float - erro = False - except ValueError: - valor_float = None - erro = True - - # Adiciona os dados à lista de resultados e agora ele informa se hove erro e passa o valor_limpo sem conversão de float. - results.append({ - 'data': data, - 'interessado': interessado, - 'valor': valor_float, - 'valor_limpo': valor_limpo, - 'erro': erro - }) - # não adicionei o total diario mas ele pode ser facilmente implementado aqui ou no front. - - return results - else: - # Se a solicitação falhar, retorne o código de status - return response.status_code diff --git a/Back/Puxador_credito.py b/Back/Puxador_credito.py deleted file mode 100644 index 153eb456b..000000000 --- a/Back/Puxador_credito.py +++ /dev/null @@ -1,85 +0,0 @@ -from fastapi import FastAPI -import requests -import re -from typing import List, Dict, Union -from pydantic import BaseModel -from datetime import date - -class DateRange(BaseModel): - published_since: date - published_until: date - -async def puxador_credito(date_range: DateRange) -> Union[List[Dict[str, Union[str, float]]], int]: - # Formatando as datas no formato americano - published_since_str = date_range.published_since.strftime('%Y-%m-%d') - published_until_str = date_range.published_until.strftime('%Y-%m-%d') - - # Fazendo a solicitação GET para a API - response = requests.get( - f'https://queridodiario.ok.org.br/api/gazettes?territory_ids=5300108&published_since={published_since_str}&published_until={published_until_str}&querystring=%22Abre%20cr%C3%A9dito%20suplementar%22&excerpt_size=120&number_of_excerpts=100000&pre_tags=&post_tags=&size=10000&sort_by=descending_date') - - # Verificando se a solicitação foi bem-sucedida - if response.status_code == 200: - # Convertendo a resposta para JSON - dados = response.json() - - # Acessando a lista de gazettes dentro dos dados - gazettes = dados['gazettes'] - - # Lista para armazenar os dicionários com as informações extraídas - results = [] - - # Conjunto para armazenar as datas já vistas - datas_vistas = set() - - # Iterando sobre cada gazette na lista - for gazette in gazettes: - # Acessando a data de cada gazette - data = gazette['date'] - # url para o pdf do diario oficial - url = gazette['url'] - - # Verificando se a data já foi impressa - if data not in datas_vistas: - # Adicionando a data ao conjunto de datas vistas - datas_vistas.add(data) - - # Acessando a lista de excertos de cada gazette - excertos = gazette['excerpts'] - - - # Iterando sobre cada excerto - for excerto in excertos: - # Substituindo quebras de linha múltiplas por um único espaço - excerto = re.sub(r'\s+', ' ', excerto) - - # Usando expressão regular para encontrar o Decreto e Valor - decreto_match = re.search(r'DECRETO\s*N[ºo]\s*([\d.]+)', excerto, re.IGNORECASE) - valor_match = re.search(r'valor\s*de\s*R\$\s*([\d,.]+)', excerto, re.IGNORECASE) - - if decreto_match and valor_match: - # Extraindo o decreto encontrado - decreto = decreto_match.group(1).strip() - - # Extraindo o valor encontrado - valor = valor_match.group(1) - # Removendo caracteres não numéricos, exceto vírgulas e pontos - valor_limpo = re.sub(r'[^\d,.]', '', valor) - # Removendo pontos extras como separadores de milhar - valor_limpo = valor_limpo.replace('.', '') - # Trocando a vírgula por ponto para ter o formato correto para float - valor_limpo = valor_limpo.replace(',', '.') - # Convertendo o valor para float - valor_float = float(valor_limpo) - - results.append({ - "data": data, - "decreto": decreto, - "valor": valor_float - }) - - - return results - else: - # Se a solicitação falhar, retorne o código de status - return response.status_code diff --git a/Back/Puxador_educacao.py b/Back/Puxador_educacao.py deleted file mode 100644 index 82c6b4a3c..000000000 --- a/Back/Puxador_educacao.py +++ /dev/null @@ -1,155 +0,0 @@ -import re -import requests -from typing import List, Dict, Union -from pydantic import BaseModel -from datetime import date - -class DateRange(BaseModel): - published_since: date - published_until: date - -async def puxador_educacao(date_range: DateRange) -> Union[List[Dict[str, Union[str, float]]], int]: - # Formatando as datas no formato americano - published_since_str = date_range.published_since.strftime('%Y-%m-%d') - published_until_str = date_range.published_until.strftime('%Y-%m-%d') - - # Fazendo a solicitação GET para a API - response = requests.get( - f'https://queridodiario.ok.org.br/api/gazettes?territory_ids=5300108&published_since={published_since_str}&published_until={published_until_str}&querystring=%22N%C2%BA%20UE%20Custeio%20Total%22%20%22N%C2%BA%20CRE%2FUE%20Capital%20Custeio%20Total%22&excerpt_size=50000&number_of_excerpts=100&pre_tags=&post_tags=&size=10000&sort_by=descending_date' - ) - - # Verificando se a solicitação foi bem-sucedida - if response.status_code == 200: - # Convertendo a resposta para JSON - dados = response.json() - - # Acessando a lista de gazettes dentro dos dados - gazettes = dados['gazettes'] - - # Lista para armazenar os dicionários com as informações extraídas - results = [] - - # Conjunto para armazenar as datas já vistas - datas_vistas = set() - - # Iterando sobre cada gazette na lista - for gazette in gazettes: - # Acessando a data de cada gazette - data = gazette['date'] - - # Variável para armazenar o total gasto no dia - total_gasto_dia = 0.0 - - # Verificando se a data já foi impressa - if data not in datas_vistas: - # Adicionando a data ao conjunto de datas vistas - datas_vistas.add(data) - - # Acessando a lista de excertos de cada gazette - excertos = gazette['excerpts'] - - # Iterando sobre cada excerto - for excerto in excertos: - # Verificando se o padrão específico "Nº CRE/UE Capital Custeio Total" está presente no excerto - if "Nº CRE/UE Capital Custeio Total" in excerto: - # Dividindo o excerto por linhas - linhas = excerto.strip().split('\n') - - # Iterando sobre as linhas a partir da linha do cabeçalho - for linha in linhas[linhas.index("Nº CRE/UE Capital Custeio Total") + 1:]: - # Aplicando a expressão regular para capturar os valores - matches = re.findall(r'\d+\s+([\w\s]+?)\s+R\$\s*([\d,.]+)\s+R\$\s*([\d,.]+)\s+R\$\s*([\d,.]+)', linha) - - if matches: - for match in matches: - escola = match[0].strip() - total = match[3].strip() - - # Convertendo o valor total de texto para float - total = total.replace('.', '').replace(',', '.') - total_float = float(total) - - # Extraindo o nome do município do campo escola - municipio = escola.split('CRE')[-1].strip() - - # Adicionando o valor total ao total gasto no dia - total_gasto_dia += total_float - - # Adicionando o resultado à lista - results.append({ - "escola": escola, - "municipio": municipio, - "data": data, - "total": total_float - }) - - # Verificando se o padrão específico "Nº UE Custeio Total" está presente no excerto - if "Nº UE Custeio Total" in excerto: - # Dividindo o excerto por linhas - linhas = excerto.strip().split('\n') - - # Iterando sobre as linhas a partir da linha do cabeçalho - for linha in linhas[linhas.index("Nº UE Custeio Total") + 1:]: - # Aplicando a expressão regular para capturar os valores - matches = re.findall(r'\d+\s+([\w\s]+?)\s+R\$\s*([\d,.]+)\s+R\$\s*([\d,.]+)', linha) - - if matches: - for match in matches: - escola = match[0].strip() - total = match[2].strip() - - # Convertendo o valor total de texto para float - total = total.replace('.', '').replace(',', '.') - total_float = float(total) - - # Extraindo o nome do município do campo escola - municipio = escola.split('CRE')[-1].strip() - - # Adicionando o valor total ao total gasto no dia - total_gasto_dia += total_float - - # Adicionando o resultado à lista - results.append({ - "escola": escola, - "municipio": municipio, - "data": data, - "total": total_float - }) - - # Verificando o padrão específico "Nº CRE / UE Capital Custeio Total" no segundo formato - if "Nº CRE / UE Capital Custeio Total" in excerto: - # Dividindo o excerto por linhas - linhas = excerto.strip().split('\n') - - # Iterando sobre as linhas a partir da linha do cabeçalho - for linha in linhas[linhas.index("Nº CRE / UE Capital Custeio Total") + 1:]: - # Aplicando a expressão regular para capturar os valores - matches = re.findall(r'\d+\s+([\w\s]+?)\s+R\$\s*([\d,.]+)\s+R\$\s*([\d,.]+)\s+R\$\s*([\d,.]+)', linha) - - if matches: - for match in matches: - escola = match[0].strip() - total = match[3].strip() - - # Convertendo o valor total de texto para float - total = total.replace('.', '').replace(',', '.') - total_float = float(total) - - # Extraindo o nome do município do campo escola - municipio = escola.split('CRE')[-1].strip() - - # Adicionando o valor total ao total gasto no dia - total_gasto_dia += total_float - - # Adicionando o resultado à lista - results.append({ - "escola": escola, - "municipio": municipio, - "data": data, - "total": total_float - }) - - return results - else: - # Se a solicitação falhar, retorne o código de status - return response.status_code diff --git a/Back/__init__.py b/Back/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/Back/__pycache__/Puxador_bens.cpython-312.pyc b/Back/__pycache__/Puxador_bens.cpython-312.pyc deleted file mode 100644 index b0f7683483b48416fb589ef844b36862f5bbb39b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3676 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 Da0b&2 diff --git a/Back/__pycache__/Puxador_convenio.cpython-312.pyc b/Back/__pycache__/Puxador_convenio.cpython-312.pyc deleted file mode 100644 index d82df78a8f34efc004c14e16c10a3e26dbb83e59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3641 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 IDQ!CNcR=H3ga7~l diff --git a/Back/__pycache__/__init__.cpython-312.pyc b/Back/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 2a48fdac2d5dd801ea0517902440f7ced182637b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151 zcmX@j%ge<81hZK8q=D$iAOanHW&w&!XQ*V*Wb|9fP{ah}eFmxdWu~8zpPQ;*mYJ8S zZ&Xl}pOspYukW5%T#{d`>*A&xTv(czVrZoAl$e~YA0H1?RT3YsS5Wzj!zMRBr8Fni Xu80+A3?mR1gBTx~85tRin1L(+b37u= diff --git a/Back/__pycache__/puxador_bens.cpython-312.pyc b/Back/__pycache__/puxador_bens.cpython-312.pyc deleted file mode 100644 index 42d4ad3d3c223a4a587e4e617c4d000d718ec4a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3676 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 D739+`