/[openfoncier]/branches/3.14.x/app/geolocalisation_treatment.php
ViewVC logotype

Contents of /branches/3.14.x/app/geolocalisation_treatment.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3343 - (show annotations)
Thu Mar 19 17:34:18 2015 UTC (9 years, 10 months ago) by vpihour
File size: 20833 byte(s)
Ajout de la branche

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 ?>

Properties

Name Value
svn:executable *
svn:keywords Id

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26