Arthur-Attili commited on
Commit
a547bbb
·
verified ·
1 Parent(s): b564964

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +31 -35
app.py CHANGED
@@ -1,6 +1,7 @@
1
  import os
2
  os.environ["GRADIO_ANALYTICS_ENABLED"] = "False"
3
  os.environ["HF_HUB_DISABLE_TELEMETRY"] = "1"
 
4
  import pandas as pd
5
  import requests
6
  import io
@@ -8,15 +9,17 @@ import itertools
8
  from collections import defaultdict
9
  import gradio as gr
10
 
11
- # 🔧 CONFIGURAÇÕES
12
  FILE_ID = "1EoH8V3Fyls0mNa95VcBN6ZL1B552ty3X"
13
  URL = f"https://drive.google.com/uc?export=download&id={FILE_ID}"
14
 
 
15
  df_auto = None
16
  grupos_auto = None
17
  planilha_carregada = False
18
  ADMIN_OPCOES = []
19
 
 
20
  def carregar_planilha():
21
  global df_auto, grupos_auto, planilha_carregada, ADMIN_OPCOES
22
 
@@ -24,7 +27,7 @@ def carregar_planilha():
24
  return True
25
 
26
  try:
27
- print("⏳ Carregando planilha...")
28
  response = requests.get(URL)
29
  response.raise_for_status()
30
  data = io.BytesIO(response.content)
@@ -53,12 +56,12 @@ def carregar_planilha():
53
  ADMIN_OPCOES = sorted(df_auto['administradora'].unique())
54
  planilha_carregada = True
55
 
56
- print(f"✅ Total de cotas: {len(df_auto)}")
57
- print(f"✅ Administradoras: {ADMIN_OPCOES}")
58
  return True
59
 
60
  except Exception as e:
61
- print(f"❌ Erro: {e}")
62
  return False
63
 
64
 
@@ -67,8 +70,7 @@ def formatar_moeda(valor):
67
 
68
 
69
  def definir_margens_absolutas(credito, entrada, parcela):
70
- """Margens fixas em R$ (ex.: 30.000 → 10.000 de margem total = 20k40k)."""
71
- margem_credito = 20_000
72
  margem_entrada = 2_000
73
  margem_parcela = 100
74
 
@@ -83,12 +85,10 @@ def definir_margens_absolutas(credito, entrada, parcela):
83
 
84
 
85
  def filtrar_cotas_por_faixa(cotas, cred_min, cred_max):
86
- """Remove cotas que não têm chance real de entrar na faixa de crédito."""
87
  return [c for c in cotas if c['valor_credito'] < cred_max * 2]
88
 
89
 
90
  def calcular_tempo_parcelas(combinacao):
91
- """Calcula o tempo de parcelas por faixa de prazo."""
92
  if not combinacao:
93
  return ""
94
 
@@ -126,14 +126,14 @@ def calcular_tempo_parcelas(combinacao):
126
  return "\\n".join(resultado) if resultado else ""
127
 
128
  except Exception as e:
129
- print(f"Erro calculando tempo de parcelas: {e}")
130
  return ""
131
 
132
 
133
  def buscar_combinacoes(credito, entrada, parcela, adm_selecionadas):
134
  if not planilha_carregada:
135
  if not carregar_planilha():
136
- return "❌ Erro: planilha não carregada."
137
 
138
  # Filtra administradoras
139
  if adm_selecionadas:
@@ -142,19 +142,16 @@ def buscar_combinacoes(credito, entrada, parcela, adm_selecionadas):
142
  grupos = grupos_auto
143
 
144
  if not grupos:
145
- return "🚫 Nenhuma cota encontrada com os filtros."
146
 
147
- print(f"🔍 Total de administradoras: {len(grupos)}")
148
-
149
- # Usa margens ABSOLUTAS em R$
150
  cred_min, cred_max, ent_min, ent_max, parc_min, parc_max = definir_margens_absolutas(
151
  float(credito or 0),
152
  float(entrada or 0),
153
  float(parcela or 0)
154
  )
155
 
156
- print(f"💰 Crédito desejado: R$ {credito:,.2f}")
157
- print(f"🔍 Margem crédito: {cred_min:,.2f} – {cred_max:,.2f}")
158
 
159
  # Limites de busca
160
  max_cotas_combinacao = 15
@@ -164,7 +161,7 @@ def buscar_combinacoes(credito, entrada, parcela, adm_selecionadas):
164
  total_combinacoes_testadas = 0
165
 
166
  for adm, cotas in grupos.items():
167
- print(f"🔍 Administradora: {adm} ({len(cotas)} cotas)")
168
  cotas_filtradas = filtrar_cotas_por_faixa(cotas, cred_min, cred_max)
169
 
170
  for r in range(1, min(max_cotas_combinacao + 1, len(cotas_filtradas) + 1)):
