DavidSB commited on
Commit
b085e12
·
verified ·
1 Parent(s): 09caa89

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +336 -0
app.py ADDED
@@ -0,0 +1,336 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import pandas as pd
3
+ import geopandas as gpd
4
+ from gradio.components import Number, Textbox, Dropdown, Button
5
+ from gradio import Interface
6
+ import pyproj
7
+ import plotly.express as px
8
+ import plotly.graph_objects as go
9
+ import plotly.io as pio
10
+ from docx import Document
11
+ from docx.shared import Pt
12
+ from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
13
+ from docx.shared import Inches
14
+ from docx.oxml.ns import qn
15
+ from docx.oxml import OxmlElement
16
+ from docx.shared import RGBColor
17
+ from fpdf import FPDF
18
+ import datetime
19
+ import os
20
+ import numpy as np
21
+
22
+ # Carrega o .csv com a base de valores de face
23
+ df = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/BD_eqv.csv', sep=';', encoding='latin-1')
24
+
25
+ # Carrega o .csv com a base de valores de face
26
+ df_rh = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/rh.csv', sep=';', encoding='latin-1')
27
+
28
+ # Carrega o .csv com a base de valores de face
29
+ df_2 = pd.read_excel('/content/drive/MyDrive/Colab Notebooks/Planilha_histórico_IT.xlsx')
30
+
31
+ # Função para converte as coordenadas sirgas em wgs
32
+
33
+ def plota(df):
34
+ # Define the TM-POA projection
35
+ tm_poa = pyproj.Proj("+proj=tmerc +lat_0=0 +lon_0=-51 +k_0=0.999995 +x_0=300000 +y_0=5000000 +ellps=GRS80 +units=m +no_defs")
36
+
37
+ # Define the WGS84 projection
38
+ wgs84 = pyproj.Proj("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
39
+
40
+ # Convert the SIRGAS2000 coordinates to latitude and longitude
41
+ lon, lat = pyproj.transform(tm_poa, wgs84, df['X'].values, df['Y'].values)
42
+
43
+ # Calculate bounding box
44
+ min_lon, max_lon = lon.min(), lon.max()
45
+ min_lat, max_lat = lat.min(), lat.max()
46
+
47
+ # Create a Plotly Scattermapbox
48
+ fig = go.Figure(go.Scattermapbox(
49
+ lat=lat,
50
+ lon=lon,
51
+ mode='markers',
52
+ marker=dict(size=15, color=['green','orange']),
53
+ text=df[['LOGRAD', 'NUM']]
54
+ ))
55
+
56
+
57
+ # Set the mapbox style
58
+ fig.update_layout(mapbox_style='carto-positron')
59
+
60
+ # Set the center and zoom of the map based on bounding box
61
+ center_lon = (min_lon + max_lon) / 2
62
+ center_lat = (min_lat + max_lat) / 2
63
+ zoom = 10 # You can adjust the zoom level as needed
64
+
65
+ fig.update_layout(mapbox=dict(center=dict(lon=center_lon, lat=center_lat), zoom=10))
66
+
67
+ # Show the map
68
+ fig.show()
69
+
70
+ return fig
71
+
72
+
73
+ # ---------------------------------------Função para calcular a equivalência-----------------------------------------------------#
74
+
75
+ def calculate_equivalent(manual, manual_RH_O, manual_RH_D, requer, docs, it, processo, prop_o, log_origem, num_origem, tipo_o, doc_o, zona_o, prop_d, log_destino,
76
+ num_destino, tipo_d, doc_d, zona_d, incluir):
77
+
78
+
79
+ # ----------------------------------------------PESQUISA-------------------------------------------------------#
80
+
81
+ if manual == "Manual":
82
+ # Para fazer a pesquisa de forma manual pelo RH
83
+ pesquisa_O = df_rh[df_rh['RH'] == manual_RH_O]
84
+ pesquisa_D = df_rh[df_rh['RH'] == manual_RH_D]
85
+
86
+ # Verifica se há resultados nas pesquisas
87
+ if not pesquisa_O.empty and not pesquisa_D.empty:
88
+ VU_O = float(pesquisa_O['VU'].iloc[0].replace('.', '').replace(',', '.'))
89
+ VU_D = float(pesquisa_D['VU'].iloc[0].replace('.', '').replace(',', '.'))
90
+
91
+ RH_O = manual_RH_O
92
+ RH_D = manual_RH_D
93
+
94
+ else:
95
+ # Para fazer a pesquisa de forma automática pelo endereço
96
+ pesquisa_O = df[(df['LOGRAD'] == log_origem) & (df['NUM'] == num_origem)]
97
+ pesquisa_D = df[(df['LOGRAD'] == log_destino) & (df['NUM'] == num_destino)]
98
+
99
+ # Verifica se há resultados nas pesquisas
100
+ if not pesquisa_O.empty and not pesquisa_D.empty:
101
+ VU_O = float(pesquisa_O['VU'].iloc[0].replace('.', '').replace(',', '.'))
102
+ VU_D = float(pesquisa_D['VU'].iloc[0].replace('.', '').replace(',', '.'))
103
+
104
+ RH_O = pesquisa_O['RH'].iloc[0]
105
+ RH_D = pesquisa_D['RH'].iloc[0]
106
+
107
+
108
+ mapa_O = df[(df['LOGRAD'] == log_origem) & (df['NUM'] == num_origem)]
109
+ mapa_D = df[(df['LOGRAD'] == log_destino) & (df['NUM'] == num_destino)]
110
+ df_combined = pd.concat([mapa_O, mapa_D], ignore_index=True)
111
+ distance_euclidean = round(np.sqrt((df_combined['X'].max() - df_combined['X'].min())**2 + (df_combined['Y'].max() - df_combined['Y'].min())**2), 0)
112
+
113
+ # --------------------------------------------CÁLCULO---------------------------------------------------------#
114
+
115
+ # Se ambos os valores foram encontrados, realize a divisão
116
+ eqv = round(VU_O / VU_D, 4)
117
+
118
+ # --------------------------------------------STRINGS---------------------------------------------------------#
119
+
120
+ documentação = f"""
121
+ Requerente: {requer}
122
+ Documentação: {docs}
123
+ """
124
+ ano_corrente = datetime.datetime.now().year
125
+ título = f"""
126
+ INFORMAÇÃO TÉCNICA
127
+ EQUIVALÊNCIA PARA ÍNDICE CONSTRUTIVO
128
+ IT_{it}_{ano_corrente}_EQUIV
129
+ """
130
+ introdução = f"""
131
+ Conforme solicitação formulada através do processo n.º {processo}, estamos informando a equivalência de valores para a transferência de índices construtivos, tendo por base valores territoriais.O Coeficiente de Equivalência foi calculado com base na documentação apresentada no processo, e possui validade de 1(um) ano, a partir da data de sua emissão. Deverá ser verificada, junto à Secretaria competente, a viabilidade da transferência de índices solicitada.
132
+ """
133
+ resultados = f"""
134
+ ORIGEM
135
+ Proprietário origem: {prop_o}
136
+ Endereço: {log_origem}
137
+ Número: {int(num_origem)}
138
+ RH: {RH_O}
139
+ Valor unitário: R$ {VU_O:,.2f} /m²
140
+ Tipo: {tipo_o}
141
+ Documento: {doc_o}
142
+ Zona: {zona_o}
143
+
144
+ DESTINO
145
+ Proprietário origem: {prop_d}
146
+ Endereço: {log_destino}
147
+ Número: {int(num_destino)}
148
+ RH: {RH_D}
149
+ Valor unitário DESTINO: R$ {VU_D:,.2f} /m²
150
+ Tipo: {tipo_d}
151
+ Documento: {doc_d}
152
+ Zona: {zona_d}
153
+
154
+ EQUIVALÊNCIA de ÍNDICE: {eqv}
155
+ """
156
+ # Substituindo ponto por vírgula
157
+ resultados = resultados.replace('.', '@')
158
+ resultados = resultados.replace(',', '.')
159
+ resultados = resultados.replace('@', ',')
160
+
161
+ #Distância: {distance_euclidean}
162
+
163
+ #---------------------------------------------------RELATÓRIO NO WORD-----------------------------------------------#
164
+
165
+ # Criação de um relatório da avaliação no word
166
+ # Criar um novo documento do Word
167
+ doc = Document()
168
+
169
+ # Definir o título do documento
170
+ doc.add_heading('', level=1)
171
+
172
+ # Definir as seções do relatório
173
+ sections = [
174
+ (documentação, ""),
175
+ (título, " "),
176
+ (introdução, " "),
177
+ (resultados, ""),
178
+ ]
179
+
180
+ for content, title in sections:
181
+ doc.add_heading(title, level=2)
182
+ p = doc.add_paragraph()
183
+ run = p.add_run(str(content))
184
+ run.font.name = 'Arial'
185
+ run.font.size = Pt(10)
186
+ p.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT # Define o alinhamento para à esquerda
187
+
188
+
189
+ # Adiciona alinhamento à direita para a assinatura
190
+ if title == " ":
191
+ run.font.size = Pt(10)
192
+ run.font.name = 'Arial'
193
+ p.alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY
194
+
195
+ # Adiciona alinhamento à direita para a assinatura
196
+ if title == " ":
197
+ run.font.size = Pt(14)
198
+ run.font.name = 'Arial'
199
+ run.bold = True
200
+ p.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
201
+
202
+ # Configuração do espaço antes e depois dos parágrafos
203
+ for paragraph in doc.paragraphs:
204
+ if paragraph.style.name.startswith('Heading'):
205
+ paragraph.space_before = Pt(0) # Elimina espaço antes dos títulos
206
+ else:
207
+ paragraph.space_before = Pt(0) # Espaço antes do parágrafo (ajuste conforme necessário)
208
+ paragraph.space_after = Pt(0) # Espaço depois do parágrafo (ajuste conforme necessário)
209
+
210
+ # Salvar o documento em um arquivo .doc
211
+ doc.save('Informação Técnica.doc')
212
+
213
+ #--------------------------------------------------RELATÓRIO EM PDF------------------------------------------------#
214
+
215
+ # Abre o documento do Word
216
+ docx_file = "Informação Técnica.doc"
217
+ doc = Document(docx_file)
218
+
219
+ # Cria um novo arquivo PDF
220
+ pdf = FPDF()
221
+ pdf.add_page()
222
+
223
+ # Define a fonte para Arial e o tamanho da fonte
224
+ pdf.set_font("Arial", size=12)
225
+
226
+ # Itera sobre os parágrafos do documento do Word e adiciona ao PDF
227
+ for paragraph in doc.paragraphs:
228
+ pdf.multi_cell(0, 5, paragraph.text)
229
+ pdf.ln()
230
+
231
+ # Salva o arquivo PDF
232
+ pdf_file = "Informação_Técnica.pdf"
233
+ pdf.output(pdf_file)
234
+
235
+ #-----------------------------------------------------DATAFRAME-----------------------------------------------------#
236
+
237
+ #Cria um DataFrame com os resultados
238
+ results_df = pd.DataFrame({
239
+ 'Processo': [processo],
240
+ 'Requerente': [requer],
241
+ 'Documentos': [docs],
242
+ 'Proprietário origem': [prop_o],
243
+ 'Endereço origem': [log_origem],
244
+ 'Número origem': [int(num_origem)],
245
+ 'RH origem': [RH_O],
246
+ 'Valor unitário origem (R$/m²)': [VU_O],
247
+ 'Tipo origem': [tipo_o],
248
+ 'Documento origem': [doc_o],
249
+ 'Zona origem': [zona_o],
250
+ 'Proprietário destino': [prop_d],
251
+ 'Endereço destino': [log_destino],
252
+ 'Número destino': [int(num_destino)],
253
+ 'RH destino': [RH_D],
254
+ 'Valor unitário destino (R$/m²)': [VU_D],
255
+ 'Tipo destino': [tipo_d],
256
+ 'Documento destino': [doc_d],
257
+ 'Zona destino': [zona_d],
258
+ 'Equivalência de Índice': [eqv],
259
+ 'IT': [f'IT_{it}_{datetime.datetime.now().year}_EQUIV']
260
+ })
261
+
262
+ # Salva o DataFrame em um arquivo Excel
263
+ # excel_file = 'Planilha_histórico_IT.xlsx'
264
+ # results_df.to_excel(excel_file, index=False)
265
+
266
+ # Verifica se o arquivo já existe
267
+ if os.path.exists('/content/drive/MyDrive/Colab Notebooks/Planilha_histórico_IT.xlsx'):
268
+ existing_df = pd.read_excel('/content/drive/MyDrive/Colab Notebooks/Planilha_histórico_IT.xlsx')
269
+ updated_df = pd.concat([existing_df, results_df], ignore_index=True)
270
+ if incluir == "Sim":
271
+ updated_df.to_excel('/content/drive/MyDrive/Colab Notebooks/Planilha_histórico_IT.xlsx', index=False)
272
+ else:
273
+ results_df.to_excel('/content/drive/MyDrive/Colab Notebooks/Planilha_histórico_IT.xlsx', index=False)
274
+
275
+
276
+ #---------------------------------------------------------MAPA---------------------------------------------------------#
277
+
278
+ mapa = plota(df_combined)
279
+
280
+ #-------------------------------------------------------OUTPUTS--------------------------------------------------------#
281
+
282
+ return documentação, título, introdução, resultados, mapa, pdf_file, '/content/drive/MyDrive/Colab Notebooks/Planilha_histórico_IT.xlsx' #, 'Informação Técnica.doc'
283
+
284
+ #------------------------------------------------------INTERFACE-------------------------------------------------------#
285
+
286
+ # Obtenha a lista única de logradouros do DataFrame
287
+ df_log = df[['LOGRAD']]
288
+ df_log = df_log.drop_duplicates()
289
+ logs = df_log['LOGRAD'].tolist()
290
+
291
+ iface = gr.Interface(
292
+ fn=calculate_equivalent,
293
+ inputs=[
294
+
295
+ gr.Radio(["Automático", "Manual"], label="Caso você queira fazer a entrada de foma manual utilizando o RH, marque a opção Manual",value="Automático"),
296
+ gr.Slider(minimum=1, maximum=380, value=1, label="RH da origem"),
297
+ gr.Slider(minimum=1, maximum=380, value=1, label="RH do destino"),
298
+
299
+ gr.Text(label="Requerente"),
300
+ gr.Dropdown(["Proprietário", "Procurador", "Origem","Destino"], multiselect=True, label="Documentação apresentada"),
301
+
302
+ gr.Text(label="Número da IT"),
303
+ gr.Text(label="Processo", value="00.0.000000000-0"),
304
+
305
+ gr.Text(label="Proprietário origem"),
306
+ gr.Dropdown(logs, label="Logradouro de origem", value ='Rua GEN JOAO MANOEL'),
307
+ gr.Number(minimum=1, label="Número de origem", value =157),
308
+ gr.Dropdown(["Matrícula", "Certidão", "Escritura Pública", "outro"], label="Tipo de documento", value ='Matrícula',
309
+ info="Escolha o tipo de documento"),
310
+ gr.Number(label="Número do Documento"),
311
+ gr.Dropdown(["1ª", "2ª", "3ª", "4ª", "5ª", "6ª"], label="Zona", value ='-',
312
+ info="Escolha a zona"),
313
+
314
+ gr.Text(label="Proprietário destino"),
315
+ gr.Dropdown(logs, label="Logradouro de destino", value ='Rua URUGUAI'),
316
+ gr.Number(minimum=1, label="Número de destino", value =277),
317
+ gr.Dropdown(["Matrícula", "Certidão", "Escritura Pública", "outro"], label="Tipo de documento", value ='Matrícula',
318
+ info="Escolha o tipo de documento"),
319
+ gr.Number(label="Número do Documento"),
320
+ gr.Dropdown(["1ª", "2ª", "3ª", "4ª", "5ª", "6ª"], label="Zona", value ='-',
321
+ info="Escolha a zona"),
322
+ gr.Radio(["Sim", "Não"], label="Incluir a IT no histórico",value="Não"),
323
+ ],
324
+ outputs=[
325
+ gr.Textbox(label="Documentação apresentada"),
326
+ gr.Textbox(label="Título"),
327
+ gr.Textbox(label="EQUIVALÊNCIA PARA ÍNDICE CONSTRUTIVO"),
328
+ gr.Textbox(label="Resultados"),
329
+ gr.Plot(label="Localização do Imóvel de Origem e de Destino"),
330
+ #gr.File(label="Informação Técnica - arquivo word"),
331
+ gr.File(label="Informação Técnica - arquivo PDF"),
332
+ gr.File(label="Histórico das IT's - arquivo Excel"),
333
+ ]
334
+ )
335
+
336
+ iface.launch(debug=True)