PLUGINS_QGIS/pluginsCenSavoie_v3/tools/parcelle_to_acte_dialog.py
2024-11-26 14:56:34 +01:00

238 lines
11 KiB
Python

# -*- coding: utf-8 -*-
"""
/***************************************************************************
ParcelleToActeDialog
A QGIS plugin
Permet d'associer des parcelles à des actes
-------------------
begin : 2015-06-19
git sha : $Format:%H$
copyright : (C) 2015 by CEN Savoie
email : a.lesconnec@cen-savoie.org
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
"""
import os
import psycopg2
import psycopg2.extras
import base64
from PyQt5 import QtGui, uic
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import QDialog, QMessageBox
from functools import partial
import datetime
from time import gmtime, strftime
# Import du fichier de configuration
from pluginsCenSavoie_v3.tools.confPython import bd_cen_host, bd_cen_port, bd_cen_name
FORM_CLASS, _ = uic.loadUiType(os.path.join(os.path.dirname(__file__), 'parcelle_to_acte_dialog_base.ui'))
class ParcelleToActeDialog(QDialog, FORM_CLASS):
def __init__(self, parent=None):
"""Constructor."""
global host
host = bd_cen_host
global port
port = bd_cen_port
global bdd
bdd = bd_cen_name
super(ParcelleToActeDialog, self).__init__(parent)
QDialog.__init__(self)
# Set up the user interface from Designer.
# After setupUI you can access any designer object by doing
# self.<objectname>, and you can use autoconnect slots - see
# http://qt-project.org/doc/qt-4.8/designer-using-a-ui-file.html
# #widgets-and-dialogs-with-auto-connect
self.setupUi(self)
def InitFormulaire(self, site_id, acces, user, mdp):
self.chk_convention.clicked.connect(partial(self.InitFormulaire, site_id = site_id, acces='reload', user = user, mdp = mdp))
self.chk_acquisition.clicked.connect(partial(self.InitFormulaire, site_id = site_id, acces='reload', user = user, mdp = mdp))
self.flt_date_today.clicked.connect(partial(self.InitFormulaire, site_id = site_id, acces='reload', user = user, mdp = mdp))
self.flt_date_week.clicked.connect(partial(self.InitFormulaire, site_id = site_id, acces='reload', user = user, mdp = mdp))
self.flt_date_month.clicked.connect(partial(self.InitFormulaire, site_id = site_id, acces='reload', user = user, mdp = mdp))
self.flt_date_unknown.clicked.connect(partial(self.InitFormulaire, site_id = site_id, acces='reload', user = user, mdp = mdp))
self.lst_actes.blockSignals(True)
self.lst_motif_maj.blockSignals(True)
if acces == 'load':
self.chk_convention.setChecked(1)
self.chk_acquisition.setChecked(1)
self.flt_date_unknown.setChecked(1)
self.no_acte.setVisible(0)
self.type_acte_sel.setVisible(0)
self.motif_maj_id.setVisible(0)
self.cal_date_modif.setVisible(0)
self.motif_maj_id.setText('');
self.button_box.setEnabled(False)
self.date_modif.setText('N.P.')
global conn, cur
conn = psycopg2.connect("host=" + host + " port=" + port + " dbname=" + bdd + " user=" + user + " password=" + mdp)
cur = conn.cursor(cursor_factory = psycopg2.extras.DictCursor)
self.lst_actes.clear() #Vidage de la combobox
self.lst_motif_maj.clear() #Vidage de la combobox
k = 0
aujourdhui = strftime("%Y-%m-%d", gmtime())
this_week = strftime("%U", gmtime())
tbl_site_id = site_id
self.no_acte.setVisible(1)
self.lst_actes.setVisible(0)
self.lst_motif_maj.setVisible(0)
global tbl_typemfu
tbl_typemfu = []
global tbl_motif_maj
tbl_motif_maj = []
rq_lst_motif = """
SELECT motif_maj_id as id, motif_maj_lib as lib
FROM
foncier.d_motif_maj
WHERE motif_maj_id != 2 AND motif_maj_manip IN ('entree', 'entree/sortie')
ORDER BY motif_maj_ordre"""
if self.chk_convention.isChecked() == 0:
rq_lst_motif = rq_lst_motif + " AND motif_maj_acte NOT LIKE '%Convention%'"
if self.chk_acquisition.isChecked() == 0:
rq_lst_motif = rq_lst_motif + " AND motif_maj_acte NOT LIKE '%Acquisition%'"
with conn:
with conn.cursor() as cur:
cur.execute(rq_lst_motif)
global res_lst_motif
res_lst_motif = cur.fetchall() #requête de récupération des options possible de niveau 2 à partir du niveau 1 sélectionné
if len(res_lst_motif) > 0:
self.lst_motif_maj.setVisible(1)
i = 0 #Déclaration à 0 d'une variable pour boucler sur toutes les options de la requête identifiée précédement
while i < len(res_lst_motif): #Boucle sur toutes les options de niveau 2
lib = res_lst_motif[i][1] #Déclaration de la variable stockant le libellé complet de la requête
self.lst_motif_maj.addItem(lib) #Ajout à la combobox de l'option en cours de bouclage
tbl_motif_maj.append(res_lst_motif[i][0])
i=i+1 #implémentation de la variable permettant de suivre le bon index de la combobox
self.lst_motif_maj.setCurrentIndex(-1)
while k < len(tbl_site_id):
cur_site_id = tbl_site_id[k]
k = k + 1
rq_lst_mfu = """
WITH tprob AS (
SELECT DISTINCT acte AS acte_id FROM alertes.v_prob_mfu_baddata
UNION
SELECT DISTINCT mfu_id AS acte_id FROM alertes.v_prob_cadastre_cen WHERE statutmfu_id = 1
UNION
SELECT DISTINCT acte AS acte_id FROM alertes.v_alertes_mu WHERE alerte LIKE 'termin%'
UNION
SELECT DISTINCT mfu_id AS acte_id FROM alertes.v_prob_mfu_sansparc
),
t1 AS (
SELECT DISTINCT
acte as type_acte, mfu_id as acte_id, mf_acquisitions.mf_lib as acte_lib, typmfu_lib as acte_typ,
v_tdb_mfu.date_sign_acte as acte_date, mf_acquisitions.maj_date as maj_date
FROM
alertes.v_tdb_mfu
JOIN foncier.mf_acquisitions ON (mf_id = mfu_id)
LEFT JOIN tprob ON (acte_id = mfu_id)
WHERE statutmfu_id IN (0, 1) AND tbl_site_id ILIKE '%"""+cur_site_id+"""%' AND tprob.acte_id IS NULL
UNION
SELECT DISTINCT
acte as type_acte, mfu_id as acte_id, mu_conventions.mu_lib as acte_lib, typmfu_lib as acte_typ,
v_tdb_mfu.date_effet_conv as acte_date, mu_conventions.maj_date as maj_date
FROM
alertes.v_tdb_mfu
JOIN foncier.mu_conventions ON (mu_id = mfu_id)
LEFT JOIN tprob ON (acte_id = mfu_id)
WHERE statutmfu_id IN (0, 1) AND tbl_site_id ILIKE '%"""+cur_site_id+"""%' AND tprob.acte_id IS NULL
)
SELECT * FROM t1 WHERE 1=1"""
if self.chk_convention.isChecked() == 0:
rq_lst_mfu = rq_lst_mfu + " AND type_acte != 'Convention'"
if self.chk_acquisition.isChecked() == 0:
rq_lst_mfu = rq_lst_mfu + " AND type_acte != 'Acquisition'"
if self.flt_date_today.isChecked() == 1:
rq_lst_mfu = rq_lst_mfu + " AND LEFT(maj_date, 10) = '"+aujourdhui+"'"
elif self.flt_date_week.isChecked() == 1:
rq_lst_mfu = rq_lst_mfu + " AND EXTRACT(WEEK FROM to_date(maj_date, 'YYYY-MM-DD')) = " + this_week
elif self.flt_date_month.isChecked() == 1:
rq_lst_mfu = rq_lst_mfu + " AND TO_DATE(maj_date, 'YYYY-MM-DD') BETWEEN TO_DATE('"+strftime("%Y-%m", gmtime())+"-01', '%Y-%m-%d') AND TO_DATE('"+strftime("%Y-%m-%d", gmtime())+"', 'YYYY-MM-DD')"
with conn:
with conn.cursor() as cur:
cur.execute(rq_lst_mfu)
res_lst_mfu = cur.fetchall() #requête de récupération des options possible de niveau 2 à partir du niveau 1 sélectionné
if len(res_lst_mfu) > 0:
self.no_acte.setVisible(0)
self.lst_actes.setVisible(1)
i = 0 #Déclaration à 0 d'une variable pour boucler sur toutes les options de la requête identifiée précédement
while i < len(res_lst_mfu): #Boucle sur toutes les options de niveau 2
lib = res_lst_mfu[i][1] #Déclaration de la variable stockant le libellé complet de la requête
self.lst_actes.addItem(lib) #Ajout à la combobox de l'option en cours de bouclage
tbl_typemfu.append(res_lst_mfu[i][0])
i=i+1 #implémentation de la variable permettant de suivre le bon index de la combobox
self.lst_actes.setCurrentIndex(-1)
self.lst_actes.currentIndexChanged.connect(self.change_lst_acte)
self.lst_actes.blockSignals(False)
self.lst_motif_maj.currentIndexChanged.connect(self.change_lst_motif_maj)
self.lst_motif_maj.blockSignals(False)
def change_lst_acte(self, index):
self.lst_motif_maj.blockSignals(True)
if self.lst_actes.currentIndex() != -1 and self.date_modif.text() != 'N.P.' and self.lst_motif_maj.currentIndex() != -1 :
self.button_box.setEnabled(True)
else:
self.button_box.setEnabled(False)
if index != -1 and tbl_typemfu[index] == 'Acquisition':
self.type_acte_sel.setText('r_cad_site_mf')
elif index != -1 and tbl_typemfu[index] == 'Convention':
self.type_acte_sel.setText('r_cad_site_mu')
with conn:
with conn.cursor() as cur:
if self.motif_maj_id.text() != '':
rq_check_lst_motif = "SELECT motif_maj_id as id, motif_maj_lib as lib FROM foncier.d_motif_maj WHERE motif_maj_manip IN ('entree', 'entree/sortie') AND motif_maj_acte LIKE '%"+str(tbl_typemfu[index])+"%' AND motif_maj_id = "+str(self.motif_maj_id.text())
cur.execute(rq_check_lst_motif)
res_check_lst_motif = cur.fetchall()
if len(res_check_lst_motif) == 0 :
self.lst_motif_maj.setCurrentIndex(-1)
self.motif_maj_id.setText('')
rq_lst_motif = """
SELECT motif_maj_id as id, motif_maj_lib as lib
FROM foncier.d_motif_maj
WHERE motif_maj_id != 2 AND motif_maj_manip IN ('entree', 'entree/sortie') AND motif_maj_acte LIKE '%"+str(tbl_typemfu[index])+"%'
ORDER BY motif_maj_ordre"""
cur.execute(rq_lst_motif)
res_lst_motif = cur.fetchall() #requête de récupération des options possible de niveau 2 à partir du niveau 1 sélectionné
if len(res_lst_motif) > 0:
self.lst_motif_maj.setVisible(1)
self.lst_motif_maj.clear()
tbl_motif_maj.clear()
i = 0 #Déclaration à 0 d'une variable pour boucler sur toutes les options de la requête identifiée précédement
j = -1
while i < len(res_lst_motif): #Boucle sur toutes les options de niveau 2
lib = res_lst_motif[i][1] #Déclaration de la variable stockant le libellé complet de la requête
self.lst_motif_maj.addItem(lib) #Ajout à la combobox de l'option en cours de bouclage
tbl_motif_maj.append(res_lst_motif[i][0])
if str(res_lst_motif[i][0]) == str(self.motif_maj_id.text()):
j = i
i=i+1 #implémentation de la variable permettant de suivre le bon index de la combobox
self.lst_motif_maj.setCurrentIndex(j)
self.lst_motif_maj.blockSignals(False)
def change_lst_motif_maj(self, index):
if self.lst_motif_maj.currentIndex() != -1:
self.motif_maj_id.setText(str(tbl_motif_maj[index]))
if self.lst_actes.currentIndex() != -1 and self.date_modif.text() != 'N.P.' and self.lst_motif_maj.currentIndex() != -1 :
self.button_box.setEnabled(True)
else:
self.button_box.setEnabled(False)