@@ -188,31 +185,27 @@ def buscar_combinacoes(credito, entrada, parcela, adm_selecionadas):
188
  total_saldo = sum(c['saldo_devedor'] for c in combinacao)
189
  valor_final = round(total_ent + total_saldo, 2)
190
  diff = abs(valor_final - total_cred)
191
-
192
  resultados.append((adm, combinacao, diff))
193
 
194
  if len(resultados) >= 45:
195
  break
196
-
197
  if len(resultados) >= 45:
198
  break
199
-
200
  if len(resultados) >= 45:
201
  break
202
 
203
- print(f"🔍 Total de combinações testadas: {total_combinacoes_testadas}")
204
- print(f"🔍 Resultados válidos: {len(resultados)}")
205
 
206
  if not resultados:
207
- return "🚫 Nenhuma combinação encontrada com os parâmetros fornecidos."
208
 
209
- resultados.sort(key=lambda x: x[2]) # menor diferença
210
  return formatar_resultados(resultados[:15])
211
 
212
 
213
  def formatar_resultados(resultados):
214
  if not resultados:
215
- return "🚫 Nenhuma combinação adequada encontrada."
216
 
217
  resposta = ""
218
  for idx, (adm, comb, _) in enumerate(resultados, 1):
@@ -231,7 +224,7 @@ def formatar_resultados(resultados):
231
  tempo = calcular_tempo_parcelas(comb)
232
 
233
  resposta += f"""
234
- --- COMBINAÇÃO {idx} ---
235
  🏢 Administradora: {adm}
236
  🔢 Códigos: {', '.join(codigos)} ({len(comb)} cotas)
237
  💰 Crédito Total: {formatar_moeda(total_cred)}
@@ -250,11 +243,12 @@ def formatar_resultados(resultados):
250
  return resposta
251
 
252
 
253
- # Carrega uma vez
254
  carregar_planilha()
255
 
256
- # Interface Gradio (com Blocks, igual ao imóvel)
257
- with gr.Blocks(title="🚗 Busca de Consórcio Auto (Otimizado)") as demo:
 
258
  gr.HTML("""
259
  <link href="https://fonts.googleapis.com/css2?family=Poppins&display=swap" rel="stylesheet">
260
  <style>
@@ -289,12 +283,13 @@ with gr.Blocks(title="🚗 Busca de Consórcio Auto (Otimizado)") as demo:
289
  choices=ADMIN_OPCOES,
290
  label="Filtrar por Administradoras",
291
  multiselect=True,
292
- value=ADMIN_OPCOES
 
293
  )
294
 
