Arthur-Attili commited on
Commit
a7992d0
·
verified ·
1 Parent(s): 1e2a89c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +98 -42
app.py CHANGED
@@ -141,53 +141,109 @@ def buscar_combinacoes_rapido(credito_desejado, entrada_desejada, parcela_deseja
141
  return f"❌ Erro inesperado: {str(e)}"
142
 
143
  def formatar_resultados(resultados):
144
- """Formata os resultados para exibição com layout IDÊNTICO ao de Automóvel."""
 
 
145
  if not resultados or isinstance(resultados, str):
146
  return resultados
147
 
148
- resposta = f"🎯 **{len(resultados)} combinações encontradas**\n\n"
149
 
150
- for idx, (adm, combinacao, diferenca) in enumerate(resultados, 1):
151
- try:
152
- codigos = [str(c.get('codigo', 'N/A')) for c in combinacao]
153
- total_credito = sum(c['valor_credito'] for c in combinacao)
154
- total_entrada_base = sum(c['valor_entrada'] for c in combinacao)
155
- total_entrada = total_entrada_base + (total_credito * 0.085)
156
- total_saldo = sum(c['saldo_devedor'] for c in combinacao)
157
- total_parcelas = sum(c['valor_parcela'] for c in combinacao)
158
- maior_prazo = max(int(c.get('qtd_parcelas', 0)) for c in combinacao)
159
-
160
- valor_final = round(total_entrada + total_saldo, 2)
161
- credito_real = round(total_credito - total_entrada, 2)
162
- taxa_total = total_saldo - credito_real
163
- taxa_percentual = (taxa_total / credito_real) * 100 if credito_real > 0 else 0
164
- taxa_mensal = taxa_percentual / maior_prazo if maior_prazo > 0 else 0
165
-
166
- # FORMATAÇÃO IDÊNTICA AO CARD DE AUTOMÓVEL
167
- resposta += f"""
168
- {adm} - Imóvel
169
-
170
- Crédito
171
- {formatar_moeda(total_credito)}
172
-
173
- 🏦 Entrada: {formatar_moeda(total_entrada)}
174
- 📅 Prazo: {maior_prazo} meses
175
- 💳 Parcela: {formatar_moeda(total_parcelas)}
176
- 📉 Saldo Devedor: {formatar_moeda(total_saldo)}
177
- 📊 Taxa Mensal: {taxa_mensal:.2f}%
178
- 📈 Taxa Anual: {taxa_mensal * 12:.2f}%
179
- 🔢 Código: {', '.join(codigos)}
180
-
181
- 🔍 Ver mais detalhes ▼
182
-
183
- 🎯 **Valor Final:** {formatar_moeda(valor_final)}
184
- 💎 **Crédito Líquido:** {formatar_moeda(credito_real)}
185
- **Taxa Total:** {taxa_percentual:.2f}% ({formatar_moeda(taxa_total)})
186
- """
187
- except Exception as e:
188
- print(f"⚠️ Erro ao formatar resultado: {e}")
189
- continue
 
 
 
 
 
 
 
 
 
190
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
191
  return resposta
192
 
193
  def ajustar_e_buscar(credito_desejado, entrada_desejada, parcela_desejada, administradoras):
 
141
  return f"❌ Erro inesperado: {str(e)}"
142
 
143
  def formatar_resultados(resultados):
144
+ """Formata os resultados para exibição com diversificação por administradora."""
145
+ from collections import defaultdict
146
+
147
  if not resultados or isinstance(resultados, str):
148
  return resultados
149
 
150
+ resposta = ""
151
 
152
+ # 1. Agrupar os resultados por administradora, mantendo a diferença para ordenação interna
153
+ grouped_by_adm = defaultdict(list)
154
+ for adm, combinacao, diferenca in resultados:
155
+ grouped_by_adm[adm].append((combinacao, diferenca))
156
+
157
+ # 2. Ordenar as combinações dentro de cada administradora pela diferença (do menor para o maior)
158
+ for adm in grouped_by_adm:
159
+ grouped_by_adm[adm].sort(key=lambda x: x[1]) # x[1] é a diferença
160
+
161
+ final_resultados_diversificados = []
162
+
163
+ # Dicionário para acompanhar o índice da próxima combinação a ser pega de cada administradora
164
+ adm_indices = {adm: 0 for adm in grouped_by_adm.keys()}
165
+
166
+ # Lista de administradoras ativas (que ainda têm combinações disponíveis)
167
+ active_adms = list(grouped_by_adm.keys())
168
+
169
+ current_adm_idx = 0 # Índice para ciclar entre as administradoras ativas
170
+
171
+ # Loop para selecionar até 15 combinações, garantindo diversidade
172
+ while len(final_resultados_diversificados) < 15 and active_adms:
173
+ # Pega a administradora da vez para selecionar uma combinação
174
+ adm_da_vez = active_adms[current_adm_idx]
175
+
176
+ # Pega o índice da próxima combinação para essa administradora
177
+ idx_na_adm = adm_indices[adm_da_vez]
178
+
179
+ # Verifica se essa administradora ainda tem combinações disponíveis
180
+ if idx_na_adm < len(grouped_by_adm[adm_da_vez]):
181
+ # Pega a combinação (ignorando a diferença, que já foi usada para ordenar internamente)
182
+ combinacao_data, _ = grouped_by_adm[adm_da_vez][idx_na_adm]
183
+
184
+ # Adiciona à lista de resultados final (com a administradora e a combinação)
185
+ final_resultados_diversificados.append((adm_da_vez, combinacao_data))
186
+
187
+ # Incrementa o índice para a próxima vez que pegarmos dessa administradora
188
+ adm_indices[adm_da_vez] += 1
189
+ else:
190
+ # Se essa administradora não tem mais combinações, remove ela da lista de ativas
191
+ active_adms.pop(current_adm_idx)
192
+ # Ajusta o current_adm_idx se a lista diminuiu e estamos no limite
193
+ if current_adm_idx >= len(active_adms) and active_adms:
194
+ current_adm_idx = 0 # Volta para o início da lista se removemos o último
195
+
196
+ # Move para a próxima administradora no ciclo (garantindo que não estouramos o índice da lista active_adms)
197
+ if active_adms: # Só avança se ainda houver administradoras ativas
198
+ current_adm_idx = (current_adm_idx + 1) % len(active_adms)
199
+ else:
200
+ break # Não há mais administradoras ativas, sai do loop
201
 
202
+ # Agora, itera sobre os resultados diversificados para formatar a resposta
203
+ for idx, (adm, combinacao) in enumerate(final_resultados_diversificados, 1):
204
+ codigos = [str(c.get('codigo', 'N/A')) for c in combinacao]
205
+ total_credito = sum(c['valor_credito'] for c in combinacao)
206
+ total_entrada_base = sum(c['valor_entrada'] for c in combinacao)
207
+ total_entrada = total_entrada_base + (total_credito * 0.085)
208
+ total_saldo = sum(c['saldo_devedor'] for c in combinacao)
209
+ total_parcelas = sum(c['valor_parcela'] for c in combinacao)
210
+ maior_prazo = max(int(c.get('qtd_parcelas', 0)) for c in combinacao)
211
+
212
+ valor_final = round(total_entrada + total_saldo, 2)
213
+ credito_real = round(total_credito - total_entrada, 2)
214
+ taxa_total = total_saldo - credito_real
215
+ taxa_percentual = (taxa_total / credito_real) * 100 if credito_real > 0 else 0
216
+ taxa_mensal = taxa_percentual / maior_prazo if maior_prazo > 0 else 0
217
+
218
+ # FORMATAÇÃO COMPLETA IDÊNTICA AO CARD DE AUTOMÓVEL
219
+ resposta += f"""
220
+ ## {adm} - Imóvel
221
+
222
+ ### Crédito
223
+ **{formatar_moeda(total_credito)}**
224
+
225
+ **Entrada:** {formatar_moeda(total_entrada)}
226
+ **Prazo:** {maior_prazo} meses
227
+ **Parcela:** {formatar_moeda(total_parcelas)}
228
+
229
+ **Saldo Devedor:** {formatar_moeda(total_saldo)}
230
+ **Taxa Mensal:** {taxa_mensal:.2f}%
231
+ **Taxa Anual:** {taxa_mensal * 12:.2f}%
232
+ **Código:** {', '.join(codigos)}
233
+
234
+ ---
235
+
236
+ ### Ver mais detalhes ▼
237
+
238
+ **Valor Final:** {formatar_moeda(valor_final)}
239
+ **Crédito Líquido:** {formatar_moeda(credito_real)}
240
+ **Taxa Total:** {taxa_percentual:.2f}% ({formatar_moeda(taxa_total)})
241
+
242
+ **Nº de Cotas:** {len(combinacao)}
243
+
244
+ ---
245
+
246
+ """
247
  return resposta
248
 
249
  def ajustar_e_buscar(credito_desejado, entrada_desejada, parcela_desejada, administradoras):