File size: 11,982 Bytes
c42059e
 
 
 
 
 
a08cc8f
 
 
 
e17e65d
c42059e
 
 
 
ab42b12
 
 
 
ab9c2d7
 
0109644
 
c42059e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8add0d9
c42059e
 
 
8add0d9
c42059e
 
ab9c2d7
c42059e
ab9c2d7
 
c42059e
ad82f17
c42059e
 
 
 
 
 
ab9c2d7
 
 
 
 
 
 
 
9e60391
ab9c2d7
 
 
0109644
ab9c2d7
 
 
 
 
 
 
 
 
 
 
0109644
ab9c2d7
c42059e
ab9c2d7
 
0109644
ab9c2d7
 
 
 
0109644
ab9c2d7
 
 
a08cc8f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4beade4
a08cc8f
 
 
 
 
 
 
3b5747c
90767fb
3b5747c
c42059e
3b5747c
ab9c2d7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
055dcd6
 
ab9c2d7
bd232f6
ab9c2d7
 
 
 
 
 
 
 
 
 
 
 
52ec269
ab9c2d7
 
 
 
8a09109
ab9c2d7
375b2cb
3b5747c
c42059e
3b5747c
ab9c2d7
 
 
a08cc8f
 
6e412d5
 
3b5747c
 
 
 
6e412d5
 
8bd64b1
de93157
3b5747c
6e412d5
f4f1fd4
1fb7157
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
# importando as bibliotecas necessárias
import gradio as gr
import pandas as pd
from datetime import datetime
from gradio.components import Number, Textbox, Dropdown, Button
import warnings
from gradio import Interface
from docx import Document
from docx.shared import Pt
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.shared import RGBColor

# Suprimir todos os avisos durante a execução do script
warnings.filterwarnings("ignore")

# Calcular a data mais recente do CUB fora da função
df_cub = pd.read_excel('TABELAS.xlsx', sheet_name='CUB')
ultimo_cub = df_cub.columns[-1]

