studios / app.py
Persano's picture
Update app.py
094e580 verified
import gradio as gr
from fpdf import FPDF
import tempfile
import os
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import numpy as np
from datetime import datetime
import uuid
# Função para formatar moeda manualmente em formato brasileiro
def formatar_moeda(valor):
return f"R$ {valor:,.2f}".replace(",", "v").replace(".", ",").replace("v", ".")
# Função para calcular ROI e gerar gráfico
def calcular_roi(valor_imovel, investimento_proprio, aluguel, anos, selic, desconto_aluguel, valorizacao, tipo_financiamento):
valor_imovel = float(valor_imovel)
investimento_proprio = float(investimento_proprio)
aluguel = float(aluguel)
anos = int(anos)
selic = float(selic)
desconto_aluguel = float(desconto_aluguel)
valorizacao = float(valorizacao)
# Para valorização do imóvel, limitar a 10 anos
anos_valorizacao = min(anos, 10)
financiado = valor_imovel - investimento_proprio
monthly_rate = (selic / 100) / 12
months = anos * 12
if tipo_financiamento == "Price":
parcela = (financiado * monthly_rate * (1 + monthly_rate) ** months) / ((1 + monthly_rate) ** months - 1)
parcelas = [parcela] * months
else: # SAC
amortizacao = financiado / months
parcelas = [(amortizacao + (financiado - amortizacao * i) * monthly_rate) for i in range(months)]
receita_mensal_liquida = aluguel * (1 - desconto_aluguel / 100)
receita_anual = receita_mensal_liquida * 12
parcela_media_anual = sum(parcelas[:12])
lucro_anual = receita_anual - parcela_media_anual
roi_anual = (lucro_anual / investimento_proprio) * 100
roi_mensal = (receita_mensal_liquida - parcelas[0]) / investimento_proprio * 100
roi_acumulado = []
saldo = 0
for ano in range(1, anos + 1):
saldo += receita_anual - sum(parcelas[(ano - 1) * 12: ano * 12])
roi_acumulado.append((saldo / investimento_proprio) * 100)
valor_futuro_imovel = valor_imovel * ((1 + valorizacao / 100) ** anos_valorizacao)
ganho_total = saldo + (valor_futuro_imovel - valor_imovel)
anos_array = list(range(1, anos + 1))
plt.figure(figsize=(8, 5))
plt.plot(anos_array, roi_acumulado, marker='o', label="ROI Acumulado (%)")
plt.title('Crescimento do ROI ao longo dos anos')
plt.xlabel('Ano')
plt.ylabel('ROI (%)')
plt.grid(True)
plt.tight_layout()
plt.legend()
graph_path_png = os.path.join(tempfile.gettempdir(), f'roi_plot_{uuid.uuid4().hex}.png')
plt.savefig(graph_path_png)
plt.close()
tabela_valorizacao = "\nAno\tValor do Imóvel"
for ano in range(1, anos_valorizacao + 1):
valor_ano = valor_imovel * ((1 + valorizacao / 100) ** ano)
tabela_valorizacao += f"\n{ano}\t{formatar_moeda(valor_ano)}"
resultados = f"""
Simulação realizada em: {datetime.now().strftime('%d/%m/%Y')}
Valor do Imóvel: {formatar_moeda(valor_imovel)}
Investimento Próprio: {formatar_moeda(investimento_proprio)}
Valor Financiado: {formatar_moeda(financiado)}
Tipo de Financiamento: {tipo_financiamento}
Parcela Mensal Inicial Estimada: {formatar_moeda(parcelas[0])}
Receita Líquida Anual: {formatar_moeda(receita_anual)}
Lucro Anual: {formatar_moeda(lucro_anual)}
ROI Anual: {roi_anual:.2f}%
ROI Mensal: {roi_mensal:.2f}%
Valor Futuro do Imóvel: {formatar_moeda(valor_futuro_imovel)}
Ganho Total Estimado: {formatar_moeda(ganho_total)}
Tabela de Valorização do Imóvel:
{tabela_valorizacao}
"""
explicacao = """
---
Explicações e Fórmulas Utilizadas:
1. Financiamento Price (Sistema Francês de Amortização):
PMT = P x [i x (1 + i)^n] / [(1 + i)^n - 1]
Onde:
- P: valor financiado
- i: taxa de juros mensal
- n: número total de parcelas
2. Financiamento SAC (Sistema de Amortização Constante):
A = P / n
Parcela mensal = A + juros sobre saldo devedor
3. ROI Mensal (%):
ROI mensal = [(Receita mensal líquida - PMT) / Investimento] × 100
4. ROI Anual (%):
ROI anual = [(Receita anual líquida - Total parcelas no ano) / Investimento] × 100
5. Valorização do Imóvel:
Valor Futuro = Valor Inicial × (1 + taxa)^anos (máx. 10 anos)
---
"""
return resultados + explicacao, graph_path_png, roi_anual, roi_mensal
def gerar_pdf(valor_imovel, investimento_proprio, aluguel, anos, selic, desconto_aluguel, valorizacao, tipo_financiamento):
try:
resultados, graph_path, roi_anual, roi_mensal = calcular_roi(valor_imovel, investimento_proprio, aluguel, anos, selic, desconto_aluguel, valorizacao, tipo_financiamento)
pdf = FPDF()
pdf.set_auto_page_break(auto=True, margin=15)
pdf.set_margins(15, 20, 15)
pdf.add_page()
pdf.set_font("Arial", 'B', 14)
pdf.cell(0, 10, "Relatório de Simulação de ROI de Aluguel", ln=True, align='C')
pdf.set_font("Arial", '', 10)
pdf.cell(0, 10, f"Data: {datetime.now().strftime('%d/%m/%Y')}", ln=True, align='C')
pdf.ln(10)
pdf.set_font("Arial", size=10)
for linha in resultados.strip().split("\n"):
if linha.strip():
linha_latin1 = linha.encode('latin-1', errors='ignore').decode('latin-1')
pdf.multi_cell(0, 6, linha_latin1)
if graph_path and os.path.exists(graph_path):
pdf.add_page()
pdf.image(graph_path, x=15, w=180)
temp_pdf_path = os.path.join(tempfile.gettempdir(), f"roi_relatorio_{uuid.uuid4().hex}.pdf")
pdf.output(temp_pdf_path)
return temp_pdf_path
except Exception as e:
print("Erro ao gerar PDF:", e)
return None
with gr.Blocks() as demo:
with gr.Row():
valor_imovel = gr.Slider(label="Valor do Imóvel", minimum=50000, maximum=2000000, step=1000, value=500000)
investimento_proprio = gr.Slider(label="Investimento Próprio", minimum=10000, maximum=1000000, step=1000, value=100000)
with gr.Row():
aluguel = gr.Slider(label="Valor do Aluguel", minimum=500, maximum=10000, step=50, value=2500)
anos = gr.Slider(label="Prazo (anos)", minimum=1, maximum=35, step=1, value=30)
with gr.Row():
selic = gr.Slider(label="Taxa SELIC (%)", minimum=2.0, maximum=20.0, step=0.1, value=10.75)
desconto_aluguel = gr.Slider(label="Desconto sobre o aluguel (%)", minimum=0, maximum=50, step=1, value=10)
valorizacao = gr.Slider(label="Valorização do imóvel ao ano (%)", minimum=0, maximum=20, step=0.5, value=5)
tipo_financiamento = gr.Radio(["SAC", "Price"], label="Tipo de Financiamento", value="SAC")
botao_calcular = gr.Button("Calcular ROI")
saida_texto = gr.Textbox(label="Resultado da Simulação", lines=25)
saida_imagem = gr.Image(label="Gráfico ROI")
botao_pdf = gr.Button("Gerar Relatório em PDF")
saida_pdf = gr.File(label="Download do Relatório")
saida_roi = gr.Number(visible=False)
saida_parcela = gr.Number(visible=False)
botao_calcular.click(
calcular_roi,
inputs=[valor_imovel, investimento_proprio, aluguel, anos, selic, desconto_aluguel, valorizacao, tipo_financiamento],
outputs=[saida_texto, saida_imagem, saida_roi, saida_parcela]
)
botao_pdf.click(
gerar_pdf,
inputs=[valor_imovel, investimento_proprio, aluguel, anos, selic, desconto_aluguel, valorizacao, tipo_financiamento],
outputs=saida_pdf
)
demo.launch()