Persano commited on
Commit
997ea01
·
verified ·
1 Parent(s): dc5ac94

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +73 -112
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) ** anos)
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, anos + 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: valor financiado
102
- i: taxa de juros mensal
103
- n: número total de parcelas
104
 
105
- 2⃣ Financiamento SAC (Sistema de Amortização Constante):
106
- A = P / n
107
- Parcela mensal: A + juros sobre saldo devedor
108
 
109
- 3⃣ ROI Mensal (%):
110
- ROIₘ = [(Rₘ - PMT) / I] × 100
111
  Onde:
112
- Rₘ: Receita mensal líquida
113
- PMT: Parcela do financiamento
114
- I: Investimento próprio
115
 
116
- 4⃣ ROI Anual (%):
117
- ROIₐ = [(Rₐ - ΣPMT) / I] × 100
118
  Onde:
119
- Rₐ: Receita anual líquida
120
 
121
- 5⃣ Valorização do Imóvel:
122
- VF = VI × (1 + v)^t
123
  Onde:
124
- VF: Valor futuro
125
- VI: Valor inicial
126
- v: taxa de valorização anual
127
- t: anos
128
  ---
129
  """
130
 
131
- return resultados, graph_path_jpg, roi_anual, roi_mensal
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, 8, linha)
152
 
153
- explicacao = """
154
- ---
155
- Explicações e Fórmulas Utilizadas:
156
 
157
- 1⃣ Financiamento Price (Sistema Francês de Amortização):
158
- PMT = P × [i × (1 + i)^n] / [(1 + i)^n - 1]
159
- Onde:
160
- P: valor financiado
161
- i: taxa de juros mensal
162
- n: número total de parcelas
163
 
164
- 2⃣ Financiamento SAC (Sistema de Amortização Constante):
165
- A = P / n
166
- Parcela mensal: A + juros sobre saldo devedor
167
 
168
- 3⃣ ROI Mensal (%):
169
- ROIₘ = [(Rₘ - PMT) / I] × 100
170
- Onde:
171
- Rₘ: Receita mensal líquida
172
- PMT: Parcela do financiamento
173
- I: Investimento próprio
174
 
175
- 4⃣ ROI Anual (%):
176
- ROIₐ = [(Rₐ - ΣPMT) / I] × 100
177
- Onde:
178
- Rₐ: Receita anual líquida
179
 
180
- 5⃣ Valorização do Imóvel:
181
- VF = VI × (1 + v)^t
182
- Onde:
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
- temp_pdf_path = os.path.join(tempfile.gettempdir(), f"roi_relatorio_{uuid.uuid4().hex}.pdf")
207
- pdf.output(temp_pdf_path)
 
 
208
 
209
- if not os.path.exists(temp_pdf_path):
210
- raise FileNotFoundError(f"O PDF não foi gerado corretamente. Caminho: {temp_pdf_path}")
211
 
212
- return temp_pdf_path
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
213
 
214
- except Exception as e:
215
- print(f"Erro ao gerar PDF: {e}")
216
- return None
217
 
218
- # Interface do Gradio
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