Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -86,6 +86,10 @@ def buscar_combinacoes(credito_desejado, entrada_desejada, parcela_desejada, adm
|
|
| 86 |
grupos = agrupar_por_administradora(df_filtrado)
|
| 87 |
resultados = []
|
| 88 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 89 |
for adm, cotas in grupos.items():
|
| 90 |
# 🔥 OTIMIZAÇÃO: Pré-filtra cotas viáveis
|
| 91 |
cotas_validas = []
|
|
@@ -98,22 +102,22 @@ def buscar_combinacoes(credito_desejado, entrada_desejada, parcela_desejada, adm
|
|
| 98 |
parcela_min <= parcela_cota <= parcela_max):
|
| 99 |
cotas_validas.append(cota)
|
| 100 |
|
| 101 |
-
|
|
|
|
| 102 |
continue
|
| 103 |
|
| 104 |
-
# Limita para
|
| 105 |
-
if len(cotas_validas) >
|
| 106 |
-
cotas_validas = cotas_validas[:
|
| 107 |
|
| 108 |
-
#
|
| 109 |
-
for r in range(
|
| 110 |
for combinacao in itertools.combinations(cotas_validas, r):
|
| 111 |
total_credito = sum(c.get('valor_credito', 0) for c in combinacao)
|
| 112 |
total_entrada_base = sum(c.get('valor_entrada', 0) for c in combinacao)
|
| 113 |
total_entrada = total_entrada_base + (total_credito * 0.085)
|
| 114 |
total_parcelas = sum(c.get('valor_parcela', 0) for c in combinacao)
|
| 115 |
|
| 116 |
-
# ✅ VERIFICAÇÃO COM TOLERÂNCIAS AMPLAS
|
| 117 |
if (credito_min <= total_credito <= credito_max and
|
| 118 |
entrada_min <= total_entrada <= entrada_max and
|
| 119 |
parcela_min <= total_parcelas <= parcela_max):
|
|
@@ -124,17 +128,17 @@ def buscar_combinacoes(credito_desejado, entrada_desejada, parcela_desejada, adm
|
|
| 124 |
|
| 125 |
resultados.append((adm, combinacao, diferenca))
|
| 126 |
|
| 127 |
-
if len(resultados) >=
|
| 128 |
break
|
| 129 |
|
| 130 |
-
if len(resultados) >=
|
| 131 |
break
|
| 132 |
|
| 133 |
-
if len(resultados) >=
|
| 134 |
break
|
| 135 |
|
| 136 |
if not resultados:
|
| 137 |
-
# 🆘 SE NÃO ENCONTRAR, TENTA COM TOLERÂNCIAS
|
| 138 |
return buscar_combinacoes_emergencia(credito_desejado, entrada_desejada, parcela_desejada, administradoras)
|
| 139 |
|
| 140 |
resultados.sort(key=lambda x: x[2])
|
|
@@ -143,9 +147,9 @@ def buscar_combinacoes(credito_desejado, entrada_desejada, parcela_desejada, adm
|
|
| 143 |
def buscar_combinacoes_emergencia(credito_desejado, entrada_desejada, parcela_desejada, administradoras):
|
| 144 |
"""Busca com tolerâncias muito amplas para garantir algum resultado."""
|
| 145 |
# Tolerâncias de emergência
|
| 146 |
-
credito_min, credito_max = credito_desejado * 0.
|
| 147 |
-
entrada_min, entrada_max = entrada_desejada * 0.
|
| 148 |
-
parcela_min, parcela_max = parcela_desejada * 0.
|
| 149 |
|
| 150 |
def formatar_moeda(valor):
|
| 151 |
return f"R$ {valor:,.2f}".replace(",", "v").replace(".", ",").replace("v", ".")
|
|
@@ -277,7 +281,7 @@ with gr.Blocks(title="Sistema de Busca de Consórcio Imóvel") as demo:
|
|
| 277 |
|
| 278 |
with gr.Row():
|
| 279 |
credito_input = gr.Number(label="Crédito Desejado (R$)", value=300000, step=1000)
|
| 280 |
-
entrada_input = gr.Number(label="Entrada Desejada (R$)", value=
|
| 281 |
parcela_input = gr.Number(label="Parcela Desejada (R$)", value=2500, step=100)
|
| 282 |
|
| 283 |
administradoras_multiselect = gr.CheckboxGroup(
|
|
|
|
| 86 |
grupos = agrupar_por_administradora(df_filtrado)
|
| 87 |
resultados = []
|
| 88 |
|
| 89 |
+
# ✅ FORÇAR MÍNIMO DE 3 COTAS
|
| 90 |
+
MIN_COTAS = 3
|
| 91 |
+
MAX_COTAS = 10
|
| 92 |
+
|
| 93 |
for adm, cotas in grupos.items():
|
| 94 |
# 🔥 OTIMIZAÇÃO: Pré-filtra cotas viáveis
|
| 95 |
cotas_validas = []
|
|
|
|
| 102 |
parcela_min <= parcela_cota <= parcela_max):
|
| 103 |
cotas_validas.append(cota)
|
| 104 |
|
| 105 |
+
# ✅ IGNORA ADMIN COM POUCAS COTAS
|
| 106 |
+
if len(cotas_validas) < MIN_COTAS:
|
| 107 |
continue
|
| 108 |
|
| 109 |
+
# Limita para 15 cotas por admin para performance
|
| 110 |
+
if len(cotas_validas) > 15:
|
| 111 |
+
cotas_validas = cotas_validas[:15]
|
| 112 |
|
| 113 |
+
# ✅ BUSCA APENAS COMBINAÇÕES COM 3-10 COTAS
|
| 114 |
+
for r in range(MIN_COTAS, min(MAX_COTAS, len(cotas_validas)) + 1):
|
| 115 |
for combinacao in itertools.combinations(cotas_validas, r):
|
| 116 |
total_credito = sum(c.get('valor_credito', 0) for c in combinacao)
|
| 117 |
total_entrada_base = sum(c.get('valor_entrada', 0) for c in combinacao)
|
| 118 |
total_entrada = total_entrada_base + (total_credito * 0.085)
|
| 119 |
total_parcelas = sum(c.get('valor_parcela', 0) for c in combinacao)
|
| 120 |
|
|
|
|
| 121 |
if (credito_min <= total_credito <= credito_max and
|
| 122 |
entrada_min <= total_entrada <= entrada_max and
|
| 123 |
parcela_min <= total_parcelas <= parcela_max):
|
|
|
|
| 128 |
|
| 129 |
resultados.append((adm, combinacao, diferenca))
|
| 130 |
|
| 131 |
+
if len(resultados) >= 20: # Limite total
|
| 132 |
break
|
| 133 |
|
| 134 |
+
if len(resultados) >= 20:
|
| 135 |
break
|
| 136 |
|
| 137 |
+
if len(resultados) >= 20:
|
| 138 |
break
|
| 139 |
|
| 140 |
if not resultados:
|
| 141 |
+
# 🆘 SE NÃO ENCONTRAR, TENTA COM TOLERÂNCIAS MAIS AMPLAS
|
| 142 |
return buscar_combinacoes_emergencia(credito_desejado, entrada_desejada, parcela_desejada, administradoras)
|
| 143 |
|
| 144 |
resultados.sort(key=lambda x: x[2])
|
|
|
|
| 147 |
def buscar_combinacoes_emergencia(credito_desejado, entrada_desejada, parcela_desejada, administradoras):
|
| 148 |
"""Busca com tolerâncias muito amplas para garantir algum resultado."""
|
| 149 |
# Tolerâncias de emergência
|
| 150 |
+
credito_min, credito_max = credito_desejado * 0.60, credito_desejado * 1.40
|
| 151 |
+
entrada_min, entrada_max = entrada_desejada * 0.50, entrada_desejada * 1.50
|
| 152 |
+
parcela_min, parcela_max = parcela_desejada * 0.30, parcela_desejada * 2.50
|
| 153 |
|
| 154 |
def formatar_moeda(valor):
|
| 155 |
return f"R$ {valor:,.2f}".replace(",", "v").replace(".", ",").replace("v", ".")
|
|
|
|
| 281 |
|
| 282 |
with gr.Row():
|
| 283 |
credito_input = gr.Number(label="Crédito Desejado (R$)", value=300000, step=1000)
|
| 284 |
+
entrada_input = gr.Number(label="Entrada Desejada (R$)", value=45000, step=1000)
|
| 285 |
parcela_input = gr.Number(label="Parcela Desejada (R$)", value=2500, step=100)
|
| 286 |
|
| 287 |
administradoras_multiselect = gr.CheckboxGroup(
|