295
- submit_btn = gr.Button("🔍 Buscar Combinações", variant="primary")
296
  output_text = gr.Textbox(
297
- label="Resultados da Busca",
298
  lines=20,
299
  max_lines=40,
300
  interactive=False,
@@ -310,6 +305,7 @@ with gr.Blocks(title="🚗 Busca de Consórcio Auto (Otimizado)") as demo:
310
  gr.Markdown("---")
311
  gr.Markdown("Desenvolvido para auxiliar na busca por cotas de consórcio automotivo.")
312
 
313
- # Inicia o app
 
314
  if __name__ == "__main__":
315
- demo.launch()
 
1
  import os
2
  os.environ["GRADIO_ANALYTICS_ENABLED"] = "False"
3
  os.environ["HF_HUB_DISABLE_TELEMETRY"] = "1"
4
+
5
  import pandas as pd
6
  import requests
7
  import io
 
9
  from collections import defaultdict
10
  import gradio as gr
11
 
12
+ # 🔧 CONFIGURAÇÕES DO ARQUIVO
13
  FILE_ID = "1EoH8V3Fyls0mNa95VcBN6ZL1B552ty3X"
14
  URL = f"https://drive.google.com/uc?export=download&id={FILE_ID}"
15
 
16
+ # Variáveis globais
17
  df_auto = None
18
  grupos_auto = None
19
  planilha_carregada = False
20
  ADMIN_OPCOES = []
21
 
22
+
23
  def carregar_planilha():
24
  global df_auto, grupos_auto, planilha_carregada, ADMIN_OPCOES
25
 
 
27
  return True
28
 
29
  try:
30
+ print("⏳ Carregando planilha de automóveis...")
31
  response = requests.get(URL)
32
  response.raise_for_status()
33
  data = io.BytesIO(response.content)
 
56
  ADMIN_OPCOES = sorted(df_auto['administradora'].unique())
57
  planilha_carregada = True
58
 
59
+ print(f"✅ Total de cotas AUTO: {len(df_auto)}")
60
+ print(f"✅ Administradoras AUTO: {ADMIN_OPCOES}")
61
  return True
62
 
63
  except Exception as e:
64
+ print(f"❌ Erro ao carregar planilha AUTO: {e}")
65
  return False
66
 
67
 
 
70
 
71
 
72
  def definir_margens_absolutas(credito, entrada, parcela):
73
+ margem_credito = 20_000 # ex.: 30.000 → 10.000–50.000
 
74
  margem_entrada = 2_000
75
  margem_parcela = 100
76
 
 
85
 
86
 
87
  def filtrar_cotas_por_faixa(cotas, cred_min, cred_max):
 
88
  return [c for c in cotas if c['valor_credito'] < cred_max * 2]
89
 
90
 
91
  def calcular_tempo_parcelas(combinacao):
 
92
  if not combinacao:
93
  return ""
94
 
 
126
  return "\\n".join(resultado) if resultado else ""
127
 
128
  except Exception as e:
129
+ print(f"Erro calcular tempo de parcelas AUTO: {e}")
130
  return ""
131
 
132
 
133
  def buscar_combinacoes(credito, entrada, parcela, adm_selecionadas):
134
  if not planilha_carregada:
135
  if not carregar_planilha():
136
+ return "❌ Erro: planilha de automóveis não carregada."
137
 
138
  # Filtra administradoras
139
  if adm_selecionadas:
 
142
  grupos = grupos_auto
143
 
144
  if not grupos:
145
+ return "🚫 Nenhuma cota de automóvel encontrada com os filtros."
146
 
147
+ # Margens absolutas
 
 
148
  cred_min, cred_max, ent_min, ent_max, parc_min, parc_max = definir_margens_absolutas(
149
  float(credito or 0),
150
  float(entrada or 0),
151
  float(parcela or 0)
152
  )
153
 
154
+ print(f"💰 AUTO - Crédito: R$ {credito:,.2f} → [{cred_min:,.2f}, {cred_max:,.2f}]")
 
155
 
156
  # Limites de busca
157
  max_cotas_combinacao = 15
 
161
  total_combinacoes_testadas = 0
162
 
163
  for adm, cotas in grupos.items():
164
+ print(f"🔍 AUTO - Administradora: {adm} ({len(cotas)} cotas)")
165
  cotas_filtradas = filtrar_cotas_por_faixa(cotas, cred_min, cred_max)
166
 
167
  for r in range(1, min(max_cotas_combinacao + 1, len(cotas_filtradas) + 1)):
 
185
  total_saldo = sum(c['saldo_devedor'] for c in combinacao)
186
  valor_final = round(total_ent + total_saldo, 2)
187
  diff = abs(valor_final - total_cred)
 
188
  resultados.append((adm, combinacao, diff))
189
 
190
  if len(resultados) >= 45:
191
  break
 
192
  if len(resultados) >= 45:
193
  break
 
194
  if len(resultados) >= 45:
195
  break
196
 
197
+ print(f"🔍 AUTO - Total de combinações testadas: {total_combinacoes_testadas}")
 
198
 
199
  if not resultados:
200
+ return "🚫 Nenhuma combinação de auto encontrada com os parâmetros fornecidos."
201
 
202
+ resultados.sort(key=lambda x: x[2])
203
  return formatar_resultados(resultados[:15])
204
 
205
 
206
  def formatar_resultados(resultados):
207
  if not resultados:
208
+ return "🚫 Nenhuma combinação de auto adequada encontrada."
209
 
210
  resposta = ""
211
  for idx, (adm, comb, _) in enumerate(resultados, 1):
 
224
  tempo = calcular_tempo_parcelas(comb)
225
 
226
  resposta += f"""
227
+ --- COMBINAÇÃO {idx} AUTO ---
228
  🏢 Administradora: {adm}
229
  🔢 Códigos: {', '.join(codigos)} ({len(comb)} cotas)
230
  💰 Crédito Total: {formatar_moeda(total_cred)}
 
243
  return resposta
244
 
245
 
246
+ # 🔁 Carregar a planilha uma vez, no início do programa
247
  carregar_planilha()
248
 
249
+
250
+ # Interface Gradio (exatamente igual ao imóvel, com Blocks)
251
+ with gr.Blocks(title="🚗 Sistema de Busca de Consórcio Auto") as demo_auto:
252
  gr.HTML("""
253
  <link href="https://fonts.googleapis.com/css2?family=Poppins&display=swap" rel="stylesheet">
254
  <style>
 
283
  choices=ADMIN_OPCOES,
284
  label="Filtrar por Administradoras",
285
  multiselect=True,
286
+ value=ADMIN_OPCOES,
287
+ interactive=True
288
  )
289
 
290
+ submit_btn = gr.Button("🔍 Buscar Combinações AUTO", variant="primary")
291
  output_text = gr.Textbox(
292
+ label="Resultados AUTO",
293
  lines=20,
294
  max_lines=40,
295
  interactive=False,
 
305
  gr.Markdown("---")
306
  gr.Markdown("Desenvolvido para auxiliar na busca por cotas de consórcio automotivo.")
307
 
308
+
309
+ # Executar o app
310
  if __name__ == "__main__":
311
+ demo_auto.launch()