Arthur-Attili commited on
Commit
eeb3b83
·
verified ·
1 Parent(s): 16042bb

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +173 -241
app.py CHANGED
@@ -1,3 +1,10 @@
 
 
 
 
 
 
 
1
  import pandas as pd
2
  import requests
3
  import io
@@ -5,9 +12,9 @@ import itertools
5
  from collections import defaultdict
6
  import gradio as gr
7
  import time
8
- import random
9
 
10
  # 🔧 CONFIGURAÇÕES GLOBAIS
 
11
  FILE_ID = "1XvNz7DlWioT64uNdcfBSL8Ui2nRSi9gT"
12
  URL = f"https://drive.google.com/uc?export=download&id={FILE_ID}"
13
 
@@ -19,7 +26,7 @@ def carregar_planilha():
19
  global df
20
  try:
21
  print("⏳ Carregando planilha...")
22
- response = requests.get(URL, timeout=30)
23
  response.raise_for_status()
24
  data = io.BytesIO(response.content)
25
  df = pd.read_excel(data)
@@ -34,10 +41,8 @@ def carregar_planilha():
34
  df[coluna] = pd.to_numeric(df[coluna], errors='coerce').fillna(0)
35
 
36
  # Verifica colunas essenciais
37
- colunas_necessarias = ['tipo_do_bem', 'administradora', 'valor_credito', 'valor_entrada', 'valor_parcela']
38
- for coluna in colunas_necessarias:
39
- if coluna not in df.columns:
40
- raise ValueError(f"Coluna essencial não encontrada: {coluna}")
41
 
42
  # Remove duplicatas
43
  df.drop_duplicates(inplace=True)
@@ -56,183 +61,66 @@ def agrupar_por_administradora(dataframe):
56
  grupos[row['administradora']].append(row.to_dict())
57
  return grupos
58
 
59
- def formatar_moeda(valor):
60
- """Formata valor como moeda brasileira."""
61
- try:
62
- return f"R$ {valor:,.2f}".replace(",", "v").replace(".", ",").replace("v", ".")
63
- except:
64
- return f"R$ {valor}"
 
65
 
