Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -71,32 +71,47 @@ def agrupar_por_administradora(dataframe):
|
|
| 71 |
return grupos
|
| 72 |
|
| 73 |
def calcular_tempo_parcelas(combinacao):
|
| 74 |
-
"""Calcula o tempo de parcelas baseado nas cotas da combinação."""
|
| 75 |
if not combinacao:
|
| 76 |
return ""
|
| 77 |
|
| 78 |
try:
|
| 79 |
-
#
|
| 80 |
-
|
|
|
|
|
|
|
|
|
|
| 81 |
|
| 82 |
-
if
|
| 83 |
return ""
|
| 84 |
|
| 85 |
-
|
| 86 |
-
|
| 87 |
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
segunda_faixa = maior_prazo - 36
|
| 96 |
|
| 97 |
-
|
| 98 |
-
|
| 99 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 100 |
|
| 101 |
except Exception as e:
|
| 102 |
print(f"❌ Erro ao calcular tempo de parcelas: {str(e)}")
|
|
@@ -290,7 +305,7 @@ def formatar_moeda(valor):
|
|
| 290 |
return f"R$ {valor:,.2f}".replace(",", "v").replace(".", ",").replace("v", ".")
|
| 291 |
|
| 292 |
def formatar_resultados(resultados):
|
| 293 |
-
"""Formata os resultados para exibição INCLUINDO TEMPO DE PARCELAS."""
|
| 294 |
if not resultados:
|
| 295 |
return "🚫 Nenhuma combinação adequada encontrada com os parâmetros fornecidos."
|
| 296 |
|
|
@@ -310,7 +325,7 @@ def formatar_resultados(resultados):
|
|
| 310 |
taxa_percentual = (taxa_total / credito_real) * 100 if credito_real > 0 else 0
|
| 311 |
taxa_mensal = taxa_percentual / maior_prazo if maior_prazo > 0 else 0
|
| 312 |
|
| 313 |
-
#
|
| 314 |
tempo_parcelas = calcular_tempo_parcelas(combinacao)
|
| 315 |
|
| 316 |
resposta += f"""
|
|
@@ -329,7 +344,7 @@ def formatar_resultados(resultados):
|
|
| 329 |
🗓️ Taxa Anual: {taxa_mensal * 12:.2f}%
|
| 330 |
|
| 331 |
⏰ TEMPO DE PARCELAS:
|
| 332 |
-
{tempo_parcelas}
|
| 333 |
|
| 334 |
"""
|
| 335 |
return resposta
|
|
|
|
| 71 |
return grupos
|
| 72 |
|
| 73 |
def calcular_tempo_parcelas(combinacao):
|
| 74 |
+
"""Calcula o tempo de parcelas baseado nas cotas da combinação - VERSÃO CORRIGIDA."""
|
| 75 |
if not combinacao:
|
| 76 |
return ""
|
| 77 |
|
| 78 |
try:
|
| 79 |
+
# Ordena as cotas pelo prazo (menor prazo primeiro)
|
| 80 |
+
cotas_ordenadas = sorted(combinacao, key=lambda x: int(x.get('qtd_parcelas', 0)))
|
| 81 |
+
|
| 82 |
+
# Encontra todos os prazos únicos e ordena
|
| 83 |
+
prazos = sorted(set(int(c.get('qtd_parcelas', 0)) for c in combinacao))
|
| 84 |
|
| 85 |
+
if not prazos or prazos[0] <= 0:
|
| 86 |
return ""
|
| 87 |
|
| 88 |
+
resultado = []
|
| 89 |
+
prazo_anterior = 0
|
| 90 |
|
| 91 |
+
for i, prazo_atual in enumerate(prazos):
|
| 92 |
+
# Calcula a soma das parcelas das cotas que estão ativas neste intervalo
|
| 93 |
+
cotas_ativas = [c for c in cotas_ordenadas if int(c.get('qtd_parcelas', 0)) >= prazo_anterior + 1]
|
| 94 |
+
valor_parcela_total = sum(c.get('valor_parcela', 0) for c in cotas_ativas)
|
| 95 |
+
|
| 96 |
+
inicio = prazo_anterior + 1
|
| 97 |
+
fim = prazo_atual
|
|
|
|
| 98 |
|
| 99 |
+
if inicio <= fim and valor_parcela_total > 0:
|
| 100 |
+
resultado.append(f"{inicio}x à {fim}x: {formatar_moeda(valor_parcela_total)}/mês")
|
| 101 |
+
|
| 102 |
+
prazo_anterior = prazo_atual
|
| 103 |
+
|
| 104 |
+
# Adiciona faixa final se houver cotas com prazos além do último ponto de quebra
|
| 105 |
+
if prazos and prazo_anterior < max(prazos):
|
| 106 |
+
cotas_ativas_finais = [c for c in cotas_ordenadas if int(c.get('qtd_parcelas', 0)) > prazo_anterior]
|
| 107 |
+
if cotas_ativas_finais:
|
| 108 |
+
valor_parcela_final = sum(c.get('valor_parcela', 0) for c in cotas_ativas_finais)
|
| 109 |
+
inicio_final = prazo_anterior + 1
|
| 110 |
+
fim_final = max(prazos)
|
| 111 |
+
if valor_parcela_final > 0:
|
| 112 |
+
resultado.append(f"{inicio_final}x à {fim_final}x: {formatar_moeda(valor_parcela_final)}/mês")
|
| 113 |
+
|
| 114 |
+
return "\n".join(resultado) if resultado else ""
|
| 115 |
|
| 116 |
except Exception as e:
|
| 117 |
print(f"❌ Erro ao calcular tempo de parcelas: {str(e)}")
|
|
|
|
| 305 |
return f"R$ {valor:,.2f}".replace(",", "v").replace(".", ",").replace("v", ".")
|
| 306 |
|
| 307 |
def formatar_resultados(resultados):
|
| 308 |
+
"""Formata os resultados para exibição INCLUINDO TEMPO DE PARCELAS CORRETO."""
|
| 309 |
if not resultados:
|
| 310 |
return "🚫 Nenhuma combinação adequada encontrada com os parâmetros fornecidos."
|
| 311 |
|
|
|
|
| 325 |
taxa_percentual = (taxa_total / credito_real) * 100 if credito_real > 0 else 0
|
| 326 |
taxa_mensal = taxa_percentual / maior_prazo if maior_prazo > 0 else 0
|
| 327 |
|
| 328 |
+
# CHAMADA CORRIGIDA para calcular tempo de parcelas
|
| 329 |
tempo_parcelas = calcular_tempo_parcelas(combinacao)
|
| 330 |
|
| 331 |
resposta += f"""
|
|
|
|
| 344 |
🗓️ Taxa Anual: {taxa_mensal * 12:.2f}%
|
| 345 |
|
| 346 |
⏰ TEMPO DE PARCELAS:
|
| 347 |
+
{tempo_parcelas if tempo_parcelas else "Não foi possível calcular o tempo de parcelas"}
|
| 348 |
|
| 349 |
"""
|
| 350 |
return resposta
|