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()