1 |
<?php |
2 |
/** |
3 |
* Traitement sur les actions de la géolocalisation |
4 |
* |
5 |
* @package openfoncier |
6 |
* @version SVN : $Id$ |
7 |
*/ |
8 |
|
9 |
// Fichires requis |
10 |
require_once "../obj/utils.class.php"; |
11 |
require_once '../services/outgoing/MessageSenderSoap.class.php'; |
12 |
require_once "../obj/sig_elyx.class.php"; |
13 |
require_once "../obj/dossier.class.php"; |
14 |
// Instance de la classe utils |
15 |
$f = new utils("nohtml"); |
16 |
$f->disableLog(); |
17 |
|
18 |
// Paramétres GET |
19 |
$id = ($f->get_submitted_get_value('id')!==null ? $f->get_submitted_get_value('id') : "" ); |
20 |
$fieldname = ($f->get_submitted_get_value('fieldname')!==null ? $f->get_submitted_get_value('fieldname') : "" ); |
21 |
|
22 |
// Vérifie les paramètres obligatoires |
23 |
if (isset($id) && $id != '' |
24 |
&& isset($fieldname) && $fieldname != '') { |
25 |
|
26 |
/** |
27 |
* Récupération des données de sig_elyx |
28 |
* @param string $id Identifiant du dossier |
29 |
* @param object $f instance de la class utils |
30 |
* @return array Tableau de résultat |
31 |
*/ |
32 |
function get_sig_elyx($id, $f) { |
33 |
|
34 |
// Requête sql |
35 |
$sqlDonneesSIG = "SELECT * |
36 |
FROM ".DB_PREFIXE."sig_elyx |
37 |
WHERE dossier = '$id'"; |
38 |
$resDonneesSIG = $f->db->query($sqlDonneesSIG); |
39 |
$f->addToLog("app/geolocalisation_treatment.php : db->query(\"".$sqlDonneesSIG."\")", VERBOSE_MODE); |
40 |
$f->isDatabaseError($resDonneesSIG); |
41 |
$rowDonneesSIG = &$resDonneesSIG->fetchRow(DB_FETCHMODE_ASSOC); |
42 |
|
43 |
// Tableau de résultat retourné |
44 |
return $rowDonneesSIG; |
45 |
} |
46 |
|
47 |
/** |
48 |
* Récupérer la contrainte par le numéro de référence SIG |
49 |
* @param string $numero Identifiant de la contrainte du SIG |
50 |
* @param object $f Instance de la classe Utils |
51 |
* @return array Tableau des résultats |
52 |
*/ |
53 |
function getContrainteByNumero($numero, $f) { |
54 |
|
55 |
// Initialisation du résultat |
56 |
$contrainte = ""; |
57 |
|
58 |
// Requête sql |
59 |
$sqlContrainte = "SELECT contrainte |
60 |
FROM ".DB_PREFIXE."contrainte |
61 |
WHERE reference = 't' |
62 |
AND numero = '".$numero."'"; |
63 |
$contrainte = $f->db->getOne($sqlContrainte); |
64 |
$f->addToLog("app/geolocalisation_treatment.php : db->getOne(\"".$sqlContrainte."\")", VERBOSE_MODE); |
65 |
$f->isDatabaseError($contrainte); |
66 |
|
67 |
// Tableau de résultat retourné |
68 |
return $contrainte; |
69 |
} |
70 |
|
71 |
/** |
72 |
* Récupération des contraintes récupérées depuis le SIG liées au dossier |
73 |
* @param string $id Identifiant du dossier d'instruction |
74 |
* @param object $f Instance de la classe Utils |
75 |
* @return array Tableau des résultats |
76 |
*/ |
77 |
function getDossierContrainteSIG($id, $f) { |
78 |
|
79 |
// Initialisation du tableau des résultats |
80 |
$listeDossierContrainteSIG = array(); |
81 |
|
82 |
// Requête SQL |
83 |
$sqlDossierContrainte = "SELECT dossier_contrainte |
84 |
FROM ".DB_PREFIXE."dossier_contrainte |
85 |
WHERE dossier = '$id' |
86 |
AND reference IS TRUE"; |
87 |
$resDossierContrainte = $f->db->query($sqlDossierContrainte); |
88 |
$f->addToLog("app/geolocalisation_treatment.php : db->query(\"".$sqlDossierContrainte."\")", VERBOSE_MODE); |
89 |
$f->isDatabaseError($resDossierContrainte); |
90 |
|
91 |
// Pour chaque résultat |
92 |
while ($rowDossierContrainte = &$resDossierContrainte->fetchRow(DB_FETCHMODE_ASSOC)) { |
93 |
// Ajoute l'identifiant du lien dans le tableau des résultats |
94 |
$listeDossierContrainteSIG[] = $rowDossierContrainte['dossier_contrainte']; |
95 |
} |
96 |
|
97 |
// Tableau de résultat retourné |
98 |
return $listeDossierContrainteSIG; |
99 |
} |
100 |
|
101 |
// Récupération des données de sig_elyx |
102 |
$rowDonneesSIG = get_sig_elyx($id, $f); |
103 |
|
104 |
// Récupération des données du dossier d'autorisation |
105 |
$sqlDonneesDI = "SELECT * |
106 |
FROM ".DB_PREFIXE."dossier |
107 |
WHERE dossier = '$id'"; |
108 |
$resDonneesDI = $f->db->query($sqlDonneesDI); |
109 |
$f->addToLog("app/geolocalisation_treatment.php : db->query(\"".$sqlDonneesDI."\")", VERBOSE_MODE); |
110 |
$f->isDatabaseError($resDonneesDI); |
111 |
$rowDonneesDI = &$resDonneesDI->fetchRow(DB_FETCHMODE_ASSOC); |
112 |
|
113 |
// Si l'enregistrement n'existe pas dans la table sig_elyx |
114 |
if (count($rowDonneesSIG) == 0) { |
115 |
|
116 |
// Création de l'enregistrement |
117 |
$sig_elyx = new sig_elyx(']', $f->db, DEBUG); |
118 |
// Création d'un tableau avec la liste des champs de sig_elyx |
119 |
foreach($sig_elyx->champs as $champ) { |
120 |
$valF[$champ] = NULL; |
121 |
} |
122 |
$valF['dossier'] = $id; |
123 |
$valF['terrain_references_cadastrales_archive'] = $rowDonneesDI['terrain_references_cadastrales']; |
124 |
// Si l'ajout à réussi |
125 |
if ($sig_elyx->ajouter($valF, $f->db, DEBUG)) { |
126 |
|
127 |
// On récupére les données de l'enregistrement |
128 |
$rowDonneesSIG = get_sig_elyx($id, $f); |
129 |
} |
130 |
} |
131 |
|
132 |
// Si les deux champs sont différent |
133 |
$diff_parcelle = false; |
134 |
if (isset($rowDonneesSIG["terrain_references_cadastrales_archive"]) && $rowDonneesSIG["terrain_references_cadastrales_archive"] != $rowDonneesDI["terrain_references_cadastrales"]) { |
135 |
$diff_parcelle = true; |
136 |
} |
137 |
|
138 |
// Formatage des parcelles pour l'envoi au webservice |
139 |
$liste_parcelles = $f->parseParcelles($rowDonneesSIG['terrain_references_cadastrales_archive']); |
140 |
if ($diff_parcelle == true && $fieldname == 'verif_parcelle') { |
141 |
$liste_parcelles = $f->parseParcelles($rowDonneesDI['terrain_references_cadastrales']); |
142 |
} |
143 |
$wParcelle = $f->formatParcelleToSend($liste_parcelles); |
144 |
// Crée une chaîne de parcelle séparée par des ";" |
145 |
$stringParcelles = implode(';', $wParcelle); |
146 |
|
147 |
// Configuration du soap |
148 |
$conf = $f->config['sig_elyx']; |
149 |
|
150 |
// Instance de la classe permettant d'envoyer des requête SOAP |
151 |
$soap = new MessageSenderSoap($conf['wsdl'], $conf['login'], |
152 |
$conf['password']); |
153 |
|
154 |
// Instance de sig_elyx |
155 |
$sig_elyx = new sig_elyx($rowDonneesSIG['sig_elyx'], $f->db, DEBUG); |
156 |
// Instance de dossier |
157 |
$dossier = new dossier($id, $f->db, DEBUG); |
158 |
|
159 |
// Initialisation des variables |
160 |
$message = ""; |
161 |
$message_diff_parcelle = _("Les parcelles ont ete modifiees."); |
162 |
$listeDossierContrainteSIGAfter = array(); |
163 |
$execute = array(); |
164 |
|
165 |
// Si les références cadastrales sont à changer dans sig_elyx |
166 |
$flag_ref_cadastrales = false; |
167 |
|
168 |
// Fait appele aux différents webservices selon le bouton cliqué |
169 |
switch ($fieldname) { |
170 |
// |
171 |
case 'verif_parcelle': |
172 |
// Données à envoyer au wsdl |
173 |
$data = array( |
174 |
"wParcelle" => $stringParcelles, |
175 |
); |
176 |
// Exécute le webservices |
177 |
$execute = $soap->execute('getExistParcelle', $data); |
178 |
break; |
179 |
// |
180 |
case 'calcul_emprise': |
181 |
// Données à envoyer au wsdl |
182 |
$data = array( |
183 |
"wParcelle" => $stringParcelles, |
184 |
"wId" => $id, |
185 |
); |
186 |
// Exécute le webservices |
187 |
$execute = $soap->execute('getCalculEmprise', $data); |
188 |
break; |
189 |
// |
190 |
case 'dessin_emprise': |
191 |
// Permet de récupérer la première parcelle |
192 |
$parcelle = $wParcelle[0]; |
193 |
// Construit le lien |
194 |
$execute['return'] = "http://".$f->collectivite['sig_web_server'] |
195 |
."?disabledAttributes=NUMERO_DE_DOSSIER&createObject=" |
196 |
.$f->collectivite['sig_couche_emprise_dossier'] |
197 |
."&attributeValues.NUMERO_DE_DOSSIER=".$id."&KEY=" |
198 |
.$f->collectivite['sig_couche_affichage_parcelle']."*/" |
199 |
.$parcelle."&SELECT=false"; |
200 |
break; |
201 |
// |
202 |
case 'calcul_centroide': |
203 |
// Données à envoyer au wsdl |
204 |
$data = array( |
205 |
"wId" => $id, |
206 |
); |
207 |
// Exécute le webservice |
208 |
$execute = $soap->execute('getCentroideDossier', $data); |
209 |
break; |
210 |
// |
211 |
case 'recup_contrainte': |
212 |
// Données à envoyer au wsdl |
213 |
$data = array( |
214 |
"wType" => "1", |
215 |
"wId" => $id, |
216 |
); |
217 |
// Exécute le webservice |
218 |
$execute = $soap->execute('getContrainteNRU', $data); |
219 |
break; |
220 |
} |
221 |
|
222 |
// Si le code HTTP retour est un '200' |
223 |
// ou que le bouton cliqué est 'dessiner l'emprise' |
224 |
if ($soap->getResponseCode() == '200' |
225 |
|| $fieldname == 'dessin_emprise') { |
226 |
// Met l'état à vrai |
227 |
$etat = 't'; |
228 |
|
229 |
// Traitement selon le bouton cliqué |
230 |
switch ($fieldname) { |
231 |
// |
232 |
case 'verif_parcelle': |
233 |
// Traitement du message |
234 |
$message = _("Les parcelles existent."); |
235 |
// Initialise le tableau qui contiendra les parcelles qui |
236 |
// n'existent pas |
237 |
$list_error_parcelle = array(); |
238 |
// Vérifie l'existence des parcelles |
239 |
foreach ($execute['return'] as $key => $ret) { |
240 |
// Si c'est un tableau |
241 |
if (is_array($execute['return'][$key])) { |
242 |
// |
243 |
if ($ret['existe'] != '0') { |
244 |
$list_error_parcelle[] = $ret['id']; |
245 |
} |
246 |
} elseif ($key == 'existe' && $execute['return'][$key] == '1') { |
247 |
$list_error_parcelle[] = $execute['return']['id']; |
248 |
} |
249 |
} |
250 |
// Si des parcelles n'existent pas alors ont les affichent |
251 |
// à l'utilisateur |
252 |
if (count($list_error_parcelle) != 0) { |
253 |
// |
254 |
$etat = 'f'; |
255 |
// |
256 |
$string_error_parcelle = implode(", ", $list_error_parcelle); |
257 |
// |
258 |
$message = _("Les parcelles n'existent pas."); |
259 |
} else { |
260 |
// Sinon ont met à jour le champ |
261 |
// terrain_references_cadastrales_archive dans la table |
262 |
// sig_elyx |
263 |
$flag_ref_cadastrales = true; |
264 |
|
265 |
} |
266 |
break; |
267 |
// |
268 |
case 'calcul_emprise': |
269 |
// Traitement du message |
270 |
$message = _("L'emprise a ete calculee."); |
271 |
break; |
272 |
// |
273 |
case 'dessin_emprise': |
274 |
// Traitement du message |
275 |
$message = _("Redirige vers ElyxWeb."); |
276 |
break; |
277 |
// |
278 |
case 'calcul_centroide': |
279 |
// Récupération du code de référentiel sig |
280 |
if($f->getParameter("sig_referentiel") == "" OR |
281 |
$f->getParameter("sig_referentiel") == NULL) { |
282 |
$etat = 'f'; |
283 |
$message = _("Erreur de configuration. Contactez votre administrateur."); |
284 |
} else { |
285 |
$coord = $execute['return']['coordX']." ".$execute['return']['coordY']; |
286 |
|
287 |
// Traitement du message |
288 |
$message = _("Le centroide a ete calcule")." : ". |
289 |
$execute['return']['coordX'].", ". |
290 |
$execute['return']['coordY']."."; |
291 |
|
292 |
// Met à jour le centroide dans le dossier |
293 |
$res = $f->db->query("UPDATE ".DB_PREFIXE."dossier ". |
294 |
"SET geom = public.ST_GeomFromText('POINT(".$coord.")',". |
295 |
$f->getParameter("sig_referentiel").") ". |
296 |
"WHERE dossier = '".$id."'"); |
297 |
$f->addToLog("app/geolocalisation_treatment.php: db->query(\"UPDATE ". |
298 |
DB_PREFIXE."dossier SET geom = public.ST_GeomFromText('POINT(". |
299 |
$coord.")',".$f->getParameter("sig_referentiel").") WHERE dossier = '".$id."'", VERBOSE_MODE); |
300 |
$f->isDatabaseError($res); |
301 |
} |
302 |
break; |
303 |
// |
304 |
case 'recup_contrainte': |
305 |
// Traitement du message |
306 |
$message = _("Les contraintes ont ete recuperees."); |
307 |
// Initialisation des variables de comparaison |
308 |
$synchro = true; |
309 |
$ajouter = true; |
310 |
$supprimer = true; |
311 |
|
312 |
// Récupère toutes les contraintes du dossier avant traitement |
313 |
$listeDossierContrainteSIG = getDossierContrainteSIG($id, $f); |
314 |
// Pour chaque contrainte; |
315 |
foreach ($execute['return'] as $key => $value) { |
316 |
// Vérifie que la contrainte est dans l'application |
317 |
$contrainte = getContrainteByNumero($value['idContrainte'], $f); |
318 |
// Si la contrainte est vide |
319 |
if ($contrainte == "") { |
320 |
// Nécessite une synchronisation |
321 |
$synchro = false; |
322 |
} |
323 |
// S'il y a une contrainte |
324 |
if ($contrainte != "") { |
325 |
// Instancie la classe dossier_contrainte |
326 |
require_once "../obj/dossier_contrainte.class.php"; |
327 |
$dossier_contrainte_add = new dossier_contrainte("]", $f->db, DEBUG); |
328 |
// Définit les valeurs |
329 |
$val = array( |
330 |
'dossier_contrainte' => ']', |
331 |
'dossier' => $id, |
332 |
'contrainte' => $contrainte, |
333 |
'texte_complete' => $value['libelle'], |
334 |
'reference' => true, |
335 |
); |
336 |
// Ajoute l'enregistrement |
337 |
$ajouter = $dossier_contrainte_add->ajouter($val, $f->db, DEBUG); |
338 |
} |
339 |
} |
340 |
|
341 |
// S'il n'y a aucune erreurs |
342 |
if ($ajouter == true && $synchro == true) { |
343 |
// Si la liste des contraintes n'est pas vide |
344 |
if (count($listeDossierContrainteSIG) > 0) { |
345 |
// Pour chaque contrainte |
346 |
foreach ($listeDossierContrainteSIG as $dossier_contrainte_id) { |
347 |
// Instancie la classe dossier_contrainte |
348 |
require_once "../obj/dossier_contrainte.class.php"; |
349 |
$dossier_contrainte_del = new dossier_contrainte($dossier_contrainte_id, $f->db, DEBUG); |
350 |
// Valeurs de l'enregistrement |
351 |
$value = array(); |
352 |
foreach($dossier_contrainte_del->champs as $key => $champ) { |
353 |
// Terme à chercher |
354 |
$search_field = 'contrainte_'; |
355 |
// Si dans le champ le terme est trouvé |
356 |
if (strpos($champ, $search_field) !== false) { |
357 |
// Supprime le champ |
358 |
unset($dossier_contrainte_del->champs[$key]); |
359 |
} else { |
360 |
// Récupère la valeur du champ |
361 |
$value[$champ] = $dossier_contrainte_del->val[$key]; |
362 |
} |
363 |
} |
364 |
// Supprime l'enregistrement |
365 |
$supprimer = $dossier_contrainte_del->supprimer($value, $f->db, DEBUG); |
366 |
} |
367 |
} |
368 |
} |
369 |
|
370 |
// Si les contraintes ne sont pas synchronisées |
371 |
if ($synchro == false) { |
372 |
// Traitement du message |
373 |
$message = _("Les contraintes doivent etre synchronisees."); |
374 |
// État à false |
375 |
$etat = 'f'; |
376 |
} |
377 |
|
378 |
// |
379 |
if ($ajouter == false && $synchro == true) { |
380 |
// Traitement du message |
381 |
$message = _("Les contraintes n'ont pas ete ajoutees au dossier."); |
382 |
// État à false |
383 |
$etat = 'f'; |
384 |
} |
385 |
|
386 |
// Si les contraintes ne sont pas synchronisées |
387 |
if ($supprimer == false && $ajouter == true && $synchro == true) { |
388 |
// Traitement du message |
389 |
$message = _("Les anciennes contraintes n'ont pas ete supprimees."); |
390 |
// État à false |
391 |
$etat = 'f'; |
392 |
} |
393 |
|
394 |
// S'il il y a une erreur |
395 |
if ($synchro == false || $ajouter == false || $supprimer == false) { |
396 |
// Ajoute au message d'erreur |
397 |
$message .= " "._("Contactez votre administrateur."); |
398 |
} |
399 |
|
400 |
// Récupère toutes les contraintes du dossier après traitement |
401 |
$listeDossierContrainteSIGAfter = getDossierContrainteSIG($id, $f); |
402 |
break; |
403 |
} |
404 |
} |
405 |
|
406 |
// Si une erreur interne est retournée |
407 |
if ($execute == -1) { |
408 |
// Met l'état à false |
409 |
$etat = 'f'; |
410 |
// Traitement du message d'erreur |
411 |
$message = _("Une erreur s'est produite. Veuillez verifier les etapes precedentes ou contacter votre administrateur."); |
412 |
// log le message d'erreur retourné par le webservice |
413 |
$f->addToLog("app/geolocalisation_treatment.php: Traitement webservice SIG: id dossier = ".$id.": ".$soap->getErrorMessage(), DEBUG_MODE); |
414 |
// Redéfinit la variable utilisée pour le retour |
415 |
unset($execute); |
416 |
$execute= array(); |
417 |
} |
418 |
|
419 |
// Format de la date pour l'affichage |
420 |
$date = date('d/m/Y H:i:s'); |
421 |
// Format de la date pour la BDD |
422 |
$date_db = $f->formatTimestamp($date, false); |
423 |
|
424 |
// Valeur à modifier dans sig_elyx |
425 |
$valueSIG = array(); |
426 |
foreach($sig_elyx->champs as $key => $champ) { |
427 |
// |
428 |
$valueSIG[$champ] = $sig_elyx->val[$key]; |
429 |
|
430 |
// Pour les champs de type timestamp étant vide, il faut renvoyer NULL |
431 |
$champ_split = explode("_", $champ); |
432 |
if ($champ_split[0] == "date" && $valueSIG[$champ] == '') { |
433 |
$valueSIG[$champ] = null; |
434 |
} |
435 |
} |
436 |
$valueSIG['date_'.$fieldname] = $date_db; |
437 |
$valueSIG['etat_'.$fieldname] = $etat; |
438 |
$valueSIG['message_'.$fieldname] = $message; |
439 |
// Si les références cadastrales ont été modifiées et vérifier |
440 |
if ($flag_ref_cadastrales === true) { |
441 |
// On met à jour le champ de la table sig_elyx |
442 |
$valueSIG['terrain_references_cadastrales_archive'] = $rowDonneesDI['terrain_references_cadastrales']; |
443 |
} |
444 |
// Si les champs contenant la référence cadastrale dans le DI |
445 |
// et dans la table sig_elyx sont différent |
446 |
if ($flag_ref_cadastrales === true && $diff_parcelle === true) { |
447 |
// Met à jour le message des autres boutons |
448 |
$valueSIG['message_calcul_emprise'] = $message_diff_parcelle; |
449 |
$valueSIG['message_calcul_centroide'] = $message_diff_parcelle; |
450 |
$valueSIG['message_recup_contrainte'] = $message_diff_parcelle; |
451 |
// Met à jour l'état des autres boutons |
452 |
$valueSIG['etat_calcul_emprise'] = 'f'; |
453 |
$valueSIG['etat_calcul_centroide'] = 'f'; |
454 |
$valueSIG['etat_recup_contrainte'] = 'f'; |
455 |
// Met à jour la date de traitement des autres boutons |
456 |
$valueSIG['date_calcul_emprise'] = $date_db; |
457 |
$valueSIG['date_calcul_centroide'] = $date_db; |
458 |
$valueSIG['date_recup_contrainte'] = $date_db; |
459 |
|
460 |
// Message à affiché à l'utilisateur |
461 |
$message_diff_parcelle = sprintf(_("Dernier traitement effectue le %s."), $date)." ".$message_diff_parcelle; |
462 |
} |
463 |
// Modification de l'enregistrement |
464 |
$sig_elyx->modifier($valueSIG, $f->db, DEBUG); |
465 |
|
466 |
// Message affiché à l'utilisateur |
467 |
$message = sprintf(_("Dernier traitement effectue le %s."), $date)." ".$message; |
468 |
|
469 |
// Tableau à retourner |
470 |
$return = $execute; |
471 |
// Ajoute les informations sur les traitements dans le tableau retourné |
472 |
$return['log'] = array( |
473 |
"date"=> $date, |
474 |
"etat"=> $etat, |
475 |
"message"=> $message, |
476 |
"message_diff_parcelle"=> $message_diff_parcelle |
477 |
); |
478 |
// Ajoute les informations concernant les contraintes récupérées |
479 |
$return['dossier_contrainte'] = array( |
480 |
"nb_contrainte_sig" => count($listeDossierContrainteSIGAfter), |
481 |
"msg_contrainte_sig_empty" => _("Aucune contraintes ajoutees depuis l'application"), |
482 |
"msg_contrainte_sig" => _("contrainte(s) ajoutee(s) depuis le SIG"), |
483 |
); |
484 |
|
485 |
// Retourne le résultat dans un tableau json |
486 |
echo json_encode($return); |
487 |
|
488 |
} |
489 |
|
490 |
?> |