Update app.py
Browse files
app.py
CHANGED
@@ -8,7 +8,6 @@ import matplotlib.pyplot as plt
|
|
8 |
import numpy as np
|
9 |
from datetime import datetime
|
10 |
import uuid
|
11 |
-
from PIL import Image
|
12 |
|
13 |
# Função para formatar moeda manualmente em formato brasileiro
|
14 |
def formatar_moeda(valor):
|
@@ -24,6 +23,9 @@ def calcular_roi(valor_imovel, investimento_proprio, aluguel, anos, selic, desco
|
|
24 |
desconto_aluguel = float(desconto_aluguel)
|
25 |
valorizacao = float(valorizacao)
|
26 |
|
|
|
|
|
|
|
27 |
financiado = valor_imovel - investimento_proprio
|
28 |
monthly_rate = (selic / 100) / 12
|
29 |
months = anos * 12
|
@@ -48,7 +50,7 @@ def calcular_roi(valor_imovel, investimento_proprio, aluguel, anos, selic, desco
|
|
48 |
saldo += receita_anual - sum(parcelas[(ano - 1) * 12: ano * 12])
|
49 |
roi_acumulado.append((saldo / investimento_proprio) * 100)
|
50 |
|
51 |
-
valor_futuro_imovel = valor_imovel * ((1 + valorizacao / 100) **
|
52 |
ganho_total = saldo + (valor_futuro_imovel - valor_imovel)
|
53 |
|
54 |
anos_array = list(range(1, anos + 1))
|
@@ -64,11 +66,8 @@ def calcular_roi(valor_imovel, investimento_proprio, aluguel, anos, selic, desco
|
|
64 |
plt.savefig(graph_path_png)
|
65 |
plt.close()
|
66 |
|
67 |
-
graph_path_jpg = graph_path_png.replace(".png", ".jpg")
|
68 |
-
Image.open(graph_path_png).convert("RGB").save(graph_path_jpg, "JPEG")
|
69 |
-
|
70 |
tabela_valorizacao = "\nAno\tValor do Imóvel"
|
71 |
-
for ano in range(1,
|
72 |
valor_ano = valor_imovel * ((1 + valorizacao / 100) ** ano)
|
73 |
tabela_valorizacao += f"\n{ano}\t{formatar_moeda(valor_ano)}"
|
74 |
|
@@ -93,42 +92,42 @@ Tabela de Valorização do Imóvel:
|
|
93 |
|
94 |
explicacao = """
|
95 |
---
|
96 |
-
Explicações e Fórmulas Utilizadas:
|
97 |
|
98 |
-
1⃣ Financiamento Price (Sistema Francês de Amortização):
|
99 |
-
PMT = P × [i × (1 + i)^n] / [(1 + i)^n - 1]
|
100 |
Onde:
|
101 |
-
P
|
102 |
-
i
|
103 |
-
n
|
104 |
|
105 |
-
2⃣ Financiamento SAC (Sistema de Amortização Constante):
|
106 |
-
A = P / n
|
107 |
-
Parcela mensal
|
108 |
|
109 |
-
3⃣ ROI Mensal (%)
|
110 |
-
ROIₘ = [(Rₘ - PMT) / I] × 100
|
111 |
Onde:
|
112 |
-
R
|
113 |
-
PMT
|
114 |
-
I
|
115 |
|
116 |
-
4⃣ ROI Anual (%)
|
117 |
-
ROIₐ = [(Rₐ - ΣPMT) / I] × 100
|
118 |
Onde:
|
119 |
-
R
|
120 |
|
121 |
-
5⃣ Valorização do Imóvel
|
122 |
-
VF = VI × (1 + v)^t
|
123 |
Onde:
|
124 |
-
VF
|
125 |
-
VI
|
126 |
-
v
|
127 |
-
t
|
128 |
---
|
129 |
"""
|
130 |
|
131 |
-
return resultados,
|
132 |
|
133 |
def gerar_pdf(valor_imovel, investimento_proprio, aluguel, anos, selic, desconto_aluguel, valorizacao, tipo_financiamento):
|
134 |
try:
|
@@ -148,98 +147,60 @@ def gerar_pdf(valor_imovel, investimento_proprio, aluguel, anos, selic, desconto
|
|
148 |
pdf.set_font("Arial", size=10)
|
149 |
for linha in resultados.strip().split("\n"):
|
150 |
if linha.strip():
|
151 |
-
pdf.multi_cell(0,
|
152 |
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
|
157 |
-
|
158 |
-
|
159 |
-
Onde:
|
160 |
-
P: valor financiado
|
161 |
-
i: taxa de juros mensal
|
162 |
-
n: número total de parcelas
|
163 |
|
164 |
-
|
165 |
-
A = P / n
|
166 |
-
Parcela mensal: A + juros sobre saldo devedor
|
167 |
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
Rₘ: Receita mensal líquida
|
172 |
-
PMT: Parcela do financiamento
|
173 |
-
I: Investimento próprio
|
174 |
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
VF: Valor futuro
|
184 |
-
VI: Valor inicial
|
185 |
-
v: taxa de valorização anual
|
186 |
-
t: anos
|
187 |
-
---
|
188 |
-
"""
|
189 |
-
pdf.multi_cell(0, 8, explicacao)
|
190 |
-
|
191 |
-
if os.path.exists(graph_path):
|
192 |
-
if os.path.getsize(graph_path) > 0:
|
193 |
-
try:
|
194 |
-
pdf.add_page()
|
195 |
-
pdf.image(graph_path, x=15, w=180)
|
196 |
-
except Exception as e:
|
197 |
-
pdf.ln(10)
|
198 |
-
pdf.cell(0, 10, f"Erro ao adicionar imagem ao PDF: {e}", ln=True)
|
199 |
-
else:
|
200 |
-
pdf.ln(10)
|
201 |
-
pdf.cell(0, 10, "[Erro] Imagem gerada está vazia.", ln=True)
|
202 |
-
else:
|
203 |
-
pdf.ln(10)
|
204 |
-
pdf.cell(0, 10, "[Erro] Caminho da imagem não encontrado.", ln=True)
|
205 |
|
206 |
-
|
207 |
-
|
|
|
|
|
208 |
|
209 |
-
|
210 |
-
raise FileNotFoundError(f"O PDF não foi gerado corretamente. Caminho: {temp_pdf_path}")
|
211 |
|
212 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
213 |
|
214 |
-
except Exception as e:
|
215 |
-
print(f"Erro ao gerar PDF: {e}")
|
216 |
-
return None
|
217 |
|
218 |
-
|
219 |
-
def app():
|
220 |
-
with gr.Blocks() as demo:
|
221 |
-
with gr.Row():
|
222 |
-
valor_imovel = gr.Slider(minimum=100000, maximum=5000000, step=10000, label="Valor do Imóvel", value=500000)
|
223 |
-
investimento_proprio = gr.Slider(minimum=0, maximum=5000000, step=10000, label="Investimento Próprio", value=100000)
|
224 |
-
aluguel = gr.Slider(minimum=500, maximum=50000, step=500, label="Aluguel Mensal", value=3000)
|
225 |
-
anos = gr.Slider(minimum=1, maximum=30, step=1, label="Número de Anos", value=20)
|
226 |
-
selic = gr.Slider(minimum=1, maximum=20, step=0.1, label="Taxa SELIC Anual (%)", value=13.25)
|
227 |
-
desconto_aluguel = gr.Slider(minimum=0, maximum=100, step=1, label="Desconto sobre Aluguel (%)", value=10)
|
228 |
-
valorizacao = gr.Slider(minimum=0, maximum=20, step=0.1, label="Taxa de Valorização Anual (%)", value=5)
|
229 |
-
tipo_financiamento = gr.Radio(choices=["Price", "SAC"], label="Tipo de Financiamento", value="Price")
|
230 |
-
|
231 |
-
gerar_pdf_button = gr.Button("Gerar Relatório PDF")
|
232 |
-
pdf_output = gr.File(label="Baixar Relatório PDF")
|
233 |
-
|
234 |
-
gerar_pdf_button.click(
|
235 |
-
gerar_pdf,
|
236 |
-
inputs=[valor_imovel, investimento_proprio, aluguel, anos, selic, desconto_aluguel, valorizacao, tipo_financiamento],
|
237 |
-
outputs=pdf_output
|
238 |
-
)
|
239 |
-
|
240 |
-
demo.launch()
|
241 |
-
|
242 |
-
# Executar o app
|
243 |
-
app()
|
244 |
|
245 |
|
|
|
8 |
import numpy as np
|
9 |
from datetime import datetime
|
10 |
import uuid
|
|
|
11 |
|
12 |
# Função para formatar moeda manualmente em formato brasileiro
|
13 |
def formatar_moeda(valor):
|
|
|
23 |
desconto_aluguel = float(desconto_aluguel)
|
24 |
valorizacao = float(valorizacao)
|
25 |
|
26 |
+
# Para valorização do imóvel, limitar a 10 anos
|
27 |
+
anos_valorizacao = min(anos, 10)
|
28 |
+
|
29 |
financiado = valor_imovel - investimento_proprio
|
30 |
monthly_rate = (selic / 100) / 12
|
31 |
months = anos * 12
|
|
|
50 |
saldo += receita_anual - sum(parcelas[(ano - 1) * 12: ano * 12])
|
51 |
roi_acumulado.append((saldo / investimento_proprio) * 100)
|
52 |
|
53 |
+
valor_futuro_imovel = valor_imovel * ((1 + valorizacao / 100) ** anos_valorizacao)
|
54 |
ganho_total = saldo + (valor_futuro_imovel - valor_imovel)
|
55 |
|
56 |
anos_array = list(range(1, anos + 1))
|
|
|
66 |
plt.savefig(graph_path_png)
|
67 |
plt.close()
|
68 |
|
|
|
|
|
|
|
69 |
tabela_valorizacao = "\nAno\tValor do Imóvel"
|
70 |
+
for ano in range(1, anos_valorizacao + 1):
|
71 |
valor_ano = valor_imovel * ((1 + valorizacao / 100) ** ano)
|
72 |
tabela_valorizacao += f"\n{ano}\t{formatar_moeda(valor_ano)}"
|
73 |
|
|
|
92 |
|
93 |
explicacao = """
|
94 |
---
|
95 |
+
📘 Explicações e Fórmulas Utilizadas:
|
96 |
|
97 |
+
1⃣ **Financiamento Price** (Sistema Francês de Amortização):
|
98 |
+
**PMT = P × [i × (1 + i)^n] / [(1 + i)^n - 1]**
|
99 |
Onde:
|
100 |
+
- **P**: valor financiado
|
101 |
+
- **i**: taxa de juros mensal
|
102 |
+
- **n**: número total de parcelas
|
103 |
|
104 |
+
2⃣ **Financiamento SAC** (Sistema de Amortização Constante):
|
105 |
+
**A = P / n**
|
106 |
+
**Parcela mensal = A + juros sobre saldo devedor**
|
107 |
|
108 |
+
3⃣ **ROI Mensal (%):**
|
109 |
+
**ROIₘ = [(Rₘ - PMT) / I] × 100**
|
110 |
Onde:
|
111 |
+
- **Rₘ**: Receita mensal líquida
|
112 |
+
- **PMT**: Parcela do financiamento
|
113 |
+
- **I**: Investimento próprio
|
114 |
|
115 |
+
4⃣ **ROI Anual (%):**
|
116 |
+
**ROIₐ = [(Rₐ - ΣPMT) / I] × 100**
|
117 |
Onde:
|
118 |
+
- **Rₐ**: Receita anual líquida
|
119 |
|
120 |
+
5⃣ **Valorização do Imóvel:**
|
121 |
+
**VF = VI × (1 + v)^t**
|
122 |
Onde:
|
123 |
+
- **VF**: Valor futuro
|
124 |
+
- **VI**: Valor inicial
|
125 |
+
- **v**: taxa de valorização anual
|
126 |
+
- **t**: anos (máx. 10 anos considerados)
|
127 |
---
|
128 |
"""
|
129 |
|
130 |
+
return resultados + explicacao, graph_path_png, roi_anual, roi_mensal
|
131 |
|
132 |
def gerar_pdf(valor_imovel, investimento_proprio, aluguel, anos, selic, desconto_aluguel, valorizacao, tipo_financiamento):
|
133 |
try:
|
|
|
147 |
pdf.set_font("Arial", size=10)
|
148 |
for linha in resultados.strip().split("\n"):
|
149 |
if linha.strip():
|
150 |
+
pdf.multi_cell(0, 6, linha)
|
151 |
|
152 |
+
if graph_path and os.path.exists(graph_path):
|
153 |
+
pdf.add_page()
|
154 |
+
pdf.image(graph_path, x=15, w=180)
|
155 |
|
156 |
+
temp_pdf_path = os.path.join(tempfile.gettempdir(), f"roi_relatorio_{uuid.uuid4().hex}.pdf")
|
157 |
+
pdf.output(temp_pdf_path)
|
|
|
|
|
|
|
|
|
158 |
|
159 |
+
return temp_pdf_path
|
|
|
|
|
160 |
|
161 |
+
except Exception as e:
|
162 |
+
print("Erro ao gerar PDF:", e)
|
163 |
+
return None
|
|
|
|
|
|
|
164 |
|
165 |
+
with gr.Blocks() as demo:
|
166 |
+
with gr.Row():
|
167 |
+
valor_imovel = gr.Slider(label="Valor do Imóvel", minimum=50000, maximum=2000000, step=1000, value=500000)
|
168 |
+
investimento_proprio = gr.Slider(label="Investimento Próprio", minimum=10000, maximum=1000000, step=1000, value=100000)
|
169 |
|
170 |
+
with gr.Row():
|
171 |
+
aluguel = gr.Slider(label="Valor do Aluguel", minimum=500, maximum=10000, step=50, value=2500)
|
172 |
+
anos = gr.Slider(label="Prazo (anos)", minimum=1, maximum=35, step=1, value=30)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
173 |
|
174 |
+
with gr.Row():
|
175 |
+
selic = gr.Slider(label="Taxa SELIC (%)", minimum=2.0, maximum=20.0, step=0.1, value=10.75)
|
176 |
+
desconto_aluguel = gr.Slider(label="Desconto sobre o aluguel (%)", minimum=0, maximum=50, step=1, value=10)
|
177 |
+
valorizacao = gr.Slider(label="Valorização do imóvel ao ano (%)", minimum=0, maximum=20, step=0.5, value=5)
|
178 |
|
179 |
+
tipo_financiamento = gr.Radio(["SAC", "Price"], label="Tipo de Financiamento", value="SAC")
|
|
|
180 |
|
181 |
+
botao_calcular = gr.Button("Calcular ROI")
|
182 |
+
saida_texto = gr.Textbox(label="Resultado da Simulação", lines=25)
|
183 |
+
saida_imagem = gr.Image(label="Gráfico ROI")
|
184 |
+
|
185 |
+
botao_pdf = gr.Button("Gerar Relatório em PDF")
|
186 |
+
saida_pdf = gr.File(label="Download do Relatório")
|
187 |
+
|
188 |
+
saida_roi = gr.Number(visible=False)
|
189 |
+
saida_parcela = gr.Number(visible=False)
|
190 |
+
|
191 |
+
botao_calcular.click(
|
192 |
+
calcular_roi,
|
193 |
+
inputs=[valor_imovel, investimento_proprio, aluguel, anos, selic, desconto_aluguel, valorizacao, tipo_financiamento],
|
194 |
+
outputs=[saida_texto, saida_imagem, saida_roi, saida_parcela]
|
195 |
+
)
|
196 |
+
|
197 |
+
botao_pdf.click(
|
198 |
+
gerar_pdf,
|
199 |
+
inputs=[valor_imovel, investimento_proprio, aluguel, anos, selic, desconto_aluguel, valorizacao, tipo_financiamento],
|
200 |
+
outputs=saida_pdf
|
201 |
+
)
|
202 |
|
|
|
|
|
|
|
203 |
|
204 |
+
demo.launch()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
205 |
|
206 |
|