Arthur-Attili commited on
Commit
3faa64c
·
verified ·
1 Parent(s): d4c30ed

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +170 -23
app.py CHANGED
@@ -7,6 +7,8 @@ import io
7
  import itertools
8
  from collections import defaultdict
9
  import gradio as gr
 
 
10
 
11
  FILE_ID = "1EoH8V3Fyls0mNa95VcBN6ZL1B552ty3X"
12
  URL = f"https://drive.google.com/uc?export=download&id={FILE_ID}"
@@ -83,7 +85,77 @@ def calcular_tempo_parcelas(combinacao):
83
  print(f"Erro tempo: {e}")
84
  return ""
85
 
86
- def buscar_combinacoes(credito, entrada, parcela, adm_selecionadas):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
87
  if not planilha_carregada:
88
  if not carregar_planilha():
89
  return "❌ Erro: planilha não carregada."
@@ -134,9 +206,11 @@ def buscar_combinacoes(credito, entrada, parcela, adm_selecionadas):
134
  break
135
 
136
  if not resultados:
137
- return "🚫 Nenhuma combinação encontrada."
 
 
138
  resultados.sort(key=lambda x: x[2])
139
- return formatar_resultados(resultados[:15])
140
 
141
  def formatar_resultados(resultados):
142
  if not resultados:
@@ -178,25 +252,98 @@ def formatar_resultados(resultados):
178
  # Carrega a planilha antes de iniciar
179
  carregar_planilha()
180
 
