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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +21 -169
app.py CHANGED
@@ -7,8 +7,6 @@ import io
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,77 +83,7 @@ def calcular_tempo_parcelas(combinacao):
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,11 +134,9 @@ def buscar_combinacoes(credito, entrada, parcela, adm_selecionadas, max_combinac
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,98 +178,24 @@ def formatar_resultados(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()
 
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
  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
  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
  # 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()