def calcular_valor_imovel(area=100, data_refer_str=None, data_const_str=None, tipo_cub="R 1-N (Res. Unifamiliar)", 
                          data_cub_str=None, percentual_cub=1, BDI=22.5, BDI_tipo ="Arbitrado", fator_local = 1, just_fator_local = "-", tipologia="APARTAMENTOS", 
                          estado="B - entre novo e regular", VR=0.0, valor_terreno=0, est_ter="Grau III de fundamentação no métodocomparativo ou no involutivo",
                          fc=1, fc_just="Arbitrado"):
    # Carregar dados dos arquivos Excel
    df_cub = pd.read_excel('TABELAS.xlsx', sheet_name='CUB')
    df_vida = pd.read_excel('TABELAS.xlsx', sheet_name='VUTIL')
    df_dep = pd.read_excel('TABELAS.xlsx', sheet_name='DEP')
    df_estado_cons = pd.read_excel('TABELAS.xlsx', sheet_name='estado_cons')

    # Converter datas de entrada
    if data_refer_str is None or data_refer_str == "":
        data_refer = datetime.now()
    else:
        data_refer = datetime.strptime(data_refer_str, "%m/%Y")
    data_const = datetime.strptime(data_const_str, "%m/%Y")
    if data_cub_str is None or data_cub_str == "":
        data_cub = datetime.now()
    else:
        data_cub = datetime.strptime(data_cub_str, "%m/%Y")

    # Filtrar por tipo_cub
    df_tipo_cub = df_cub[df_cub['CÓDIGO'] == tipo_cub]

    # Obter o valor do CUB na coluna correspondente à data
    valor_cub_column = data_cub.strftime("%m/%Y")
    valor_cub = df_tipo_cub.at[df_tipo_cub.index[0], valor_cub_column]

    # Idade
    idade = data_refer.toordinal() - data_const.toordinal()
    if idade > 1:
        idade = idade // 365
    else:
        idade = 1

    # Filtrar por %de Vida
    vdu = df_vida.loc[(df_vida['FINAL'] == tipologia)]

    # % de vida útil
    percentual_vdu = (idade / vdu['VIDAUTIL']) * 100
    percentual_vdu = int(round(percentual_vdu, 0))

    if percentual_vdu != 1:
      percentual_vdu = percentual_vdu
    else:
      percentual_vdu = 2
    print(percentual_vdu,"%")

    # Filtrar conforme o % de vida útil
    df_conserv = df_dep.loc[df_dep['%deVida'] == percentual_vdu]

    # Converter o valor residual de string para número (float)
    if VR and VR.strip() != "":
        VR = float(VR)
    else:
        VR = 0.0
    # Obter da depreciação
    coef_HH = float(df_conserv[estado]/100)
    coef_HH = round(coef_HH, 3)

    # Valor do "Kd"
    kd = VR + (1 - coef_HH) * (1 - VR)
    kd = round(kd, 3)

    # Cálculos
    Valor_sem_deprec = round(area * valor_cub * percentual_cub * (1 + BDI / 100) * fator_local, 2)
    Valor_com_deprec = Valor_sem_deprec * kd
    Valor_com_deprec = round(Valor_com_deprec, 2)
    valor_imovel = round((valor_terreno + Valor_com_deprec) * float(fc), 2)
    
    
    # Atributo da coluna "cons" pelo qual você deseja fazer a correspondência
    atributo_desejado = estado
    # Encontrar o valor da coluna "obs" com base no atributo da coluna "cons"
    valor_obs = df_estado_cons.loc[df_estado_cons['cons'] == atributo_desejado, 'obs'].iloc[0]
    

    valor_inicial = f"""
    Área construída (m²): {area}
    Data de referência: {data_refer.strftime("%m/%Y")}
    Data da construção: {data_const_str}
    Data do CUB: {data_cub.strftime("%m/%Y")}
    Tipo de CUB: {tipo_cub}
    Percentual para adequação do CUB (%): {percentual_cub}
    BDI (%): {BDI}
    Maneira como o BDI foi elaborado: {BDI_tipo}
    Valor CUB: {round(valor_cub, 2)}
    Fator local: {fator_local}
    Fator local (justificativa): {just_fator_local}
    Valor sem depreciação: {Valor_sem_deprec}
    """
    
    deprec = f"""
    Tipologia: {tipologia}
    Vida útil da tipologia: {int(vdu['VIDAUTIL'])}
    Estado de conservação: {estado}
    Estado de conservação - descrição: {valor_obs}
    % de Vida Útil: {percentual_vdu}
    Coeficiente de Depreciação: {coef_HH}
    Valor residual (0, 0.1 ou 0.2): {VR}
    Kd: {kd}
    Valor final construção: {Valor_com_deprec}
    """
    
    valor_ter = f"""
    Valor do Terreno: {valor_terreno}
    Observação sobre o grau de fundamentação: {est_ter}
    """
    
    valor_final = f"""
    FC (Fator de Comercialização): {fc}
    Observação sobre o FC: {fc_just}
    Valor do Imóvel: {valor_imovel}
    """

    # Criar um novo documento do Word
    doc = Document()

    # Definir o título do documento
    doc.add_heading('Relatório de Avaliação de Imóvel', level=1)

    # Definir as seções do relatório
    sections = [
        (valor_inicial, "Valor Inicial da Construção"),
        (deprec, "Cálculo da Depreciação"),
        (valor_ter, "Valor Estimado para o Terreno"),
        (valor_final, "Valor Final do Imóvel"),
    ]

    # Adicionar cada seção ao documento
    for content, title in sections:
        # Adicionar o título da seção
        doc.add_heading(title, level=2)

        # Adicionar o conteúdo da seção
        p = doc.add_paragraph()
        p.add_run(content).font.size = Pt(12)
        p.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
        run.font.color.rgb = RGBColor(153, 153, 153)  # Define a cor cinza 60%

    # Salvar o documento em um arquivo .doc
    doc.save('relatorio_avaliacao_imovel.doc')


    return valor_inicial, deprec, valor_ter, valor_final, 'relatorio_avaliacao_imovel.doc'

                              