66
- def buscar_combinacoes_eficiente(credito_desejado, entrada_desejada, parcela_desejada, administradoras=None):
67
- """Busca combinações de forma eficiente e garantida."""
68
- try:
69
- print("🔍 Iniciando busca de combinações...")
70
-
71
- if df is None:
72
- print("⚠️ DataFrame não carregado, tentando carregar...")
73
- if not carregar_planilha():
74
- return "❌ Erro: Planilha não carregada."
75
-
76
- # Debug: verifica se o DataFrame foi carregado
77
- print(f"✅ DataFrame carregado com {len(df)} linhas")
78
- print(f"📋 Colunas disponíveis: {list(df.columns)}")
79
-
80
- # Filtra por tipo de bem
81
- if 'tipo_do_bem' not in df.columns:
82
- return "❌ Coluna 'tipo_do_bem' não encontrada na planilha."
83
-
84
- df_filtrado = df[df['tipo_do_bem'].str.lower() == 'imovel']
85
- print(f"📊 Imóveis filtrados: {len(df_filtrado)} linhas")
86
-
87
- if administradoras:
88
- if isinstance(administradoras, tuple):
89
- administradoras = list(administradoras)
90
- print(f"🎯 Administradoras selecionadas: {administradoras}")
91
- df_filtrado = df_filtrado[df_filtrado['administradora'].isin(administradoras)]
92
- print(f"📊 Após filtrar administradoras: {len(df_filtrado)} linhas")
93
-
94
- if df_filtrado.empty:
95
- return "🚫 Nenhuma cota encontrada com os filtros aplicados."
96
-
97
- # Debug: mostra algumas administradoras disponíveis
98
- adm_disponiveis = df_filtrado['administradora'].unique()[:5]
99
- print(f"🏢 Primeiras administradoras disponíveis: {adm_disponiveis}")
100
-
101
- # Tolerâncias amplas para garantir resultados
102
- credito_min, credito_max = credito_desejado * 0.80, credito_desejado * 1.20
103
- entrada_min, entrada_max = entrada_desejada * 0.75, entrada_desejada * 1.25
104
- parcela_min, parcela_max = parcela_desejada * 0.50, parcela_desejada * 1.50
105
-
106
- grupos = agrupar_por_administradora(df_filtrado)
107
- print(f"📦 Grupos formados: {len(grupos)} administradoras")
108
-
109
- resultados = []
110
- MIN_COTAS = 3
111
- MAX_COTAS = 10
112
-
113
- for adm, cotas in grupos.items():
114
- print(f"🔍 Processando {adm} com {len(cotas)} cotas")
115
-
116
- if len(cotas) < MIN_COTAS:
117
- continue
118
-
119
- # Ordena por valor de crédito (otimização)
120
- cotas_ordenadas = sorted(cotas, key=lambda x: x.get('valor_credito', 0))
121
-
122
- # Busca combinações de forma inteligente
123
- for tamanho in range(MIN_COTAS, min(MAX_COTAS + 1, len(cotas_ordenadas) + 1)):
124
- # Amostra para evitar explosão combinatória
125
- for i in range(0, len(cotas_ordenadas), max(1, len(cotas_ordenadas) // 5)):
126
- for j in range(i + tamanho, min(i + 20, len(cotas_ordenadas))):
127
- combinacao = cotas_ordenadas[i:j]
128
- if len(combinacao) != tamanho:
129
- continue
130
-
131
- try:
132
- total_credito = sum(c.get('valor_credito', 0) for c in combinacao)
133
- total_entrada_base = sum(c.get('valor_entrada', 0) for c in combinacao)
134
- total_entrada = total_entrada_base + (total_credito * 0.085)
135
- total_parcelas = sum(c.get('valor_parcela', 0) for c in combinacao)
136
-
137
- if (credito_min <= total_credito <= credito_max and
138
- entrada_min <= total_entrada <= entrada_max and
139
- parcela_min <= total_parcelas <= parcela_max):
140
-
141
- total_saldo = sum(c.get('saldo_devedor', 0) for c in combinacao)
142
- valor_final = round(total_entrada + total_saldo, 2)
143
- diferenca = abs(valor_final - total_credito)
144
-
145
- resultados.append((adm, combinacao, diferenca))
146
-
147
- if len(resultados) >= 50:
148
- break
149
- except Exception as e:
150
- print(f"⚠️ Erro em combinação: {e}")
151
- continue
152
-
153
- if len(resultados) >= 50:
154
- break
155
-
156
- if len(resultados) >= 50:
157
- break
158
-
159
- if len(resultados) >= 50:
160
- break
161
-
162
- print(f"✅ Busca concluída: {len(resultados)} combinações encontradas")
163
-
164
- if not resultados:
165
- return "🚫 Nenhuma combinação adequada encontrada. Tente ampliar os filtros."
166
-
167
- resultados.sort(key=lambda x: x[2])
168
- return formatar_resultados(resultados[:15])
169
-
170
- except Exception as e:
171
- error_msg = f"❌ Erro inesperado: {str(e)}"
172
- print(error_msg)
173
- return error_msg
174
 
175
- def formatar_resultados(resultados):
176
- """Formata os resultados para exibição com diversificação por administradora."""
177
- from collections import defaultdict
178
-
179
- if not resultados or isinstance(resultados, str):
180
- return resultados
181
-
182
- resposta = ""
183
-
184
- # 1. Agrupar os resultados por administradora, mantendo a diferença para ordenação interna
185
- grouped_by_adm = defaultdict(list)
186
- for adm, combinacao, diferenca in resultados:
187
- grouped_by_adm[adm].append((combinacao, diferenca))
188
 
189
- # 2. Ordenar as combinações dentro de cada administradora pela diferença (do menor para o maior)
190
- for adm in grouped_by_adm:
191
- grouped_by_adm[adm].sort(key=lambda x: x[1]) # x[1] é a diferença
 
192
 
193
- final_resultados_diversificados = []
194
-
195
- # Dicionário para acompanhar o índice da próxima combinação a ser pega de cada administradora
196
- adm_indices = {adm: 0 for adm in grouped_by_adm.keys()}
197
 
198
- # Lista de administradoras ativas (que ainda têm combinações disponíveis)
199
- active_adms = list(grouped_by_adm.keys())
200
-
201
- current_adm_idx = 0 # Índice para ciclar entre as administradoras ativas
202
-
203
- # Loop para selecionar até 15 combinações, garantindo diversidade
204
- while len(final_resultados_diversificados) < 15 and active_adms:
205
- # Pega a administradora da vez para selecionar uma combinação
206
- adm_da_vez = active_adms[current_adm_idx]
207
-
208
- # Pega o índice da próxima combinação para essa administradora
209
- idx_na_adm = adm_indices[adm_da_vez]
210
-
211
- # Verifica se essa administradora ainda tem combinações disponíveis
212
- if idx_na_adm < len(grouped_by_adm[adm_da_vez]):
213
- # Pega a combinação (ignorando a diferença, que já foi usada para ordenar internamente)
214
- combinacao_data, _ = grouped_by_adm[adm_da_vez][idx_na_adm]
215
-
216
- # Adiciona à lista de resultados final (com a administradora e a combinação)
217
- final_resultados_diversificados.append((adm_da_vez, combinacao_data))
218
-
219
- # Incrementa o índice para a próxima vez que pegarmos dessa administradora
220
- adm_indices[adm_da_vez] += 1
221
- else:
222
- # Se essa administradora não tem mais combinações, remove ela da lista de ativas
223
- active_adms.pop(current_adm_idx)
224
- # Ajusta o current_adm_idx se a lista diminuiu e estamos no limite
225
- if current_adm_idx >= len(active_adms) and active_adms:
226
- current_adm_idx = 0 # Volta para o início da lista se removemos o último
227
-
228
- # Move para a próxima administradora no ciclo (garantindo que não estouramos o índice da lista active_adms)
229
- if active_adms: # avança se ainda houver administradoras ativas
230
- current_adm_idx = (current_adm_idx + 1) % len(active_adms)
231
- else:
232
- break # Não há mais administradoras ativas, sai do loop
233
-
234
- # Agora, itera sobre os resultados diversificados para formatar a resposta
235
- for idx, (adm, combinacao) in enumerate(final_resultados_diversificados, 1):
236
  codigos = [str(c.get('codigo', 'N/A')) for c in combinacao]
237
  total_credito = sum(c['valor_credito'] for c in combinacao)
238
  total_entrada_base = sum(c['valor_entrada'] for c in combinacao)
@@ -247,84 +135,125 @@ def formatar_resultados(resultados):
247
  taxa_percentual = (taxa_total / credito_real) * 100 if credito_real > 0 else 0
248
  taxa_mensal = taxa_percentual / maior_prazo if maior_prazo > 0 else 0
249
 
250
- # FORMATAÇÃO COMPLETA IDÊNTICA AO CARD DE AUTOMÓVEL
251
  resposta += f"""
252
- ## {adm} - Imóvel
253
-
254
- ### Crédito
255
- **{formatar_moeda(total_credito)}**
256
-
257
- **Entrada:** {formatar_moeda(total_entrada)}
258
- **Prazo:** {maior_prazo} meses
259
- **Parcela:** {formatar_moeda(total_parcelas)}
260
-
261
- **Saldo Devedor:** {formatar_moeda(total_saldo)}
262
- **Taxa Mensal:** {taxa_mensal:.2f}%
263
- **Taxa Anual:** {taxa_mensal * 12:.2f}%
264
- **Código:** {', '.join(codigos)}
265
-
266
- ---
267
-
268
- ### Ver mais detalhes ▼
269
-
270
- **Valor Final:** {formatar_moeda(valor_final)}
271
- **Crédito Líquido:** {formatar_moeda(credito_real)}
272
- **Taxa Total:** {taxa_percentual:.2f}% ({formatar_moeda(taxa_total)})
273
-
274
- **Nº de Cotas:** {len(combinacao)}
275
-
276
- ---
277
-
278
  """
279
  return resposta
280
 
281
- def ajustar_e_buscar(credito_desejado, entrada_desejada, parcela_desejada, administradoras):
282
- """Função principal ajustada para a interface."""
283
- try:
284
- if credito_desejado is None or entrada_desejada is None or parcela_desejada is None:
285
- return "⚠️ Preencha todos os valores corretamente."
286
-
287
- entrada_calculada = credito_desejado * 0.085 + entrada_desejada
288
-
289
- resultado = buscar_combinacoes_rapido(
290
- credito_desejado, entrada_calculada, parcela_desejada, administradoras
291
- )
292
-
293
- return resultado
294
-
295
- except Exception as e:
296
- return f"❌ Erro na busca: {str(e)}"
297
-
298
- # Carrega a planilha ao iniciar
299
  carregar_planilha()
300
 
 
 
 
 
301
  # Prepara a lista de administradoras para o Gradio
302
  def get_administradoras_options():
303
- try:
304
- if df is not None and 'administradora' in df.columns and 'tipo_do_bem' in df.columns:
305
- adm_list = df[df['tipo_do_bem'].str.lower() == 'imovel']['administradora'].unique()
306
- return sorted([adm for adm in adm_list if pd.notna(adm)])
307
- return []
308
- except:
309
- return []
310
-
311
- # Interface Gradio simplificada
312
- with gr.Blocks(title="Sistema de Busca de Consórcio", theme=gr.themes.Default()) as demo:
313
- gr.Markdown("# 🏠 Busca de Combinações de Consórcio Imóvel")
 
 
 
 
 
 
 
314
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
315
  with gr.Row():
316
- credito_input = gr.Number(label="Crédito Desejado (R$)", value=2000000, step=1000)
317
- entrada_input = gr.Number(label="Entrada Desejada (R$)", value=300000, step=1000)
318
- parcela_input = gr.Number(label="Parcela Desejada (R$)", value=20000, step=100)
319
 
320
  administradoras_multiselect = gr.CheckboxGroup(
321
  label="Filtrar por Administradoras",
322
  choices=get_administradoras_options(),
323
- value=get_administradoras_options()
324
  )
325
 
326
  submit_btn = gr.Button("🔍 Buscar Combinações", variant="primary")
327
- output_text = gr.Textbox(label="Resultados da Busca", lines=20, max_lines=40)
 
328
 
329
  submit_btn.click(
330
  fn=ajustar_e_buscar,
@@ -332,6 +261,9 @@ with gr.Blocks(title="Sistema de Busca de Consórcio", theme=gr.themes.Default()
332
  outputs=output_text
333
  )
334
 
335
- # Inicia o aplicativo
 
 
 
336
  if __name__ == "__main__":
337
- demo.launch(server_name="0.0.0.0", server_port=7860, share=False)
 
1
+ """Imovel.ipynb
2
+ Automatically generated by Colab.
3
+ Original file is located at
4
+ https://colab.research.google.com/drive/1DZAQZfrXvTy358Vg2qfUg_ge6b3kcgBy
5
+ """
6
+
7
+ # app.py
8
  import pandas as pd
9
  import requests
10
  import io
 
12
  from collections import defaultdict
13
  import gradio as gr
14
  import time
 
15
 
16
  # 🔧 CONFIGURAÇÕES GLOBAIS
17
+ # Certifique-se de que este FILE_ID esteja acessível publicamente ou para "Qualquer pessoa com o link"
18
  FILE_ID = "1XvNz7DlWioT64uNdcfBSL8Ui2nRSi9gT"
19
  URL = f"https://drive.google.com/uc?export=download&id={FILE_ID}"
20
 
 
26
  global df
27
  try:
28
  print("⏳ Carregando planilha...")
29
+ response = requests.get(URL)
30
  response.raise_for_status()
31
  data = io.BytesIO(response.content)
32
  df = pd.read_excel(data)
 
41
  df[coluna] = pd.to_numeric(df[coluna], errors='coerce').fillna(0)
42
 
43
  # Verifica colunas essenciais
44
+ if 'tipo_do_bem' not in df.columns or 'administradora' not in df.columns:
45
+ raise ValueError("Colunas essenciais não encontradas")
 
 
46
 
47
  # Remove duplicatas
48
  df.drop_duplicates(inplace=True)
 
61
  grupos[row['administradora']].append(row.to_dict())
62
  return grupos
63
 
64
+ def buscar_combinacoes(credito_desejado, entrada_desejada, parcela_desejada, administradoras=None):
65
+ """Busca combinações de cotas dentro dos parâmetros especificados."""
66
+ # Garante que o DataFrame está carregado
67
+ if df is None:
68
+ # Tenta carregar se ainda não foi carregado
69
+ if not carregar_planilha():
70
+ return "❌ Erro: Planilha não carregada. Por favor, tente novamente."
71
 
72
+ # Filtra por tipo de bem e administradoras
73
+ df_filtrado = df[df['tipo_do_bem'].str.lower() == 'imovel']
74
+ if administradoras:
75
+ # Certifica-se de que administradoras é uma lista (Gradio retorna tupla)
76
+ if isinstance(administradoras, tuple):
77
+ administradoras = list(administradoras)
78
+ df_filtrado = df_filtrado[df_filtrado['administradora'].isin(administradoras)]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
 
80
+ if df_filtrado.empty:
81
+ return "🚫 Nenhuma cota encontrada com os filtros aplicados. Tente ajustar os parâmetros."
 
 
 
 
 
 
 
 
 
 
 
82
 
83
+ # Define faixas de tolerância
84
+ credito_min, credito_max = credito_desejado * 0.93, credito_desejado * 1.07
85
+ entrada_min, entrada_max = entrada_desejada * 0.93, entrada_desejada * 1.07
86
+ parcela_min, parcela_max = parcela_desejada * 0.75, parcela_desejada * 1.25
87
 
88
+ grupos = agrupar_por_administradora(df_filtrado)
89
+ resultados = []
 
 
90
 
91
+ for adm, cotas in grupos.items():
92
+ for r in range(1, min(3, len(cotas)) + 1): # Máximo 3 cotas por combinação
93
+ for combinacao in itertools.combinations(cotas, r):
94
+ total_credito = sum(c['valor_credito'] for c in combinacao)
95
+ total_entrada_base = sum(c['valor_entrada'] for c in combinacao)
96
+ total_entrada = total_entrada_base + (total_credito * 0.085) # aplica os 8,5% sobre o crédito
97
+ total_parcelas = sum(c['valor_parcela'] for c in combinacao)
98
+
99
+ if (credito_min <= total_credito <= credito_max and
100
+ entrada_min <= total_entrada <= entrada_max and
101
+ parcela_min <= total_parcelas <= parcela_max):
102
+
103
+ total_saldo = sum(c['saldo_devedor'] for c in combinacao)
104
+ valor_final = round(total_entrada + total_saldo, 2)
105
+ diferenca = abs(valor_final - total_credito) # Diferença do valor final pelo crédito (para ordenação)
106
+
107
+ resultados.append((adm, combinacao, diferenca))
108
+
109
+ if not resultados:
110
+ return "🚫 Nenhuma combinação adequada encontrada com os parâmetros fornecidos."
111
+
112
+ resultados.sort(key=lambda x: x[2]) # Ordena pela diferença
113
+
114
+ return formatar_resultados(resultados)
115
+
116
+ def formatar_moeda(valor):
117
+ return f"R$ {valor:,.2f}".replace(",", "v").replace(".", ",").replace("v", ".")
118
+
119
+ def formatar_resultados(resultados):
120
+ """Formata os resultados para exibição."""
121
+ resposta = ""
122
+ # Limita a 15 resultados para evitar saídas muito longas
123
+ for idx, (adm, combinacao, _) in enumerate(resultados[:15], 1):
 
 
 
 
 
124
  codigos = [str(c.get('codigo', 'N/A')) for c in combinacao]
125
  total_credito = sum(c['valor_credito'] for c in combinacao)
126
  total_entrada_base = sum(c['valor_entrada'] for c in combinacao)
 
135
  taxa_percentual = (taxa_total / credito_real) * 100 if credito_real > 0 else 0
136
  taxa_mensal = taxa_percentual / maior_prazo if maior_prazo > 0 else 0
137
 
 
138
  resposta += f"""
139
+ --- COMBINAÇÃO {idx} ---
140
+ 🏢 Administradora: {adm}
141
+ 🔢 Códigos: {', '.join(codigos)}
142
+ 💰 Crédito Total: {formatar_moeda(total_credito)}
143
+ 💵 Entrada (+comissão): {formatar_moeda(total_entrada)}
144
+ 📉 Saldo Devedor: {formatar_moeda(total_saldo)}
145
+ 💲 Parcela: {formatar_moeda(total_parcelas)}
146
+ ⏳ Prazo: {maior_prazo} meses
147
+ 🔚 Valor Final: {formatar_moeda(valor_final)}
148
+ 💠 Crédito Líquido: {formatar_moeda(credito_real)}
149
+ 📊 Taxa Total: {taxa_percentual:.2f}% ({formatar_moeda(taxa_total)})
150
+ 🗓️ Taxa Mensal: {taxa_mensal:.2f}%
151
+ 🗓️ Taxa Anual: {taxa_mensal * 12:.2f}%
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  """
153
  return resposta
154
 
155
+ # Carrega a planilha uma vez quando o aplicativo inicia
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
156
  carregar_planilha()
157
 
158
+ def ajustar_e_buscar(credito_desejado, entrada_desejada, parcela_desejada, administradoras):
159
+ entrada_calculada = credito_desejado * 0.085 + entrada_desejada
160
+ return buscar_combinacoes(credito_desejado, entrada_calculada, parcela_desejada, administradoras)
161
+
162
  # Prepara a lista de administradoras para o Gradio
163
  def get_administradoras_options():
164
+ if df is not None:
165
+ adm_list = df[df['tipo_do_bem'].str.lower() == 'imovel']['administradora'].unique()
166
+ return sorted(adm_list)
167
+ return []
168
+
169
+ # Criando a interface Gradio
170
+ with gr.Blocks(title="Sistema de Busca de Consórcio Imóvel") as demo:
171
+ gr.HTML("""
172
+ <link href="https://fonts.googleapis.com/css2?family=Poppins&display=swap" rel="stylesheet">
173
+ <style>
174
+ * {
175
+ font-family: 'Poppins', sans-serif !important;
176
+ }
177
+
178
+ body {
179
+ background-color: #ff8f00 !important;
180
+ color: black !important;
181
+ }
182
 
183
+ /* Inputs Numéricos: Crédito, Entrada, Parcela */
184
+ input[type="number"] {
185
+ background-color: white !important;
186
+ border: 2px solid #000 !important;
187
+ border-radius: 12px !important;
188
+ color: black !important;
189
+ padding: 10px !important;
190
+ font-weight: 500;
191
+ }
192
+
193
+ /* Inputs de texto e áreas de texto (como a saída e código) */
194
+ input[type="text"], textarea {
195
+ background-color: white !important;
196
+ border: 2px solid black !important;
197
+ border-radius: 12px !important;
198
+ color: black !important;
199
+ padding: 10px !important;
200
+ }
201
+
202
+ input::placeholder, textarea::placeholder {
203
+ color: #333 !important;
204
+ opacity: 0.7;
205
+ }
206
+
207
+ .gr-checkbox label {
208
+ display: flex;
209
+ align-items: center;
210
+ gap: 8px;
211
+ font-weight: 600;
212
+ }
213
+
214
+ input[type="checkbox"] {
215
+ accent-color: black !important;
216
+ width: 18px;
217
+ height: 18px;
218
+ }
219
+
220
+ .gr-button {
221
+ font-weight: bold;
222
+ border-radius: 10px !important;
223
+ background-color: white !important;
224
+ color: black !important;
225
+ border: 2px solid black !important;
226
+ }
227
+
228
+ .gr-button:hover {
229
+ background-color: #fff3e0 !important;
230
+ color: black !important;
231
+ }
232
+
233
+ label {
234
+ font-weight: 600 !important;
235
+ }
236
+ </style>
237
+ """)
238
+
239
+
240
+ gr.Markdown("# 🏠 Busca de Combinações de Consórcio Imóvel")
241
+ gr.Markdown("Insira os valores desejados para crédito, entrada e parcela, e filtre por administradora.")
242
+
243
  with gr.Row():
244
+ credito_input = gr.Number(label="Crédito Desejado (R$)", value=300000, step=1000)
245
+ entrada_input = gr.Number(label="Entrada Desejada (R$)", value=30000, step=1000)
246
+ parcela_input = gr.Number(label="Parcela Desejada (R$)", value=1500, step=100)
247
 
248
  administradoras_multiselect = gr.CheckboxGroup(
249
  label="Filtrar por Administradoras",
250
  choices=get_administradoras_options(),
251
+ value=get_administradoras_options() # Seleciona todas por padrão
252
  )
253
 
254
  submit_btn = gr.Button("🔍 Buscar Combinações", variant="primary")
255
+
256
+ output_text = gr.Textbox(label="Resultados da Busca", lines=20, max_lines=40, interactive=False, placeholder="Os resultados aparecerão aqui...")
257
 
258
  submit_btn.click(
259
  fn=ajustar_e_buscar,
 
261
  outputs=output_text
262
  )
263
 
264
+ gr.Markdown("---")
265
+ gr.Markdown("Desenvolvido para auxiliar na busca por cotas de consórcio ideais.")
266
+
267
+ # Inicia o aplicativo Gradio
268
  if __name__ == "__main__":
269
+ demo.launch() # Você não precisa disso no Colab, mas sim no arquivo que você fará o deploy