Files changed (1) hide show
  1. app.py +187 -170
app.py CHANGED
@@ -75,211 +75,228 @@ def plota(df):
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('Planilha_histórico_IT.xlsx'):
268
- existing_df = pd.read_excel('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('Planilha_histórico_IT.xlsx', index=False)
272
- else:
273
- results_df.to_excel('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, 'Planilha_histórico_IT.xlsx' #, 'Informação Técnica.doc'
 
 
 
 
 
 
 
 
 
 
 
 
283
 
284
  #------------------------------------------------------INTERFACE-------------------------------------------------------#
285
 
@@ -333,4 +350,4 @@ iface = gr.Interface(
333
  ]
334
  )
335
 
336
- iface.launch(debug=True)
 
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
+ try:
79
+
80
 
81
  # ----------------------------------------------PESQUISA-------------------------------------------------------#
82
 
83
+ if manual == "Manual":
84
+ # Para fazer a pesquisa de forma manual pelo RH
85
+ pesquisa_O = df_rh[df_rh['RH'] == manual_RH_O]
86
+ pesquisa_D = df_rh[df_rh['RH'] == manual_RH_D]
87
 
88
+ # Verifica se há resultados nas pesquisas
89
+ if not pesquisa_O.empty and not pesquisa_D.empty:
90
+ VU_O = float(pesquisa_O['VU'].iloc[0].replace('.', '').replace(',', '.'))
91
+ VU_D = float(pesquisa_D['VU'].iloc[0].replace('.', '').replace(',', '.'))
92
 
93
+ RH_O = manual_RH_O
94
+ RH_D = manual_RH_D
95
 
96
+ else:
97
+ # Para fazer a pesquisa de forma automática pelo endereço
98
+ pesquisa_O = df[(df['LOGRAD'] == log_origem) & (df['NUM'] == num_origem)]
99
+ pesquisa_D = df[(df['LOGRAD'] == log_destino) & (df['NUM'] == num_destino)]
100
 
101
+ # Verifica se há resultados nas pesquisas
102
+ if not pesquisa_O.empty and not pesquisa_D.empty:
103
+ VU_O = float(pesquisa_O['VU'].iloc[0].replace('.', '').replace(',', '.'))
104
+ VU_D = float(pesquisa_D['VU'].iloc[0].replace('.', '').replace(',', '.'))
105
 
106
+ RH_O = pesquisa_O['RH'].iloc[0]
107
+ RH_D = pesquisa_D['RH'].iloc[0]
108
 
109
 
110
+ mapa_O = df[(df['LOGRAD'] == log_origem) & (df['NUM'] == num_origem)]
111
+ mapa_D = df[(df['LOGRAD'] == log_destino) & (df['NUM'] == num_destino)]
112
+ df_combined = pd.concat([mapa_O, mapa_D], ignore_index=True)
113
+ distance_euclidean = round(np.sqrt((df_combined['X'].max() - df_combined['X'].min())**2 + (df_combined['Y'].max() - df_combined['Y'].min())**2), 0)
114
 
115
  # --------------------------------------------CÁLCULO---------------------------------------------------------#
116
 
117
+ # Se ambos os valores foram encontrados, realize a divisão
118
+ eqv = round(VU_O / VU_D, 4)
119
+
120
+ # ------------------------------------------ IMPRIMIR DOCUMENTAÇÃO ------------------------------------------ #
121
 
122
+ # Separa os itens da lista
123
+ formatted_docs = ', '.join(docs)
124
+
125
  # --------------------------------------------STRINGS---------------------------------------------------------#
126
 
127
+ documentação = f"""
128
+ Requerente: {requer}
129
+ Documentação: {formatted_docs}
130
+ """
131
+ ano_corrente = datetime.datetime.now().year
132
+ título = f"""
133
+ INFORMAÇÃO TÉCNICA
134
+ EQUIVALÊNCIA PARA ÍNDICE CONSTRUTIVO
135
+ IT_{it}_{ano_corrente}_EQUIV
136
+ """
137
+ introdução = f"""
138
+ 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.
139
+ """
140
+ resultados = f"""
141
+ ORIGEM
142
+ Proprietário origem: {prop_o}
143
+ Endereço: {log_origem}
144
+ Número: {int(num_origem)}
145
+ RH: {RH_O}
146
+ Valor unitário: R$ {VU_O:,.2f} /m²
147
+ Tipo: {tipo_o}
148
+ Documento: {doc_o}
149
+ Zona: {zona_o}
150
+ DESTINO
151
+ Proprietário origem: {prop_d}
152
+ Endereço: {log_destino}
153
+ Número: {int(num_destino)}
154
+ RH: {RH_D}
155
+ Valor unitário DESTINO: R$ {VU_D:,.2f} /m²
156
+ Tipo: {tipo_d}
157
+ Documento: {doc_d}
158
+ Zona: {zona_d}
159
+ EQUIVALÊNCIA de ÍNDICE: {eqv}
160
+ """
161
+ # Substituindo ponto por vírgula
162
+ resultados = resultados.replace('.', '@')
163
+ resultados = resultados.replace(',', '.')
164
+ resultados = resultados.replace('@', ',')
165
+
166
+ #Distância: {distance_euclidean}
 
 
167
 
168
  #---------------------------------------------------RELATÓRIO NO WORD-----------------------------------------------#
169
 
170
+ # Criação de um relatório da avaliação no word
171
+ # Criar um novo documento do Word
172
+ doc = Document()
173
+
174
+ # Definir o título do documento
175
+ doc.add_heading('', level=1)
176
+
177
+ # Definir as seções do relatório
178
+ sections = [
179
+ (documentação, ""),
180
+ (título, " "),
181
+ (introdução, " "),
182
+ (resultados, ""),
183
+ ]
184
+
185
+ for content, title in sections:
186
+ doc.add_heading(title, level=2)
187
+ p = doc.add_paragraph()
188
+ run = p.add_run(str(content))
189
+ run.font.name = 'Arial'
190
+ run.font.size = Pt(10)
191
+ p.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT # Define o alinhamento para à esquerda
192
+
193
+
194
+ # Adiciona alinhamento à direita para a assinatura
195
+ if title == " ":
196
+ run.font.size = Pt(10)
197
+ run.font.name = 'Arial'
198
+ p.alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY
199
+
200
+ # Adiciona alinhamento à direita para a assinatura
201
+ if title == " ":
202
+ run.font.size = Pt(14)
203
+ run.font.name = 'Arial'
204
+ run.bold = True
205
+ p.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
206
+
207
+ # Configuração do espaço antes e depois dos parágrafos
208
+ for paragraph in doc.paragraphs:
209
+ if paragraph.style.name.startswith('Heading'):
210
+ paragraph.space_before = Pt(0) # Elimina espaço antes dos títulos
211
+ else:
212
+ paragraph.space_before = Pt(0) # Espaço antes do parágrafo (ajuste conforme necessário)
213
+ paragraph.space_after = Pt(0) # Espaço depois do parágrafo (ajuste conforme necessário)
214
+
215
+ # Salvar o documento em um arquivo .doc
216
+ doc.save('Informação Técnica.doc')
217
 
218
  #--------------------------------------------------RELATÓRIO EM PDF------------------------------------------------#
219
 
220
+ # Abre o documento do Word
221
+ docx_file = "Informação Técnica.doc"
222
+ doc = Document(docx_file)
223
 
224
+ # Cria um novo arquivo PDF
225
+ pdf = FPDF()
226
+ pdf.add_page()
227
 
228
+ # Define a fonte para Arial e o tamanho da fonte
229
+ pdf.set_font("Arial", size=12)
230
 
231
+ # Itera sobre os parágrafos do documento do Word e adiciona ao PDF
232
+ for paragraph in doc.paragraphs:
233
+ pdf.multi_cell(0, 5, paragraph.text)
234
+ pdf.ln()
235
 
236
+ # Salva o arquivo PDF
237
+ pdf_file = "Informação_Técnica.pdf"
238
+ pdf.output(pdf_file)
239
 
240
  #-----------------------------------------------------DATAFRAME-----------------------------------------------------#
241
 
242
+ #Cria um DataFrame com os resultados
243
+ results_df = pd.DataFrame({
244
+ 'Processo': [processo],
245
+ 'Requerente': [requer],
246
+ 'Documentos': [docs],
247
+ 'Proprietário origem': [prop_o],
248
+ 'Endereço origem': [log_origem],
249
+ 'Número origem': [int(num_origem)],
250
+ 'RH origem': [RH_O],
251
+ 'Valor unitário origem (R$/m²)': [VU_O],
252
+ 'Tipo origem': [tipo_o],
253
+ 'Documento origem': [doc_o],
254
+ 'Zona origem': [zona_o],
255
+ 'Proprietário destino': [prop_d],
256
+ 'Endereço destino': [log_destino],
257
+ 'Número destino': [int(num_destino)],
258
+ 'RH destino': [RH_D],
259
+ 'Valor unitário destino (R$/m²)': [VU_D],
260
+ 'Tipo destino': [tipo_d],
261
+ 'Documento destino': [doc_d],
262
+ 'Zona destino': [zona_d],
263
+ 'Equivalência de Índice': [eqv],
264
+ 'IT': [f'IT_{it}_{datetime.datetime.now().year}_EQUIV']
265
+ })
266
+
267
+ # Salva o DataFrame em um arquivo Excel
268
+ # excel_file = 'Planilha_histórico_IT.xlsx'
269
+ # results_df.to_excel(excel_file, index=False)
270
+
271
+ # Verifica se o arquivo já existe
272
+ if os.path.exists('Planilha_histórico_IT.xlsx'):
273
+ existing_df = pd.read_excel('Planilha_histórico_IT.xlsx')
274
+ updated_df = pd.concat([existing_df, results_df], ignore_index=True)
275
+ if incluir == "Sim":
276
+ pdated_df.to_excel('Planilha_histórico_IT.xlsx', index=False)
277
+ else:
278
+ results_df.to_excel('Planilha_histórico_IT.xlsx', index=False)
279
 
280
 
281
  #---------------------------------------------------------MAPA---------------------------------------------------------#
282
 
283
+ mapa = plota(df_combined)
284
 
285
  #-------------------------------------------------------OUTPUTS--------------------------------------------------------#
286
 
287
+ return documentação, título, introdução, resultados, mapa, pdf_file, 'Planilha_histórico_IT.xlsx' #, 'Informação Técnica.doc'
288
+
289
+ #-------------------------------------------------------EXCEPTION-------------------------------------------------------#
290
+
291
+ except Exception as e:
292
+ # Here, you handle any errors that occur in your function.
293
+ # You can log the actual error to console or a file if needed for debugging.
294
+ print(f"Error: {e}")
295
+
296
+ # Return a custom error message to the user
297
+ custom_error_message = "Revisar as informações fornecidas"
298
+ # Return this message in the same format as your function's successful output
299
+ return None, None, None, custom_error_message, None, None, None
300
 
301
  #------------------------------------------------------INTERFACE-------------------------------------------------------#
302
 
 
350
  ]
351
  )
352
 
353
+ iface.launch(debug=True)