181
- # Interface usando gr.Interface (API automática em /api/predict)
182
- demo = gr.Interface(
183
- fn=buscar_combinacoes,
184
- inputs=[
185
- gr.Number(label="Crédito Desejado (R$)", value=30000, step=1000),
186
- gr.Number(label="Entrada Desejada (R$)", value=3000, step=100),
187
- gr.Number(label="Parcela Desejada (R$)", value=500, step=10),
188
- gr.Dropdown(
189
- choices=ADMIN_OPCOES,
190
- label="Filtrar por Administradoras",
191
- multiselect=True,
192
- value=ADMIN_OPCOES
193
- )
194
- ],
195
- outputs=gr.Textbox(label="Resultados da Busca", lines=20, max_lines=40),
196
- title="🚗 Busca de Combinações de Consórcio Auto",
197
- description="Insira os valores desejados para crédito, entrada e parcela, e filtre por administradora."
198
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
199
 
200
  if __name__ == "__main__":
201
- demo.launch()
202
- #
 
7
  import itertools
8
  from collections import defaultdict
9
  import gradio as gr
10
+ import time # Adicionado para compatibilidade com o código de imóveis
11
+ import math # Adicionado para compatibilidade com o código de imóveis
12
 
13
  FILE_ID = "1EoH8V3Fyls0mNa95VcBN6ZL1B552ty3X"
14
  URL = f"https://drive.google.com/uc?export=download&id={FILE_ID}"
 
85
  print(f"Erro tempo: {e}")
86
  return ""
87
 
88
+ def buscar_combinacoes_amplo(credito, entrada, parcela, adm_selecionadas, max_combinacoes=15):
89
+ """Busca combinações com tolerâncias mais amplas para valores altos."""
90
+ global grupos_auto
91
+ if not planilha_carregada:
92
+ if not carregar_planilha():
93
+ return "❌ Erro: planilha não carregada."
94
+
95
+ if adm_selecionadas:
96
+ grupos = {adm: cotas for adm, cotas in grupos_auto.items() if adm in adm_selecionadas}
97
+ else:
98
+ grupos = grupos_auto
99
+ if not grupos:
100
+ return "🚫 Nenhuma cota encontrada com os filtros."
101
+
102
+ # Tolerâncias mais amplas para valores altos
103
+ if credito > 5000000:
104
+ tol_cred, tol_ent, tol_par = 0.50, 0.50, 1.00
105
+ max_cotas = 25
106
+ elif credito > 100000:
107
+ tol_cred, tol_ent, tol_par = 0.25, 0.25, 0.50
108
+ max_cotas = 15
109
+ else:
110
+ tol_cred, tol_ent, tol_par = 0.15, 0.15, 0.30
111
+ max_cotas = 15
112
+
113
+ cred_min = credito * (1 - tol_cred)
114
+ cred_max = credito * (1 + tol_cred)
115
+ ent_min = entrada * (1 - tol_ent)
116
+ ent_max = entrada * (1 + tol_ent)
117
+ parc_min = parcela * (1 - tol_par)
118
+ parc_max = parcela * (1 + tol_par)
119
+
120
+ resultados = []
121
+ total_combinacoes_testadas = 0
122
+
123
+ for adm, cotas in grupos.items():
124
+ print(f"🔍 BUSCA AMPLA - Analisando administradora: {adm} ({len(cotas)} cotas)")
125
+ for r in range(1, min(max_cotas + 1, len(cotas) + 1)):
126
+ max_combinacoes_por_adm = 7000 if credito > 5000000 else 4000
127
+ combinacoes_geradas = 0
128
+ for comb in itertools.combinations(cotas, r):
129
+ if combinacoes_geradas >= max_combinacoes_por_adm:
130
+ break
131
+ total_combinacoes_testadas += 1
132
+ combinacoes_geradas += 1
133
+ total_cred = sum(c['valor_credito'] for c in comb)
134
+ total_ent_base = sum(c['valor_entrada'] for c in comb)
135
+ total_ent = total_ent_base + total_cred * 0.085
136
+ total_parc = sum(c['valor_parcela'] for c in comb)
137
+ if (cred_min <= total_cred <= cred_max and
138
+ ent_min <= total_ent <= ent_max and
139
+ parc_min <= total_parc <= parc_max):
140
+ total_saldo = sum(c['saldo_devedor'] for c in comb)
141
+ valor_final = total_ent + total_saldo
142
+ diff = abs(valor_final - total_cred)
143
+ resultados.append((adm, comb, diff))
144
+ if len(resultados) >= max_combinacoes * 2:
145
+ break
146
+ if len(resultados) >= max_combinacoes * 2:
147
+ break
148
+ if len(resultados) >= max_combinacoes * 2:
149
+ break
150
+
151
+ print(f"🔍 BUSCA AMPLA: Combinações válidas encontradas: {len(resultados)}")
152
+ if not resultados:
153
+ return "🚫 Nenhuma combinação adequada encontrada com os parâmetros fornecidos."
154
+
155
+ resultados.sort(key=lambda x: x[2])
156
+ return formatar_resultados(resultados[:max_combinacoes])
157
+
158
+ def buscar_combinacoes(credito, entrada, parcela, adm_selecionadas, max_combinacoes=15):
159
  if not planilha_carregada:
160
  if not carregar_planilha():
161
  return "❌ Erro: planilha não carregada."
 
206
  break
207
 
208
  if not resultados:
209
+ print("🔍 Nenhuma combinação encontrada. Tentando busca ampla...")
210
+ return buscar_combinacoes_amplo(credito, entrada, parcela, adm_selecionadas, max_combinacoes)
211
+
212
  resultados.sort(key=lambda x: x[2])
213
+ return formatar_resultados(resultados[:max_combinacoes])
214
 
215
  def formatar_resultados(resultados):
216
  if not resultados:
 
252
  # Carrega a planilha antes de iniciar
253
  carregar_planilha()
254
 
255
+ def get_administradoras_options():
256
+ """Retorna a lista de administradoras disponíveis para o dropdown."""
257
+ return ADMIN_OPCOES
258
+
259
+ def ajustar_e_buscar(credito_desejado, entrada_desejada, parcela_desejada, administradoras):
260
+ """Função wrapper para chamar a busca com os parâmetros ajustados."""
261
+ return buscar_combinacoes(credito_desejado, entrada_desejada, parcela_desejada, administradoras, max_combinacoes=15)
262
+
263
+ # Interface usando gr.Blocks para garantir carregamento correto (inspirado no código de imóveis)
264
+ with gr.Blocks(title="Sistema de Busca de Consórcio Auto") as demo:
265
+ gr.HTML("""
266
+ <link href="https://fonts.googleapis.com/css2?family=Poppins&display=swap" rel="stylesheet">
267
+ <style>
268
+ * {
269
+ font-family: 'Poppins', sans-serif !important;
270
+ }
271
+ body {
272
+ background-color: #ff8f00 !important;
273
+ color: black !important;
274
+ }
275
+ input[type="number"] {
276
+ background-color: white !important;
277
+ border: 2px solid #000 !important;
278
+ border-radius: 12px !important;
279
+ color: black !important;
280
+ padding: 10px !important;
281
+ font-weight: 500;
282
+ }
283
+ input[type="text"], textarea {
284
+ background-color: white !important;
285
+ border: 2px solid black !important;
286
+ border-radius: 12px !important;
287
+ color: black !important;
288
+ padding: 10px !important;
289
+ }
290
+ input::placeholder, textarea::placeholder {
291
+ color: #333 !important;
292
+ opacity: 0.7;
293
+ }
294
+ .gr-checkbox label {
295
+ display: flex;
296
+ align-items: center;
297
+ gap: 8px;
298
+ font-weight: 600;
299
+ }
300
+ input[type="checkbox"] {
301
+ accent-color: black !important;
302
+ width: 18px;
303
+ height: 18px;
304
+ }
305
+ .gr-button {
306
+ font-weight: bold;
307
+ border-radius: 10px !important;
308
+ background-color: white !important;
309
+ color: black !important;
310
+ border: 2px solid black !important;
311
+ }
312
+ .gr-button:hover {
313
+ background-color: #fff3e0 !important;
314
+ color: black !important;
315
+ }
316
+ label {
317
+ font-weight: 600 !important;
318
+ }
319
+ </style>
320
+ """)
321
+
322
+ gr.Markdown("# 🚗 Busca de Combinações de Consórcio Auto")
323
+ gr.Markdown("Insira os valores desejados para crédito, entrada e parcela, e filtre por administradora.")
324
+
325
+ with gr.Row():
326
+ credito_input = gr.Number(label="Crédito Desejado (R$)", value=30000, step=1000)
327
+ entrada_input = gr.Number(label="Entrada Desejada (R$)", value=3000, step=100)
328
+ parcela_input = gr.Number(label="Parcela Desejada (R$)", value=500, step=10)
329
+
330
+ administradoras_multiselect = gr.CheckboxGroup(
331
+ label="Filtrar por Administradoras",
332
+ choices=get_administradoras_options(),
333
+ value=get_administradoras_options() # Seleciona todas por padrão
334
+ )
335
+
336
+ submit_btn = gr.Button("🔍 Buscar Combinações", variant="primary")
337
+ output_text = gr.Textbox(label="Resultados da Busca", lines=20, max_lines=40, interactive=False, placeholder="Os resultados aparecerão aqui...")
338
+
339
+ submit_btn.click(
340
+ fn=ajustar_e_buscar,
341
+ inputs=[credito_input, entrada_input, parcela_input, administradoras_multiselect],
342
+ outputs=output_text
343
+ )
344
+
345
+ gr.Markdown("---")
346
+ gr.Markdown("Desenvolvido para auxiliar na busca por cotas de consórcio ideais.")
347
 
348
  if __name__ == "__main__":
349
+ demo.launch()