/[openfoncier]/trunk/obj/dossier_instruction.class.php
ViewVC logotype

Contents of /trunk/obj/dossier_instruction.class.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3982 - (show annotations)
Fri Apr 15 16:21:37 2016 UTC (8 years, 9 months ago) by softime
File size: 75455 byte(s)
* Suppression de deux cellules du tableau des logs d'instruction.
1 <?php
2
3 //
4 require_once "dossier.class.php";
5 require_once "../obj/geoads.class.php";
6
7 //
8 class dossier_instruction extends dossier {
9
10 /**
11 * Instance de la classe demande
12 *
13 * @var mixed
14 */
15 var $inst_demande = null;
16
17 function dossier_instruction($id, &$db, $DEBUG) {
18 //
19 //$this->constructeur($id, $db, $DEBUG);
20 $this->dossier($id, $db, $DEBUG);
21 }
22
23 /**
24 * Définition des actions disponibles sur la classe.
25 *
26 * @return void
27 */
28 function init_class_actions() {
29 //
30 parent::init_class_actions();
31
32 // ACTION - 001 - modifier
33 //
34 $this->class_actions[1]["portlet"]["libelle"] = _("Modifier");
35 $this->class_actions[1]["condition"] = array(
36 "is_user_from_allowed_collectivite",
37 "is_editable",
38 );
39
40 // ACTION - 002 - supprimer
41 //
42 $this->class_actions[2]["portlet"]["libelle"] = _("Supprimer");
43 $this->class_actions[2]["portlet"]["order"] = 125;
44 $this->class_actions[2]["condition"] = array(
45 "is_user_from_allowed_collectivite",
46 );
47
48 // ACTION - 100 - donnees_techniques
49 // Affiche dans un overlay les données techniques
50 $this->class_actions[100] = array(
51 "identifier" => "donnees_techniques",
52 "portlet" => array(
53 "type" => "action-self",
54 "libelle" => _("Données techniques"),
55 "order" => 100,
56 "class" => "rediger-16",
57 ),
58 "view" => "view_donnees_techniques",
59 "permission_suffix" => "donnees_techniques_consulter",
60 "condition" => array(
61 "is_user_from_allowed_collectivite",
62 "can_open_donnees_techniques",
63 ),
64 );
65
66 // ACTION - 110 - rapport_instruction
67 // Affiche dans un overlay le rapport d'instruction
68 $this->class_actions[110] = array(
69 "identifier" => "rapport_instruction",
70 "portlet" => array(
71 "type" => "action-self",
72 "libelle" => _("Rapport d'instruction"),
73 "order" => 110,
74 "class" => "rediger-16",
75 ),
76 "view" => "view_rapport_instruction",
77 "permission_suffix" => "rapport_instruction_rediger",
78 "condition" => array(
79 "is_user_from_allowed_collectivite",
80 "can_open_rapport_instruction",
81 ),
82 );
83
84 // ACTION - 111 - recepisse
85 // Affiche l'édition
86 $this->class_actions[111] = array(
87 "identifier" => "recepisse",
88 "portlet" => array(
89 "type" => "action-direct",
90 "libelle" => _("Regenerer le recepisse"),
91 "order" => 111,
92 "class" => "pdf-16",
93 ),
94 "view" => "formulaire",
95 "method" => "regenerate_recepisse",
96 "permission_suffix" => "regenerate_recepisse",
97 "button" => "valider",
98 "condition" => array(
99 "is_user_from_allowed_collectivite",
100 "can_regenerate_recepisse",
101 ),
102 );
103
104 // ACTION - 120 - geolocalisation
105 // Affiche dans un overlay la géolocalisation
106 $this->class_actions[120] = array(
107 "identifier" => "geolocalisation",
108 "portlet" => array(
109 "type" => "action-self",
110 "libelle" => _("Geolocalisation"),
111 "order" => 120,
112 "class" => "rediger-16",
113 ),
114 "view" => "view_geolocalisation",
115 "permission_suffix" => "geolocalisation_consulter",
116 "condition" => array(
117 "is_user_from_allowed_collectivite",
118 "can_open_geolocalisation",
119 ),
120 );
121
122 // ACTION - 121 - geolocalisation verif parcelles
123 // action de l'overlay de géolocalisation verif_parcelle
124 $this->class_actions[121] = array(
125 "identifier" => "geolocalisation_verif_parcelle",
126 "view" => "view_geolocalisation_verif_parcelle",
127 "permission_suffix" => "geolocalisation_consulter",
128 "condition" => array(
129 "is_user_from_allowed_collectivite",
130 "can_open_geolocalisation",
131 ),
132 );
133
134 // ACTION - 122 - geolocalisation calcul_emprise
135 // action de l'overlay de géolocalisation calcul_emprise
136 $this->class_actions[122] = array(
137 "identifier" => "geolocalisation_calcul_emprise",
138 "view" => "view_geolocalisation_calcul_emprise",
139 "permission_suffix" => "geolocalisation_consulter",
140 "condition" => array(
141 "is_user_from_allowed_collectivite",
142 "can_open_geolocalisation",
143 ),
144 );
145
146 // ACTION - 123 - geolocalisation dessin_emprise
147 // action de l'overlay de géolocalisation dessin_emprise
148 $this->class_actions[123] = array(
149 "identifier" => "geolocalisation_dessin_emprise",
150 "view" => "view_geolocalisation_dessin_emprise",
151 "permission_suffix" => "geolocalisation_consulter",
152 "condition" => array(
153 "is_user_from_allowed_collectivite",
154 "can_open_geolocalisation",
155 ),
156 );
157
158 // ACTION - 124 - geolocalisation calcul_centroide
159 // action de l'overlay de géolocalisation calcul_centroide
160 $this->class_actions[124] = array(
161 "identifier" => "geolocalisation_calcul_centroide",
162 "view" => "view_geolocalisation_calcul_centroide",
163 "permission_suffix" => "geolocalisation_consulter",
164 "condition" => array(
165 "is_user_from_allowed_collectivite",
166 "can_open_geolocalisation",
167 ),
168 );
169
170 // ACTION - 125 - geolocalisation recup_contrainte
171 // action de l'overlay de géolocalisation recup_contrainte
172 $this->class_actions[125] = array(
173 "identifier" => "geolocalisation_recup_contrainte",
174 "view" => "view_geolocalisation_recup_contrainte",
175 "permission_suffix" => "geolocalisation_consulter",
176 "condition" => array(
177 "is_user_from_allowed_collectivite",
178 "can_open_geolocalisation",
179 ),
180 );
181
182 // ACTION - 130 - edition
183 // Affiche l'édition
184 $this->class_actions[130] = array(
185 "identifier" => "edition",
186 "portlet" => array(
187 "type" => "action-blank",
188 "libelle" => _("Recapitulatif"),
189 "order" => 130,
190 "class" => "pdf-16",
191 ),
192 "view" => "view_edition",
193 "permission_suffix" => "consulter",
194 "condition" => array(
195 "is_user_from_allowed_collectivite",
196 ),
197 );
198
199 // ACTION - 140 - Redirection vers le SIG
200 $this->class_actions[140] = array(
201 "identifier" => "localiser",
202 "view" => "view_localiser",
203 "permission_suffix" => "localiser-sig-externe",
204 );
205
206 // ACTION - 150 - Générer la clé accès citoyen
207 // Ce bouton est affiché seulement si le DA lié n'a pas de clé associée
208 $this->class_actions[150] = array(
209 "identifier" => "generate_citizen_access_key",
210 "portlet" => array(
211 "type" => "action-direct",
212 "libelle" => _("Generer la cle d'acces au portail citoyen"),
213 "class" => "citizen_access_key-16"
214 ),
215 "method" => "generate_citizen_access_key",
216 "permission_suffix" => "generer_cle_acces_citoyen",
217 "view" => "formulaire",
218 "condition" => array(
219 "is_option_citizen_access_portal_enabled",
220 "can_generate_citizen_access_key",
221 "is_user_from_allowed_collectivite",
222 ),
223 );
224
225 // ACTION - 151 - Regénérer la clé accès citoyen
226 // Ce bouton est affiché seulement si le DA lié a déjà une clé d'accès
227 $this->class_actions[151] = array(
228 "identifier" => "regenerate_citizen_access_key",
229 "portlet" => array(
230 "type" => "action-direct-with-confirmation",
231 "libelle" => _("Regenerer la cle d'acces au portail citoyen"),
232 "class" => "citizen_access_key-16"
233 ),
234 "method" => "regenerate_citizen_access_key",
235 "permission_suffix" => "regenerer_cle_acces_citoyen",
236 "view" => "formulaire",
237 "condition" => array(
238 "is_option_citizen_access_portal_enabled",
239 "can_regenerate_citizen_access_key",
240 "is_user_from_allowed_collectivite",
241 ),
242 );
243
244 // ACTION - 200 - Afficher les logs des événements d'instruction
245 //
246 $this->class_actions[200] = array(
247 "identifier" => "get_log_di",
248 "permission_suffix" => "log_instructions",
249 "view" => "view_get_log_di",
250 "condition" => array(
251 "is_user_from_allowed_collectivite",
252 ),
253 );
254 }
255
256
257 function setType(&$form,$maj) {
258 parent::setType($form,$maj);
259 // On définit le type des champs pour les actions direct
260 // utilisant la vue formulaire
261 if ($maj == 111 || $maj == 150 || $maj == 151) {
262 foreach ($this->champs as $key => $value) {
263 $form->setType($value, 'hidden');
264 }
265 }
266 }
267
268
269 /**
270 * Vérifie la division de l'instructeur et l'état du dossier.
271 *
272 * @return boolean
273 */
274 function check_instructeur_division_and_di_state() {
275
276 // Si l'utilisateur est un intructeur qui ne correspond pas à la
277 // division du dossier
278 // et qu'il y a plusieurs instructions
279 if ($this->f->isUserInstructeur() == true
280 && $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()
281 && $this->has_only_recepisse() == false) {
282
283 //
284 return false;
285 }
286
287 // Si le dossier est cloturé
288 if ($this->getStatut() == "cloture") {
289
290 //
291 return false;
292 }
293
294 //
295 return true;
296 }
297
298 /**
299 * CONDITION - is_editable.
300 *
301 * Condition pour la modification.
302 *
303 * @return boolean
304 */
305 function is_editable() {
306
307 // Contrôle si l'utilisateur possède un bypass
308 $bypass = $this->f->isAccredited(get_class()."_modifier_bypass");
309 //
310 if ($bypass == true) {
311
312 //
313 return true;
314 }
315
316 // S'il y a plusieurs événements d'instruction sur le dossier
317 // et qu'il ne s'agit pas d'un instructeur
318 if ($this->f->isUserInstructeur() == false
319 && $this->has_only_recepisse() == false) {
320 //
321 return false;
322 }
323
324 // Contrôle le droit de l'instruction (retoune true si ce n'est pas un
325 // instructeur)
326 if ($this->check_instructeur_division_and_di_state() == false) {
327
328 //
329 return false;
330 }
331
332 //
333 return true;
334 }
335
336 /**
337 * CONDITION - can_open_donnees_techniques.
338 *
339 * Condition pour afficher les données techniques.
340 *
341 * @return boolean
342 */
343 function can_open_donnees_techniques() {
344
345 // Contrôle si l'utilisateur possède un bypass
346 $bypass = $this->f->isAccredited(get_class()."_donnees_techniques_consulter_bypass");
347 //
348 if ($bypass == true) {
349
350 //
351 return true;
352 }
353
354 //
355 return true;
356 }
357
358 /**
359 * CONDITION - can_open_rapport_instruction.
360 *
361 * Condition pour afficher le rapport d'instruction en overlay.
362 *
363 * @return boolean
364 */
365 function can_open_rapport_instruction() {
366
367 // Contrôle si l'utilisateur possède un bypass
368 $bypass = $this->f->isAccredited(get_class()."_rapport_instruction_rediger_bypass");
369 //
370 if ($bypass == true) {
371 //
372 return true;
373 }
374 // S'il n'y a aucun rapport d'instruction lié
375 if ($this->getRapportInstruction() == '') {
376 // Vérification de la division de l'instructeur et de l'état du dossier.
377 if ($this->check_instructeur_division_and_di_state() == false) {
378 return false;
379 }
380 // Si l'utilisateur n'a pas le droit d'ajouter
381 if ($this->f->isAccredited(array(
382 "rapport_instruction",
383 "rapport_instruction_ajouter"), "OR") == false) {
384 return false;
385 }
386 }
387 //
388 return true;
389 }
390
391 /**
392 * CONDITION - can_open_geolocalisation.
393 *
394 * Condition pour afficher la géolocalisation en overlay.
395 *
396 * @return boolean
397 */
398 function can_open_geolocalisation() {
399 // On récupère les informations de la collectivité du dossier
400 $collectivite_param = $this->f->getCollectivite($this->getVal('om_collectivite'));
401 // Si l'option sig n'est pas réglé sur 'sig_externe',
402 // l'action géolocalisation n'est pas affiché
403 if ($collectivite_param['option_sig'] != 'sig_externe') {
404
405 //
406 return false;
407 }
408
409 // Contrôle si l'utilisateur possède un bypass
410 $bypass = $this->f->isAccredited(get_class()."_geolocalisation_consulter_bypass");
411 //
412 if ($bypass == true) {
413
414 //
415 return true;
416 }
417
418 // Contrôle le droit de l'instruction
419 if ($this->check_instructeur_division_and_di_state() == false) {
420
421 //
422 return false;
423 }
424
425 //
426 return true;
427 }
428
429 /**
430 * CONDITION - can_regenerate_recepisse.
431 *
432 * Condition pour regénérer le récépissé.
433 *
434 * @return boolean
435 */
436 function can_regenerate_recepisse() {
437
438 // S'il y a plusieurs événements d'instruction sur le dossier
439 // et qu'il ne s'agit pas d'un administrateur technique ni fonctionnel
440 if ($this->f->isUserAdministrateur() == false
441 && $this->has_only_recepisse() == false) {
442 //
443 return false;
444 }
445
446 //
447 return true;
448 }
449
450
451 /**
452 * CONDITION - can_generate_citizen_access_key
453 *
454 * Vérifie que le DA lié au DI courant n'a pas de clé déjà générée.
455 *
456 * @return boolean true si on peut générer la clé, false sinon
457 */
458 protected function can_generate_citizen_access_key() {
459
460 // Si la clé existe, on ne peut pas générer la clé
461 if ($this->get_citizen_access_key() !== false) {
462 return false;
463 }
464 //
465 return true;
466 }
467
468
469 /**
470 * CONDITION - can_regenerate_citizen_access_key
471 *
472 * Vérifie que le DA lié au DI courant possède déjà une clé d'accès.
473 *
474 * @return boolean true si on peut regénérer la clé, false sinon
475 */
476 protected function can_regenerate_citizen_access_key() {
477
478 // Si la clé existe, on retourne true car on peut la regénérer
479 if ($this->get_citizen_access_key() !== false) {
480 return true;
481 }
482 //
483 return false;
484 }
485
486
487 /**
488 * CONDITION - is_option_citizen_access_portal_enabled
489 *
490 * Permet de savoir si le om_parametre acces_portail_citoyen est activé.
491 *
492 * @return boolean true si l'option acces_portail_citoyen vaut 'true', false sinon
493 */
494 protected function is_option_citizen_access_portal_enabled() {
495
496 return $this->f->is_option_citizen_access_portal_enabled();
497 }
498
499
500 /**
501 * VIEW - view_edition.
502 *
503 * Affiche le récapitulatif du dossier d'instruction.
504 *
505 * @return void
506 */
507 function view_edition() {
508
509 // Vérification de l'accessibilité sur l'élément
510 $this->checkAccessibility();
511
512 // Identifiant du dossier
513 $idx = $this->getVal($this->clePrimaire);
514
515 //
516 $collectivite = $this->f->getCollectivite($this->getVal('om_collectivite'));
517
518 // Génération du PDF
519 $result = $this->compute_pdf_output('etat', $this->table, $collectivite, $idx);
520 // Affichage du PDF
521 $this->expose_pdf_output(
522 $result['pdf_output'],
523 $result['filename']
524 );
525 }
526
527 /**
528 * VIEW - view_donnees_techniques.
529 *
530 * Ouvre le sous-formulaire en ajaxIt dans un overlay.
531 * Cette action est bindée pour utiliser la fonction popUpIt.
532 *
533 * @return void
534 */
535 function view_donnees_techniques() {
536
537 // Vérification de l'accessibilité sur l'élément
538 $this->checkAccessibility();
539 //
540 $this->display_overlay(
541 $this->getVal($this->clePrimaire),
542 "donnees_techniques"
543 );
544 }
545
546 /**
547 * VIEW - view_rapport_instruction.
548 *
549 * Ouvre le sous-formulaire en ajaxIt dans un overlay.
550 * Cette action est bindée pour utiliser la fonction popUpIt.
551 *
552 * @return void
553 */
554 function view_rapport_instruction() {
555
556 // Vérification de l'accessibilité sur l'élément
557 $this->checkAccessibility();
558 //
559 $this->display_overlay(
560 $this->getVal($this->clePrimaire),
561 "rapport_instruction"
562 );
563 }
564
565 /**
566 * Ouvre le sous-formulaire passé en paramètre en overlay
567 * en mode ajout si aucun n'existe sinon en mode modifier.
568 *
569 * @return void
570 */
571 function display_overlay($idx = "", $obj = "") {
572
573 // Seulement si le numéro de dossier est fourni
574 if (isset($idx) && !empty($idx)
575 && isset($obj) && !empty($obj)){
576
577 // Vérifie que l'objet n'existe pas
578 $sql = "SELECT
579 ".$obj."
580 FROM
581 ".DB_PREFIXE.$obj."
582 where
583 dossier_instruction = '$idx'";
584 // Ajout au log
585 $this->f->addToLog($obj.".php: db->query(\"".$sql."\");", VERBOSE_MODE);
586 // Exécution de la requête
587 $res = $this->f->db->query($sql);
588 $this->f->isDatabaseError($res);
589
590 // S'il n'y en a pas, afficher le formulaire d'ajout
591 if ( $res->numrows() == 0 ){
592 //
593 echo '
594 <script type="text/javascript" >
595 overlayIt(\''.$obj.'\',\'../scr/sousform.php?objsf='.$obj.'&obj='.$obj.'&action=0&retourformulaire=dossier_instruction&idxformulaire='.$idx.'\', 1);
596 </script>
597 ';
598 }
599 // Sinon afficher l'objet en consultation
600 else {
601 //
602 $row = & $res->fetchRow(DB_FETCHMODE_ASSOC);
603 //
604 echo '
605 <script type="text/javascript" >
606 overlayIt(\''.$obj.'\',\'../scr/sousform.php?objsf='.$obj.'&idxformulaire='.$idx.'&retourformulaire='.$obj.'&obj='.$obj.'&action=3&idx='.$row[$obj].'\', 1);
607 </script>
608 ';
609 }
610 }
611 }
612
613
614 /**
615 * TREATMENT - generate_citizen_access_key.
616 *
617 * Génère la clé d'accès au portail citoyen sur un dossier qui n'en a pas.
618 *
619 * @return boolean
620 */
621 protected function generate_citizen_access_key() {
622
623 // Récupération de l'instance du dossier d'autorisation lié au DI courant
624 $inst_da = $this->get_inst_dossier_autorisation($this->getVal("dossier_autorisation"));
625 $generation = $inst_da->update_citizen_access_key();
626 if ($generation == true) {
627 $this->correct = true;
628 $this->addToMessage(_("La cle d'acces au portail citoyen a ete generee."));
629 return true;
630 }
631 $this->addToMessage(sprintf("%s %s", _("La cle d'acces au portail citoyen n'a pas pu etre generee."), _("Veuillez contacter votre administrateur.")));
632 //
633 return false;
634 }
635
636
637 /**
638 * TREATMENT - regenerate_citizen_access_key.
639 *
640 * Régénère la clé d'accès au portail citoyen en écrasant la clé présente.
641 *
642 * @return boolean
643 */
644 protected function regenerate_citizen_access_key() {
645
646 // Récupération de l'instance du dossier d'autorisation lié au DI courant
647 $inst_da = $this->get_inst_dossier_autorisation();
648 // L'appel à update_citizen_access_key avec la valeur true force la regénération
649 $generation = $inst_da->update_citizen_access_key(true);
650 if ($generation == true) {
651 $this->correct = true;
652 $this->addToMessage(_("La cle d'acces au portail citoyen a ete regeneree."));
653 return true;
654 }
655 $this->addToMessage(sprintf("%s %s", _("La cle d'acces au portail citoyen n'a pas pu etre regeneree."), _("Veuillez contacter votre administrateur.")));
656 //
657 return false;
658 }
659
660
661 /**
662 * TREATMENT - regenerate_recepisse.
663 *
664 * Finalisation d'un événement d'instruction
665 * et affichage du lien de téléchargement.
666 *
667 * @return void
668 */
669 function regenerate_recepisse() {
670 // Récupère l'identifiant du document
671 $idx_instruction = $this->get_demande_instruction_recepisse();
672
673 // Instanciation de l'événement d'instruction
674 require_once "../obj/instruction.class.php";
675 $instruction = new instruction($idx_instruction, $this->f->db, 0);
676 $instruction->setParameter('maj', 1);
677
678 // Met l'autoCommit à false
679 $this->f->db->autoCommit(false);
680
681 // Vérifie si l'instruction est déjà finalisée
682 $finalize = $instruction->is_unfinalizable_without_bypass();
683
684 // S'il faut définaliser
685 $unfinalization = true;
686 if ($finalize == true) {
687 // Définalise l'instruction
688 $unfinalization = $instruction->unfinalize($instruction->valF);
689 }
690
691 // Si la définalisation est OK ou qu'il n'y avait pas besoin de définaliser
692 if ($unfinalization != false) {
693
694 // Finalise l'instruction
695 $finalization = $instruction->finalize($instruction->valF);
696 $url_fichier = '../spg/file.php?obj=instruction&'.
697 'champ=om_fichier_instruction&id='.$idx_instruction;
698 // Si la finalisation est ok
699 if ($finalization != false) {
700 $this->correct = true;
701 //
702 $this->f->db->commit();
703 // Lien PDF
704 $lien_pdf = "<br/><br/>
705 <a id='telecharger_recepisse' title=\""._("Telecharger le recepisse de la demande")."\" class='lien' href='".$url_fichier."' target='_blank'>
706 <span class=\"om-icon om-icon-16 om-icon-fix pdf-16\">".
707 _("Telecharger le recepisse de la demande").
708 "</span>&nbsp;".
709 _("Telecharger le recepisse de la demande")."
710 </a>";
711 $this->msg="";
712 $this->addToMessage(
713 _("Le recepisse de la demande a ete regenere.").$lien_pdf
714 );
715 // Return
716 return $this->end_treatment(__METHOD__, true);
717 }
718 }
719 // Si une erreur s'est produite
720 $this->correct = false;
721 //
722 $this->addToMessage(
723 _("Une erreur s'est produite lors de la regeneration du recepisse de la demande.")
724 ."<br/>"._("Veuillez contacter votre administrateur.")
725 );
726 // Return
727 return $this->end_treatment(__METHOD__, false);
728 }
729
730
731 /**
732 * Met à jour les informations (log) d'actions de localisation sur un dossier.
733 *
734 * @param string $action Nom de l'action.
735 * @param string $date Date de l'action.
736 * @param boolean $etat Etat de l'action.
737 * @param string $message Message de retour de l'action.
738 *
739 * @return boolean false si erreur de traitement, true sinon.
740 */
741 private function update_dossier_geolocalisation($action, $date, $etat, $message) {
742 require_once "../obj/dossier_geolocalisation.class.php";
743 $dossier_geolocalisation = new dossier_geolocalisation(
744 null,
745 null,
746 null,
747 $this->getVal('dossier')
748 );
749
750 return $dossier_geolocalisation->set_geolocalisation_state(
751 $action,
752 $date,
753 $etat,
754 $message
755 );
756 }
757
758
759 /**
760 * Traitement des erreurs retournées par l'abstracteur geoads.
761 *
762 * @param geoads_exception $exception Exception retournée par l'abstracteur.
763 *
764 * @return void
765 */
766 private function handle_geoads_exception(geoads_exception $exception) {
767 // log le message d'erreur retourné par le webservice
768 $this->f->addToLog(
769 "geolocalisation : Traitement webservice SIG: id dossier = ".
770 $this->getVal("dossier")." : ".$exception->getMessage(), DEBUG_MODE
771 );
772 $return['log'] = array(
773 "date" => date('d/m/Y H:i:s'),
774 "etat" => false,
775 "message" => $exception->getMessage(),
776 );
777 if ($this->f->isAjaxRequest()) {
778 echo json_encode($return);
779 die();
780 } else {
781 $this->f->displayMessage('error', $return["log"]["message"]);
782 }
783 }
784
785
786 /**
787 * Retourne une instance du connecteur geoads, et la créer si elle n'existe pas.
788 *
789 * @param array $collectivite Informations de la collectivité.
790 *
791 * @return geoads Instance du connecteur.
792 */
793 private function get_geoads_instance(array $collectivite) {
794 if(isset($this->geoads_instance)) {
795 return $this->geoads_instance;
796 }
797 // Instanciation de l'abstracteur geoads
798 try {
799 $this->geoads_instance = new geoads($collectivite);
800 } catch (geoads_exception $e) {
801 $this->handle_geoads_exception($e);
802 return false;
803 }
804 return $this->geoads_instance;
805 }
806
807
808 /**
809 * VIEW - view_geolocalisation_verif_parcelle.
810 *
811 * 1ere action de géolocalisation, permet de vérifier l'existence des
812 * parcelles sur le sig.
813 *
814 * @return void
815 */
816 public function view_geolocalisation_verif_parcelle() {
817 // Format de la date pour l'affichage
818 $date = date('d/m/Y H:i:s');
819 $correct = true;
820 $message = "";
821 // Récupération des infos de la collectivité du dossier.
822 $collectivite = $this->f->getCollectivite($this->getVal('om_collectivite'));
823 // Récupération des informations (log) d'actions de localisation sur le dossier.
824 require_once "../obj/dossier_geolocalisation.class.php";
825 $dossier_geolocalisation = new dossier_geolocalisation(null, null, null, $this->getVal('dossier'));
826
827 // Définition des références cadastrales dans la table dossier_geolocalisation
828 // si elle n'existe pas encore afin de pouvoir les comparer par la suite.
829 if($dossier_geolocalisation->get_terrain_references_cadastrales_archive() == "") {
830 $dossier_geolocalisation->set_terrain_references_cadastrales_archive($this->getVal('terrain_references_cadastrales'));
831 }
832
833 // Instanciation de l'abstracteur geoads
834 $geoads = $this->get_geoads_instance($collectivite);
835
836 // Formatage des parcelles pour l'envoi au webservice
837 $liste_parcelles = $this->f->parseParcelles(
838 $this->getVal('terrain_references_cadastrales'),
839 $this->getVal('om_collectivite')
840 );
841
842 // Intérogation du web service du SIG
843 try {
844 $execute = $geoads->verif_parcelle($liste_parcelles);
845 } catch (geoads_exception $e) {
846 $this->handle_geoads_exception($e);
847 return;
848 }
849 // Initialisation des messages
850 $message_diff_parcelle = _("Les parcelles ont ete modifiees.");
851 $message = _("Les parcelles existent.");
852 // Initialise le tableau qui contiendra les parcelles qui n'existent pas
853 $list_error_parcelle = array();
854 $date_db = $this->f->formatTimestamp($date, false);
855 // Vérifie l'existence des parcelles
856 foreach ($execute as $parcelle) {
857 // Si la parcelle n'existe pas on la consigne dans un tableau
858 if ($parcelle['existe'] != true) {
859 $list_error_parcelle[] = $parcelle['parcelle'];
860 }
861 }
862 // Si des parcelles n'existent pas alors on les affichent à l'utilisateur
863 if (count($list_error_parcelle) != 0) {
864 //
865 $correct = false;
866 //
867 $string_error_parcelle = implode(", ", $list_error_parcelle);
868 //
869 $message = _("Les parcelles n'existent pas.");
870 } else {
871
872 if($dossier_geolocalisation->get_terrain_references_cadastrales_archive() !=
873 $this->getVal('terrain_references_cadastrales')) {
874 // Message affiché à l'utilisateur
875 $message_diff_parcelle = sprintf(_("Dernier traitement effectue le %s."), $date)." ".$message_diff_parcelle;
876 // Met à jour du message des autres boutons
877 $this->update_dossier_geolocalisation('calcul_emprise', $date_db, $correct, $message_diff_parcelle);
878 $this->update_dossier_geolocalisation('calcul_centroide', $date_db, $correct, $message_diff_parcelle);
879 $this->update_dossier_geolocalisation('recup_contrainte', $date_db, $correct, $message_diff_parcelle);
880
881 // Message affiché à l'utilisateur
882 $message_diff_parcelle = sprintf(_("Dernier traitement effectue le %s."), $date)." ".$message_diff_parcelle;
883 }
884 // Mise à jour du champ terrain_references_cadastrales_archive dans
885 // les informations de localisation du dossier.
886 $dossier_geolocalisation->set_terrain_references_cadastrales_archive(
887 $this->getVal('terrain_references_cadastrales')
888 );
889 }
890
891 // Message affiché à l'utilisateur
892 $message = sprintf(_("Dernier traitement effectue le %s."), $date)." ".$message;
893 $this->update_dossier_geolocalisation('verif_parcelle', $date_db, $correct, $message);
894 // Tableau contenant l'adresse à retourner
895 $return = $execute;
896 // Ajoute les informations sur le traitement dans le tableau retourné
897 $return['log'] = array(
898 "date" => $date,
899 "etat" => $correct,
900 "message" => $message,
901 "message_diff_parcelle" => $message_diff_parcelle
902
903 );
904 // Retourne le résultat dans un tableau json
905 echo json_encode($return);
906 return;
907 }
908
909
910 /**
911 * Vérification de la cohérence des parcelles actuelles :
912 * si parcelles différentes de l'archive affichage d'une erreur.
913 *
914 * @return boolean false si identique, tableau json avec état d'erreur sinon
915 */
916 private function is_different_parcelle_from_dossier_geolocalisation() {
917 $date = date('d/m/Y H:i:s');
918 require_once "../obj/dossier_geolocalisation.class.php";
919 $dossier_geolocalisation = new dossier_geolocalisation(null, null, null, $this->getVal('dossier'));
920 if($dossier_geolocalisation->get_terrain_references_cadastrales_archive() !=
921 $this->getVal('terrain_references_cadastrales')) {
922 $return['log'] = array(
923 "date" => $date,
924 "etat" => false,
925 "message" => sprintf(_("Les parcelles n'ont pas ete verifiees ou ont ete modifiees, veuillez (re)lancer leur verification.")." "._("Dernier traitement effectue le %s."), $date),
926 );
927 return json_encode($return);
928 }
929 return false;
930 }
931
932
933 /**
934 * VIEW - view_geolocalisation_calcul_emprise.
935 *
936 * Permet de calculer l'emprise du dossier sur le sig.
937 *
938 * @return void
939 */
940 public function view_geolocalisation_calcul_emprise() {
941 // Format de la date pour l'affichage
942 $date = date('d/m/Y H:i:s');
943 $correct = true;
944 $message = "";
945 $collectivite = $this->f->getCollectivite($this->getVal('om_collectivite'));
946
947 // Vérification de la cohérence des parcelles actuelles.
948 if(($different_parcelle = $this->is_different_parcelle_from_dossier_geolocalisation()) !== false) {
949 echo $different_parcelle;
950 return;
951 }
952 // Instance geoads
953 $geoads = $this->get_geoads_instance($collectivite);
954
955 // Formatage des parcelles pour l'envoi au webservice
956 $liste_parcelles = $this->f->parseParcelles(
957 $this->getVal('terrain_references_cadastrales'),
958 $this->getVal('om_collectivite')
959 );
960
961 // Intérogation du web service du SIG
962 try {
963 $execute = $geoads->calcul_emprise($liste_parcelles, $this->getVal('dossier'));
964 } catch (geoads_exception $e) {
965 $this->handle_geoads_exception($e);
966 return;
967 }
968
969 // Traitement du message
970 $message = _("L'emprise a ete calculee.");
971 if($execute != true) {
972 $message = _("L'emprise n'a pas pu etre calculee.");
973 $correct = false;
974 }
975 // Message affiché à l'utilisateur
976 $message = sprintf(_("Dernier traitement effectue le %s."), $date)." ".$message;
977 $date_db = $this->f->formatTimestamp($date, false);
978 // Mise à jour de la table dossier_géolocalisation
979 $this->update_dossier_geolocalisation('calcul_emprise', $date_db, $correct, $message);
980
981 // Ajoute les informations sur le traitement dans le tableau retourné
982 $return['log'] = array(
983 "date" => $date,
984 "etat" => $correct,
985 "message" => $message,
986 );
987
988 // Retourne le résultat dans un tableau json
989 echo json_encode($return);
990 return;
991 }
992
993
994 /**
995 * VIEW - view_geolocalisation_dessin_emprise.
996 * Permet de rediriger l'utilisateur vers le sig afin qu'il dessine l'emprise
997 * du dossier.
998 *
999 * @return void
1000 */
1001 public function view_geolocalisation_dessin_emprise() {
1002 // Format de la date pour l'affichage
1003 $date = date('d/m/Y H:i:s');
1004 $correct = true;
1005 $message = "";
1006 $collectivite = $this->f->getCollectivite($this->getVal('om_collectivite'));
1007 // Vérification de la cohérence des parcelles actuelles.
1008 if(($different_parcelle = $this->is_different_parcelle_from_dossier_geolocalisation()) !== false) {
1009 echo $different_parcelle;
1010 return;
1011 }
1012 // Instance geoads
1013 $geoads = $this->get_geoads_instance($collectivite);
1014
1015 // Formatage des parcelles pour l'envoi au webservice
1016 $liste_parcelles = $this->f->parseParcelles(
1017 $this->getVal('terrain_references_cadastrales'),
1018 $this->getVal('om_collectivite')
1019 );
1020
1021 // Intérogation du web service du SIG
1022 try {
1023 $execute = $geoads->redirection_web_emprise($liste_parcelles, $this->getVal('dossier'));
1024 } catch (geoads_exception $e) {
1025 $this->handle_geoads_exception($e);
1026 return;
1027 }
1028
1029 // Traitement du message
1030 $message = _("Redirection vers le SIG.");
1031
1032 // Message affiché à l'utilisateur
1033 $message = sprintf(_("Dernier traitement effectue le %s."), $date)." ".$message;
1034 $date_db = $this->f->formatTimestamp($date, false);
1035 // Mise à jour de la table dossier_géolocalisation
1036 $this->update_dossier_geolocalisation('dessin_emprise', $date_db, $correct, $message);
1037 // Tableau à retourner
1038 $return['return'] = $execute;
1039 // Ajoute les informations sur les traitements dans le tableau retourné
1040 $return['log'] = array(
1041 "date" => $date,
1042 "etat" => $correct,
1043 "message" => $message,
1044 );
1045
1046 // Retourne le résultat dans un tableau json
1047 echo json_encode($return);
1048 }
1049
1050
1051 /**
1052 * VIEW - view_geolocalisation_calcul_centroide.
1053 * Calcul du centroid qui sert à ajouter le geom sur le dossier.
1054 *
1055 * @return void
1056 */
1057 public function view_geolocalisation_calcul_centroide() {
1058 // Format de la date pour l'affichage
1059 $date = date('d/m/Y H:i:s');
1060 $correct = true;
1061 $message = "";
1062 $collectivite = $this->f->getCollectivite($this->getVal('om_collectivite'));
1063 // Vérification de la cohérence des parcelles actuelles.
1064 if(($different_parcelle = $this->is_different_parcelle_from_dossier_geolocalisation()) !== false) {
1065 echo $different_parcelle;
1066 return;
1067 }
1068 // Instance geoads
1069 $geoads = $this->get_geoads_instance($collectivite);
1070
1071 // Intérogation du web service du SIG
1072 try {
1073 $execute = $geoads->calcul_centroide($this->getVal('dossier'));
1074 } catch (geoads_exception $e) {
1075 $this->handle_geoads_exception($e);
1076 return;
1077 }
1078
1079 // Récupération du code de référentiel sig
1080 if($collectivite["sig"]["sig_referentiel"] == "" or
1081 $collectivite["sig"]["sig_referentiel"] == null) {
1082 $correct = false;
1083 $message = _("Erreur de configuration (aucun referentiel). Contactez votre administrateur.");
1084 } else {
1085 $coord = $execute['x']." ".$execute['y'];
1086
1087 // Traitement du message
1088 $message = _("Le centroide a ete calcule")." : ".
1089 $execute['x'].", ".
1090 $execute['y'].".";
1091
1092 // Met à jour le centroide dans le dossier
1093 $res = $this->f->db->query("UPDATE ".DB_PREFIXE."dossier ".
1094 "SET geom = public.ST_GeomFromText('POINT(".$coord.")',".
1095 $collectivite["sig"]["sig_referentiel"].") ".
1096 "WHERE dossier = '".$this->getVal('dossier')."'");
1097 $this->f->addToLog(__FILE__.": db->query(\"UPDATE ".
1098 DB_PREFIXE."dossier SET geom = public.ST_GeomFromText('POINT(".
1099 $coord.")',".$collectivite["sig"]["sig_referentiel"].") WHERE dossier = '".$this->getVal('dossier')."'", VERBOSE_MODE);
1100 $this->f->isDatabaseError($res);
1101 }
1102
1103 // Message affiché à l'utilisateur
1104 $message = sprintf(_("Dernier traitement effectue le %s."), $date)." ".$message;
1105 $date_db = $this->f->formatTimestamp($date, false);
1106 // Mise à jour de la table dossier_géolocalisation
1107 $this->update_dossier_geolocalisation('calcul_centroide', $date_db, $correct, $message);
1108 // Tableau à retourner
1109 $return = $execute;
1110 // Ajoute les informations sur le traitements dans le tableau retourné
1111 $return['log'] = array(
1112 "date" => $date,
1113 "etat" => $correct,
1114 "message" => $message,
1115 );
1116
1117 // Retourne le résultat dans un tableau json
1118 echo json_encode($return);
1119 return;
1120 }
1121
1122
1123 /**
1124 * VIEW - view_geolocalisation_recup_contrainte.
1125 *
1126 * Permet de récupérer les contraintes et les affecter au dossier.
1127 *
1128 * @return void
1129 */
1130 public function view_geolocalisation_recup_contrainte() {
1131 // Format de la date pour l'affichage
1132 $date = date('d/m/Y H:i:s');
1133 $correct = true;
1134 $message = "";
1135 $collectivite = $this->f->getCollectivite($this->getVal('om_collectivite'));
1136 // Vérification de la cohérence des parcelles actuelles.
1137 if(($different_parcelle = $this->is_different_parcelle_from_dossier_geolocalisation()) !== false) {
1138 echo $different_parcelle;
1139 return;
1140 }
1141 // Instance geoads
1142 $geoads = $this->get_geoads_instance($collectivite);
1143
1144 // Intérogation du web service du SIG
1145 try {
1146 $execute = $geoads->recup_contrainte_dossier($this->getVal('dossier'));
1147 } catch (geoads_exception $e) {
1148 $this->handle_geoads_exception($e);
1149 return;
1150 }
1151
1152 // Traitement du message
1153 $message = _("Les contraintes ont ete recuperees.");
1154 // Initialisation des variables de comparaison
1155 $synchro = true;
1156 $ajouter = true;
1157 $supprimer = true;
1158
1159 // Récupère toutes les contraintes du dossier avant traitement
1160 $listeDossierContrainteSIG = $this->get_dossier_contrainte_SIG();
1161 // Pour chaque contrainte;
1162 foreach ($execute as $key => $value) {
1163 // Vérifie que la contrainte est dans l'application
1164 $contrainte = $this->getContrainteByNumero($value['contrainte']);
1165 // Si la contrainte est vide
1166 if ($contrainte == "") {
1167 // Nécessite une synchronisation
1168 $synchro = false;
1169 break;
1170 }
1171 // S'il y a une contrainte
1172 // Instancie la classe dossier_contrainte
1173 require_once "../obj/dossier_contrainte.class.php";
1174 $dossier_contrainte_add = new dossier_contrainte("]", $f->db, DEBUG);
1175 // Définit les valeurs
1176 $val = array(
1177 'dossier_contrainte' => ']',
1178 'dossier' => $this->getVal('dossier'),
1179 'contrainte' => $contrainte,
1180 'texte_complete' => $value['libelle'],
1181 'reference' => true,
1182 );
1183 // Ajoute l'enregistrement
1184 $ajouter = $dossier_contrainte_add->ajouter($val, $f->db, DEBUG);
1185 // Si erreur lors de l'ajout on sort de la boucle.
1186 if($ajouter != true) {
1187 break;
1188 }
1189 }
1190
1191
1192 // Si les contraintes ne sont pas synchronisées
1193 if ($synchro == false) {
1194 // Traitement du message
1195 $message = _("Les contraintes doivent etre synchronisees.");
1196 // État à false
1197 $correct = false;
1198 }
1199
1200 //
1201 if ($ajouter == false && $synchro == true) {
1202 // Traitement du message
1203 $message = _("Les contraintes n'ont pas ete ajoutees au dossier.");
1204 // État à false
1205 $correct = false;
1206 }
1207
1208 // Si les contraintes ne sont pas synchronisées
1209 if ($supprimer == false && $ajouter == true && $synchro == true) {
1210 // Traitement du message
1211 $message = _("Les anciennes contraintes n'ont pas ete supprimees.");
1212 // État à false
1213 $correct = false;
1214 }
1215
1216 // S'il il y a une erreur
1217 if ($synchro == false || $ajouter == false || $supprimer == false) {
1218 // Ajoute au message d'erreur
1219 $message .= " "._("Contactez votre administrateur.");
1220 }
1221
1222 // On supprime les contraintes SIG déjà affectées au dossier
1223 if ($ajouter == true && $synchro == true) {
1224 // Si la liste des contraintes SIG déjà affectées au dossier
1225 if (count($listeDossierContrainteSIG) > 0) {
1226 // Pour chaque contrainte déjà affectées au dossier
1227 foreach ($listeDossierContrainteSIG as $dossier_contrainte_id) {
1228 // Instancie la classe dossier_contrainte
1229 require_once "../obj/dossier_contrainte.class.php";
1230 $dossier_contrainte_del = new dossier_contrainte($dossier_contrainte_id, $this->f->db, DEBUG);
1231 // Valeurs de l'enregistrement
1232 $value = array();
1233 foreach($dossier_contrainte_del->champs as $key => $champ) {
1234 // Terme à chercher
1235 $search_field = 'contrainte_';
1236 // Si dans le champ le terme est trouvé
1237 if (strpos($champ, $search_field) !== false) {
1238 // Supprime le champ
1239 unset($dossier_contrainte_del->champs[$key]);
1240 } else {
1241 // Récupère la valeur du champ
1242 $value[$champ] = $dossier_contrainte_del->val[$key];
1243 }
1244 }
1245 // Supprime l'enregistrement
1246 $supprimer = $dossier_contrainte_del->supprimer($value, $f->db, DEBUG);
1247 }
1248 }
1249 }
1250
1251 // Récupère toutes les contraintes du dossier après traitement
1252 $listeDossierContrainteSIGAfter = $this->get_dossier_contrainte_SIG();
1253 $date_db = $this->f->formatTimestamp($date, false);
1254 // Message affiché à l'utilisateur
1255 $message = sprintf(_("Dernier traitement effectue le %s."), $date)." ".$message;
1256 // Mise à jour de la table dossier_géolocalisation
1257 $this->update_dossier_geolocalisation('recup_contrainte', $date_db, $correct, $message);
1258 // Ajoute les informations sur les traitements dans le tableau retourné
1259 $return['log'] = array(
1260 "date" => $date,
1261 "etat" => $correct,
1262 "message" => $message
1263 );
1264 // Ajoute les informations concernant les contraintes récupérées
1265 $return['dossier_contrainte'] = array(
1266 "nb_contrainte_sig" => count($listeDossierContrainteSIGAfter),
1267 "msg_contrainte_sig_empty" => _("Aucune contrainte ajoutee depuis le SIG"),
1268 "msg_contrainte_sig" => _("contrainte(s) ajoutee(s) depuis le SIG"),
1269 );
1270 // Retourne le résultat dans un tableau json
1271 echo json_encode($return);
1272 return;
1273 }
1274
1275
1276 /**
1277 * Récupérer la contrainte par le numéro de référence SIG.
1278 *
1279 * @param string $numero Identifiant de la contrainte du SIG.
1280 *
1281 * @return array Tableau des résultats
1282 */
1283 public function getContrainteByNumero($numero) {
1284
1285 // Initialisation du résultat
1286 $contrainte = "";
1287
1288 // Requête sql
1289 $sqlContrainte = "SELECT contrainte
1290 FROM ".DB_PREFIXE."contrainte
1291 WHERE reference = 't'
1292 AND numero = '".$numero."'";
1293 $contrainte = $this->f->db->getOne($sqlContrainte);
1294 $this->f->addToLog(__FILE__." : db->getOne(\"".$sqlContrainte."\")", VERBOSE_MODE);
1295 $this->f->isDatabaseError($contrainte);
1296
1297 // Tableau de résultat retourné
1298 return $contrainte;
1299 }
1300
1301
1302 /**
1303 * Récupération des contraintes récupérées depuis le SIG liées au dossier
1304 *
1305 * @return array Tableau des résultats
1306 */
1307 public function get_dossier_contrainte_SIG() {
1308
1309 // Initialisation du tableau des résultats
1310 $listeDossierContrainteSIG = array();
1311
1312 // Requête SQL
1313 $sqlDossierContrainte = "SELECT dossier_contrainte
1314 FROM ".DB_PREFIXE."dossier_contrainte
1315 WHERE dossier = '".$this->getVal("dossier")."'
1316 AND reference IS TRUE";
1317 $resDossierContrainte = $this->f->db->query($sqlDossierContrainte);
1318 $this->f->addToLog(
1319 __FILE__." : db->query(\"".
1320 $sqlDossierContrainte."\")",
1321 VERBOSE_MODE
1322 );
1323
1324 $this->f->isDatabaseError($resDossierContrainte);
1325 // Pour chaque résultat
1326 while (
1327 $rowDossierContrainte = &$resDossierContrainte->fetchRow(DB_FETCHMODE_ASSOC)
1328 ) {
1329 // Ajoute l'identifiant du lien dans le tableau des résultats
1330 $listeDossierContrainteSIG[] = $rowDossierContrainte['dossier_contrainte'];
1331 }
1332
1333 // Tableau de résultat retourné
1334 return $listeDossierContrainteSIG;
1335 }
1336
1337
1338 /**
1339 * VIEW - view_geolocalisation.
1340 *
1341 * Redirige pour ouvrir le formulaire en ajaxIt dans un overlay.
1342 * Cette action est bindée pour utiliser la fonction popUpIt.
1343 *
1344 * @return void
1345 */
1346 public function view_geolocalisation() {
1347
1348 // Vérification de l'accessibilité sur l'élément
1349 $this->checkAccessibility();
1350
1351 //
1352 $idx = $this->getVal($this->clePrimaire);
1353
1354 require_once "../obj/dossier_geolocalisation.class.php";
1355 $dossier_geolocalisation = new dossier_geolocalisation(null, null, null, $this->getVal('dossier'));
1356
1357 // Récupération des contraintes liées au DI
1358 $sqlDossierContrainte = "SELECT dossier_contrainte, reference
1359 FROM ".DB_PREFIXE." dossier_contrainte
1360 WHERE dossier = '".$idx."'";
1361 $resDossierContrainte = $this->f->db->query($sqlDossierContrainte);
1362 $this->f->addToLog(__METHOD__."() : db->query(\"".$sqlDossierContrainte."\")", VERBOSE_MODE);
1363 $this->f->isDatabaseError($resDossierContrainte);
1364
1365 //
1366 $geom = "";
1367 //
1368 if ($this->getVal('geom') != '') {
1369 //
1370 $sqlGEOM = "SELECT public.ST_AsText('".$this->getVal('geom')."'::geometry)";
1371 $geom = $this->f->db->getOne($sqlGEOM);
1372 $this->f->addToLog(__METHOD__."() : db->getOne(\"".$sqlGEOM."\")", VERBOSE_MODE);
1373 }
1374
1375 // Compteurs de contrainte manuelle et automatique
1376 $nb_contrainte_man = 0;
1377 $nb_contrainte_sig = 0;
1378 // Nombre de contrainte du DI
1379 while ($rowDossierContrainte = &$resDossierContrainte->fetchRow(DB_FETCHMODE_ASSOC)) {
1380 //
1381 if ($rowDossierContrainte['reference'] == 'f') {
1382 $nb_contrainte_man++;
1383 } else {
1384 $nb_contrainte_sig++;
1385 }
1386 }
1387 // Modifie les messages en fonction du nombre de contrainte
1388 if ($nb_contrainte_man == 0) {
1389 $msg_contrainte_man = _("Aucune contraintes ajoutees depuis l'application");
1390 } else {
1391 $msg_contrainte_man = $nb_contrainte_man." "._("contrainte(s) ajoutee(s) depuis l'application");
1392 }
1393 if ($nb_contrainte_sig == 0) {
1394 $msg_contrainte_sig = _("Aucune contraintes ajoutees depuis le SIG");
1395 } else {
1396 $msg_contrainte_sig = $nb_contrainte_sig." "._("contrainte(s) ajoutee(s) depuis le SIG");
1397 }
1398 $contrainte_val = "<span id='msg_contrainte_man'>".$msg_contrainte_man."</span>"."<br />".
1399 "<span id='msg_contrainte_sig'>".$msg_contrainte_sig."</span>";
1400
1401 // Affichage du fil d'Ariane
1402 $this->f->displaySubTitle(_("Geolocalisation") . "->" . $this->getVal('dossier_libelle'));
1403 $this->f->display();
1404
1405 // Message affiché
1406 $message_field = '<div class="message ui-widget ui-corner-all ui-state-highlight ui-state-%s" id="%s">
1407 <p>
1408 <span class="ui-icon ui-icon-info"></span>
1409 <span class="text">%s<br></span>
1410 </p>
1411 </div>';
1412
1413 // Message d'erreur si les références cadastrales ont été modifiées
1414 // dans le dossier d'instruction
1415 if ($dossier_geolocalisation->get_terrain_references_cadastrales_archive() != "" &&
1416 $dossier_geolocalisation->get_terrain_references_cadastrales_archive() != $this->getVal('terrain_references_cadastrales')) {
1417
1418 if($this->getVal('terrain_references_cadastrales') != "") {
1419
1420 $messageRefCadUtilisees = _("Les references cadastrales utilisees par le SIG")." : ".
1421 $dossier_geolocalisation->get_terrain_references_cadastrales_archive();
1422 } else {
1423 $messageRefCadUtilisees = _("Aucune reference cadastrale n'est renseignee pour le SIG");
1424 }
1425
1426 printf($message_field, "error", "geolocalisation-message",
1427 "<p>"._("Les references cadastrales ont ete modifiees dans le dossier d'instruction.")."</p>".
1428 "<p>".$messageRefCadUtilisees."</p>");
1429 }
1430
1431 // Bouton retour
1432 $button_return = '<div class="formControls">
1433 <a id="retour-button" onclick="redirectPortletAction(1,\'main\'); refresh_page_return();" href="#" class="retour">Retour</a>
1434 </div>';
1435
1436 // Affiche le bouton de retour
1437 printf($button_return);
1438
1439 // Début du formulaire
1440 printf("\n<!-- ########## START FORMULAIRE ########## -->\n");
1441 printf("<div class=\"formEntete ui-corner-all\">\n");
1442
1443 // Champ pour le bouton
1444 $button_field = '<div class="field field-type-static">
1445 <div class="form-libelle">
1446 <label id="lib-%1$s" class="libelle-%1$s" for="%1$s">
1447 %2$s
1448 </label>
1449 </div>
1450 <div class="form-content">
1451 <span id="%1$s" class="field_value">
1452 %3$s
1453 </span>
1454 </div>
1455 </div>';
1456
1457 // Boutons d'action sur la géolocalisation
1458 $button = '<input type="submit" class="om-button ui-button ui-widget ui-state-default ui-corner-all" id="%s-button" value="%s" onclick="%s" role="button" aria-disabled="false">';
1459
1460 // Affiche le bouton permettant de lancer tous les traitements
1461 printf('<div class="alignBtnCenter">');
1462 printf($button, "chance", "J'ai de la chance", "all_geolocalisation_treatments('$idx', '"._("Etes vous sur de vouloir recuperer les contraintes ?")."')");
1463 printf('</div>');
1464
1465 // Tableau pour afficher l'interface sur deux colonnes
1466 printf("<div class='sousform-geolocalisation'><div class='list-buttons-geolocalisation'>");
1467
1468 //Affichage des boutons
1469 $rowDonneesSIG = $dossier_geolocalisation->get_geolocalisation_state('verif_parcelle');
1470 printf($button_field, 'verif_parcelle', sprintf($button, 'verif_parcelle', "Vérifier les parcelles", "geolocalisation_treatment('$idx', 'verif_parcelle', set_geolocalisation_message)"), $this->build_message('verif_parcelle', $message_field, $rowDonneesSIG));
1471 $rowDonneesSIG = $dossier_geolocalisation->get_geolocalisation_state('calcul_emprise');
1472 printf($button_field, 'calcul_emprise', sprintf($button, 'calcul_emprise', "Calculer l'emprise", "geolocalisation_treatment('$idx', 'calcul_emprise', '')"), $this->build_message('calcul_emprise', $message_field, $rowDonneesSIG));
1473 $rowDonneesSIG = $dossier_geolocalisation->get_geolocalisation_state('dessin_emprise');
1474 printf($button_field, 'dessin_emprise', sprintf($button, 'dessin_emprise', "Dessiner l'emprise", "geolocalisation_treatment('$idx', 'dessin_emprise', redirection_web_sig)"), $this->build_message('dessin_emprise', $message_field, $rowDonneesSIG));
1475 $rowDonneesSIG = $dossier_geolocalisation->get_geolocalisation_state('calcul_centroide');
1476 printf($button_field, 'calcul_centroide', sprintf($button, 'calcul_centroide', "Calculer le centroïde", "geolocalisation_treatment('$idx', 'calcul_centroide', set_geolocalisation_centroide)"), $this->build_message('calcul_centroide', $message_field, $rowDonneesSIG));
1477 $rowDonneesSIG = $dossier_geolocalisation->get_geolocalisation_state('recup_contrainte');
1478 printf($button_field, 'recup_contrainte', sprintf($button, 'recup_contrainte', "Récupérer les contraintes", "geolocalisation_treatment('$idx', 'recup_contrainte', set_geolocalisation_contrainte, '"._("Etes vous sur de vouloir recuperer les contraintes ?")."')"), $this->build_message('recup_contrainte', $message_field, $rowDonneesSIG));
1479
1480 //
1481 printf("</div>");
1482
1483 // Le formulaire n'a pas été validé
1484 $validation = 1;
1485 // Le formulaire est en mode consultation
1486 $maj = 3;
1487
1488 // Champs du formulaire
1489 $champs = array("centroide", "contrainte", "adresse", "references_cadastrales");
1490
1491 // Création d'un nouvel objet de type formulaire
1492 $form = new formulaire(null, $validation, $maj, $champs);
1493
1494 // Configuration des types de champs
1495 foreach ($champs as $key) {
1496 $form->setType($key, 'static');
1497 }
1498 $form->setType("references_cadastrales", "referencescadastralesstatic");
1499
1500 // Configuration des libellés
1501 $form->setLib("references_cadastrales", _("terrain_references_cadastrales"));
1502 $form->setLib("adresse", _("adresse"));
1503 $form->setLib("centroide", _("centroide"));
1504 $form->setLib("contrainte", _("contrainte"));
1505
1506 // Configuration des données
1507 $form->setVal("references_cadastrales", $this->getVal("terrain_references_cadastrales"));
1508 $form->setVal("adresse", $this->getVal("terrain_adresse_voie_numero")." ".$this->getVal("terrain_adresse_voie")." ".$this->getVal("terrain_adresse_lieu_dit")." ".$this->getVal("terrain_adresse_code_postal")." ".$this->getVal("terrain_adresse_localite")." ".$this->getVal("terrain_adresse_bp")." ".$this->getVal("terrain_adresse_cedex"));
1509 if($geom != "") {
1510 $form->setVal('centroide', $this->getGeolocalisationLink());
1511 } else {
1512 $form->setVal('centroide', $geom);
1513 }
1514 $form->setVal("contrainte", $contrainte_val);
1515
1516 // Affichage des champs
1517 $form->setBloc("centroide", "D", _("Donnees du dossier d'instruction"), "alignForm col_12");
1518 $form->setBloc("centroide", "DF", "", "geoloc_form alignForm col_12");
1519 $form->setBloc("contrainte", "DF", "", "geoloc_form alignForm col_12");
1520 $form->setBloc("adresse", "DF", "", "geoloc_form alignForm col_12");
1521 $form->setBloc("references_cadastrales", "DF", "", "geoloc_form alignForm col_12");
1522 $form->setBloc("references_cadastrales", "F");
1523
1524 $form->afficher($champs, $validation, false, false);
1525 // Ferme le tableau pour l'affichage sur deux colonnes
1526 printf("</div></div>");
1527
1528 //Ajout d'un div vide pour éviter les superspositions des div
1529 printf("<div class=\"both\"></div>");
1530
1531 // Fin du formulaire
1532 printf("</div></div>");
1533
1534 // Affiche le bouton de retour
1535 printf($button_return);
1536 }
1537
1538
1539 /**
1540 * Compose le message affiché à l'utilisateur.
1541 *
1542 * @param string $field_name Nom du champ.
1543 * @param string $message_field Code html du message.
1544 * @param mixed $rowDonneesSIG Tableau des données.
1545 *
1546 * @return string Message.
1547 */
1548 private function build_message($field_name, $message_field, $rowDonneesSIG) {
1549
1550 // Récupération des infos
1551 $date = "";
1552 if (isset($rowDonneesSIG["date"])) {
1553 $date = $this->f->formatTimestamp($rowDonneesSIG["date"]);
1554 }
1555 $etat = "";
1556 if (isset($rowDonneesSIG["etat"])) {
1557 $etat = $rowDonneesSIG["etat"];
1558 }
1559 $text = "";
1560 if (isset($rowDonneesSIG["message"])) {
1561 $text = $rowDonneesSIG["message"];
1562 }
1563
1564 // id du message
1565 $id_message = $field_name."-message";
1566
1567 // Définit le type du message "empty", "valid" ou "error"
1568 // empty : message grisé
1569 // valid : message de validation
1570 // error : message d'erreur
1571 $type_message = "empty";
1572 if ($etat != "") {
1573 //
1574 $type_message = "valid";
1575 if ($etat == 'f') {
1576 $type_message = "error";
1577 }
1578 }
1579
1580 // Si il y a une date, un message est ajouté en debut
1581 if ($date != "") {
1582 //
1583 $date = sprintf(_("Dernier traitement effectue le %s."), $date);
1584 }
1585
1586 // Si aucun message alors l'action n'a jamais été effectuée
1587 if ($text == "") {
1588 //
1589 $text = _("Action non effectuee.");
1590 //
1591 $type_message = "empty";
1592 }
1593
1594 // Compose le message
1595 $message = sprintf($message_field, $type_message, $id_message, $date." ".$text);
1596
1597 // retour
1598 return $message;
1599 }
1600
1601
1602 /**
1603 *
1604 */
1605 function view_widget_dossiers_evenement_retour_finalise() {
1606
1607 // Création de la requête de récupération des dossiers
1608 //
1609 // On recherche les dossiers dont le dernier événement d'instruction (hors événement retour)
1610 // est de type arrêté finalisé ou changement de décision
1611 // et que les dates de retour de signature, envoi RAR, retour RAR et
1612 // contrôle de légalité de cet événement d'instruction ne sont pas remplies
1613 // que le dossier est en cours, qu'il est instruit par la communauté
1614 // et que l'utilisateur connecté est un instructeur de la même commune que le dossier
1615 $sql =
1616 "SELECT
1617 dossier.dossier,
1618 dossier.dossier_libelle,
1619 CASE WHEN dossier.instructeur IS NOT NULL THEN
1620 CONCAT(instructeur.nom, ' (', division.libelle, ')')
1621 END as nom_instructeur,
1622 CASE WHEN incomplet_notifie IS TRUE AND incompletude IS TRUE THEN
1623 dossier.date_limite_incompletude ELSE
1624 dossier.date_limite END as date_limite_na,
1625 COALESCE(demandeur.particulier_nom, demandeur.personne_morale_denomination)
1626 AS nom_petitionnaire
1627 FROM
1628 ".DB_PREFIXE."dossier
1629 JOIN ".DB_PREFIXE."instruction ON instruction.instruction = (
1630 SELECT instruction
1631 FROM ".DB_PREFIXE."instruction
1632 JOIN ".DB_PREFIXE."evenement on instruction.evenement=evenement.evenement
1633 WHERE instruction.dossier = dossier.dossier
1634 AND evenement.retour IS FALSE
1635 ORDER BY date_evenement DESC, instruction DESC
1636 LIMIT 1
1637 )
1638 JOIN ".DB_PREFIXE."evenement ON instruction.evenement=evenement.evenement
1639 JOIN ".DB_PREFIXE."lien_dossier_demandeur ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
1640 JOIN ".DB_PREFIXE."demandeur ON lien_dossier_demandeur.demandeur = demandeur.demandeur
1641 JOIN ".DB_PREFIXE."instructeur ON dossier.instructeur=instructeur.instructeur
1642 JOIN ".DB_PREFIXE."om_utilisateur ON om_utilisateur.om_utilisateur=instructeur.om_utilisateur
1643 JOIN ".DB_PREFIXE."division ON instructeur.division=division.division
1644 JOIN ".DB_PREFIXE."om_collectivite ON om_utilisateur.om_collectivite=om_collectivite.om_collectivite
1645 JOIN ".DB_PREFIXE."etat ON dossier.etat = etat.etat
1646 JOIN ".DB_PREFIXE."dossier_instruction_type ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type AND dossier_instruction_type.code IN ('P', 'T', 'M')
1647 WHERE
1648 ((evenement.type = 'arrete' AND instruction.om_final_instruction IS TRUE) OR evenement.type = 'changement_decision')
1649 AND evenement.retour IS FALSE
1650 AND instruction.date_retour_signature IS NULL
1651 AND instruction.date_envoi_rar IS NULL
1652 AND instruction.date_retour_rar IS NULL
1653 AND instruction.date_envoi_controle_legalite IS NULL
1654 AND instruction.date_retour_controle_legalite IS NULL
1655 AND etat.statut = 'encours'
1656 AND om_utilisateur.login != '".$_SESSION['login']."'
1657 AND om_collectivite.niveau = '2'
1658 ";
1659
1660 // Si collectivité de l'utilisateur niveau mono alors filtre sur celle-ci
1661 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
1662 $sql .= " AND dossier.om_collectivite=".$_SESSION['collectivite'];
1663 }
1664
1665 $sql .= " ORDER BY date_evenement DESC LIMIT 5";
1666
1667 // Exécution de la requête
1668 $res = $this->f->db->query($sql);
1669 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
1670 $this->f->isDatabaseError($res);
1671 $nb_result = $res->numrows();
1672 // Ouverture conteneur
1673 echo '<div id="view_widget_dossiers_evenement_retour_finalise">';
1674 // Affiche des données résultats
1675 if ($nb_result > 0) {
1676 echo '<table class="tab-tab">';
1677 // Entête de tableau
1678 echo '<thead>';
1679 echo '<tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">';
1680 echo '<th class="title col-0 firstcol">';
1681 echo '<span class="name">';
1682 echo _('dossier');
1683 echo '</span>';
1684 echo '</th>';
1685 echo '<th class="title col-0 firstcol">';
1686 echo '<span class="name">';
1687 echo _('petitionnaire');
1688 echo '</span>';
1689 echo '</th>';
1690 echo '<th class="title col-0 firstcol">';
1691 echo '<span class="name">';
1692 echo _('instructeur');
1693 echo '</span>';
1694 echo '</th>';
1695 echo '</tr>';
1696 echo '</thead>';
1697
1698 echo '<tbody>';
1699
1700 // Données dans le tableau
1701 while ( $row =& $res->fetchRow(DB_FETCHMODE_ASSOC) ) {
1702
1703 echo '<tr class="tab-data odd">';
1704 // Numéro de dossier
1705 echo '<td class="col-1 firstcol">';
1706 echo '<a class="lienTable"
1707 href="form.php?obj=dossier_instruction&amp;action=3&amp;idx='.$row["dossier"].'&amp;idz='.$row["dossier_libelle"].'&amp;premier=0&amp;advs_id=&amp;recherche=&amp;tricol=&amp;selectioncol=&amp;valide=&amp;retour=tab">'
1708 .$row["dossier_libelle"]
1709 .'</a>';
1710 echo '</td>';
1711
1712 // Nom du pétitionnaire
1713 echo '<td class="col-1">';
1714 echo '<a class="lienTable"
1715 href="form.php?obj=dossier_instruction&amp;action=3&amp;idx='.$row["dossier"].'&amp;idz='.$row["dossier_libelle"].'&amp;premier=0&amp;advs_id=&amp;recherche=&amp;tricol=&amp;selectioncol=&amp;valide=&amp;retour=tab">'
1716 .$row["nom_petitionnaire"]
1717 .'</a>';
1718 echo '</td>';
1719
1720 // Instructeur
1721 echo '<td class="col-2 lastcol">';
1722 echo '<a class="lienTable"
1723 href="form.php?obj=dossier_instruction&amp;action=3&amp;idx='.$row["dossier"].'&amp;idz='.$row["dossier_libelle"].'&amp;premier=0&amp;advs_id=&amp;recherche=&amp;tricol=&amp;selectioncol=&amp;valide=&amp;retour=tab">'
1724 .$row["nom_instructeur"]
1725 .'</a>';
1726 echo '</td>';
1727
1728 echo "</tr>";
1729 }
1730
1731 echo '</tbody>';
1732
1733 echo '</table>';
1734 if ($nb_result > 5 && $this->f->isAccredited("dossier_instruction_tab")) {
1735 $link = '../scr/tab.php?obj=dossier_instruction&decision=true';
1736 $title = _("Voir tous les dossiers");
1737 printf('<br/><a href="%s">%s</a>', $link, $title);
1738 }
1739 }
1740 else{
1741 echo _("Vous n'avez pas de dossier pour lequel on peut proposer une autre decision.");
1742 echo '</div>';
1743 return true;
1744 }
1745 // Fermeture conteneur
1746 echo '</div>';
1747 return false;
1748 }
1749
1750
1751 /**
1752 * VIEW - view_get_log_di
1753 *
1754 * Affiche le tableau des logs des événements d'instruction du DI.
1755 *
1756 * @return Faux
1757 */
1758 public function view_get_log_di() {
1759 // Colonnes
1760 $headers = array(
1761 _('date'),
1762 _('id'),
1763 _('contexte'),
1764 _('login'),
1765 _('date_evenement'),
1766 _('retour RAR'),
1767 _('retour signature'),
1768 _('evenement'),
1769 _('action'),
1770 _('etat'),
1771 );
1772 // Lignes
1773 $logs = $this->get_log_instructions();
1774 $rows = array();
1775 foreach ($logs as $log) {
1776 $cells = array();
1777 $cells[] = $log["date"];
1778 $cells[] = $log["values"]["instruction"];
1779 $cells[] = $log["action"];
1780 $cells[] = $log["user"];
1781 $cells[] = $log["values"]["date_evenement"];
1782 $cells[] = $log["values"]["date_retour_rar"];
1783 $cells[] = $log["values"]["date_retour_signature"];
1784 $cells[] = $log["values"]["evenement"];
1785 $cells[] = $log["values"]["action"];
1786 $cells[] = $log["values"]["etat"];
1787 $rows[] = $cells;
1788 }
1789 // Affichage
1790 echo $this->f->compose_generate_table('view_get_log_di', $headers, $rows);
1791 return false;
1792 }
1793
1794
1795 /**
1796 * Retourne vrai quand le dossier n'a qu'un événement d'instruction, sinon
1797 * faux.
1798 *
1799 * @return boolean
1800 */
1801 function has_only_recepisse() {
1802 // Récupère la liste des instruction du dossier
1803 $list_instructions = $this->get_list_instructions();
1804
1805 // Si la liste à plus d'un élément
1806 if (count($list_instructions) != 1) {
1807 //
1808 return false;
1809 }
1810
1811 // Si l'instruction retournée n'est pas l'instruction de récépissé de la
1812 // demande
1813 if ($list_instructions[0] != $this->get_demande_instruction_recepisse()) {
1814 //
1815 return false;
1816 }
1817
1818 //
1819 return true;
1820 }
1821
1822 /**
1823 * Récupère la liste des événements du dossier.
1824 *
1825 * @return array
1826 */
1827 function get_list_instructions() {
1828 // Initialisation de la variable de retour
1829 $result = array();
1830
1831 // SQL
1832 $sql = "SELECT instruction
1833 FROM ".DB_PREFIXE."instruction
1834 WHERE dossier = '".$this->getVal($this->clePrimaire)."'
1835 ORDER BY instruction ASC";
1836 $res = $this->f->db->query($sql);
1837 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
1838 $this->f->isDatabaseError($res);
1839
1840 // Récupère les résultats dans un tableau
1841 while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
1842 //
1843 $result[] = $row['instruction'];
1844 }
1845
1846 // Retourne le tableau de résultat
1847 return $result;
1848 }
1849
1850 /**
1851 * Récupère le numéro d'instruction du récépissé de demande.
1852 *
1853 * @return integer
1854 */
1855 function get_demande_instruction_recepisse() {
1856 // Instance de demande
1857 $demande = $this->get_inst_demande();
1858
1859 // Récupère la valeur du champ instruction_recepisse
1860 $instruction_recepisse = $demande->getVal('instruction_recepisse');
1861
1862 //
1863 return $instruction_recepisse;
1864 }
1865
1866 /**
1867 * Récupère l'instance de la demande du dossier
1868 *
1869 * @param mixed Identifiant de la demande
1870 *
1871 * @return object
1872 */
1873 function get_inst_demande($demande = null) {
1874 //
1875 if (is_null($this->inst_demande)) {
1876 //
1877 if (is_null($demande)) {
1878 $demande = $this->get_demande_by_dossier_instruction();
1879 }
1880 //
1881 require_once "../obj/demande.class.php";
1882 $this->inst_demande = new demande($demande, $this->f->db, 0);
1883 }
1884 //
1885 return $this->inst_demande;
1886 }
1887
1888 /**
1889 * Récupère l'identifiant de la demande par le dossier d'instruction.
1890 *
1891 * @return integer
1892 */
1893 function get_demande_by_dossier_instruction() {
1894 // Initialisation de la variable de retour
1895 $res = null;
1896
1897 // SQL
1898 $sql = "SELECT demande
1899 FROM ".DB_PREFIXE."demande
1900 WHERE dossier_instruction = '".$this->getVal($this->clePrimaire)."'";
1901 $res = $this->f->db->getOne($sql);
1902 $this->f->addToLog(__METHOD__."(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
1903 $this->f->isDatabaseError($res);
1904
1905 //
1906 return $res;
1907 }
1908
1909
1910 /**
1911 * VIEW - view_localiser
1912 * Redirige l'utilisateur vers le SIG externe.
1913 *
1914 * @return void
1915 */
1916 public function view_localiser() {
1917 if($this->can_open_geolocalisation() === false) {
1918 // On affiche un message d'erreur
1919 $this->f->displayMessage('error', _("La localisation SIG n'est pas activee.")." "._("Veuillez contacter votre administrateur."));
1920 // On redirige l'utilisateur vers la fiche du dossier en consultation
1921 $this->setParameter("maj", 3);
1922 $this->formulaire();
1923 return false;
1924 }
1925
1926 // On récupère les informations de la collectivité du dossier
1927 $collectivite = $this->f->getCollectivite($this->getVal('om_collectivite'));
1928 // identifiant du dossier
1929 $idx = $this->getVal($this->clePrimaire);
1930
1931 // Instance geoads
1932 $geoads = $this->get_geoads_instance($collectivite);
1933 if($geoads === false) {
1934 // L'erreur geoads est affichée dans la méthode handle_geoads_exception
1935 // On redirige l'utilisateur vers la fiche du dossier en consultation
1936 $this->setParameter("maj", 3);
1937 $this->formulaire();
1938 return false;
1939 }
1940
1941
1942 // Si le geom existe : le centroid a été calculé donc le sig connait
1943 // le dossier donc redirection par numéro de dossier
1944 if ($this->getVal('geom') != "") {
1945 //
1946 $url = $geoads->redirection_web(null, $idx);
1947 }
1948 // Sinon on décompose les references cadastrales en parcelles :
1949 // redirection references cadastrales
1950 elseif ($this->getVal('terrain_references_cadastrales') != "") {
1951 //
1952 $tabParcelles = $this->f->parseParcelles(
1953 $this->getVal('terrain_references_cadastrales'),
1954 $this->getVal('om_collectivite')
1955 );
1956 $url = $geoads->redirection_web($tabParcelles);
1957 }
1958 // Sinon redirection vers le sig sans argument
1959 else {
1960 //
1961 $url = $geoads->redirection_web();
1962 }
1963 // Redirection
1964 header("Location: ".$url);
1965
1966 }
1967
1968
1969 }
1970
1971 ?>

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26