|
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 |
|
|
|
|
|
def formatar_moeda(valor): |
|
return f"R$ {valor:,.2f}".replace(",", "v").replace(".", ",").replace("v", ".") |
|
|
|
|
|
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) |
|
|
|
|
|
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: |
|
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() |
|
|
|
|
|
|