Arthur-Attili commited on
Commit
5543d6f
·
verified ·
1 Parent(s): 757e554

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +19 -15
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
- if len(cotas_validas) < 1:
 
102
  continue
103
 
104
- # Limita para 12 cotas por admin para performance
105
- if len(cotas_validas) > 12:
106
- cotas_validas = cotas_validas[:12]
107
 
108
- # Busca combinações de 1 a 6 cotas (mais rápido)
109
- for r in range(1, min(10, len(cotas_validas)) + 1):
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) >= 25: # Limite total
128
  break
129
 
130
- if len(resultados) >= 25:
131
  break
132
 
133
- if len(resultados) >= 25:
134
  break
135
 
136
  if not resultados:
137
- # 🆘 SE NÃO ENCONTRAR, TENTA COM TOLERÂNCIAS MUITO AMPLAS
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.70, credito_desejado * 1.30
147
- entrada_min, entrada_max = entrada_desejada * 0.60, entrada_desejada * 1.40
148
- parcela_min, parcela_max = parcela_desejada * 0.40, parcela_desejada * 2.00
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=30000, step=1000)
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(