avalia.EVO / app.py
DavidSB's picture
Update app.py
318720a
raw
history blame
14.2 kB
# 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
# 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(nome="-", prof="Engenheiro Civil", ent="CREA", reg="-",
lograd="-", munic="-", tipo_imo="-", infra="Água Potável", serv="Coleta de Lixo", uso="Residencial",
pad_reg="-", tipo_via="-", obs_gerais="-",
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]
dados_resp = f"""
Responsável Técnico: {nome}
Profissão: {prof}
Entidade de Classe: {ent}
Nùmero do resgistro: {reg}
"""
inf_end = f"""
Logradouro e número: {lograd}
Município: {munic}
Tipode imóvel: {tipo_imo}
Infraentrutura: {infra}
Serviços Públicos: {serv}
Uso: {uso}
Padrão predominante na região: {pad_reg}
Tipo de via de acesso: {tipo_via}
Outras oservações: {obs_gerais}
"""
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 = [
(dados_resp, "Informações do Responsável Técnico"),
(inf_end, "Endereço e Informações da Região"),
(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"),
]
for content, title in sections:
doc.add_heading(title, level=2)
p = doc.add_paragraph()
run = p.add_run(content)
run.font.size = Pt(12)
p.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT # Define o alinhamento para à esquerda
# Salvar o documento em um arquivo .doc
doc.save('relatorio_avaliacao.doc')
return dados_resp, inf_end, valor_inicial, deprec, valor_ter, valor_final, 'relatorio_avaliacao.doc'
interface = gr.Interface(
calcular_valor_imovel,
inputs = [
# Informações do Responsável Técnico
gr.Textbox(label="Responsável Técnico", value="-"),
gr.Dropdown(["Engenheiro Civil", "Arquiteto e Urbanista", "Corretor de Imóveis"],label="Profissão", value="-"),
gr.Dropdown(["CREA", "CAU", "CRECI"],label="Entidade de Classe", value="-"),
gr.Number(label="Nº do registro", value="0"),
# Informações do imóvel e região
gr.Textbox(label="Endereço (Logradouro, nº e bairro)", value="-"),
gr.Textbox(label="Município", value="-"),
gr.Textbox(label="Tipo de Imóvel", value="-"),
gr.Dropdown(["Água Potável", "Energia Elétrica", "Telefone", "Pavimentação", "Esgoto Pluvial",
"Iluminação Pública"], value=["Água Potável"], multiselect=True, label="Infraestrutura Urbana"),
gr.Dropdown(["Coleta de Lixo", "Transporte Coletivo", "Comércio", "Educação", "Saúde"],
value=["Coleta de Lixo"], multiselect=True, label="Serviços Públicos"),
gr.Radio(["Residencial", "Comercial", "Misto"], label="Uso",value="Residencial"),
gr.Radio(["Baixo", "Normal", "Alto"], label="Padrão predominante na região",value="Normal"),
gr.Radio(["Local", "Coletora", "Arterial"], label="Tipo de via de acesso ao imóvel",value="Local"),
gr.Textbox(label="Outras informação", value="-"),
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 = "Informações do Responsável Técnico"),
gr.Textbox(label = "Endereço e Informações da Região"),
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)