Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
|
@@ -63,8 +63,6 @@ def agrupar_por_administradora(dataframe):
|
|
| 63 |
|
| 64 |
def buscar_combinacoes(credito_desejado, entrada_desejada, parcela_desejada, administradoras=None):
|
| 65 |
"""Busca combinações de cotas para automóveis dentro dos parâmetros especificados."""
|
| 66 |
-
# Garante que o DataFrame está carregado antes de cada busca
|
| 67 |
-
# Isso é útil caso a sessão expire ou o DF seja limpo por algum motivo no servidor do HF.
|
| 68 |
global df
|
| 69 |
if df is None:
|
| 70 |
if not carregar_planilha():
|
|
@@ -73,12 +71,11 @@ def buscar_combinacoes(credito_desejado, entrada_desejada, parcela_desejada, adm
|
|
| 73 |
# Filtra por tipo de bem (Auto) e administradoras selecionadas
|
| 74 |
df_filtrado = df[df['tipo_do_bem'].str.lower() == 'auto']
|
| 75 |
if administradoras:
|
| 76 |
-
if isinstance(administradoras, tuple):
|
| 77 |
administradoras = list(administradoras)
|
| 78 |
-
administradoras = [a.strip().lower() for a in administradoras]
|
| 79 |
df_filtrado = df_filtrado[df_filtrado['administradora'].isin(administradoras)]
|
| 80 |
|
| 81 |
-
|
| 82 |
if df_filtrado.empty:
|
| 83 |
return "🚫 Nenhuma cota de automóvel encontrada com os filtros aplicados."
|
| 84 |
|
|
@@ -89,13 +86,20 @@ def buscar_combinacoes(credito_desejado, entrada_desejada, parcela_desejada, adm
|
|
| 89 |
|
| 90 |
grupos = agrupar_por_administradora(df_filtrado)
|
| 91 |
resultados = []
|
|
|
|
| 92 |
|
| 93 |
for adm, cotas in grupos.items():
|
| 94 |
-
|
|
|
|
|
|
|
|
|
|
| 95 |
for combinacao in itertools.combinations(cotas, r):
|
|
|
|
|
|
|
|
|
|
| 96 |
total_credito = sum(c['valor_credito'] for c in combinacao)
|
| 97 |
total_entrada_base = sum(c['valor_entrada'] for c in combinacao)
|
| 98 |
-
total_entrada = total_entrada_base + (total_credito * 0.085)
|
| 99 |
total_parcelas = sum(c['valor_parcela'] for c in combinacao)
|
| 100 |
|
| 101 |
if (credito_min <= total_credito <= credito_max and
|
|
@@ -107,11 +111,17 @@ def buscar_combinacoes(credito_desejado, entrada_desejada, parcela_desejada, adm
|
|
| 107 |
diferenca = abs(valor_final - total_credito)
|
| 108 |
|
| 109 |
resultados.append((adm, combinacao, diferenca))
|
|
|
|
| 110 |
|
| 111 |
if not resultados:
|
| 112 |
return "Nenhuma combinação adequada encontrada para automóveis com os parâmetros fornecidos."
|
| 113 |
|
|
|
|
| 114 |
resultados.sort(key=lambda x: x[2])
|
|
|
|
|
|
|
|
|
|
|
|
|
| 115 |
return formatar_resultados(resultados)
|
| 116 |
|
| 117 |
def formatar_moeda(valor):
|
|
|
|
| 63 |
|
| 64 |
def buscar_combinacoes(credito_desejado, entrada_desejada, parcela_desejada, administradoras=None):
|
| 65 |
"""Busca combinações de cotas para automóveis dentro dos parâmetros especificados."""
|
|
|
|
|
|
|
| 66 |
global df
|
| 67 |
if df is None:
|
| 68 |
if not carregar_planilha():
|
|
|
|
| 71 |
# Filtra por tipo de bem (Auto) e administradoras selecionadas
|
| 72 |
df_filtrado = df[df['tipo_do_bem'].str.lower() == 'auto']
|
| 73 |
if administradoras:
|
| 74 |
+
if isinstance(administradoras, tuple):
|
| 75 |
administradoras = list(administradoras)
|
| 76 |
+
administradoras = [a.strip().lower() for a in administradoras]
|
| 77 |
df_filtrado = df_filtrado[df_filtrado['administradora'].isin(administradoras)]
|
| 78 |
|
|
|
|
| 79 |
if df_filtrado.empty:
|
| 80 |
return "🚫 Nenhuma cota de automóvel encontrada com os filtros aplicados."
|
| 81 |
|
|
|
|
| 86 |
|
| 87 |
grupos = agrupar_por_administradora(df_filtrado)
|
| 88 |
resultados = []
|
| 89 |
+
MAX_COMBINACOES_POR_ADM = 1000 # Limite para evitar processamento excessivo
|
| 90 |
|
| 91 |
for adm, cotas in grupos.items():
|
| 92 |
+
cotas = cotas[:20] # Limita a 20 cotas por administradora para evitar combinações explosivas
|
| 93 |
+
combinacoes_validas = 0
|
| 94 |
+
|
| 95 |
+
for r in range(1, min(5, len(cotas)) + 1): # Agora até 5 cotas
|
| 96 |
for combinacao in itertools.combinations(cotas, r):
|
| 97 |
+
if combinacoes_validas >= MAX_COMBINACOES_POR_ADM:
|
| 98 |
+
break
|
| 99 |
+
|
| 100 |
total_credito = sum(c['valor_credito'] for c in combinacao)
|
| 101 |
total_entrada_base = sum(c['valor_entrada'] for c in combinacao)
|
| 102 |
+
total_entrada = total_entrada_base + (total_credito * 0.085)
|
| 103 |
total_parcelas = sum(c['valor_parcela'] for c in combinacao)
|
| 104 |
|
| 105 |
if (credito_min <= total_credito <= credito_max and
|
|
|
|
| 111 |
diferenca = abs(valor_final - total_credito)
|
| 112 |
|
| 113 |
resultados.append((adm, combinacao, diferenca))
|
| 114 |
+
combinacoes_validas += 1
|
| 115 |
|
| 116 |
if not resultados:
|
| 117 |
return "Nenhuma combinação adequada encontrada para automóveis com os parâmetros fornecidos."
|
| 118 |
|
| 119 |
+
# Ordena por diferença (melhores combinações primeiro)
|
| 120 |
resultados.sort(key=lambda x: x[2])
|
| 121 |
+
|
| 122 |
+
# Limita o número total de resultados para evitar sobrecarga
|
| 123 |
+
resultados = resultados[:500]
|
| 124 |
+
|
| 125 |
return formatar_resultados(resultados)
|
| 126 |
|
| 127 |
def formatar_moeda(valor):
|