Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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
|
|
|
|
|
|
|
| 145 |
if not resultados or isinstance(resultados, str):
|
| 146 |
return resultados
|
| 147 |
|
| 148 |
-
resposta =
|
| 149 |
|
| 150 |
-
|
| 151 |
-
|
| 152 |
-
|
| 153 |
-
|
| 154 |
-
|
| 155 |
-
|
| 156 |
-
|
| 157 |
-
|
| 158 |
-
|
| 159 |
-
|
| 160 |
-
|
| 161 |
-
|
| 162 |
-
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
|
| 166 |
-
|
| 167 |
-
|
| 168 |
-
|
| 169 |
-
|
| 170 |
-
|
| 171 |
-
|
| 172 |
-
|
| 173 |
-
|
| 174 |
-
|
| 175 |
-
|
| 176 |
-
|
| 177 |
-
|
| 178 |
-
|
| 179 |
-
|
| 180 |
-
|
| 181 |
-
|
| 182 |
-
|
| 183 |
-
|
| 184 |
-
|
| 185 |
-
|
| 186 |
-
|
| 187 |
-
|
| 188 |
-
|
| 189 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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):
|