interface = gr.Interface(
calcular_valor_imovel,

inputs = [
    gr.Number(label="Área construída (m²)", value=100),
    gr.Textbox(label="Data de referência (mm/aaaa)", value=ultimo_cub, info="Data do fato gerador da demanda"),
    gr.Textbox(label="Data da construção (mm/aaaa)", value=ultimo_cub, info="Data de construção do imóvel"),
    gr.Dropdown(label="Tipo de CUB", choices=["R 1-B (Res. Unifamiliar)", 
                                              "R 1-N (Res. Unifamiliar)", 
                                              "R 1-A (Res. Unifamiliar)", 
                                              "PP 4-B (Prédio Popular)", 
                                              "PP 4-N (Prédio Popular)",
                                              "R 8-B  (Res. Multifamiliar)",
                                              "R 8-N (Res. Multifamiliar)",
                                              "R 8-A (Res. Multifamiliar)",
                                              "R 16-N (Res. Multifamiliar)",
                                              "R 16-A (Res. Multifamiliar)",
                                              "PIS (Projeto Inter. Social)",
                                              "RP1Q (Residência Popular)",
                                              "CAL 8-N (Com. Andar Livres)",
                                              "CAL 8-A (Com. Andar Livres)",
                                              "CSL 8-N (Com.Salas e Lojas)",
                                              "CSL 8-A (Com.Salas e Lojas)",
                                              "CSL 16-N (Com.Salas e Lojas)", 
                                              "CSL 16-A (Com.Salas e Lojas)",
                                              "GI (Galpão Industrial)"],
                                               value="R 1-N (Res. Unifamiliar)"),
    gr.Textbox(label="Data do CUB (mm/aaaa)", value=ultimo_cub, info="Data do CUB deverá coincidir com a data de referência do laudo"),
    #gr.Number(label="Percentual para adequação do CUB (%)", value=1, info="Adaptação do CUB para uma situação atípica ou para contemplar insumos/serviços que não constam na composição do CUB"),
    gr.Slider(0.5, 2.0, value=1, label="Fator para adequação do CUB", info="Adaptação do CUB para uma situação atípica ou para contemplar insumos/serviços que não constam na sua composição (insumos/serviços)", step = 0.1),
    gr.Number(label="BDI (%)", value=22.5),
    gr.Radio(["Justificado", "Arbitrado"], label="Tipo de BDI", info="Estipule como foi elaborado o % de BDI", value="Arbitrado"),
    gr.Slider(0.5, 1.5, value=1, label="Fator local", info="Escolha um coeficiente de valorização local baseado no seu conhecimento de mercado", step = 0.1),
    gr.Textbox(label="Justificativa para o Fator Local", value="-", info="Justifique tecnicamente a utilização deste fator"),
    gr.Dropdown(label="Tipologia", choices=["APARTAMENTOS", "BANCOS", "CASAS DE ALVENARIA",
                                            "CASAS DE MADEIRA", "HOTÉIS", "LOJAS", "TEATROS",
                                            "ARMAZÉNS", "FÁBRICAS", "CONST. RURAIS", "GARAGENS",
                                            "EDIFÍCIOS DE ESCRITÓRIOS", "GALPÕES (DEPÓSITOS)", "SILOS"],
                                            value="CASAS DE ALVENARIA"),
    gr.Dropdown(label="Estado de conservação", choices=["A - novo", "B - entre novo e regular",
                                                        "C - regular", "D - entre regular e reparos simples",
                                                        "E - reparos simples", "F - entre reparos simples e importantes",
                                                        "G - reparos importantes", "H - entre reparos importantes e sem valor"],
                                                        value="A - novo"),
    gr.Dropdown(label="Valor residual (0, 0.1 ou 0.2)", choices=["0", "0.1", "0.2"], value="0"),
    gr.Number(label="Valor do Terreno", value=0),
    gr.Radio(["Grau III de fundamentação no método comparativo ou no involutivo",
          "Grau II de fundamentação no método comparativo ou no involutivo",
          "Grau I de fundamentação no método comparativo ou no involutivo"], 
          info="Escolha o Grau de Fundamentação alcançado pelo avaliação do terreno", label="", value="Grau I de fundamentação no método comparativo ou no involutivo"),
    gr.Slider(0.1, 2.0, value=1.0, label="FC (Fator de Comercialização)", info="O Fator de Comercialização, também chamado de Terceiro Componente ou Vantagem da Coisa Feita, é definido no item 3.20 da NBR 14653-1:2001: “Fator de comercialização: Razão entre o valor de mercado de um bem e o seu custo de reedição ou de substituição, que pode ser maior ou menor que 1", step = 0.1),
    gr.Radio(["Inferido em mercado semelhante", "Justificado", "Arbitrado"], label="", info="Estipule como foi elaborado o FC",value="Arbitrado"),
],

outputs = [
    gr.Textbox(label = "Valor Inicial da Contrução"),
    gr.Textbox(label = "Cálculo da Depreciação"),
    gr.Textbox(label = "Valor estimado para o terreno"),
    gr.Textbox(label = "Valor final do imóvel"),
    gr.File(label="Relatório em Word"),
],

live=False,
capture_session=True,
theme=gr.themes.Monochrome(),
title="<span style='color: gray; font-size: 52px;'>aval</span><span style='color: black; font-size: 52px;'>ia</span><span style='color: gray; font-size: 56px;'>.EVO</span>",
description=f"""
<p style="text-align: left;"><b><span style='color: gray; font-size: 40px;'>aval</span><span style='color: black; font-size: 40px;'>ia</span><span style='color: gray; font-size: 40px;'>.se</b></p>
<p style="text-align: left;"></span>Aplicativo Método Evolutivo (benfeitorias + terrenos) / Para ver a documentação <a href='https://huggingface.co/spaces/DavidSB/avaliaFACTOR/resolve/main/dados_entrada_factor.xlsx' download='dados_entrada_factor.xlsx'>aqui</a><br><br></p>
"""
)

if __name__ == "__main__":
    interface.launch(debug=True)