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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 19592 - (show annotations)
Wed Jan 22 18:04:27 2025 UTC (5 days, 1 hour ago) by softime
File size: 316816 byte(s)
merge: fusion de la branche d'intégration v6.10.0-develop dans le trunk

1 <?php
2 /**
3 * Ce fichier est destine a permettre la surcharge de certaines methodes de
4 * la classe om_application pour des besoins specifiques de l'application
5 *
6 * @package openmairie_exemple
7 * @version SVN : $Id: utils.class.php 6132 2016-03-09 09:18:18Z stimezouaght $
8 */
9
10 /**
11 *
12 */
13 if (file_exists("../dyn/locales.inc.php") === true) {
14 require_once "../dyn/locales.inc.php";
15 }
16
17 /**
18 *
19 */
20 if (file_exists("../dyn/include.inc.php") === true) {
21 require_once "../dyn/include.inc.php";
22 } else {
23 /**
24 * Définition de la constante représentant le chemin d'accès au framework
25 */
26 define("PATH_OPENMAIRIE", getcwd()."/../core/");
27
28 /**
29 * TCPDF specific config
30 */
31 define('K_TCPDF_EXTERNAL_CONFIG', true);
32 define('K_TCPDF_CALLS_IN_HTML', true);
33 define('K_PATH_FONTS', '../app/fonts/');
34
35 /**
36 * Dépendances PHP du framework
37 * On modifie la valeur de la directive de configuration include_path en
38 * fonction pour y ajouter les chemins vers les librairies dont le framework
39 * dépend.
40 */
41 set_include_path(
42 get_include_path().PATH_SEPARATOR.implode(
43 PATH_SEPARATOR,
44 array(
45 getcwd()."/../php/pear",
46 getcwd()."/../php/db",
47 getcwd()."/../php/fpdf",
48 getcwd()."/../php/phpmailer",
49 getcwd()."/../php/tcpdf",
50 )
51 )
52 );
53
54 /**
55 * Retourne l'URL de la racine d'openADS.
56 * Exemple : http://localhost/openads/
57 */
58 if (!function_exists("get_base_url")) {
59 function get_base_url() {
60 // Récupération du protocole
61 $protocol = 'http';
62 if (isset($_SERVER['HTTPS'])) {
63 $protocol = ($_SERVER['HTTPS'] && $_SERVER['HTTPS'] != "off") ? "https" : "http";
64 }
65 // Récupération du domaine
66 $domain = $_SERVER['HTTP_HOST'];
67 // Récupération du port
68 $port = $_SERVER['SERVER_PORT'];
69 $disp_port = ($protocol == 'http' && $port == 80 || $protocol == 'https' && $port == 443) ? '' : ":$port";
70 // Construction du chemin restant
71 $base_url = str_replace('app', '', rtrim(dirname($_SERVER['PHP_SELF']), '/\\'));
72 //
73 return $protocol."://".$domain.$disp_port.$base_url;
74 }
75 }
76 define("PATH_BASE_URL", get_base_url());
77 }
78
79 /**
80 *
81 */
82 if (file_exists("../dyn/debug.inc.php") === true) {
83 require_once "../dyn/debug.inc.php";
84 }
85
86 /**
87 *
88 */
89 (defined("PATH_OPENMAIRIE") ? "" : define("PATH_OPENMAIRIE", ""));
90
91 /**
92 * Constante donnant le code de la catégorie de document numérisé liée à Plat'AU
93 */
94 (defined("CODE_CATEGORIE_DOC_NUM_PLATAU") ? "" : define('CODE_CATEGORIE_DOC_NUM_PLATAU', 'PLATAU'));
95
96 /**
97 * Constante pour récupérer le code des documents de travail.
98 */
99 (defined("CODE_TYPE_DOC_TRAVAIL") ? "" : define('CODE_TYPE_DOC_TRAVAIL', 'DOCTRAV'));
100
101 /**
102 * Constantes donnant le nom de la catégorie des tâches liées à Plat'AU et ua portail citoyen
103 */
104 (defined("PLATAU") ? "" : define('PLATAU', 'platau'));
105 (defined("PORTAL") ? "" : define('PORTAL', 'portal'));
106 /**
107 * Constantes contennant le libellé des options
108 */
109 (defined("OPTION_NORMALISE_NOM_DOC") ? "" : define('OPTION_NORMALISE_NOM_DOC', 'option_normaliser_nommage_document_numerise'));
110 /**
111 *
112 */
113 require_once PATH_OPENMAIRIE."om_application.class.php";
114
115 require_once __DIR__."/module_manager.class.php";
116 use Module\module_manager;
117
118 require_once __DIR__.'/extra_data_store.impl_2_tables.php';
119
120 /**
121 *
122 */
123 class utils extends application {
124
125 /**
126 * Gestion du nom de l'application.
127 *
128 * @var mixed Configuration niveau application.
129 */
130 protected $_application_name = "openADS";
131
132 /**
133 * Titre HTML.
134 *
135 * @var mixed Configuration niveau application.
136 */
137 protected $html_head_title = ":: openMairie :: openADS";
138
139 /**
140 * Gestion du nom de la session.
141 *
142 * @var mixed Configuration niveau application.
143 */
144 protected $_session_name = "openads";
145
146 /**
147 * Gestion du favicon de l'application.
148 *
149 * @var mixed Configuration niveau application.
150 */
151 var $html_head_favicon = '../app/img/favicon.ico';
152
153 /**
154 * Gestion du mode de gestion des permissions.
155 *
156 * @var mixed Configuration niveau application.
157 */
158 protected $config__permission_by_hierarchical_profile = false;
159
160 /**
161 * Stockage des paramètres des collectivités.
162 *
163 * @var array
164 */
165 protected $collectivitiesParameters = array();
166
167 /**
168 * Niveau de log
169 *
170 * @var int
171 */
172 public $log_level = 4; // WARNING
173
174 /**
175 * Description des niveaux de log
176 *
177 * @see: https://github.com/php-fig/log/blob/master/src/LogLevel.php
178 *
179 * @var array
180 */
181 public $log_levels = array(
182 'EMERGENCY' => 0,
183 'ALERT' => 1,
184 'CRITICAL' => 2,
185 'ERROR' => 3,
186 'WARNING' => 4,
187 'NOTICE' => 5,
188 'INFO' => 6,
189 'DEBUG' => 7
190 );
191
192 /**
193 * Instance du gestionnaire de modules
194 */
195 public $module_manager;
196
197 /**
198 * Instance du stockage de données « supplémentaires »
199 */
200 public $extra_data_store;
201
202 /**
203 * Surcharge pour instancier le module manager et pour définir le niveau de log
204 */
205 function __construct($flag = null, $right = null, $title = null) {
206
207 $log_file_conf = '../log.level';
208 if (file_exists($log_file_conf)) {
209 if (($log_level_raw = file_get_contents($log_file_conf)) !== false) {
210 $log_level_raw = trim($log_level_raw);
211 $log_level_regex = '/^'.implode('|', array_keys($this->log_levels)).'$/';
212 if (preg_match($log_level_regex, $log_level_raw)) {
213 $this->log_level = $this->log_levels[$log_level_raw];
214 } else {
215 $this->addToLog(__METHOD__."(): invalid log level '$log_level_raw' in ".
216 "'$log_file_conf'", DEBUG_MODE);
217 }
218 }
219 }
220
221
222 parent::__construct($flag, $right, $title);
223
224 // démarrage d'une session même en 'anonyme', requis pour l'authentification OpenID
225 if ($this->flag == 'anonym') {
226 session_name($this->get_session_name());
227 @session_start();
228 }
229
230 $this->module_manager = new module_manager($this);
231
232 $this->extra_data_store = new extra_data_store_2_tables($this);
233 }
234
235 /**
236 * Log un message en lui ajoutant un préfixe.
237 *
238 * @param string $method La méthode d'où provient le message (càd: __METHOD__)
239 * @param string $message Le message à écire dans le ficheir de logs
240 * @param string $level Le niveau de log
241 * @param string $filename Le nom du fichier de log
242 *
243 * @return void
244 */
245 public function log(string $method, string $message, string $level = 'DEBUG',
246 string $filename = 'debug', int $method_max_len = 52) {
247 if (! isset($this->log_levels[$level])) {
248 $this->addToLog(__METHOD__."(): invalid log level '$level'", DEBUG_MODE);
249 return;
250 }
251 if ($this->log_levels[$level] > $this->log_level) {
252 return;
253 }
254
255 $log_dir = dirname(__DIR__).'/var/log';
256 $log_file = $filename.'.log';
257 $log_path = "$log_dir/$log_file";
258
259 $method_len = $method_max_len;
260 $method_short = $method;
261 if (strlen($method_short) > ($method_len - 1)) {
262 $method_short = substr($method_short, 0, $method_len - 1).'…';
263 }
264
265 $now = date('Y-m-d H:i:s');
266
267 $prefix = sprintf("%20s %-10s %-${method_len}s ", $now, $level, $method_short);
268 foreach(explode("\n", $message) as $line) {
269 file_put_contents($log_path, $prefix.$line.PHP_EOL, FILE_APPEND);
270 }
271 }
272
273 // {{{
274
275 /**
276 * SURCHARGE DE LA CLASSE OM_APPLICATION.
277 *
278 * @see Documentation sur la méthode parent 'om_application:getCollectivite'.
279 */
280 function getCollectivite($om_collectivite_idx = null) {
281 // On vérifie si une valeur a été passée en paramètre ou non.
282 if ($om_collectivite_idx === null) {
283 // Cas d'utilisation n°1 : nous sommes dans le cas où on
284 // veut récupérer les informations de la collectivité de
285 // l'utilisateur et on stocke l'info dans un flag.
286 $is_get_collectivite_from_user = true;
287 // On initialise l'identifiant de la collectivité
288 // à partir de la variable de session de l'utilisateur.
289 $om_collectivite_idx = $_SESSION['collectivite'];
290 } else {
291 // Cas d'utilisation n°2 : nous sommes dans le cas où on
292 // veut récupérer les informations de la collectivité
293 // passée en paramètre et on stocke l'info dans le flag.
294 $is_get_collectivite_from_user = false;
295 }
296
297
298 if (array_key_exists($om_collectivite_idx, $this->collectivitiesParameters) === false
299 || empty($this->collectivitiesParameters[$om_collectivite_idx]) === true) {
300 $collectivite_parameters = parent::getCollectivite($om_collectivite_idx);
301
302 //// BEGIN - SURCHARGE OPENADS
303
304 // Ajout du paramétrage du sig pour la collectivité
305 if (file_exists("../dyn/var.inc")) {
306 include "../dyn/var.inc";
307 }
308 if (file_exists("../dyn/sig.inc.php")) {
309 include "../dyn/sig.inc.php";
310 }
311 if (!isset($sig_externe)) {
312 $sig_externe = "sig-default";
313 }
314 $idx_multi = $this->get_idx_collectivite_multi();
315
316 if (isset($collectivite_parameters['om_collectivite_idx'])
317 && isset($conf[$sig_externe][$collectivite_parameters['om_collectivite_idx']])
318 && isset($conf[$sig_externe]["sig_treatment_mod"])
319 && isset($collectivite_parameters["option_sig"])
320 && $collectivite_parameters["option_sig"] == "sig_externe") {
321 // Cas numéro 1 : conf sig définie sur la collectivité et option sig active
322 $collectivite_parameters["sig"] = $conf[$sig_externe][$collectivite_parameters['om_collectivite_idx']];
323 $collectivite_parameters["sig"]["sig_treatment_mod"] = $conf[$sig_externe]["sig_treatment_mod"];
324 } elseif ($idx_multi != ''
325 && isset($conf[$sig_externe][$idx_multi])
326 && isset($conf[$sig_externe]["sig_treatment_mod"])
327 && isset($collectivite_parameters["option_sig"])
328 && $collectivite_parameters["option_sig"] == "sig_externe") {
329 // Cas numéro : conf sig définie sur la collectivité multi et option_sig activé pour la collectivité mono
330 $collectivite_parameters["sig"] = $conf[$sig_externe][$idx_multi];
331 $collectivite_parameters["sig"]["sig_treatment_mod"] = $conf[$sig_externe]["sig_treatment_mod"];
332 }
333
334 //// END - SURCHARGE OPENADS
335
336 // Si on se trouve dans le cas d'utilisation n°1
337 if ($is_get_collectivite_from_user === true) {
338 // Alors on stocke dans l'attribut collectivite le tableau de
339 // paramètres pour utilisation depuis la méthode 'getParameter'.
340 $this->collectivite = $collectivite_parameters;
341 }
342 // On stocke le tableau de paramètres.
343 $this->collectivitiesParameters[$om_collectivite_idx] = $collectivite_parameters;
344 }
345 // Renvoie la liste des paramètres de la collectivité voulue
346 return $this->collectivitiesParameters[$om_collectivite_idx];
347 }
348
349 /**
350 * Affiche un bloc d'information.
351 *
352 * @param string $class Classe CSS.
353 * @param string $message Message à afficher.
354 *
355 * @return void
356 */
357 function display_panel_information($class = "", $message = "", $tableau=null, $legend=null, $id_suffixe='') {
358 if (!defined('REST_REQUEST')) {
359 if ($tableau !== null) {
360 $message .= '<fieldset id="fieldset-message-tab_'.$id_suffixe.'" class="cadre ui-corner-all ui-widget-content startClosed collapsed">';
361 $message .= '<legend class="ui-corner-all ui-widget-content ui-state-active">'.$legend.'</legend>';
362 $message .= '<div id="fieldset-message-tab-content" class="fieldsetContent" style="display: none;">';
363 $message .= '<ul>';
364 foreach ($tableau as $value) {
365 $message .= "<li>".$value."</li>";
366 }
367 $message .= '</ul>';
368 $message .= '</div>';
369 $message .= '</fieldset>';
370 }
371 //
372 if ($class == "ok") {
373 $class = "valid";
374 }
375 //
376 echo "\n<div class=\"panel_information ui-widget ui-corner-all ui-state-highlight ui-state-".$class."\">\n";
377 echo "<p>\n";
378 echo "\t<span class=\"ui-icon ui-icon-info\"><!-- --></span> \n\t";
379 echo "<span class=\"text\">";
380 echo $message;
381 echo "</span>";
382 echo "\n</p>\n";
383 echo "</div>\n";
384 }
385 }
386
387 /**
388 * Récupère toutes les collectivités ayant le niveau passé en
389 * paramètre. Si le niveau n'est pas donné ou que ce n'est pas
390 * un nombre renvoi une chaine vide.
391 *
392 * @param integer niveau de la collectivite
393 * @return string
394 */
395 protected function get_collectivite_par_niveau($niveau) {
396 if (empty($niveau) || ! is_numeric($niveau)) {
397 return '';
398 }
399 $qres = $this->get_one_result_from_db_query(
400 sprintf(
401 'SELECT
402 om_collectivite
403 FROM
404 %1$som_collectivite
405 WHERE
406 niveau = \'%2$d\'',
407 DB_PREFIXE,
408 intval($niveau)
409 ),
410 array(
411 "origin" => __METHOD__,
412 )
413 );
414 return $qres['result'];
415 }
416
417 /**
418 * Permet de savoir si le type de document numérisé est de catégorie Plat'AU
419 * ou pas.
420 *
421 * @return boolean true : Plat'AU, false : pas Plat'AU
422 */
423 public function is_categorie_platau($obj, $object_id, $val) {
424 // Récupération de la catégorie de document numérisé pour savoir si
425 // c'est un document de catégorie PLATAU
426 $categorie = $this->get_inst__om_dbform(array(
427 'obj' => $obj,
428 'idx' => $object_id
429 ));
430 return $categorie->getVal($val) == CODE_CATEGORIE_DOC_NUM_PLATAU;
431 }
432
433
434 /**
435 *
436 * @return string
437 */
438 function get_id_document_type_categorie_platau() {
439 //
440 $qres = $this->get_one_result_from_db_query(
441 sprintf(
442 'SELECT
443 document_type_categorie.document_type_categorie,
444 document_type_categorie.libelle
445 FROM
446 %1$sdocument_type_categorie
447 WHERE
448 document_type_categorie.code = \'%2$s\'',
449 DB_PREFIXE,
450 CODE_CATEGORIE_DOC_NUM_PLATAU
451 ),
452 array(
453 'origin' => __METHOD__
454 )
455 );
456 //
457 return $qres['result'];
458 }
459
460
461 /**
462 * Retourne l'identifiant de la collectivité multi ou l'identifiant de la
463 * seule collectivité dans le cas d'une installation mono.
464 *
465 * @return integer Identifiant de la collectivité multi.
466 */
467 public function get_idx_collectivite_multi() {
468 // Récupère l'identifiant de la collectivité de niveau 2
469 $idx = $this->get_collectivite_par_niveau(2);
470 // S'il n'y a pas de collectivité de niveau 2
471 if ($idx == null || $idx == '') {
472 // Compte le nombre de collectivité
473 $qres = $this->get_one_result_from_db_query(
474 sprintf(
475 'SELECT
476 count(om_collectivite)
477 FROM
478 %1$som_collectivite',
479 DB_PREFIXE
480 ),
481 array(
482 "origin" => __METHOD__,
483 )
484 );
485 $count = $qres["result"];
486 // S'il y qu'une collectivité
487 if ($count == 1) {
488 // Récupère l'identifiant de la seule collectivité
489 $idx = $this->get_collectivite_par_niveau(1);
490 }
491 }
492 // Retourne l'identifiant
493 return $idx;
494 }
495
496
497 /**
498 * Retourne l'identifiant de la collectivité de l'element de la table passée
499 * en paramètre.
500 *
501 * @param string $table Table de l'element.
502 * @param mixed $id Identifiant de l'element.
503 *
504 * @return string identifiant de la collectivite ou false si l'element n'existe pas.
505 */
506 public function get_collectivite_of_element($table, $id) {
507 $instance = $this->get_inst__om_dbform(array(
508 "obj" => $table,
509 "idx" => $id,
510 ));
511 if($instance->getVal($instance->clePrimaire) != '') {
512 return $instance->getVal('om_collectivite');
513 }
514 return false;
515 }
516
517
518 /**
519 * Retourne vrai si la collectivité passée en paramètre ou la collectivité
520 * de l'utilisateur connecté est mono.
521 *
522 * @param string $id Identifiant de la collectivité.
523 *
524 * @return boolean
525 */
526 public function isCollectiviteMono($id = null) {
527 // Si on ne passe pas de collectivité en argument
528 if ($id == null) {
529 // On vérifie la collectivité stockée en session de l'utilisateur
530 // connecté
531 $res = false;
532 if ($_SESSION['niveau'] === '1') {
533 //
534 $res = true;
535 }
536 //
537 return $res;
538 }
539
540 $inst_om_collectivite = $this->get_inst__om_dbform(array(
541 "obj" => "om_collectivite",
542 "idx" => $id,
543 ));
544 if ($inst_om_collectivite->getVal("niveau") === '1') {
545 //
546 return true;
547 }
548 //
549 return false;
550 }
551
552 // }}}
553
554 // {{{
555
556 var $om_utilisateur = array();
557 var $user_is_instr = NULL;
558 var $user_is_service = NULL;
559 public $user_is_tiers = NULL;
560 var $user_is_admin = NULL;
561 var $user_is_service_ext = NULL;
562 var $user_is_qualificateur = NULL;
563 var $user_is_chef = NULL;
564 var $user_is_divisionnaire = NULL;
565 var $user_is_service_int = NULL;
566
567 /**
568 * Méthode de récupération des informations de l'utilisateur connecté.
569 */
570 function getUserInfos() {
571
572 // Si l'utilisateur est loggé $_SESSION existe
573 if(isset($_SESSION['login']) && !empty($_SESSION['login'])) {
574
575 // Récupération des infos utilisateur
576 $qres = $this->get_all_results_from_db_query(
577 sprintf('
578 SELECT
579 om_utilisateur,
580 nom,
581 email,
582 login,
583 om_collectivite,
584 om_profil
585 FROM
586 %1$som_utilisateur
587 WHERE
588 login = \'%2$s\' ',
589 DB_PREFIXE,
590 $_SESSION['login']
591 ),
592 array(
593 "origin" => __METHOD__,
594 )
595 );
596
597 // On ne récupère que la 1ere ligne
598 $this->om_utilisateur = array_shift($qres['result']);
599
600 // Récupère le profil et test si c'est un
601 $inst_om_profil = $this->get_inst__om_dbform(array(
602 "obj" => "om_profil",
603 "idx" => $this->om_utilisateur['om_profil'],
604 ));
605 $resProfil = $inst_om_profil->getVal("libelle");
606 // Sauvegarde le libelle du profil
607 $this->om_utilisateur["libelle_profil"] = $resProfil;
608
609 // si c'est un administrateur technique
610 // XXX Mauvaise méthode, il faut utiliser isAccredited
611 if ($resProfil == "ADMINISTRATEUR TECHNIQUE"
612 || $resProfil == "ADMINISTRATEUR FONCTIONNEL") {
613 $this->user_is_admin = true;
614 } else {
615 $this->user_is_admin = false;
616 }
617
618 //si c'est un service externe
619 if ($resProfil == "SERVICE CONSULTÉ") {
620 $this->user_is_service_ext = true;
621 } else {
622 $this->user_is_service_ext = false;
623 }
624
625 //si c'est un service interne
626 if ($resProfil == "SERVICE CONSULTÉ INTERNE") {
627 $this->user_is_service_int = true;
628 } else {
629 $this->user_is_service_int = false;
630 }
631
632 // si c'est un qualificateur
633 if ($resProfil == "QUALIFICATEUR") {
634 $this->user_is_qualificateur = true;
635 } else {
636 $this->user_is_qualificateur = false;
637 }
638
639 // si c'est un chef de service
640 if ($resProfil == "CHEF DE SERVICE") {
641 $this->user_is_chef = true;
642 } else {
643 $this->user_is_chef = false;
644 }
645
646 // si c'est un divisionnaire
647 if ($resProfil == "DIVISIONNAIRE") {
648 $this->user_is_divisionnaire = true;
649 } else {
650 $this->user_is_divisionnaire = false;
651 }
652
653 // Récupération des infos instructeur
654 $qres = $this->get_all_results_from_db_query(
655 sprintf('
656 SELECT
657 instructeur.instructeur,
658 instructeur.nom,
659 instructeur.telephone,
660 division.division,
661 division.code,
662 division.libelle
663 FROM
664 %1$sinstructeur
665 INNER JOIN %1$sdivision
666 ON division.division=instructeur.division
667 WHERE
668 instructeur.om_utilisateur = %2$d ',
669 DB_PREFIXE,
670 intval($this->om_utilisateur['om_utilisateur'])
671 ),
672 array(
673 "origin" => __METHOD__,
674 )
675 );
676
677 // Si pas de résultat, initialisé à NULL
678 // Comme le comportement de la requête qui va être remplacé
679 // On ne récupère que la 1ere ligne
680 $tempInstr= (!empty($qres['result'])) ? array_shift($qres['result']) : NULL;
681
682 // Si il y a un resultat c'est un instructeur
683 if (is_array($tempInstr) === true && count($tempInstr) > 0) {
684 $this->user_is_instr=true;
685 $this->om_utilisateur = array_merge($this->om_utilisateur,$tempInstr);
686 } else {
687 $this->user_is_instr=false;
688 }
689
690 // Récupération des infos de services consultés
691 $qres = $this->get_all_results_from_db_query(
692 sprintf('
693 SELECT
694 service.service,
695 service.abrege,
696 service.libelle
697 FROM
698 %1$sservice
699 INNER JOIN %1$slien_service_om_utilisateur
700 ON lien_service_om_utilisateur.service=service.service
701 WHERE
702 lien_service_om_utilisateur.om_utilisateur = %2$d',
703 DB_PREFIXE,
704 intval($this->om_utilisateur['om_utilisateur'])
705 ),
706 array(
707 "origin" => __METHOD__,
708 )
709 );
710
711 foreach ($qres['result'] as $result) {
712 $this->om_utilisateur['service'][]=$result;
713 }
714
715 // Si il y a un resultat c'est un utilisateur de service
716 if(isset($this->om_utilisateur['service'])) {
717 $this->user_is_service=true;
718 } else {
719 $this->user_is_service=false;
720 }
721
722
723 // Récupération des infos de tiers consultés
724 $qres = $this->get_all_results_from_db_query(
725 sprintf('
726 SELECT
727 tiers_consulte.tiers_consulte,
728 tiers_consulte.abrege,
729 tiers_consulte.libelle
730 FROM
731 %1$slien_om_utilisateur_tiers_consulte
732 INNER JOIN %1$stiers_consulte
733 ON lien_om_utilisateur_tiers_consulte.tiers_consulte=tiers_consulte.tiers_consulte
734 WHERE
735 lien_om_utilisateur_tiers_consulte.om_utilisateur = %2$d',
736 DB_PREFIXE,
737 intval($this->om_utilisateur['om_utilisateur'])
738 ),
739 array(
740 "origin" => __METHOD__,
741 )
742 );
743
744 foreach ($qres['result'] as $result) {
745 $this->om_utilisateur['tiers'][]=$result;
746 }
747
748 // Si il y a un resultat c'est un utilisateur de tiers
749 $this->user_is_tiers = false;
750 if (isset($this->om_utilisateur['tiers'])) {
751 $this->user_is_tiers = true;
752 }
753 }
754 }
755
756 /**
757 * getter user_is_service
758 */
759 function isUserService() {
760 if (is_null($this->user_is_service)) {
761 $this->getUserInfos();
762 }
763 return $this->user_is_service;
764 }
765
766 /**
767 * getter user_is_tiers
768 */
769 function isUserTiers() {
770 if (is_null($this->user_is_tiers)) {
771 $this->getUserInfos();
772 }
773 return $this->user_is_tiers;
774 }
775
776 /**
777 * getter user_is_instr
778 */
779 function isUserInstructeur() {
780 if (is_null($this->user_is_instr)) {
781 $this->getUserInfos();
782 }
783 return $this->user_is_instr;
784 }
785
786 function isUserAdministrateur() {
787 if (is_null($this->user_is_admin)) {
788 $this->getUserInfos();
789 }
790 return $this->user_is_admin;
791 }
792
793 /**
794 * getter user_is_service_ext
795 */
796 function isUserServiceExt() {
797 if (is_null($this->user_is_service_ext)) {
798 $this->getUserInfos();
799 }
800 return $this->user_is_service_ext;
801 }
802
803 /**
804 * getter user_is_service_int
805 */
806 function isUserServiceInt() {
807 if (is_null($this->user_is_service_int)) {
808 $this->getUserInfos();
809 }
810 return $this->user_is_service_int;
811 }
812
813 /**
814 * getter user_is_qualificateur
815 */
816 function isUserQualificateur() {
817 if (is_null($this->user_is_qualificateur)) {
818 $this->getUserInfos();
819 }
820 return $this->user_is_qualificateur;
821 }
822
823 /**
824 * getter user_is_chef
825 */
826 function isUserChef() {
827 if (is_null($this->user_is_chef)) {
828 $this->getUserInfos();
829 }
830 return $this->user_is_chef;
831 }
832
833 /**
834 * getter user_is_divisionnaire
835 */
836 function isUserDivisionnaire() {
837 if (is_null($this->user_is_divisionnaire)) {
838 $this->getUserInfos();
839 }
840 return $this->user_is_divisionnaire;
841 }
842
843 /**
844 * Méthode permettant de définir si l'utilisateur connecté peut ajouter un
845 * événement d'instruction
846 *
847 * @param integer $idx identifiant du dossier
848 * @param string $obj objet
849 *
850 * @return boolean true si il peut false sinon
851 */
852 function isUserCanAddObj($idx, $obj) {
853 // Si il à le droit "bypass" il peut ajouter
854 if($this->isAccredited($obj."_ajouter_bypass") === true) {
855 return true;
856 }
857 if($this->isAccredited(array($obj."_ajouter", $obj), "OR") === false) {
858 return false;
859 }
860 $return = false;
861
862 $object_instance = $this->get_inst__om_dbform(array(
863 "obj" => $obj,
864 "idx" => "]",
865 ));
866 // Si il n'est pas dans la même division on défini le retour comme faux
867 // à moins qu'il ai un droit de changement de decision
868 if($this->isUserInstructeur() === true &&
869 ($object_instance->getDivisionFromDossier($idx) == $_SESSION["division"] ||
870 ($obj == "instruction" &&
871 $object_instance->isInstrCanChangeDecision($idx) === true))) {
872
873 $return = true;
874 }
875
876 return $return;
877 }
878
879
880 /**
881 * Ajout de variables de session contenant la division pour permettre une
882 * utilisation plus efficace dans les requetes.
883 *
884 * @param array $utilisateur Tableau d'informations de l'utilisateur.
885 */
886 function triggerAfterLogin($utilisateur = NULL) {
887
888 // Récupération de la division de l'utilisateur.
889 $qres = $this->get_all_results_from_db_query(
890 sprintf('
891 SELECT
892 instructeur.division,
893 division.code
894 FROM
895 %1$sinstructeur
896 LEFT JOIN %1$sdivision
897 ON instructeur.division = division.division
898 WHERE
899 instructeur.om_utilisateur= %2$d ',
900 DB_PREFIXE,
901 intval($utilisateur["om_utilisateur"])
902 ),
903 array(
904 "origin" => __METHOD__,
905 )
906 );
907
908 // On ne récupère que la 1ere ligne
909 $row = array_shift($qres['result']);
910
911 // Enregistrement de la division en session
912 if (isset($row["division"]) && $row["division"] != NULL) {
913 $_SESSION["division"] = $row["division"];
914 $_SESSION["division_code"] = $row["code"];
915 } else {
916 $_SESSION["division"] = "0";
917 $_SESSION["division_code"] = "";
918 }
919
920 // Récupération du paramétrage des groupes de l'utilisateur
921 $qres = $this->get_all_results_from_db_query(
922 sprintf('
923 SELECT
924 groupe.code,
925 lien_om_utilisateur_groupe.confidentiel,
926 lien_om_utilisateur_groupe.enregistrement_demande,
927 groupe.libelle
928 FROM
929 %1$sgroupe
930 RIGHT JOIN %1$slien_om_utilisateur_groupe
931 ON lien_om_utilisateur_groupe.groupe = groupe.groupe
932 WHERE
933 lien_om_utilisateur_groupe.login = \'%2$s\'
934 ORDER BY
935 libelle',
936 DB_PREFIXE,
937 $this->db->escapeSimple($utilisateur["login"])
938 ),
939 array(
940 "origin" => __METHOD__,
941 )
942 );
943
944 $resGroupes=$qres['result'];
945
946 // Si aucun résultat alors récupération du paramétrage des groupes du profil
947 if (count($resGroupes) === 0) {
948
949 $qres = $this->get_all_results_from_db_query(
950 sprintf(
951 'SELECT
952 groupe.code,
953 lien_om_profil_groupe.confidentiel,
954 lien_om_profil_groupe.enregistrement_demande,
955 groupe.libelle
956 FROM
957 %1$sgroupe
958 RIGHT JOIN %1$slien_om_profil_groupe
959 ON lien_om_profil_groupe.groupe = groupe.groupe
960 AND
961 om_profil = %2$s
962 ORDER BY
963 libelle',
964 DB_PREFIXE,
965 $this->db->escapeSimple($utilisateur["om_profil"])
966 ),
967 array(
968 "origin" => __METHOD__,
969 )
970 );
971
972 $resGroupes = $qres['result'];
973 }
974 $_SESSION["groupe"] = array();
975 // Enregistrement des groupe en session
976 foreach ($resGroupes as $result) {
977 // $resGroupes=$result;
978 if ($result["confidentiel"] === 't') {
979 $result["confidentiel"] = true;
980 } else {
981 $result["confidentiel"] = false;
982 }
983 if ($result["enregistrement_demande"] === 't') {
984 $result["enregistrement_demande"] = true;
985 } else {
986 $result["enregistrement_demande"] = false;
987 }
988 $_SESSION["groupe"][$result["code"]] = array(
989 "confidentiel" => $result["confidentiel"],
990 "enregistrement_demande" => $result["enregistrement_demande"],
991 "libelle" => $result["libelle"],
992 );
993 }
994 }
995
996 // Affichage des actions supplémentaires
997 function displayActionExtras() {
998 // Affichage de la division si l'utilisateur en possède une
999 if ($_SESSION["division"] != 0) {
1000 echo "\t\t\t<li class=\"action-division\">";
1001 echo "(".$_SESSION['division_code'].")";
1002 echo "</li>\n";
1003 }
1004 }
1005
1006 /**
1007 * SURCHARGE
1008 *
1009 * Compose la liste des liens à afficher dans la section 'actions'.
1010 *
1011 * Cette méthode retourne la liste des liens disponibles pour l'utilisateur
1012 * connecté dans le contexte actuel.
1013 *
1014 * @return array
1015 */
1016 function getActionsToDisplay() {
1017 $actions_to_display = array();
1018 if ($this->authenticated == false) {
1019 return $actions_to_display;
1020 }
1021 // Récupère les actions
1022 $actions = parent::getActionsToDisplay();
1023 $change_linked_users = array(
1024 "title" => __("Utilisateurs liés"),
1025 "description" => __("Utilisateurs liés"),
1026 "href" => "../app/change_linked_users.php",
1027 "class" => "action-change_linked_users",
1028 );
1029 array_unshift($actions, $change_linked_users);
1030 return $actions;
1031 }
1032
1033 /**
1034 * Authentifie un utilisateur à partir de son login.
1035 *
1036 * @param string $login Login de l'utilisateur
1037 * @param string $password Mot de passe de l'utilisateur
1038 * @param bool $linked_user_mode 'true' pour forcer le mode "utilisateur lié"
1039 *
1040 * @return array format: (bool authenticated, string message, array data)
1041 */
1042 protected function authenticate_with_login(string $login, string $password, bool $linked_user_mode = false) {
1043 $this->log(__METHOD__, "authenticating '$login' ...", 'DEBUG', 'auth');
1044
1045 // recupere le mode d'authenfication de l'utilisateur
1046 $mode = $this->retrieve_user_authentication_mode($login, $linked_user_mode);
1047
1048 // utilisateur non présent en BDD
1049 if (empty($mode)) {
1050 return array(false, sprintf(
1051 __("L'utilisateur <em>%s</em> n'est pas présent dans la base de données."),
1052 $login),
1053 array());
1054 }
1055
1056 // mode linked
1057 if ($mode == 'linked' && ! $linked_user_mode) {
1058 return array(false, __("Les utilisateurs liés ne peuvent s'authentifier."), array());
1059 }
1060
1061 // instancie "l'authentifieur"
1062 $authenticator = $this->get_authenticator_instance($mode);
1063
1064 // authentifie l'utilisateur
1065 $authentication = $authenticator->authenticate(array(
1066 'login' => $login, 'password' => $password));
1067 $this->log(__METHOD__, "authentification: ".var_export($authentication, true), 'DEBUG', 'auth');
1068
1069 // retourne
1070 return $authentication;
1071 }
1072
1073 /**
1074 * Authentifie un utilisateur via un service tiers (sans renseigner de login côté openADS).
1075 * Pour l'instant, seul OpenID Connect est supporté.
1076 *
1077 * @return array format: (bool authenticated, string message, array data)
1078 */
1079 protected function authenticate_without_login() {
1080
1081 // instancie "l'authentifieur"
1082 $authenticator = $this->get_authenticator_instance('openid');
1083
1084 // authentifie l'utilisateur
1085 $authentication = $authenticator->authenticate(array());
1086 $this->log(__METHOD__, "authentification: ".var_export($authentication, true), 'DEBUG', 'auth');
1087
1088 // retourne
1089 return $authentication;
1090 }
1091
1092 /**
1093 * Renvoi une instance d'authenticator spécifiée.
1094 *
1095 * @param string $name
1096 *
1097 * @return authenticator
1098 */
1099 protected function get_authenticator_instance($name) {
1100
1101 // construit le nom et le chemin de la class "authentifieur"
1102 $authenticator_classname = 'authenticator_'.$name;
1103 switch ($name) {
1104 case 'db': $authenticator_classname = 'authenticator_database'; break;
1105 }
1106 $authenticator_classpath = __DIR__."/$authenticator_classname.class.php";
1107 if (! is_file($authenticator_classpath)) {
1108 throw new RuntimeException("Invalid authenticator '$authenticator_classname' provided.");
1109 }
1110
1111 // instancie "l'authentifieur"
1112 require_once $authenticator_classpath;
1113 $authenticator = new $authenticator_classname($this);
1114
1115 return $authenticator;
1116 }
1117
1118 /**
1119 * Cette methode permet d'effectuer toutes les verifications et les
1120 * traitements necessaires pour la gestion de l'authentification des
1121 * utilisateurs a l'application.
1122 *
1123 * @return void
1124 */
1125 function login() {
1126 // Initialisation des paramètres
1127 $params = array(
1128 "came_from" => array(
1129 "method" => array("post", ),
1130 "default_value" => "",
1131 ),
1132 );
1133 foreach ($this->get_initialized_parameters($params) as $key => $value) {
1134 ${$key} = $value;
1135 }
1136 $this->came_from = $came_from;
1137
1138 // Debug
1139 $this->log(__METHOD__, "start", 'DEBUG', 'auth');
1140 $this->redirect_authenticated_users();
1141 // Si l'utilisateur ne souhaite pas s'authentifier (le cas se presente
1142 // si nous sommes sur la page de login et que l'utilisateur n'a pas
1143 // valider le formulaire) alors on sort de la methode
1144 if ($this->wantToAuthenticate() != true) {
1145 // Logger
1146 $this->log(__METHOD__, "end (don't wantToAuthenticate)", 'DEBUG', 'auth');
1147 return;
1148 }
1149 // Si la valeur du champ coll dans le formulaire de login est definie
1150 if ($this->get_submitted_post_value("coll") !== null) {
1151 // On ajoute en variable de session la cle du tableau associatif de
1152 // configuration de base de donnees a laquelle l'utilisateur
1153 // souhaite se connecter
1154 $_SESSION['coll'] = $this->get_submitted_post_value("coll");
1155 $this->log(__METHOD__, "\$_SESSION['coll']=\"".$_SESSION['coll']."\"", 'DEBUG', 'auth');
1156 }
1157 // On se connecte a la base de donnees
1158 $this->connectDatabase();
1159 // On recupere le login et le mot de passe de l'utilisateur qui
1160 // demande l'authentification
1161 $login = $this->getUserLogin() ?? '';
1162 $password = $this->getUserPassword() ?? '';
1163
1164 // login vide ?
1165 if (isset($_POST['login']) && empty($_POST['login'])) {
1166 $this->log(__METHOD__,
1167 "login vide: ".var_export($_POST['login'], true),
1168 'ERROR', 'auth');
1169 $this->addToMessage('error', __("Login vide."));
1170 return;
1171 }
1172
1173 // sélectionne une méthode d'authentification:
1174 // - par défaut et si on a un login posté: authenfication avec login/password
1175 // - pas de login posté: via le retour d'un service tiers (type OpenID/OAuth)
1176 $auth_method = 'authenticate_with_login';
1177 $auth_args = array($login, $password);
1178 if (isset($_REQUEST['auth_sso']) && $_REQUEST['auth_sso'] = 'true') {
1179 $auth_method = 'authenticate_without_login';
1180 $auth_args = array();
1181 }
1182
1183 // On procede a l'authentification
1184 $authentication = call_user_func_array(array($this, $auth_method), $auth_args);
1185
1186 // problème/bug
1187 if (! is_array($authentication)) {
1188 $this->log(__METHOD__,
1189 "retourn d'authentification invalide: ".var_export($authentication, true),
1190 'ERROR', 'auth');
1191 $this->addToMessage('error', __("Erreur d'authentification. Contactez votre administrateur."));
1192 return;
1193 }
1194
1195 // récupère les informations suite à l'authentification
1196 list($authenticated, $auth_msg, $auth_data) = $authentication;
1197 $this->log(__METHOD__, "authentificated: ".var_export($authenticated, true), 'DEBUG', 'auth');
1198
1199 // si dans les données d'authentification on reçoit le login, on le défini
1200 if (is_array($auth_data) && isset($auth_data['login']) && ! empty($auth_data['login'])) {
1201 $this->log(__METHOD__,
1202 "login from authentification: ".var_export($auth_data['login'], true).
1203 " (before: ".var_export($login, true).")", 'DEBUG', 'auth');
1204 $login = $auth_data['login'];
1205 }
1206
1207 // message
1208 if (is_string($auth_msg) && ! empty($auth_msg)) {
1209 $msg_class = $authenticated ? 'ok' : 'error';
1210 $this->addToMessage($msg_class, $auth_msg);
1211 }
1212
1213 // échec d'authentification
1214 if ($authenticated !== true) {
1215 return;
1216 }
1217
1218 // log les authentifications réussies
1219 if ($authenticated === true) {
1220 $this->log(__METHOD__, "auth:OK for login: ".var_export($login, true).", ".
1221 "pass: ".var_export(substr($password, 0, 3).'…', true).", ".
1222 "linked: false",
1223 'INFO', 'auth');
1224 }
1225
1226 $this->log(__METHOD__, "'$login' authenticated: ".var_export($authenticated, true), 'INFO', 'auth');
1227 $user_infos = null;
1228 if ($authenticated) {
1229 $user_infos = $this->retrieveUserProfile($login);
1230 }
1231 $this->log(__METHOD__, "user infos: ".var_export($user_infos, true), 'DEBUG', 'auth');
1232 if (isset($user_infos[$this->table_om_utilisateur_field_om_profil])) {
1233 // Identification OK
1234 $_SESSION["profil"] = $user_infos[$this->table_om_profil_field_hierarchie];
1235 $_SESSION["login"] = $user_infos[$this->table_om_utilisateur_field_login];
1236 $_SESSION["collectivite"] = $user_infos[$this->table_om_utilisateur_field_om_collectivite];
1237 $_SESSION["niveau"] = $user_infos[$this->table_om_collectivite_field_niveau];
1238 $_SESSION["justlogin"] = true;
1239 $this->triggerAfterLogin($user_infos);
1240 $class = "ok";
1241 $message = __("Votre session est maintenant ouverte.");
1242 $this->addToMessage($class, $message);
1243 $this->disconnectDatabase();
1244 if ($this->flag === "login_and_nohtml") {
1245 $this->authenticated = true;
1246 $this->setFlag("nohtml");
1247 return;
1248 }
1249 // Redirection vers le came_from si existant
1250 if ($came_from != "") {
1251 header("Location: ".urldecode($came_from));
1252 exit();
1253 } else {
1254 // Sinon on redirige vers le tableau de bord
1255 $this->goToDashboard ();
1256 }
1257 } else {
1258 $this->addToMessage('error', $this->authentication_message);
1259 }
1260 $this->log(__METHOD__, "end", 'DEBUG', 'auth');
1261 }
1262
1263 /**
1264 * Affiche le formulaire de login.
1265 *
1266 * @return void
1267 */
1268 public function displayLoginForm() {
1269 // Initialisation des paramètres
1270 $params = array(
1271 "came_from" => array(
1272 "method" => array("post", "get"),
1273 "default_value" => "",
1274 ),
1275 );
1276 foreach ($this->get_initialized_parameters($params) as $key => $value) {
1277 ${$key} = $value;
1278 }
1279 $html = "\n<div id=\"loginform\" class=\"ui-widget\">";
1280 $html .= "<div id=\"loginform_t\">";
1281 $html .= "<div id=\"loginform_l\">";
1282 $html .= "<div id=\"loginform_r\">";
1283 $html .= "<div id=\"loginform_b\">\n";
1284
1285 $html .= "<div id=\"formulaire\">\n\n";
1286 $html .= "<ul>\n";
1287 $html .= "\t<li><a href=\"#tabs-1\">".__("Identification")."</a></li>\n";
1288 $html .= "</ul>\n";
1289 $html .= "\n<div id=\"tabs-1\">\n";
1290 echo $html;
1291 $html = '';
1292
1293 $this->layout->display__form_container__begin(array(
1294 "action" => OM_ROUTE_LOGIN,
1295 "id" => "login_form",
1296 ));
1297 $validation = 0;
1298 $maj = 0;
1299 $champs = array("came_from", "login", "password");
1300 if (count($this->database) > 1) {
1301 array_push($champs, "coll");
1302 }
1303 $form = $this->get_inst__om_formulaire(array(
1304 "validation" => $validation,
1305 "maj" => $maj,
1306 "champs" => $champs,
1307 ));
1308 $form->setType("came_from", "hidden");
1309 $form->setTaille("came_from", 20);
1310 $form->setMax("came_from", 20);
1311 $form->setVal("came_from", $came_from);
1312
1313 $form->setLib("login", __("Identifiant"));
1314 $form->setType("login", "text");
1315 $form->setTaille("login", 20);
1316 $form->setMax("login", 100);
1317 $form->setVal("login", ($this->config['demo']==true?"demo":""));
1318
1319 $form->setLib("password", __("Mot de passe"));
1320 $form->setType("password", "password");
1321 $form->setTaille("password", 20);
1322 $form->setMax("password", 100);
1323 $form->setVal("password", ($this->config['demo']==true?"demo":""));
1324
1325 if (count($this->database)>1) {
1326 $form->setLib("coll", __("Base de donnees"));
1327 $form->setType("coll", "select");
1328 $contenu = array(
1329 0 => array(),
1330 1 => array(),
1331 );
1332 foreach ($this->database as $key => $coll) {
1333 array_push($contenu[0], $key);
1334 array_push($contenu[1], $coll['title']);
1335 }
1336 $form->setSelect("coll", $contenu);
1337 if (isset($_SESSION['coll'])) {
1338 $form->setVal("coll", $_SESSION['coll']);
1339 }
1340 }
1341
1342 $form->entete();
1343 $form->afficher($champs, $validation, false, false);
1344 $form->enpied();
1345
1346 $this->layout->display__form_controls_container__begin(array(
1347 "controls" => "bottom",
1348 ));
1349 $this->layout->display__form_input_submit(array(
1350 "name" => "login.action.connect",
1351 "value" => __("Se connecter"),
1352 "class" => "context boutonFormulaireLogin ui-button ui-state ui-corner-all",
1353 ));
1354 $this->layout->display__form_controls_container__end();
1355 $this->layout->display__form_container__end();
1356
1357 // Ajout du lien de redefinition de mot de passe
1358 if (isset($this->config['password_reset']) && $this->config['password_reset'] == true) {
1359 $html .= "\n\t<p class=\"link-password-reset\">\n";
1360 $html .= "\t\t<a href=\"".OM_ROUTE_PASSWORD_RESET."\">";
1361 $html .= __("Mot de passe oublie ?");
1362 $html .= "</a>\n";
1363 $html .= "\t</p>\n";
1364 }
1365
1366 // Ajout du lien qui redirige vers le tiers OpenID pour une authent' SSO (si activé)
1367 if (isset($this->config['enable_openid_login']) && $this->config['enable_openid_login']) {
1368 $openid_redirect_url = 'authenticate_with_openid.php?auth_sso=true';
1369 $html .= "\n\t<p class=\"link-sso\">\n";
1370 $html .= "\t\t<a href=\"".$openid_redirect_url."\">";
1371 $html .= __("S'identifier avec le SSO");
1372 $html .= "</a>\n";
1373 $html .= "\t</p>\n";
1374 }
1375
1376 $html .= "</div>";
1377 $html .= "</div>";
1378 $html .= "</div>";
1379 $html .= "</div>";
1380 $html .= "</div>";
1381 $html .= "</div>";
1382 $html .= "</div>\n";
1383 echo $html;
1384 }
1385
1386 /**
1387 * Redirige les utilisateurs authentifiés vers le tableau de bord.
1388 *
1389 * @param void
1390 * @return null
1391 */
1392 protected function redirect_authenticated_users() {
1393 // Si l'utilisateur est deja authentifie on le redirige sur le tableau
1394 // de bord de l'application et on sort de la methode
1395 if ($this->authenticated != false) {
1396 // Appel de la methode de redirection vers le tableau de bord
1397 $this->goToDashboard();
1398 // On retourne null
1399 return null;
1400 }
1401 return null;
1402 }
1403
1404 /**
1405 * Retourne l'etat de la demande d'authentification
1406 *
1407 * Cette methode pourra etre surchargee pour permettre d'utiliser un
1408 * systeme central d'authentification
1409 *
1410 * @return bool Etat de la demande d'authentification
1411 * @access public
1412 */
1413 public function wantToAuthenticate() {
1414 // Si l'utilisateur a valide le formulaire de login alors c'est qu'il
1415 // souhaite s'authentifier sinon l'authentification n'est pas
1416 // souhaitee
1417 $this->log(__METHOD__, "login_callback: ".var_export($this->get_submitted_get_value("login_callback"), true), 'DEBUG', 'auth');
1418 return (
1419 $this->get_submitted_post_value("login_action_connect") !== null
1420 || $this->get_submitted_get_value("login_callback") === 'true');
1421 }
1422
1423 /**
1424 * Cette methode permet d'effectuer toutes les verifications et les
1425 * traitements necessaires pour la gestion de l'authentification des
1426 * utilisateurs liés.
1427 *
1428 * Est un dérivé de la méthode om_application.login()
1429 *
1430 * @return void
1431 */
1432 function login_linked_users() {
1433 // Initialisation des paramètres
1434 $params = array(
1435 "came_from" => array(
1436 "method" => array("post", ),
1437 "default_value" => "",
1438 ),
1439 );
1440 foreach ($this->get_initialized_parameters($params) as $key => $value) {
1441 ${$key} = $value;
1442 }
1443 $this->came_from = $came_from;
1444
1445 $this->log(__METHOD__, "start", 'DEBUG', 'auth');
1446 // Si l'utilisateur ne souhaite pas s'authentifier (le cas se presente
1447 // si nous sommes sur la page de login et que l'utilisateur n'a pas
1448 // valider le formulaire) alors on sort de la methode
1449 if ($this->wantToAuthenticate() != true) {
1450 $this->log(__METHOD__, "end (don't wantToAuthenticate)", 'DEBUG', 'auth');
1451 return;
1452 }
1453 // On recupere le login et le mot de passe de l'utilisateur qui
1454 // demande l'authentification
1455 $login = $this->getUserLogin();
1456 $password = $this->getUserPassword();
1457
1458 // On procede a l'authentification
1459 $authentication = $this->authenticate_with_login($login, $password, true /* linked mode */);
1460
1461 // problème/bug
1462 if (! is_array($authentication)) {
1463 $this->log(__METHOD__,
1464 "retourn d'authentification invalide: ".var_export($authentication, true),
1465 'ERROR', 'auth');
1466 $this->addToMessage('error', __("Erreur d'authentification. Contactez votre administrateur."));
1467 return;
1468 }
1469
1470 // récupère les informations suite à l'authentification
1471 list($authenticated, $auth_msg, $auth_data) = $authentication;
1472 $this->log(__METHOD__, "authentificated: ".var_export($authenticated, true), 'DEBUG', 'auth');
1473
1474 // message
1475 if (is_string($auth_msg) && ! empty($auth_msg)) {
1476 $msg_class = $authenticated ? 'ok' : 'error';
1477 $this->addToMessage($msg_class, $auth_msg);
1478 }
1479
1480 // échec d'authentification
1481 if ($authenticated !== true) {
1482 return;
1483 }
1484
1485 // log les authentifications réussies
1486 if ($authenticated === true) {
1487 $this->log(__METHOD__, "auth:OK for login: ".var_export($login, true).", ".
1488 "pass: ".var_export(substr($password, 0, 3).'…', true).", ".
1489 "linked: true",
1490 'INFO', 'auth');
1491 }
1492
1493 $this->log(__METHOD__, "'$login' authenticated: ".var_export($authenticated, true), 'INFO', 'auth');
1494 if ($authenticated) {
1495 $user_infos = $this->retrieveUserProfile($login);
1496 }
1497 $this->log(__METHOD__, "user infos: ".var_export($user_infos, true), 'DEBUG', 'auth');
1498 if (isset($user_infos[$this->table_om_utilisateur_field_om_profil])) {
1499 // Identification OK
1500 $_SESSION["profil"] = $user_infos[$this->table_om_profil_field_hierarchie];
1501 $_SESSION["login"] = $user_infos[$this->table_om_utilisateur_field_login];
1502 $_SESSION["collectivite"] = $user_infos[$this->table_om_utilisateur_field_om_collectivite];
1503 $_SESSION["niveau"] = $user_infos[$this->table_om_collectivite_field_niveau];
1504 $_SESSION["justlogin"] = true;
1505 $this->triggerAfterLogin($user_infos);
1506 // Gestion des sessions spécifiques
1507 unset($_SESSION['dossiers_consulte']);
1508 $class = "ok";
1509 $message = __("Votre session est maintenant ouverte.");
1510 $this->addToMessage($class, $message);
1511 //
1512 // $this->disconnectDatabase();
1513 //
1514 if ($this->flag === "login_and_nohtml") {
1515 $this->authenticated = true;
1516 $this->setFlag("nohtml");
1517 return;
1518 }
1519 // Redirection vers le came_from si existant
1520 if ($came_from != "") {
1521 header("Location: ".urldecode($came_from));
1522 exit();
1523 } else {
1524 // Sinon on redirige vers le tableau de bord
1525 $this->goToDashboard ();
1526 }
1527 } else {
1528 $this->addToMessage('error', $this->authentication_message);
1529 }
1530 $this->log(__METHOD__, "end", 'DEBUG', 'auth');
1531 }
1532
1533 /**
1534 * Recuperation du mode d'authentification de l'utilisateur
1535 *
1536 * @param string $login Identifiant de l'utilisateur
1537 * @return string Mode d'authentification de l'utilisateur
1538 */
1539 public function retrieve_user_authentication_mode(string $login, bool $linked_user_mode) {
1540 $mode = parent::retrieveUserAuthenticationMode($login);
1541 $mode = is_string($mode) ? strtolower($mode) : '';
1542 $this->log(__METHOD__, "mode d'authentification (parent): '$mode'", 'DEBUG', 'auth');
1543
1544 // force le mode 'linked' si le flag 'linked_user' a été spécifié
1545 if ($linked_user_mode && $mode != 'linked') {
1546 $this->log(__METHOD__,
1547 "'linked' mode forcé (au lieu de '$mode'), car flag 'linked_user' spéficié",
1548 'DEBUG', 'auth');
1549 $mode = 'linked';
1550 }
1551
1552 $this->log(__METHOD__, "mode d'authentification (final): '$mode'", 'DEBUG', 'auth');
1553 return $mode;
1554 }
1555
1556 // }}}
1557
1558
1559 // {{{ GESTION DES FICHIERS
1560
1561 /**
1562 *
1563 */
1564 function notExistsError ($explanation = NULL) {
1565 // message
1566 $message_class = "error";
1567 $message = __("Cette page n'existe pas.");
1568 $this->addToMessage ($message_class, $message);
1569 //
1570 $this->setFlag(NULL);
1571 $this->display();
1572
1573 //
1574 die();
1575 }
1576
1577 // }}}
1578 /**
1579 * Retourne le statut du dossier d'instruction
1580 * @param string $idx Identifiant du dossier d'instruction
1581 * @return string Le statut du dossier d'instruction
1582 */
1583 function getStatutDossier($idx){
1584 $statut = '';
1585 //Si l'identifiant du dossier d'instruction fourni est correct
1586 if ($idx != '') {
1587 //On récupère le statut de l'état du dossier à partir de l'identifiant du
1588 //dossier d'instruction
1589 $qres = $this->get_one_result_from_db_query(
1590 sprintf(
1591 'SELECT
1592 etat.statut
1593 FROM
1594 %1$sdossier
1595 LEFT JOIN %1$setat
1596 ON dossier.etat = etat.etat
1597 WHERE
1598 dossier = \'%2$s\'',
1599 DB_PREFIXE,
1600 $this->db->escapeSimple($idx)
1601 ),
1602 array(
1603 "origin" => __METHOD__,
1604 )
1605 );
1606 $statut = $qres["result"];
1607 }
1608 return $statut;
1609 }
1610
1611 /**
1612 * Formate le champ pour le type Timestamp
1613 * @param date $date_str Date
1614 * @param boolean $show Format pour l'affichage
1615 * @return mixed False si le traitement échoue ou la date formatée
1616 */
1617 function formatTimestamp ($date_str, $show = true) {
1618
1619 // Sépare la date et l'heure
1620 $date = explode(" ", $date_str);
1621 if (count($date) != 2) {
1622 return false;
1623 }
1624
1625 // Date en BDD
1626 $date_db = explode ('-', $date[0]);
1627 // Date en affichage
1628 $date_show = explode ('/', $date[0]);
1629
1630 // Contrôle la composition de la date
1631 if (count ($date_db) != 3 && count ($date_show) != 3) {
1632 return false;
1633 }
1634
1635 if (count ($date_db) == 3) {
1636 // Vérifie que c'est une date valide
1637 if (!checkdate($date_db[1], $date_db[2], $date_db[0])) {
1638 return false;
1639 }
1640 // Si c'est pour l'affichage de la date
1641 if ($show == true) {
1642 return $date_db [2]."/".$date_db [1]."/".$date_db [0]." ".$date[1];
1643 } else {
1644 return $date[0];
1645 }
1646 }
1647
1648 //
1649 if (count ($date_show) == 3) {
1650 // Vérifie que c'est une date valide
1651 if (!checkdate($date_show[1], $date_show[0], $date_show[2])) {
1652 return false;
1653 }
1654 // Si c'est pour l'affichage de la date
1655 if ($show == true) {
1656 return $date[0];
1657 } else {
1658 return $date_show [2]."-".$date_show [1]."-".$date_show [0]." ".$date[1];
1659 }
1660
1661 }
1662 return false;
1663
1664 }
1665
1666 /**
1667 * Permet de calculer la liste des parcelles à partir de la chaîne passée en paramètre
1668 * et la retourner sous forme d'un tableau associatif
1669 *
1670 * @param string $strParcelles Chaîne de la parcelles.
1671 * @param string $collectivite_idx Collectivite de la parcelle, false pour que la
1672 * collectivité ne soit pas récupérée.
1673 * @param string $dossier_id Identifiant du dossier d'instruction.
1674 *
1675 * @return array (array(prefixe, quartier, section, parcelle), ...)
1676 */
1677 function parseParcelles($strParcelles, $collectivite_idx = null, $dossier_id = null) {
1678
1679 // Séparation des lignes, après suppression de tous les espaces et retours à la ligne
1680 $references = explode(";", str_replace(array(' ', "\n", "\r", "\t", "\v", "\x00"), '',
1681 $strParcelles));
1682 $liste_parcelles = array();
1683
1684 // On boucle sur chaque ligne pour ajouter la liste des parcelles de chaque ligne
1685 foreach ($references as $parcelles) {
1686 // Si le contenu de la parcelle est vide on passe à la suite
1687 if (strval($parcelles) === ""){
1688 continue;
1689 }
1690 // Tableau des champs de la ligne de références cadastrales
1691 $reference_tab = array();
1692 // On récupère le quartier
1693 preg_match('/^[0-9]{3}/', $parcelles, $matches);
1694 if (empty($matches) === false) {
1695 $reference_tab[] = $matches[0];
1696 }
1697
1698 // Le dernier chiffre de la parcelle est soit au caractère 9 soit au caractère 8
1699 // Ceci nous permet de savoir si il y a une ou deux lettres dans la section
1700 if (substr($parcelles, 8, 1) == ''
1701 || substr($parcelles, 8, 1) == "A"
1702 || substr($parcelles, 8, 1) == "/" ) {
1703 //
1704 $only_one_letter = true;
1705 $regex_for_section = '/^[a-zA-Z]{1}/';
1706
1707 } else if ( preg_match('/^[0-9]+$/', substr($parcelles, 8, 1)) == 1 ) {
1708 $only_one_letter = false;
1709 $regex_for_section = '/^[0-9a-zA-Z]{2}/';
1710 } else {
1711 $msg = sprintf(
1712 "%sLa parcelle %s ne respectent pas le format imposé par openADS.",
1713 isset($dossier_id) === true && $dossier_id !== null ? sprintf("%s : ", $dossier_id) : '',
1714 $parcelles
1715 );
1716 $this->addToLog(__METHOD__."() : ".$msg, DEBUG_MODE);
1717 continue;
1718 }
1719
1720 // On récupère la section
1721 preg_match($regex_for_section, substr($parcelles, 3), $matches);
1722 if (empty($matches) === false) {
1723 $reference_tab[] = $matches[0];
1724 }
1725
1726 // On récupère la parcelle
1727 preg_match('/^[0-9]{4}/', substr($parcelles, $only_one_letter === true ? 4 : 5 ), $matches);
1728 if (empty($matches) === false) {
1729 $reference_tab[] = $matches[0];
1730 }
1731
1732 // On vérifie que la référence cadastrale possède au moins un séparateur
1733 if ( substr($parcelles, $only_one_letter === true ? 8 : 9 ) !== false ) {
1734 // Initialisation du tableau qui va contenir les séparateurs et les parcelles non triés
1735 $sep_parc_tab = array();
1736
1737 // On récupère les séparateurs et les parcelles dans un tableau
1738 $sep_parc_tab = preg_split('/(A)|(\/)/', substr($parcelles, $only_one_letter === true ? 8 : 9 ), -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
1739
1740 // Si le tableau est rempli on boucle sur les séparateurs + parcelles pour les ajouter dans le tableau
1741 if ( empty($sep_parc_tab) === false ) {
1742 foreach ($sep_parc_tab as $value) {
1743 $reference_tab[] = $value;
1744 }
1745 }
1746 }
1747
1748 // Vérification du format de la parcelle
1749 if (isset($reference_tab[0]) === false
1750 || isset($reference_tab[1]) === false) {
1751 //
1752 $msg = sprintf(
1753 "%sLa parcelle %s ne respectent pas le format imposé par openADS.",
1754 isset($dossier_id) === true && $dossier_id !== null ? sprintf("%s : ", $dossier_id) : '',
1755 $parcelles
1756 );
1757 $this->addToLog(__METHOD__."() : ".$msg, DEBUG_MODE);
1758 continue;
1759 }
1760
1761 // Calcul des parcelles
1762 $quartier = $reference_tab[0];
1763 $sect = $reference_tab[1];
1764
1765 $ancien_ref_parc = "";
1766 for ($i=2; $i < count($reference_tab); $i+=2) {
1767 if ($collectivite_idx !== null
1768 && $collectivite_idx !== false) {
1769 // Récupération du code impot de l'arrondissement
1770 $collectivite = $this->getCollectivite($collectivite_idx);
1771 $parc["prefixe"] = $this->get_arrondissement_code_impot($quartier);
1772 }
1773 $parc["quartier"] = $quartier;
1774 // Met en majuscule si besoin
1775 $parc["section"] = strtoupper($sect);
1776 if( $ancien_ref_parc == "" || $reference_tab[$i-1] == "/") {
1777 // 1ere parcelle ou parcelle individuelle
1778 // Compléte par des "0" le début de la chaîne si besoin
1779 $parc["parcelle"] = str_pad($reference_tab[$i], 4, "0", STR_PAD_LEFT);
1780 // Ajout d'une parcelle à la liste
1781 $liste_parcelles[] = $parc;
1782 } elseif ($reference_tab[$i-1] == "A") {
1783 // Interval de parcelles
1784 for ($j=$ancien_ref_parc+1; $j <= $reference_tab[$i]; $j++) {
1785 // Compléte par des "0" le début de la chaîne si besoin
1786 $parc["parcelle"] = str_pad($j, 4, "0", STR_PAD_LEFT);
1787 // Ajout d'une parcelle à la liste
1788 $liste_parcelles[] = $parc;
1789 }
1790 }
1791 //Gestion des erreurs
1792 else{
1793 $msg = sprintf(
1794 "%sLa parcelle %s ne respectent pas le format imposé par openADS.",
1795 isset($dossier_id) === true && $dossier_id !== null ? sprintf("%s : ", $dossier_id) : '',
1796 $parcelles
1797 );
1798 $this->addToLog(__METHOD__."() : ".$msg, DEBUG_MODE);
1799 continue;
1800 }
1801 // Sauvegarde de la référence courante de parcelle
1802 $ancien_ref_parc = $reference_tab[$i];
1803 }
1804 }
1805
1806 return $liste_parcelles;
1807 }
1808
1809
1810 /**
1811 * Récupère le code impôt par rapport au quartier.
1812 *
1813 * @param string $quartier Numéro de quartier.
1814 * @return string Code impôts.
1815 */
1816 protected function get_arrondissement_code_impot($quartier) {
1817 // Si le quartier fournis est correct
1818 if ($quartier != "") {
1819 // Requête SQL
1820 $qres = $this->get_one_result_from_db_query(
1821 sprintf(
1822 'SELECT
1823 arrondissement.code_impots
1824 FROM
1825 %1$sarrondissement
1826 LEFT JOIN %1$squartier
1827 ON quartier.arrondissement = arrondissement.arrondissement
1828 WHERE
1829 quartier.code_impots = \'%2$s\'',
1830 DB_PREFIXE,
1831 $quartier
1832 ),
1833 array(
1834 "origin" => __METHOD__,
1835 )
1836 );
1837 }
1838 // Retour
1839 $code_impots = ! isset($qres["result"]) || $qres["result"] === null ?
1840 '' :
1841 $qres["result"];
1842 return $code_impots;
1843 }
1844
1845
1846 /**
1847 * Formate les parcelles en ajoutant le code impôt
1848 * @param array $liste_parcelles Tableau des parcelles
1849 * @return string Liste des parcelles formatées
1850 */
1851 function formatParcelleToSend($liste_parcelles) {
1852
1853 //
1854 $wParcelle = array();
1855
1856 //Formatage des références cadastrales pour l'envoi
1857 foreach ($liste_parcelles as $value) {
1858
1859 // On ajoute les données dans le tableau que si quartier + section + parcelle
1860 // a été fourni
1861 if ($value["quartier"] !== ""
1862 && $value["section"] !== ""
1863 && $value["parcelle"] !== ""){
1864
1865 //On récupère le code impôt de l'arrondissement
1866 $arrondissement = $this->get_arrondissement_code_impot($value["quartier"]);
1867
1868 //On ajoute la parcelle, si un arrondissement a été trouvé
1869 if ($arrondissement!=="") {
1870 //
1871 $wParcelle[] = $arrondissement.$value["quartier"].
1872 str_pad($value["section"], 2, " ", STR_PAD_LEFT).
1873 $value["parcelle"];
1874 }
1875 }
1876 }
1877
1878 //
1879 return $wParcelle;
1880 }
1881
1882 /**
1883 * Retourne true si tous les paramètres du SIG externe ont bien été définis
1884 * @return bool true/false
1885 */
1886 public function issetSIGParameter($idx) {
1887 $collectivite_idx = $this->get_collectivite_of_element("dossier", $idx);
1888 $collectivite = $this->getCollectivite($collectivite_idx);
1889 if(isset($collectivite["sig"])) {
1890 return true;
1891 } else {
1892 return false;
1893 }
1894 }
1895
1896 /**
1897 * Permet de vérifier que des champs existe dans une table
1898 * @param array $list_fields Liste des champs à tester
1899 * @param string $table Table où les champs doivent exister
1900 * @return mixed Retourne les champs qui n'existent pas
1901 * ou true
1902 */
1903 public function check_field_exist($list_fields, $table) {
1904
1905 // Instance de la classe en paramètre
1906 $object = $this->get_inst__om_dbform(array(
1907 "obj" => $table,
1908 "idx" => "]",
1909 ));
1910
1911 // Récupère les champs de la table
1912 foreach ($object->champs as $champ) {
1913 $list_column[] = $champ;
1914 }
1915
1916 // Tableau des champs en erreur
1917 $error_fields = array();
1918
1919 // Pour chaque champ à tester
1920 foreach ($list_fields as $value) {
1921
1922 // S'il n'apparaît pas dans la liste des champs possible
1923 if (!in_array($value, $list_column)) {
1924
1925 // Alors le champ est ajouté au tableau des erreurs
1926 $error_fields[] = $value;
1927 }
1928 }
1929
1930 // Si le tableau des erreurs n'est pas vide on le retourne
1931 if (count($error_fields) > 0) {
1932 return $error_fields;
1933 }
1934
1935 // Sinon on retourne le booléen true
1936 return true;
1937
1938 }
1939
1940 /**
1941 * Vérifie la présence du NULL dans une règle.
1942 *
1943 * @param string $rule Règle d'action ou d'événement.
1944 * @param string $rule_name Nom de la règle.
1945 *
1946 * RETURNS
1947 * NULL if unfound
1948 * ARRAY of
1949 * BOOLEAN : TRUE if IS unique,
1950 * TEXTE ERROR MESSAGE
1951 */
1952 function rule_null_is_valid($rule, $rule_name) {
1953 if (
1954 strpos($rule, 'NULL') !== false
1955 || strpos($rule, 'null') !== false
1956 ) {
1957 $match_result = preg_match('/^(\bnull\b|\bNULL\b)$/', $rule, $matches);
1958 if ($match_result !== 0 && $match_result !== false) {
1959 return array(true, null);
1960 } else {
1961 // Message d'erreur
1962 $error_msg = __("La valeur %s du champ %s est invalide, 'NULL' losque est utilisé doit être la seule valeur du champ.");
1963 return array(
1964 false,
1965 sprintf(
1966 $error_msg,
1967 '<b>'.$rule.'</b>',
1968 '<b>'.__($rule_name).'</b>'
1969 )
1970 );
1971 }
1972 }
1973 return null;
1974 }
1975
1976 /**
1977 * Vérifie la présence d'une valeur en mois dans une règle de type date.
1978 *
1979 * @param string $rule Règle d'action ou d'événement.
1980 * @param string $rule_name Nom de la règle.
1981 *
1982 * RETURNS
1983 * NULL if unfound
1984 * ARRAY of
1985 * BOOLEAN,
1986 * TEXTE ERROR MESSAGE
1987 */
1988 function rule_date_is_valid($operand, $rule_name) {
1989 $operand = str_replace(' ', '', $operand);
1990 if (
1991 strpos($operand, 'mois') !== false
1992 || strpos($operand, 'jour') !== false
1993 ) {
1994 $match_result = preg_match('/^\d+(mois\b|jour\b|jours\b)$/', $operand, $matches);
1995 if ($match_result !== 0 && $match_result !== false) {
1996 return array(true, null);
1997 } else {
1998 // Message d'erreur
1999 $error_msg = __("La valeur %s du champ %s, n'est pas une chaine 'x mois' ou 'x jours' valide.");
2000 return array(
2001 false,
2002 sprintf(
2003 $error_msg,
2004 '<b>'.$operand.'</b>',
2005 '<b>'.__($rule_name).'</b>'
2006 )
2007 );
2008 }
2009 }
2010 return null;
2011 }
2012
2013 /**
2014 * ReFormatage de la valeur des règles de date
2015 */
2016 function formatage_regles($value) {
2017 // Traitement de la valeur à afficher
2018 $value = str_replace(' ', '', $value);
2019 $value = preg_replace('/(\d+)/', '$1 ', $value);
2020 $value = preg_replace('/(\+)/', ' $1 ', $value);
2021 $value = trim(preg_replace('/\s\s+/', ' ', strtolower($value)));
2022 return $value;
2023 }
2024
2025
2026 /**
2027 * Récupère la lettre type lié à un événement
2028 * @param integer $evenement L'identifiant de l'événement
2029 * @return integer Retourne l'idenfiant de la lettre-type ou true
2030 */
2031 function getLettreType($evenement){
2032
2033 $qres = $this->get_all_results_from_db_query(
2034 sprintf('
2035 SELECT
2036 lettretype
2037 FROM
2038 %1$sevenement
2039 WHERE
2040 evenement = %2$d',
2041 DB_PREFIXE,
2042 intval($evenement)
2043 ),
2044 array(
2045 "origin" => __METHOD__,
2046 )
2047 );
2048
2049 $lettretype = null;
2050 if ($qres['row_count'] > 0) {
2051 $row = array_shift($qres['result']);
2052 $lettretype = $row['lettretype'];
2053 }
2054 return $lettretype;
2055 }
2056
2057
2058 /**
2059 * Récupère la lettre type lié à un événement
2060 * @param integer $evenement L'identifiant de l'événement
2061 * @return integer Retourne l'idenfiant de la lettre-type ou true
2062 */
2063 function get_document_type($evenement){
2064 //
2065 $evenement = $this->get_inst__om_dbform(array(
2066 'obj' => 'evenement',
2067 'idx' => $evenement,
2068 ));
2069 if (! empty($evenement->getVal('document_type'))) {
2070 return $evenement->getVal('document_type');
2071 }
2072 return NULL;
2073 }
2074
2075
2076
2077 /**
2078 * Retourne le type de dossier d'autorisation du dossier courant :
2079 * @param $idxDossier Le numéro du dossier d'instruction
2080 * @return le code du type détaillée de dossier d'autorisation
2081 **/
2082 function getDATDCode($idxDossier) {
2083 $qres = $this->get_one_result_from_db_query(
2084 sprintf(
2085 'SELECT
2086 dossier_autorisation_type_detaille.code
2087 FROM
2088 %1$sdossier_autorisation_type_detaille
2089 INNER JOIN %1$sdossier_instruction_type
2090 ON dossier_autorisation_type_detaille.dossier_autorisation_type_detaille = dossier_instruction_type.dossier_autorisation_type_detaille
2091 INNER JOIN %1$sdossier
2092 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
2093
2094 WHERE
2095 dossier.dossier = \'%2$s\'',
2096 DB_PREFIXE,
2097 $this->db->escapeSimple($idxDossier)
2098 ),
2099 array(
2100 "origin" => __METHOD__,
2101 )
2102 );
2103 return $qres["result"];
2104 }
2105
2106 /**
2107 * Retourne le type de dossier d'autorisation du dossier courant :
2108 * @param $idxDossier Le numéro du dossier d'instruction
2109 * @return le code du type de dossier d'autorisation
2110 **/
2111 function getDATCode($idxDossier) {
2112 $qres = $this->get_one_result_from_db_query(
2113 sprintf(
2114 'SELECT
2115 dossier_autorisation_type.code
2116 FROM
2117 %1$sdossier_autorisation_type
2118 INNER JOIN %1$sdossier_autorisation_type_detaille
2119 ON dossier_autorisation_type.dossier_autorisation_type = dossier_autorisation_type_detaille.dossier_autorisation_type
2120 INNER JOIN %1$sdossier_instruction_type
2121 ON dossier_autorisation_type_detaille.dossier_autorisation_type_detaille = dossier_instruction_type.dossier_autorisation_type_detaille
2122 INNER JOIN %1$sdossier
2123 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
2124 WHERE
2125 dossier.dossier = \'%2$s\'',
2126 DB_PREFIXE,
2127 $this->db->escapeSimple($idxDossier)
2128 ),
2129 array(
2130 "origin" => __METHOD__,
2131 )
2132 );
2133 return $qres["result"];
2134 }
2135
2136 /**
2137 * Permet de copier un enregistrement
2138 * @param mixed $idx Identifiant de l'enregistrment
2139 * @param string $obj Objet de l'enregistrment
2140 * @param string $objsf Objets associés
2141 * @return array Tableau des nouveaux id et du message
2142 */
2143 function copier($idx, $obj, $objsf) {
2144
2145 // Tableau de résultat
2146 $resArray = array();
2147 // Message retourné à l'utilisateur
2148 $message = "";
2149 // Type du message (valid ou error)
2150 $message_type = "valid";
2151
2152 // Requête SQL permettant de récupérer les informations sur l'objet métier
2153 $qres = $this->get_all_results_from_db_query(
2154 sprintf('
2155 SELECT
2156 *
2157 FROM
2158 %1$s%2$s
2159 WHERE
2160 %2$s = %3$s',
2161 DB_PREFIXE,
2162 $obj,
2163 $idx
2164 ),
2165 array(
2166 "origin" => __METHOD__,
2167 )
2168 );
2169
2170 // Valeurs clonées
2171 $valF = array();
2172
2173 foreach ($qres['result'] as $result) {
2174 $valF = $result;
2175 }
2176
2177 // Valeurs non clonées
2178 // Identifiant modifié pour que ça soit un ajout
2179 $valF[$obj] = "]";
2180 // Instance de l'objet métier
2181 $clone_obj = $this->get_inst__om_dbform(array(
2182 "obj" => $obj,
2183 "idx" => "]",
2184 ));
2185 // Si dans l'objet métier la fonction "copier" existe
2186 if (method_exists($clone_obj, "update_for_copy")) {
2187 // Traitement sur les valeurs du duplicata
2188 $valF = $clone_obj->update_for_copy($valF, $objsf, DEBUG);
2189 // Recupère les messages retourné par la fonction
2190 $message .= $valF['message'];
2191 // Supprime les messages de la liste des valeurs
2192 unset($valF['message']);
2193 }
2194 // Ajoute le duplicata
2195 $clone_obj->ajouter($valF);
2196 // Si aucune erreur se produit dans la classe instanciée
2197 if ($clone_obj->correct === true) {
2198 // Récupère l'identifiant de l'objet créé
2199 $clone_obj_id = $clone_obj->valF[$obj];
2200
2201 // Message
2202 $message .= sprintf(__("La copie de l'enregistrement %s avec l'identifiant %s s'est effectuee avec succes"), "<span class='bold'>".__($obj)."</span>", "<span class='bold'>".$idx."</span>")."<br />";
2203 $message .= sprintf(
2204 '<a class="om-prev-icon" id="action-link--copy-of-%s-%s" href="%s">%s</a><br/><br/>',
2205 $obj,
2206 $idx,
2207 sprintf(
2208 '%s&obj=%s&action=3&idx=%s',
2209 OM_ROUTE_FORM,
2210 $obj,
2211 $clone_obj_id
2212 ),
2213 ("Cliquer ici pour accéder à la copie")
2214 );
2215 // Ajout de l'identifant au tableau des résultat
2216 $resArray[$obj.'_'.$idx] = $clone_obj_id;
2217
2218 // S'il y a au moins un objet metier associé
2219 if ($objsf != "") {
2220 // Liste des objet métier associés
2221 $list_objsf = explode(",", $objsf);
2222 // Pour chaque objet associé
2223 foreach ($list_objsf as $key => $objsf) {
2224 // Requête SQL permettant de récupérer les informations sur
2225 // l'objet métier associé
2226 $qres = $this->get_all_results_from_db_query(
2227 sprintf('
2228 SELECT
2229 *
2230 FROM
2231 %1$s%2$s
2232 WHERE
2233 %3$s = %4$s',
2234 DB_PREFIXE,
2235 $objsf,
2236 $obj,
2237 $idx
2238 ),
2239 array(
2240 "origin" => __METHOD__,
2241 )
2242 );
2243
2244 // Pour chaque élément associé
2245 foreach ($qres['result'] as $result) {
2246 // Identifiant de l'objet associé à copier
2247 $idxsf = $result[$objsf];
2248
2249 // Valeurs clonées
2250 $valF = $result;
2251 // Valeurs non clonées
2252 $valF[$obj] = $clone_obj_id;
2253 // Identifiant modifié pour que ça soit un ajout
2254 $valF[$objsf] = "]";
2255 // Instance de l'objet métier associé
2256 $clone_objsf = $this->get_inst__om_dbform(array(
2257 "obj" => $objsf,
2258 "idx" => "]",
2259 ));
2260 // Si dans l'objet métier associé
2261 // la fonction "copier" existe
2262 if (method_exists($clone_objsf, "update_for_copy")) {
2263 // Traitement sur les valeurs du duplicata
2264 $valF = $clone_objsf->update_for_copy($valF, $objsf, DEBUG);
2265 // Recupère les messages retourné par la fonction
2266 $message .= $valF['message'];
2267 // Supprime les messages de la liste des valeurs
2268 unset($valF['message']);
2269 }
2270 // Ajoute le duplicata
2271 $clone_objsf->ajouter($valF);
2272 // Si aucune erreur se produit dans la classe instanciée
2273 if ($clone_objsf->correct === true) {
2274 // Récupère l'identifiant de l'objet créé
2275 $clone_objsf_id = $clone_objsf->valF[$objsf];
2276
2277 // Message
2278 $message .= sprintf(
2279 __("La copie de l'enregistrement %s avec l'identifiant %s s'est effectuee avec succes"),
2280 "<span class='bold'>".__($objsf)."</span>",
2281 "<span class='bold'>".$idxsf."</span>"
2282 )."<br />";
2283
2284 // Ajout de l'identifant au tableau des résultat
2285 $resArray[$objsf.'_'.$result[$objsf]] = $clone_objsf_id;
2286 } else {
2287
2288 // Message d'erreur récupéré depuis la classe
2289 $message .= $clone_objsf->msg;
2290 // Type du message
2291 $message_type = "error";
2292 }
2293 }
2294 }
2295 }
2296 //
2297 } else {
2298
2299 // Message d'erreur récupéré depuis la classe
2300 $message .= $clone_obj->msg;
2301 // Type du message
2302 $message_type = "error";
2303 }
2304
2305 // Ajout du message au tableau des résultats
2306 $resArray['message'] = $message;
2307 // Ajout du type de message au tableau des résultats
2308 $resArray['message_type'] = $message_type;
2309
2310 // Retourne le tableau des résultats
2311 return $resArray;
2312 }
2313
2314 /**
2315 * Cette fonction prend en entrée le ou les paramètres du &contrainte qui sont entre
2316 * parenthèses (un ensemble de paramètres séparés par des points-virgules). Elle
2317 * sépare les paramètres et leurs valeurs puis construit et retourne un tableau
2318 * associatif qui contient pour les groupes et sous-groupes :
2319 * - un tableau de valeurs, avec un nom de groupe ou sous-groupe par ligne
2320 * pour les autres options :
2321 * - la valeur de l'option
2322 *
2323 * @param string $contraintes_param Chaîne contenant tous les paramètres
2324 *
2325 * @return array Tableau associatif avec paramètres et valeurs séparés
2326 */
2327 function explodeConditionContrainte($contraintes_param) {
2328
2329 // Initialisation des variables
2330 $return = array();
2331 $listGroupes = "";
2332 $listSousgroupes = "";
2333 $service_consulte = "";
2334 $affichage_sans_arborescence = "";
2335
2336 // Sépare toutes les conditions avec leurs valeurs et les met dans un tableau
2337 $contraintes_params = explode(";", $contraintes_param);
2338
2339 // Pour chaque paramètre de &contraintes
2340 foreach ($contraintes_params as $value) {
2341 // Récupère le mot-clé "liste_groupe" et les valeurs du paramètre
2342 if (strstr($value, "liste_groupe=")) {
2343 // On enlève le mots-clé "liste_groupe=", on garde les valeurs
2344 $listGroupes = str_replace("liste_groupe=", "", $value);
2345 }
2346 // Récupère le mot-clé "liste_ssgroupe" et les valeurs du paramètre
2347 if (strstr($value, "liste_ssgroupe=")) {
2348 // On enlève le mots-clé "liste_ssgroupe=", on garde les valeurs
2349 $listSousgroupes = str_replace("liste_ssgroupe=", "", $value);
2350 }
2351 // Récupère le mot-clé "service_consulte" et la valeur du paramètre
2352 if (strstr($value, "service_consulte=")) {
2353 // On enlève le mots-clé "service_consulte=", on garde sa valeur
2354 $service_consulte = str_replace("service_consulte=", "", $value);
2355 }
2356 // Récupère le mot-clé "affichage_sans_arborescence" et la valeur du
2357 // paramètre
2358 if (strstr($value, "affichage_sans_arborescence=")) {
2359 // On enlève le mots-clé "affichage_sans_arborescence=", on garde la valeur
2360 $affichage_sans_arborescence = str_replace("affichage_sans_arborescence=", "", $value);
2361 }
2362 }
2363
2364 // Récupère dans des tableaux la liste des groupes et sous-groupes qui
2365 // doivent être utilisés lors du traitement de la condition
2366 if ($listGroupes != "") {
2367 $listGroupes = array_map('trim', explode(",", $listGroupes));
2368 }
2369 if ($listSousgroupes != "") {
2370 $listSousgroupes = array_map('trim', explode(",", $listSousgroupes));
2371 }
2372
2373 // Tableau à retourner
2374 $return['groupes'] = $listGroupes;
2375 $return['sousgroupes'] = $listSousgroupes;
2376 $return['service_consulte'] = $service_consulte;
2377 $return['affichage_sans_arborescence'] = $affichage_sans_arborescence;
2378 return $return;
2379 }
2380
2381 /**
2382 * Méthode qui complète la clause WHERE de la requête SQL de récupération des
2383 * contraintes, selon les paramètres fournis. Elle permet d'ajouter une condition sur
2384 * les groupes, sous-groupes et les services consultés.
2385 *
2386 * @param $string $part Contient tous les paramètres fournis à &contraintes séparés
2387 * par des points-virgules, tel que définis dans l'état.
2388 * array[] $conditions Paramètre optionnel, contient les conditions déjà explosées
2389 * par la fonction explodeConditionContrainte()
2390 *
2391 * @return string Contient les clauses WHERE à ajouter à la requête SQL principale.
2392 */
2393 function traitement_condition_contrainte($part, $conditions = NULL) {
2394
2395 // Initialisation de la condition
2396 $whereContraintes = "";
2397 // Lorsqu'on a déjà les conditions explosées dans le paramètre $conditions, on
2398 // utilise ces données. Sinon, on appelle la méthode qui explose la chaîne de
2399 // caractères contenant l'ensemble des paramètres.
2400 if (is_array($conditions)){
2401 $explodeConditionContrainte = $conditions;
2402 }
2403 else {
2404 $explodeConditionContrainte = $this->explodeConditionContrainte($part);
2405 }
2406 // Récupère les groupes, sous-groupes et service_consulte pour la condition
2407 $groupes = $explodeConditionContrainte['groupes'];
2408 $sousgroupes = $explodeConditionContrainte['sousgroupes'];
2409 $service_consulte = $explodeConditionContrainte['service_consulte'];
2410
2411 // Pour chaque groupe
2412 if ($groupes != "") {
2413 foreach ($groupes as $key => $groupe) {
2414 // Si le groupe n'est pas vide
2415 if (!empty($groupe)) {
2416 // Choisit l'opérateur logique
2417 $op_logique = $key > 0 ? 'OR' : 'AND (';
2418 // Ajoute la condition
2419 $whereContraintes .= " ".$op_logique." lower(trim(both E'\n\r\t' from contrainte.groupe)) = lower('"
2420 .pg_escape_string($groupe)."')";
2421 }
2422 }
2423 // S'il y a des valeurs dans groupe
2424 if (count($groupes) > 0) {
2425 // Ferme la parenthèse
2426 $whereContraintes .= " ) ";
2427 }
2428 }
2429
2430 // Pour chaque sous-groupe
2431 if ($sousgroupes != "") {
2432 foreach ($sousgroupes as $key => $sousgroupe) {
2433 // Si le sous-groupe n'est pas vide
2434 if (!empty($sousgroupe)) {
2435 // Choisit l'opérateur logique
2436 $op_logique = $key > 0 ? 'OR' : 'AND (';
2437 // Ajoute la condition
2438 $whereContraintes .= " ".$op_logique." lower(trim(both E'\n\r\t' from contrainte.sousgroupe)) = lower('"
2439 .pg_escape_string($sousgroupe)."')";
2440 }
2441 }
2442 // S'il y a des valeurs dans sous-groupe
2443 if (count($sousgroupes) > 0) {
2444 // Ferme la parenthèse
2445 $whereContraintes .= " ) ";
2446 }
2447 }
2448
2449 // Si l'option service_consulte n'est pas vide
2450 if ($service_consulte != "") {
2451 // Ajoute la condition
2452 $whereContraintes .= " AND service_consulte = cast(lower('".$service_consulte."') as boolean) ";
2453 }
2454
2455 // Condition retournée
2456 return $whereContraintes;
2457 }
2458
2459 /**
2460 * Calcule une date par l'ajout ou la soustraction de mois ou de jours.
2461 *
2462 * @param date $date Date de base (format dd-mm-yyyy)
2463 * @param integer $delay Délais à ajouter
2464 * @param string $operator Opérateur pour le calcul ("-" ou "+")
2465 * @param string $type Type de calcul (mois ou jour)
2466 *
2467 * @return date Date calculée
2468 */
2469 function mois_date($date, $delay, $operator = "+", $type = "mois") {
2470 // On force le type du paramètre $delay
2471 $delay = intval($delay);
2472
2473 // On force le type en minuscules
2474 $type = strtolower($type);
2475
2476 // Si un type n'est pas définit
2477 if ($type != "mois" && $type != "jour" && $type != "jours") {
2478 //
2479 return null;
2480 }
2481
2482 // Si aucune date n'a été fournie ou si ce n'est pas une date correctement
2483 // formatée
2484 if ( is_null($date) || $date == "" ||
2485 preg_match('/[0-9]{4}-[0-9]{2}-[0-9]{2}/', $date) == 0 ){
2486 return null;
2487 }
2488
2489 // Si l'opérateur n'est pas définit
2490 if ($operator != "+" && $operator != "-") {
2491 //
2492 return null;
2493 }
2494
2495 // Découpage de la date
2496 $temp = explode("-", $date);
2497 $day = (int) $temp[2];
2498 $month = (int) $temp[1];
2499 $year = (int) $temp[0];
2500
2501 // Si c'est un calcul sur des mois
2502 // Le calcul par mois ne se fait pas comme le calcul par jour car
2503 // les fonctions PHP ne réalisent pas les calculs réglementaires
2504 if ($type == "mois") {
2505
2506 // Si c'est une addition
2507 if ($operator == '+') {
2508 // Année à ajouter
2509 $year += floor($delay / 12);
2510 // Mois restant
2511 $nb_month = ($delay % 12);
2512 // S'il y a des mois restant
2513 if ($nb_month != 0) {
2514 // Ajout des mois restant
2515 $month += $nb_month;
2516 // Si ça dépasse le mois 12 (décembre)
2517 if ($month > 12) {
2518 // Soustrait 12 au mois
2519 $month -= 12;
2520 // Ajoute 1 à l'année
2521 $year += 1;
2522 }
2523 }
2524 }
2525
2526 // Si c'est une soustraction
2527 if ($operator == "-") {
2528 // Année à soustraire
2529 $year -= floor($delay / 12);
2530 // Mois restant
2531 $nb_month = ($delay % 12);
2532 // S'il y a des mois restant
2533 if ($nb_month != 0) {
2534 // Soustrait le délais
2535 $month -= $nb_month;
2536 // Si ça dépasse le mois 1 (janvier)
2537 if ($month < 1) {
2538 // Soustrait 12 au mois
2539 $month += 12;
2540 // Ajoute 1 à l'année
2541 $year -= 1;
2542 }
2543 }
2544 }
2545
2546 // Calcul du nombre de jours dans le mois sélectionné
2547 switch($month) {
2548 // Mois de février
2549 case "2":
2550 if ($year % 4 == 0 && $year % 100 != 0 || $year % 400 == 0) {
2551 $day_max = 29;
2552 } else {
2553 $day_max = 28;
2554 }
2555 break;
2556 // Mois d'avril, juin, septembre et novembre
2557 case "4":
2558 case "6":
2559 case "9":
2560 case "11":
2561 $day_max = 30;
2562 break;
2563 // Mois de janvier, mars, mai, juillet, août, octobre et décembre
2564 default:
2565 $day_max = 31;
2566 }
2567
2568 // Si le jour est supérieur au jour maximum du mois
2569 if ($day > $day_max) {
2570 // Le jour devient le jour maximum
2571 $day = $day_max;
2572 }
2573
2574 // Compléte le mois et le jour par un 0 à gauche si c'est un chiffre
2575 $month = str_pad($month, 2, "0", STR_PAD_LEFT);
2576 $day = str_pad($day, 2, "0", STR_PAD_LEFT);
2577
2578 // Résultat du calcul
2579 $date_result = $year."-".$month."-".$day;
2580 }
2581
2582 // Si c'est un calcul sur des jours
2583 if ($type == "jour" || $type == "jours") {
2584 //
2585 $datetime = new DateTime($date);
2586 // Si le délai est un numérique
2587 if (is_numeric($delay)) {
2588 // Modifie la date
2589 $datetime->modify($operator.$delay.' days');
2590 }
2591 // Résultat du calcul
2592 $date_result = $datetime->format('Y-m-d');
2593 }
2594
2595 // Retourne la date calculée
2596 return $date_result;
2597 }
2598
2599 /**
2600 * Vérifie la valididité d'une date.
2601 *
2602 * @param string $pDate Date à vérifier
2603 *
2604 * @return boolean
2605 */
2606 function check_date($pDate) {
2607
2608 // Vérifie si c'est une date valide
2609 if (preg_match("/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/", $pDate, $date)
2610 && checkdate($date[2], $date[3], $date[1])
2611 && $date[1] >= 1900) {
2612 //
2613 return true;
2614 }
2615
2616 //
2617 return false;
2618 }
2619
2620 /**
2621 * Permet de tester le bypass
2622 *
2623 * @param string $obj le nom de l'objet
2624 * @param string $permission_suffix
2625 * @return boolean
2626 */
2627 function can_bypass($obj="", $permission_suffix=""){
2628 //On teste le droit bypass
2629 if ($permission_suffix!=""&&$obj!=""&&
2630 $this->isAccredited($obj."_".$permission_suffix."_bypass")){
2631 return true;
2632 }
2633 return false;
2634 }
2635
2636
2637 /**
2638 * Vérifie l'option de numérisation.
2639 *
2640 * @return boolean
2641 */
2642 public function is_option_digitalization_folder_enabled() {
2643 //
2644 if ($this->getParameter("option_digitalization_folder") !== true) {
2645 //
2646 return false;
2647 }
2648 //
2649 return true;
2650 }
2651
2652
2653 /**
2654 * Vérifie l'option de suppression d'un dossier d'instruction.
2655 *
2656 * @return boolean
2657 */
2658 public function is_option_suppression_dossier_instruction_enabled($om_collectivite=null) {
2659 //
2660 $parameters = $this->getCollectivite($om_collectivite);
2661 //
2662 if (isset($parameters['option_suppression_dossier_instruction']) === true
2663 && $parameters['option_suppression_dossier_instruction'] === 'true') {
2664 //
2665 return true;
2666 }
2667
2668 //
2669 return false;
2670 }
2671
2672
2673
2674 /**
2675 * Vérifie que l'option d'accès au portail citoyen est activée.
2676 *
2677 * @param integer $om_collectivite Identifiant de la collectivité.
2678 *
2679 * @return boolean
2680 */
2681 public function is_option_citizen_access_portal_enabled($om_collectivite=null) {
2682 //
2683 $parameters = $this->getCollectivite($om_collectivite);
2684 //
2685 if (isset($parameters['option_portail_acces_citoyen']) === true
2686 && $parameters['option_portail_acces_citoyen'] === 'true') {
2687 //
2688 return true;
2689 }
2690
2691 //
2692 return false;
2693 }
2694
2695
2696 /**
2697 * Vérifie que l'option du SIG est activée.
2698 *
2699 * @return boolean
2700 */
2701 public function is_option_sig_enabled($om_collectivite=null) {
2702 //
2703 $parameters = $this->getCollectivite($om_collectivite);
2704 //
2705 if (isset($parameters['option_sig']) === true
2706 && $parameters['option_sig'] === 'sig_externe') {
2707 //
2708 return true;
2709 }
2710 //
2711 return false;
2712 }
2713
2714 /**
2715 * Vérifie que l'option du SIG est activée.
2716 *
2717 * @return boolean
2718 */
2719 public function is_option_ws_synchro_contrainte_enabled($om_collectivite=null) {
2720 //
2721 $parameters = $this->getCollectivite($om_collectivite);
2722 //
2723 if (isset($parameters['option_ws_synchro_contrainte']) === true
2724 && $parameters['option_ws_synchro_contrainte'] === 'true') {
2725 //
2726 return true;
2727 }
2728 //
2729 return false;
2730 }
2731
2732
2733 /**
2734 * Vérifie que l'option de simulation des taxes est activée.
2735 *
2736 * @param integer $om_collectivite Identifiant de la collectivité.
2737 *
2738 * @return boolean
2739 */
2740 public function is_option_simulation_taxes_enabled($om_collectivite=null) {
2741 //
2742 $parameters = $this->getCollectivite($om_collectivite);
2743 //
2744 if (isset($parameters['option_simulation_taxes']) === true
2745 && $parameters['option_simulation_taxes'] === 'true') {
2746 //
2747 return true;
2748 }
2749
2750 //
2751 return false;
2752 }
2753
2754 /**
2755 * Vérifie que l'option de prévisualisation de l'édition est activée.
2756 *
2757 * @param integer $om_collectivite Identifiant de la collectivité.
2758 *
2759 * @return boolean
2760 */
2761 public function is_option_preview_pdf_enabled($om_collectivite=null) {
2762 //
2763 $parameters = $this->getCollectivite($om_collectivite);
2764 //
2765 if (isset($parameters['option_previsualisation_edition']) === true
2766 && $parameters['option_previsualisation_edition'] === 'true') {
2767 //
2768 return true;
2769 }
2770
2771 //
2772 return false;
2773 }
2774
2775 /**
2776 * Vérifie que l'option de rédaction libre de l'édition est activée.
2777 *
2778 * @param integer $om_collectivite Identifiant de la collectivité.
2779 *
2780 * @return boolean
2781 */
2782 public function is_option_redaction_libre_enabled($om_collectivite=null) {
2783 //
2784 $parameters = $this->getCollectivite($om_collectivite);
2785 //
2786 if (isset($parameters['option_redaction_libre']) === true
2787 && $parameters['option_redaction_libre'] === 'true') {
2788 //
2789 return true;
2790 }
2791
2792 //
2793 return false;
2794 }
2795
2796
2797 /**
2798 * Vérifie que l'option de finalisation automatique des instructions tacites
2799 * et retours est activée..
2800 *
2801 * @param integer $om_collectivite Identifiant de la collectivité.
2802 *
2803 * @return boolean
2804 */
2805 public function is_option_finalisation_auto_enabled($om_collectivite = null) {
2806 //
2807 $parameters = $this->getCollectivite($om_collectivite);
2808 //
2809 if (isset($parameters['option_final_auto_instr_tacite_retour']) === true
2810 && $parameters['option_final_auto_instr_tacite_retour'] === 'true') {
2811 //
2812 return true;
2813 }
2814
2815 //
2816 return false;
2817 }
2818
2819 /**
2820 * Vérifie que l'option de trouillotage numérique automatique des
2821 * pièces est activée.
2822 *
2823 * @param integer $om_collectivite Identifiant de la collectivité.
2824 *
2825 * @return boolean
2826 */
2827 public function is_option_trouillotage_numerique_enabled($om_collectivite = null) {
2828 //
2829 $parameters = $this->getCollectivite($om_collectivite);
2830 //
2831 if (isset($parameters['option_trouillotage_numerique']) === true
2832 && $parameters['option_trouillotage_numerique'] === 'true') {
2833 //
2834 return true;
2835 }
2836 //
2837 return false;
2838 }
2839
2840 /**
2841 * Vérifie que l'option de saisie du numéro de dossier est activée.
2842 *
2843 * @param integer $om_collectivite Identifiant de la collectivité.
2844 *
2845 * @return boolean
2846 */
2847 public function is_option_dossier_saisie_numero_enabled($om_collectivite=null) {
2848 //
2849 $parameters = $this->getCollectivite($om_collectivite);
2850 //
2851 if (isset($parameters['option_dossier_saisie_numero']) === true
2852 && $parameters['option_dossier_saisie_numero'] === 'true') {
2853 //
2854 return true;
2855 }
2856
2857 //
2858 return false;
2859 }
2860
2861 /**
2862 * Vérifie que l'option de saisie du numéro de dossier est activée.
2863 *
2864 * @param integer $om_collectivite Identifiant de la collectivité.
2865 *
2866 * @return boolean
2867 */
2868 public function is_option_dossier_saisie_numero_complet_enabled($om_collectivite=null) {
2869 //
2870 $parameters = $this->getCollectivite($om_collectivite);
2871 //
2872 if (isset($parameters['option_dossier_saisie_numero_complet']) === true
2873 && $parameters['option_dossier_saisie_numero_complet'] === 'true') {
2874 //
2875 return true;
2876 }
2877
2878 //
2879 return false;
2880 }
2881
2882 /**
2883 * Vérifie que l'option de la commune associée à un dossier est activée.
2884 *
2885 * @param integer $om_collectivite Identifiant de la collectivité.
2886 *
2887 * @return boolean
2888 */
2889 public function is_option_dossier_commune_enabled($om_collectivite=null) {
2890 $parameters = $this->getCollectivite($om_collectivite);
2891 return (
2892 isset($parameters['option_dossier_commune']) &&
2893 $parameters['option_dossier_commune'] === 'true');
2894 }
2895
2896 /**
2897 * Vérifie que l'option de récupération de la division de l'instructeur
2898 * affecté pour la numérotation des dossiers est activée.
2899 *
2900 * @param integer $om_collectivite Identifiant de la collectivité.
2901 *
2902 * @return boolean
2903 */
2904 public function is_option_instructeur_division_numero_dossier_enabled($om_collectivite=null) {
2905 //
2906 $parameters = $this->getCollectivite($om_collectivite);
2907 //
2908 if (isset($parameters['option_instructeur_division_numero_dossier']) === true
2909 && $parameters['option_instructeur_division_numero_dossier'] === 'true') {
2910 //
2911 return true;
2912 }
2913
2914 //
2915 return false;
2916 }
2917
2918 /**
2919 * Vérifie que l'option pour afficher les un surlignage en couleur des
2920 * numéros des dossiers dans les listings est activée.
2921 *
2922 * @param integer $om_collectivite Identifiant de la collectivité.
2923 *
2924 * @return boolean
2925 */
2926 public function is_option_afficher_couleur_dossier($om_collectivite=null) {
2927 //
2928 $parameters = $this->getCollectivite($om_collectivite);
2929 //
2930 if (isset($parameters['option_afficher_couleur_dossier']) === true
2931 && $parameters['option_afficher_couleur_dossier'] === 'true') {
2932 //
2933 return true;
2934 }
2935
2936 //
2937 return false;
2938 }
2939
2940 /**
2941 * Vérifie que l'option du suivi de numérisation est activée.
2942 * Les utilisateurs de la collectivité de niveau 2 peuvent accéder aux
2943 * fonctionnalités du suivi de numérisation même si l'option est activée seulement
2944 * sur une collectivité de niveau 1.
2945 *
2946 * @param integer $om_collectivite Identifiant de la collectivité.
2947 *
2948 * @return boolean
2949 */
2950 public function is_option_suivi_numerisation_enabled($om_collectivite=null) {
2951 //
2952 $parameters = $this->getCollectivite($om_collectivite);
2953 //
2954 if (isset($parameters['option_suivi_numerisation']) === true
2955 && $parameters['option_suivi_numerisation'] === 'true') {
2956 //
2957 return true;
2958 }
2959
2960 // Si l'utilisateur fait partie de la collectivité de niveau 2
2961 // et qu'au moins une des communes à l'option de numérisation activée
2962 if ($this->has_collectivite_multi() === true) {
2963 $qres = $this->get_one_result_from_db_query(
2964 sprintf(
2965 'SELECT
2966 valeur
2967 FROM
2968 %1$som_parametre
2969 WHERE
2970 libelle = \'option_suivi_numerisation\'',
2971 DB_PREFIXE
2972 ),
2973 array(
2974 "origin" => __METHOD__,
2975 "force_return" => true,
2976 )
2977 );
2978 if ($qres["code"] === "OK"
2979 && $qres["result"] === "true") {
2980 //
2981 return true;
2982 }
2983 }
2984
2985 //
2986 return false;
2987 }
2988
2989 // Mode MC
2990 public function is_option_om_collectivite_entity_enabled($om_collectivite=null) {
2991 //
2992 $parameters = $this->getCollectivite($om_collectivite);
2993 //
2994 if (isset($parameters['option_om_collectivite_entity']) === true
2995 && $parameters['option_om_collectivite_entity'] === 'true') {
2996 //
2997 return true;
2998 }
2999
3000 //
3001 return false;
3002 }
3003
3004 public function is_option_date_depot_mairie_enabled($om_collectivite=null) {
3005 //
3006 $parameters = $this->getCollectivite($om_collectivite);
3007 //
3008 if (isset($parameters['option_date_depot_mairie']) === true
3009 && $parameters['option_date_depot_mairie'] === 'true') {
3010 //
3011 return true;
3012 }
3013
3014 //
3015 return false;
3016 }
3017
3018 /**
3019 * [is_option_date_depot_mairie_enabled description]
3020 * @param [type] $om_collectivite [description]
3021 * @return boolean [description]
3022 */
3023 public function is_option_renommer_collectivite_enabled($om_collectivite=null) {
3024 //
3025 $parameters = $this->getCollectivite($om_collectivite);
3026 //
3027 if (isset($parameters['option_renommer_collectivite']) === true
3028 && $parameters['option_renommer_collectivite'] === 'true') {
3029 //
3030 return true;
3031 }
3032
3033 //
3034 return false;
3035 }
3036
3037 /**
3038 * [is_option_mode_service_consulte_enabled description]
3039 * @param [type] $om_collectivite [description]
3040 * @return boolean [description]
3041 */
3042 public function is_option_mode_service_consulte_enabled($om_collectivite=null) {
3043 //
3044 $parameters = $this->getCollectivite($om_collectivite);
3045 //
3046 if (isset($parameters['option_mode_service_consulte']) === true
3047 && $parameters['option_mode_service_consulte'] === 'true') {
3048 //
3049 return true;
3050 }
3051
3052 //
3053 return false;
3054 }
3055
3056 /**
3057 * Vérifie si l'option de notification automatique de dépôt de dossier
3058 * par voie dématérialisée est active ou pas.
3059 *
3060 * @param integer $om_collectivite identifiant de la collectivité
3061 * @return boolean
3062 */
3063 public function is_option_notification_depot_demat_enabled($om_collectivite=null) {
3064 $parameters = $this->getCollectivite($om_collectivite);
3065
3066 if (isset($parameters['option_notification_depot_demat']) === true
3067 && $parameters['option_notification_depot_demat'] === 'true') {
3068 return true;
3069 }
3070 return false;
3071 }
3072
3073 /**
3074 * Méthode permettant de récupérer le paramètrage de l'option
3075 * option_notification
3076 *
3077 * @param integer identifiant de la collectivité dont on veux le paramétrage
3078 * @return string la valeur du paramètre ou null si il n'est pas défini
3079 */
3080 public function get_param_option_notification($om_collectivite=null) {
3081 //
3082 $parameters = $this->getCollectivite($om_collectivite);
3083 //
3084 if (isset($parameters['option_notification']) === true) {
3085 return $parameters['option_notification'];
3086 }
3087 //
3088 return null;
3089 }
3090
3091 /**
3092 * Méthode permettant de récupérer le paramètrage de l'option
3093 * param_operateur
3094 *
3095 * @param integer identifiant de la collectivité. Par défaut, il est null
3096 * @return array
3097 */
3098 public function get_option_param_operateur($om_collectivite=null) {
3099
3100 $parameters = $this->getCollectivite($om_collectivite);
3101
3102 if (isset($parameters['param_operateur']) === true) {
3103 $param_operateur = json_decode($parameters['param_operateur']);
3104 return $param_operateur;
3105 }
3106
3107 return null;
3108 }
3109
3110 /**
3111 * Méthode permettant de récupérer le paramètre
3112 * affichage_di_listing_colonnes_masquees
3113 *
3114 * @param integer identifiant de la collectivité. Par défaut, il est null
3115 * @return array
3116 */
3117 public function get_affichage_di_listing_colonnes_masquees($om_collectivite=null) {
3118 $parameters = $this->getCollectivite($om_collectivite);
3119 if (isset($parameters['affichage_di_listing_colonnes_masquees']) === true) {
3120 $colonnes = explode(";", $parameters['affichage_di_listing_colonnes_masquees']);
3121 return $colonnes;
3122 }
3123
3124 return null;
3125 }
3126
3127 /**
3128 * Méthode permettant de récupérer le paramètre
3129 * option_afficher_localisation_colonne_dossier
3130 *
3131 * @param integer identifiant de la collectivité. Par défaut, il est null
3132 * @return boolean
3133 */
3134 public function is_option_afficher_localisation_colonne_dossier($om_collectivite=null) {
3135 $parameters = $this->getCollectivite($om_collectivite);
3136 if (isset($parameters['option_afficher_localisation_colonne_dossier']) === true
3137 && $parameters['option_afficher_localisation_colonne_dossier'] === 'true') {
3138 //
3139 return true;
3140 }
3141
3142 return false;
3143 }
3144
3145
3146 /**
3147 * Méthode permettant de récupérer le paramètrage de l'option
3148 * option_notification
3149 *
3150 * @return boolean
3151 */
3152 public function get_parametre_notification_url_acces($om_collectivite=null) {
3153 //
3154 $parameters = $this->getCollectivite($om_collectivite);
3155 //
3156 if (isset($parameters['parametre_notification_url_acces']) === true) {
3157 return $parameters['parametre_notification_url_acces'];
3158 }
3159 //
3160 return null;
3161 }
3162
3163 /**
3164 * Permet de récupérer le paramètre 'param_base_path_metadata_url_di'
3165 *
3166 * @param integer $om_collectivite Identifiant de la collectivité.
3167 * @return mixed Chaine de caractères ou null
3168 */
3169 public function get_param_base_path_metadata_url_di($om_collectivite=null) {
3170 //
3171 $parameters = $this->getCollectivite($om_collectivite);
3172 //
3173 if (isset($parameters['param_base_path_metadata_url_di']) === true) {
3174 return $parameters['param_base_path_metadata_url_di'];
3175 }
3176 //
3177 return null;
3178 }
3179
3180 /**
3181 * Permet de récupérer le paramètre 'portal_code_suivi_base_url'.
3182 *
3183 * @param integer $om_collectivite Identifiant de la collectivité.
3184 * @return mixed Chaine de caractères ou null.
3185 */
3186 public function get_portal_code_suivi_base_url($om_collectivite=null) {
3187 //
3188 $parameters = $this->getCollectivite($om_collectivite);
3189 //
3190 if (isset($parameters['portal_code_suivi_base_url']) === true
3191 && $parameters['portal_code_suivi_base_url'] !== null
3192 && $parameters['portal_code_suivi_base_url'] !== '') {
3193 //
3194 return $parameters['portal_code_suivi_base_url'];
3195 }
3196 //
3197 return null;
3198 }
3199
3200 /**
3201 * Méthode permettant de récupérer le corps et le titre du mail de notification
3202 * selon le type de notification voulu.
3203 *
3204 * @return boolean
3205 */
3206 public function get_notification_parametre_courriel_type($om_collectivite=null, $typeNotification = 'notification_demandeur') {
3207 $paramDefaut = array(
3208 'parametre_courriel_type_titre' => __("[openADS] Notification concernant votre dossier [DOSSIER]"),
3209 'parametre_courriel_type_message' => __("Bonjour, veuillez prendre connaissance du(des) document(s) suivant(s) :<br>[LIEN_TELECHARGEMENT_DOCUMENT]<br>[LIEN_TELECHARGEMENT_ANNEXE]"),
3210 );
3211 // Il existe 3 type de notification des demandeurs. Si la notification voulu appartiens a un de ces 3 types
3212 // alors ce sont les paramétre de la notification des demandeurs qui doivent être récupéré
3213 if (in_array($typeNotification, array('notification_instruction', 'notification_recepisse', 'notification_decision'))) {
3214 $typeNotification = 'notification_demandeur';
3215 }
3216 // Construit le nom de la méthode selon le type de notification
3217 // si la méthode existe elle est appellé sinon on renvoie le message défini par défaut
3218 $method = sprintf('get_%1$s_parametre_courriel_type', $typeNotification);
3219 if (method_exists($this, $method)) {
3220 $param = $this->$method($om_collectivite);
3221 // Si le titre du message n'a pas été récupéré c'est le titre par défaut qui est utilisé
3222 $param['parametre_courriel_type_titre'] =
3223 ! array_key_exists('parametre_courriel_type_titre', $param) ?
3224 $paramDefaut['parametre_courriel_type_titre'] :
3225 $param['parametre_courriel_type_titre'];
3226 // Si le corps du message n'a pas été récupéré c'est le titre par défaut qui est utilisé
3227 $param['parametre_courriel_type_message'] =
3228 ! array_key_exists('parametre_courriel_type_message', $param) ?
3229 $paramDefaut['parametre_courriel_type_message'] :
3230 $param['parametre_courriel_type_message'];
3231 return $param;
3232 }
3233 return $paramDefaut;
3234 }
3235
3236 /**
3237 * Permet de récupérer les phrases types composant la notification aux pétitionnaires.
3238 *
3239 * @param integer $om_collectivite Identifiant de la collectivité.
3240 *
3241 * @return array Tableau contenant les phrases types.
3242 */
3243 private function get_notification_demandeur_parametre_courriel_type($om_collectivite = null) {
3244 // Phrases types par défaut
3245 $result = array();
3246 // Récupération des paramètres
3247 $parameters = $this->getCollectivite($om_collectivite);
3248 // Vérification de l'existance des paramètres titre et message
3249 if (isset($parameters['parametre_courriel_type_message']) === true
3250 && $parameters['parametre_courriel_type_message'] !== null
3251 && $parameters['parametre_courriel_type_message'] !== '') {
3252 //
3253 $result['parametre_courriel_type_message'] = $parameters['parametre_courriel_type_message'];
3254 }
3255 if (isset($parameters['parametre_courriel_type_titre']) === true
3256 && $parameters['parametre_courriel_type_titre'] !== null
3257 && $parameters['parametre_courriel_type_titre'] !== '') {
3258 //
3259 $result['parametre_courriel_type_titre'] = $parameters['parametre_courriel_type_titre'];
3260 }
3261 //
3262 return $result;
3263 }
3264
3265 /**
3266 * Permet de récupérer les phrases types composant la notification aux services
3267 * consultés.
3268 *
3269 * @param integer $om_collectivite Identifiant de la collectivité.
3270 *
3271 * @return array Tableau contenant les phrases types.
3272 */
3273 private function get_notification_service_consulte_parametre_courriel_type($om_collectivite = null) {
3274 // Phrases types par défaut
3275 $result = array();
3276 // Récupération des paramètres
3277 $parameters = $this->getCollectivite($om_collectivite);
3278 // Vérification de l'existance des paramètres titre et message
3279 if (isset($parameters['parametre_courriel_service_type_message']) === true
3280 && $parameters['parametre_courriel_service_type_message'] !== null
3281 && $parameters['parametre_courriel_service_type_message'] !== '') {
3282 //
3283 $result['parametre_courriel_type_message'] = $parameters['parametre_courriel_service_type_message'];
3284 }
3285 if (isset($parameters['parametre_courriel_service_type_titre']) === true
3286 && $parameters['parametre_courriel_service_type_titre'] !== null
3287 && $parameters['parametre_courriel_service_type_titre'] !== '') {
3288 //
3289 $result['parametre_courriel_type_titre'] = $parameters['parametre_courriel_service_type_titre'];
3290 }
3291 //
3292 return $result;
3293 }
3294
3295 /**
3296 * Permet de récupérer les phrases types composant la notification aux tiers consultés.
3297 *
3298 * @param integer $om_collectivite Identifiant de la collectivité.
3299 *
3300 * @return array Tableau contenant les phrases types.
3301 */
3302 private function get_notification_tiers_consulte_parametre_courriel_type($om_collectivite = null) {
3303 // Phrases types par défaut
3304 $result = array();
3305 // Récupération des paramètres
3306 $parameters = $this->getCollectivite($om_collectivite);
3307 // Vérification de l'existance des paramètres titre et message
3308 if (isset($parameters['parametre_courriel_tiers_type_message']) === true
3309 && $parameters['parametre_courriel_tiers_type_message'] !== null
3310 && $parameters['parametre_courriel_type_message'] !== '') {
3311 //
3312 $result['parametre_courriel_type_message'] = $parameters['parametre_courriel_tiers_type_message'];
3313 }
3314 if (isset($parameters['parametre_courriel_tiers_type_titre']) === true
3315 && $parameters['parametre_courriel_tiers_type_titre'] !== null
3316 && $parameters['parametre_courriel_tiers_type_titre'] !== '') {
3317 //
3318 $result['parametre_courriel_type_titre'] = $parameters['parametre_courriel_tiers_type_titre'];
3319 }
3320 //
3321 return $result;
3322 }
3323
3324 /**
3325 * Permet de récupérer les phrases types composant la notification automatique du
3326 * dépôt de dossiers dématérialisés.
3327 *
3328 * @param integer $om_collectivite Identifiant de la collectivité.
3329 *
3330 * @return array Tableau contenant les phrases types.
3331 */
3332 private function get_notification_depot_demat_parametre_courriel_type($om_collectivite = null) {
3333 // Phrases types par défaut
3334 $result = array();
3335 // Récupération des paramètres
3336 $parameters = $this->getCollectivite($om_collectivite);
3337 // Vérification de l'existance des paramètres titre et message
3338 if (isset($parameters['param_courriel_de_notification_depot_demat_message']) === true
3339 && $parameters['param_courriel_de_notification_depot_demat_message'] !== null
3340 && $parameters['param_courriel_de_notification_depot_demat_message'] !== '') {
3341
3342 $result['parametre_courriel_type_message'] =
3343 $parameters['param_courriel_de_notification_depot_demat_message'];
3344 }
3345 if (isset($parameters['param_courriel_de_notification_depot_demat_titre']) === true
3346 && $parameters['param_courriel_de_notification_depot_demat_titre'] !== null
3347 && $parameters['param_courriel_de_notification_depot_demat_titre'] !== '') {
3348
3349 $result['parametre_courriel_type_titre'] =
3350 $parameters['param_courriel_de_notification_depot_demat_titre'];
3351 }
3352 return $result;
3353 }
3354
3355 /**
3356 * Permet de récupérer les phrases types composant la notification aux services
3357 * consultés.
3358 *
3359 * @param integer $om_collectivite Identifiant de la collectivité.
3360 *
3361 * @return array Tableau contenant les phrases types.
3362 */
3363 public function get_notification_commune_parametre_courriel_type($om_collectivite = null) {
3364 // Phrases types par défaut
3365 $result = array();
3366 // Récupération des paramètres
3367 $parameters = $this->getCollectivite($om_collectivite);
3368 // Vérification de l'existance des paramètres titre et message
3369 if (isset($parameters['param_courriel_de_notification_commune_modele_depuis_instruction']) === true
3370 && $parameters['param_courriel_de_notification_commune_modele_depuis_instruction'] !== null
3371 && $parameters['param_courriel_de_notification_commune_modele_depuis_instruction'] !== '') {
3372 //
3373 $result['parametre_courriel_type_message'] = $parameters['param_courriel_de_notification_commune_modele_depuis_instruction'];
3374 }
3375 if (isset($parameters['param_courriel_de_notification_commune_objet_depuis_instruction']) === true
3376 && $parameters['param_courriel_de_notification_commune_objet_depuis_instruction'] !== null
3377 && $parameters['param_courriel_de_notification_commune_objet_depuis_instruction'] !== '') {
3378 //
3379 $result['parametre_courriel_type_titre'] = $parameters['param_courriel_de_notification_commune_objet_depuis_instruction'];
3380 }
3381 //
3382 return $result;
3383 }
3384
3385 /**
3386 * Méthode permettant de récupérer le corps et le titre du mail de notification au signataire
3387 *
3388 * @param integer identifiant de la collectivité
3389 *
3390 * @return array tableau à deux entrées :
3391 * - parametre_courriel_type_titre : titre parametré pour les courriels
3392 * - parametre_courriel_type_message : contenu parametré pour les courriels
3393 */
3394 public function get_notification_signataire_parametre_courriel_type($om_collectivite = null) {
3395 // Phrases types par défaut
3396 $result = array(
3397 'parametre_courriel_type_titre' => __("[openADS] Nouveau document à signer pour le dossier [DOSSIER]"),
3398 'parametre_courriel_type_message' => __("Bonjour,<br/><br/>Un document concernant le dossier <DOSSIER_INSTRUCTION> est disponible à la signature.<br/><br/>Vous pouvez le signer en cliquant sur le lien suivant :<br/>[LIEN_PAGE_SIGNATURE]<br/><br/>Si vous possédez un compte sur openADS, vous pouvez retrouver l'intégralité du dossier en suivant le lien ci-dessous :<br/>[URL_DOSSIER]"),
3399 );
3400 // Récupération des paramètres
3401 $parameters = $this->getCollectivite($om_collectivite);
3402 if (isset($parameters['param_courriel_notification_signataire_type_message']) === true
3403 && $parameters['param_courriel_notification_signataire_type_message'] !== null
3404 && $parameters['param_courriel_notification_signataire_type_message'] !== '') {
3405 //
3406 $result['parametre_courriel_type_message'] = $parameters['param_courriel_notification_signataire_type_message'];
3407 }
3408 if (isset($parameters['param_courriel_notification_signataire_type_titre']) === true
3409 && $parameters['param_courriel_notification_signataire_type_titre'] !== null
3410 && $parameters['param_courriel_notification_signataire_type_titre'] !== '') {
3411 //
3412 $result['parametre_courriel_type_titre'] = $parameters['param_courriel_notification_signataire_type_titre'];
3413 }
3414 //
3415 return $result;
3416 }
3417
3418 /**
3419 * Récupère la liste des mails paramétrés pour l'envoi de notification email aux
3420 * communes
3421 *
3422 * @param integer $om_collectivite Identifiant de la collectivité.
3423 *
3424 * @return array Liste des adresses emails.
3425 */
3426 public function get_param_courriel_de_notification_commune($om_collectivite = null) {
3427 $listeEmail = array();
3428 // Récupération des paramètres
3429 $parameters = $this->getCollectivite($om_collectivite);
3430 // Récupération du contenu du paramèrtre
3431 if (! empty($parameters['param_courriel_de_notification_commune'])) {
3432 $listeEmail = explode("\n", $parameters['param_courriel_de_notification_commune']);
3433 }
3434 return $listeEmail;
3435 }
3436
3437 /**
3438 * Permet de récupérer la limite maximum du nombre d'annexe que l'on peux envoyer
3439 * lors de la notification des pétitionnaires via le paramètre "parametre_notification_max_annexes"
3440 *
3441 * @param integer $om_collectivite Identifiant de la collectivité.
3442 *
3443 * @return int Valeur maximale du nombre d'annexe notifiable
3444 */
3445 public function get_nb_max_annexe($om_collectivite = null) {
3446 $nb_annexe_max = 5;
3447 // Récupération des paramètres
3448 $parameters = $this->getCollectivite($om_collectivite);
3449 // Récupération de la valeur du paramètre 'parametre_notification_max_annexes'
3450 if (!empty($parameters['parametre_notification_max_annexes'])
3451 && is_numeric($parameters['parametre_notification_max_annexes'])) {
3452 // Si l'utilisateur à ajouté et correctement saisi le paramètre "parametre_notification_max_annexes"
3453 // cette valeur devient la nouvelle limite du nombre max d'annexe notifiable
3454 $nb_annexe_max = intVal($parameters['parametre_notification_max_annexes']);
3455 }
3456 return $nb_annexe_max;
3457 }
3458
3459 /**
3460 * Vérifie que le type de dossier soit transmissible.
3461 * Dans le cas d'un sous-dossier, c'est le type de son dossier parent qui
3462 * doit être vérifié.
3463 *
3464 * @param string $idx_dossier Identifiant du dossier
3465 * @param string $dossier_instruction_type Identifiant du type de dossier d'instruction
3466 *
3467 * @return boolean
3468 */
3469 function is_type_dossier_platau($idx_dossier, $dossier_instruction_type = null) {
3470 // Instanciation du DI à partir de son identifiant
3471 if ($idx_dossier !== null) {
3472 $inst_di = $this->get_inst__om_dbform(array(
3473 "obj" => "dossier",
3474 "idx" => $idx_dossier,
3475 ));
3476 // Vérifiaction que le DI n'a pas de parent :
3477 // un sous-dossier (avec parent), n'a pas de type de DI
3478 if ($inst_di->getVal('dossier_parent') !== '') {
3479 $idx_dossier_parent = $inst_di->getVal('dossier_parent');
3480 $inst_di_parent = $this->get_inst__om_dbform(array(
3481 "obj" => "dossier",
3482 "idx" => $idx_dossier_parent,
3483 ));
3484 // Remplacement de l'instanciation du DI par celle de son parent
3485 $inst_di = $inst_di_parent;
3486 }
3487 // Récupération du type de DI du parent
3488 $dossier_instruction_type = $inst_di->getVal('dossier_instruction_type');
3489 }
3490
3491 // Instanciation du type de DI
3492 $inst_dit = $this->get_inst__om_dbform(array(
3493 "obj" => "dossier_instruction_type",
3494 "idx" => $dossier_instruction_type,
3495 ));
3496
3497 // Récupération du DATD
3498 $inst_datd = $this->get_inst__om_dbform(array(
3499 "obj" => "dossier_autorisation_type_detaille",
3500 "idx" => $inst_dit->getVal('dossier_autorisation_type_detaille'),
3501 ));
3502
3503 if ($inst_datd->getVal('dossier_platau') === true || $inst_datd->getVal('dossier_platau') === 't'){
3504 return true;
3505 }
3506
3507 return false;
3508 }
3509
3510 /**
3511 * Définit si le type de dossier d'instruction est transmissible à Plat'AU.
3512 *
3513 * @param integer $dossier_instruction_type Identifiant du type de dossier d'instruction
3514 *
3515 * @return boolean
3516 */
3517 public function is_dit_transmitted_platau($dossier_instruction_type, $om_collectivite = null) {
3518 $parameters = $this->getCollectivite($om_collectivite);
3519 $inst_dit = $this->get_inst__om_dbform(array(
3520 "obj" => "dossier_instruction_type",
3521 "idx" => $dossier_instruction_type,
3522 ));
3523 // Si le code du type de dossier d'instruction est dans la liste des codes
3524 // identifiés comme transmissibles à Plat'AU grâce au paramètre dit_code__to_transmit__platau
3525 if (isset($parameters['dit_code__to_transmit__platau']) === true) {
3526 $dit_code__to_transmit__platau = explode(";", $parameters['dit_code__to_transmit__platau']);
3527 if (is_array($dit_code__to_transmit__platau) === true) {
3528 $dit_code__to_transmit__platau = array_map('mb_strtolower', $dit_code__to_transmit__platau);
3529 if (in_array(mb_strtolower($inst_dit->getVal('code')), $dit_code__to_transmit__platau, true)) {
3530 // Le type de DI est considéré comme transmissible
3531 return true;
3532 }
3533 }
3534 // Si le code n'est pas renseigné, alors le type de DI n'est pas transmissible
3535 return false;
3536 }
3537 // Si le paramètre n'est pas définit alors tous les types de DI sont considéré comme transmissible
3538 return true;
3539 }
3540
3541 /**
3542 * Vérifie que l'option du lien Google Street View est activée.
3543 *
3544 * @param integer $om_collectivite Identifiant de la collectivité.
3545 *
3546 * @return boolean
3547 */
3548 public function is_option_streetview_enabled($om_collectivite=null) {
3549 //
3550 $parameters = $this->getCollectivite($om_collectivite);
3551 //
3552 if (isset($parameters['option_streetview']) === true
3553 && $parameters['option_streetview'] === 'true') {
3554 //
3555 return true;
3556 }
3557
3558 //
3559 return false;
3560 }
3561
3562 /**
3563 * Vérifie que l'option d'affichage en lecture seule de la date
3564 * de l'événement d'instruction est activée.
3565 *
3566 * @param integer $om_collectivite Identifiant de la collectivité.
3567 *
3568 * @return boolean
3569 */
3570 public function is_option_date_evenement_instruction_lecture_seule($om_collectivite=null) {
3571 //
3572 $parameters = $this->getCollectivite($om_collectivite);
3573 //
3574 if (isset($parameters['option_date_evenement_instruction_lecture_seule']) === true
3575 && $parameters['option_date_evenement_instruction_lecture_seule'] === 'true') {
3576 //
3577 return true;
3578 }
3579
3580 //
3581 return false;
3582 }
3583
3584 /**
3585 * Vérifie que l'option référentiel ERP est activée.
3586 *
3587 * @param integer $om_collectivite Identifiant de la collectivité.
3588 *
3589 * @return boolean
3590 */
3591 public function is_option_geolocalisation_auto_contrainte_enabled($om_collectivite=null) {
3592 //
3593 $parameters = $this->getCollectivite($om_collectivite);
3594 //
3595 if (isset($parameters['option_geolocalisation_auto_contrainte']) === true
3596 && $parameters['option_geolocalisation_auto_contrainte'] === 'true') {
3597 //
3598 return true;
3599 }
3600
3601 //
3602 return false;
3603 }
3604
3605 /**
3606 * Vérifie que l'option de renommage des documents numérisés ajoutés par
3607 * une tâches "add_piece" est activée.
3608 *
3609 * Cette option doit être globale, c'est-à-dire soit sur la collectivité de
3610 * niveau 2, soit désactivée.
3611 *
3612 * @param integer $om_collectivite Identifiant de la collectivité.
3613 *
3614 * @return boolean
3615 */
3616 public function is_option_renommage_document_numerise_tache_enabled($om_collectivite=null) {
3617 //
3618 $parameters = $this->getCollectivite($om_collectivite);
3619 //
3620 if (isset($parameters['option_renommage_document_numerise_tache']) === true
3621 && $parameters['option_renommage_document_numerise_tache'] === 'true') {
3622 //
3623 return true;
3624 }
3625
3626 //
3627 return false;
3628 }
3629
3630 /**
3631 * Vérifie le niveau de la collectivité de l'utilisateur connecté
3632 *
3633 * @return boolean
3634 */
3635 function has_collectivite_multi() {
3636 $idx_multi = $this->get_idx_collectivite_multi();
3637 if (intval($_SESSION['collectivite']) === intval($idx_multi)) {
3638 return true;
3639 }
3640 return false;
3641 }
3642
3643
3644 /**
3645 * Pour un path absolu donné, retourne le relatif à la racine de
3646 * l'application.
3647 *
3648 * @param string $absolute Chemin absolu.
3649 *
3650 * @return mixed Faux si échec sinon chemin relatif.
3651 */
3652 public function get_relative_path($absolute) {
3653 if ($this->get_path_app() === false) {
3654 return false;
3655 }
3656 $path_app = $this->get_path_app();
3657 return str_replace($path_app, '', $absolute);
3658 }
3659
3660
3661 /**
3662 * Retourne le path absolu de la racine de l'application
3663 *
3664 * @return mixed Faux si échec sinon chemin absolu
3665 */
3666 public function get_path_app() {
3667 $match = array();
3668 preg_match( '/(.*)\/[a-zA-Z0-9]+\/\.\.\/core\/$/', PATH_OPENMAIRIE, $match);
3669 // On vérifie qu'il n'y a pas d'erreur
3670 if (isset($match[1]) === false) {
3671 return false;
3672 }
3673 return $match[1];
3674 }
3675
3676 /**
3677 * Compose un tableau et retourne son code HTML
3678 *
3679 * @param string $id ID CSS du conteneur
3680 * @param array $headers entêtes de colonnes
3681 * @param array $rows lignes
3682 * @return string code HTML
3683 */
3684 public function compose_generate_table($id, $headers, $rows) {
3685 //
3686 $html = '';
3687 // Début conteneur
3688 $html .= '<div id="'.$id.'">';
3689 // Début tableau
3690 $html .= '<table class="tab-tab">';
3691 // Début entête
3692 $html .= '<thead>';
3693 $html .= '<tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">';
3694 // Colonnes
3695 $nb_colonnes = count($headers);
3696 $index_last_col = $nb_colonnes - 1;
3697 foreach ($headers as $i => $header) {
3698 if ($i === 0) {
3699 $col = ' firstcol';
3700 }
3701 if ($i === $index_last_col) {
3702 $col = ' lastcol';
3703 }
3704 $html .= '<th class="title col-'.$i.$col.'">';
3705 $html .= '<span class="name">';
3706 $html .= $header;
3707 $html .= '</span>';
3708 $html .= '</th>';
3709 }
3710 // Fin entête
3711 $html .= '</tr>';
3712 $html .= '</thead>';
3713 // Début corps
3714 $html .= '<tbody>';
3715 // Lignes
3716 foreach ($rows as $cells) {
3717 // Début ligne
3718 $html .= '<tr class="tab-data">';
3719 // Cellules
3720 foreach ($cells as $j => $cell) {
3721 if ($j === 0) {
3722 $col = ' firstcol';
3723 }
3724 if ($j === $index_last_col) {
3725 $col = ' lastcol';
3726 }
3727 $html .= '<td class="title col-'.$j.$col.'">';
3728 $html .= '<span class="name">';
3729 $html .= $cell;
3730 $html .= '</span>';
3731 $html .= '</td>';
3732 }
3733 // Fin ligne
3734 $html .= "</tr>";
3735 }
3736 // Fin corps
3737 $html .= '</tbody>';
3738 // Fin tableau
3739 $html .= '</table>';
3740 // Fin conteneur
3741 $html .= '</div>';
3742 //
3743 return $html;
3744 }
3745
3746 /**
3747 * Retourne le login de l'utilisateur connecté + entre parenthèses son nom
3748 * s'il en a un.
3749 *
3750 * @return string myLogin OU myLogin (myName)
3751 */
3752 public function get_connected_user_login_name() {
3753 // Requête et stockage des informations de l'user connecté
3754 $this->getUserInfos();
3755 // Si le nom existe et est défini on le récupère
3756 $nom = "";
3757 if (isset($this->om_utilisateur["nom"])
3758 && !empty($this->om_utilisateur["nom"])) {
3759 $nom = trim($this->om_utilisateur["nom"]);
3760 }
3761 // Définition de l'émetteur : obligatoirement son login
3762 $emetteur = $_SESSION['login'];
3763 // Définition de l'émetteur : + éventuellement son nom
3764 if ($nom != "") {
3765 $emetteur .= " (".$nom.")";
3766 }
3767 // Retour
3768 return $emetteur;
3769 }
3770
3771 /**
3772 * Cette méthode permet d'interfacer le module 'Settings'.
3773 */
3774 function view_module_settings() {
3775 //
3776 require_once "../obj/settings.class.php";
3777 $settings = new settings();
3778 $settings->view_main();
3779 }
3780
3781
3782 /**
3783 * Vérifie que l'option référentiel ERP est activée.
3784 *
3785 * @param integer $om_collectivite Identifiant de la collectivité.
3786 *
3787 * @return boolean
3788 */
3789 public function is_option_referentiel_erp_enabled($om_collectivite=null) {
3790 //
3791 $parameters = $this->getCollectivite($om_collectivite);
3792 //
3793 if (isset($parameters['option_referentiel_erp']) === true
3794 && $parameters['option_referentiel_erp'] === 'true') {
3795 //
3796 return true;
3797 }
3798
3799 //
3800 return false;
3801 }
3802
3803 /**
3804 * Vérifie que l'option d'affichage de la miniature des fichiers est activée.
3805 *
3806 * @param integer $om_collectivite Identifiant de la collectivité.
3807 *
3808 * @return boolean
3809 */
3810 public function is_option_miniature_fichier_enabled($om_collectivite=null) {
3811 //
3812 $parameters = $this->getCollectivite($om_collectivite);
3813 //
3814 if (isset($parameters['option_miniature_fichier']) === true
3815 && $parameters['option_miniature_fichier'] === 'true') {
3816 //
3817 return true;
3818 }
3819
3820 //
3821 return false;
3822 }
3823
3824 /**
3825 * Méthode générique permettant de savoir si une option donnée est active.
3826 *
3827 * @param string $opionName : nom de l'option dans la table om_parametre
3828 * @param string $om_collectivite : identifiant de la collectivite pour laquelle on souhaite vérifier
3829 * l'activation de l'option.
3830 *
3831 * @return boolean
3832 */
3833 public function is_option_enabled(string $optionName, $om_collectivite = null) {
3834 // Récupération des paramètres de la collectivité voulu
3835 $parameters = $this->getCollectivite($om_collectivite);
3836 // Vérification que l'option est active cad qu'elle existe et qu'elle a pour valeur 'true'
3837 return isset($parameters[$optionName]) === true && $parameters[$optionName] === 'true';
3838 }
3839
3840 /**
3841 * Interface avec le référentiel ERP.
3842 */
3843 function send_message_to_referentiel_erp($code, $infos) {
3844 //
3845 require_once "../obj/interface_referentiel_erp.class.php";
3846 $interface_referentiel_erp = new interface_referentiel_erp();
3847 $ret = $interface_referentiel_erp->send_message_to_referentiel_erp($code, $infos);
3848 return $ret;
3849 }
3850
3851 /**
3852 * Récupère la liste des identifiants des collectivités
3853 *
3854 * @param string $return_type 'string' ou 'array' selon que l'on retourne
3855 * respectivement une chaîne ou un tableau
3856 * @param string $separator caractère(s) séparateur(s) employé(s) lorsque
3857 * l'on retourne une chaîne, inutilisé si tableau
3858 * @return mixed possibilité de boolean/string/array :
3859 * false si erreur BDD sinon résultat
3860 */
3861 public function get_list_id_collectivites($return_type = 'string', $separator = ',') {
3862 $qres = $this->get_one_result_from_db_query(
3863 sprintf(
3864 'SELECT
3865 array_to_string(
3866 array_agg(om_collectivite),
3867 \'%2$s\'
3868 ) AS list_id_collectivites
3869 FROM
3870 %1$som_collectivite',
3871 DB_PREFIXE,
3872 $this->db->escapeSimple($separator)
3873 ),
3874 array(
3875 "origin" => __METHOD__,
3876 "force_return" => true,
3877 )
3878 );
3879
3880 if ($qres["code"] !== "OK") {
3881 return false;
3882 }
3883 if ($return_type === 'array') {
3884 return explode($separator, $qres["result"]);
3885 }
3886 return $qres["result"];
3887 }
3888
3889 /**
3890 * Teste si l'utilisateur connecté appartient au groupe indiqué en paramètre
3891 * ou s'il a le goupe bypass.
3892 *
3893 * @param string $groupe Code du groupe : ADS / CTX / CU / RU / ERP.
3894 * @return boolean vrai si utilisateur appartient au groupe fourni
3895 */
3896 public function is_user_in_group($groupe) {
3897 if (isset($_SESSION['groupe']) === true
3898 && (array_key_exists($groupe, $_SESSION['groupe']) === true
3899 || array_key_exists("bypass", $_SESSION['groupe']) === true)) {
3900 return true;
3901 }
3902 return false;
3903 }
3904
3905 /**
3906 * CONDITION - can_user_access_dossiers_confidentiels_from_groupe
3907 *
3908 * Permet de savoir si le type de dossier d'autorisation du dossier courant est
3909 * considéré comme confidentiel ou si l'utilisateur a le groupe bypass.
3910 *
3911 * @param string $groupe Code du groupe : ADS / CTX / CU / RU / ERP.
3912 * @return boolean true si l'utilisateur à accès aux dossiers confidentiels du groupe
3913 * passé en paramètre, sinon false.
3914 *
3915 */
3916 public function can_user_access_dossiers_confidentiels_from_groupe($groupe) {
3917 if ((isset($_SESSION['groupe'][$groupe]['confidentiel']) === true
3918 && $_SESSION['groupe'][$groupe]['confidentiel'] === true)
3919 || array_key_exists("bypass", $_SESSION['groupe']) === true) {
3920 return true;
3921 }
3922 return false;
3923 }
3924
3925 public function starts_with($haystack, $needle) {
3926 $length = strlen($needle);
3927 return (substr($haystack, 0, $length) === $needle);
3928 }
3929
3930 public function ends_with($haystack, $needle) {
3931 $length = strlen($needle);
3932 if ($length == 0) {
3933 return true;
3934 }
3935 return (substr($haystack, -$length) === $needle);
3936 }
3937
3938 /**
3939 * Récupère le type définit dans la base de données des champs d'une table
3940 * entière ou d'un champs si celui-ci est précisé.
3941 *
3942 * Liste des types BDD :
3943 * - int4
3944 * - varchar
3945 * - bool
3946 * - numeric
3947 * - text
3948 *
3949 * @param string $table Nom de la table.
3950 * @param string $column Nom de la colonne (facultatif).
3951 *
3952 * @return array
3953 */
3954 public function get_type_from_db($table, $column = null) {
3955
3956 $qres = $this->get_all_results_from_db_query(
3957 sprintf('
3958 SELECT
3959 column_name,
3960 udt_name
3961 FROM
3962 information_schema.columns
3963 WHERE
3964 table_schema = \'%1$s\'
3965 AND
3966 table_name = \'%2$s\'
3967 %3$s
3968 ORDER BY
3969 ordinal_position',
3970 str_replace('.', '', DB_PREFIXE),
3971 $table,
3972 // Si une colonne est précisé
3973 ($column !== null || $column !== '') ?
3974 sprintf(" AND column_name = '%s' ", $column) :
3975 ''
3976 ),
3977 array(
3978 "origin" => __METHOD__,
3979 )
3980 );
3981
3982 $list_type = array();
3983 foreach ($qres['result'] as $result) {
3984 $list_type[$result['column_name']] = $result['udt_name'];
3985 }
3986
3987 // Retourne la liste des codes
3988 return $list_type;
3989 }
3990
3991
3992 /**
3993 * Cette méthode permet de récupérer le code de division correspondant
3994 * au dossier sur lequel on se trouve.
3995 *
3996 * Méthode identique à la méthode getDivisionFromDossier() de la classe
3997 * om_dbform à l'exception d'un cas de récupération du numéro de dossier par
3998 * la méthode getVal(). Cette exception permet d'utiliser cette méthode dans
3999 * les scripts instanciant seulement la classe utils tel que les *.inc.php.
4000 *
4001 * @param string $dossier Identifiant du dossier d'instruction.
4002 *
4003 * @return string Code de la division du dossier en cours
4004 */
4005 public function get_division_from_dossier_without_inst($dossier = null) {
4006
4007 // Cette méthode peut être appelée plusieurs fois lors d'une requête.
4008 // Pour éviter de refaire le traitement de recherche de la division
4009 // alors on vérifie si nous ne l'avons pas déjà calculé.
4010 if (isset($this->_division_from_dossier) === true
4011 && $this->_division_from_dossier !== null) {
4012 // Log
4013 $this->addToLog(__METHOD__."() : retour de la valeur déjà calculée - '".$this->_division_from_dossier."'", EXTRA_VERBOSE_MODE);
4014 // On retourne la valeur déjà calculée
4015 return $this->_division_from_dossier;
4016 }
4017
4018 // Récupère le paramétre retourformulaire présent dans l'URL
4019 $retourformulaire = $this->getParameter("retourformulaire");
4020 // Récupère le paramétre idxformulaire présent dans l'URL
4021 $idxformulaire = $this->getParameter("idxformulaire");
4022
4023 // Si le dossier n'est pas passé en paramètre de la méthode
4024 if ($dossier === null) {
4025
4026 // La méthode de récupération du dossier diffère selon le contexte
4027 // du formulaire
4028 if ($retourformulaire === "dossier"
4029 || $this->contexte_dossier_instruction()) {
4030
4031 // Récupère le numéro du dossier depuis le paramètre
4032 // idxformulaire présent dans l'URL
4033 $dossier = $idxformulaire;
4034 }
4035 //
4036 if ($retourformulaire === "lot") {
4037 $inst_lot = $this->get_inst__om_dbform(array(
4038 "obj" => "lot",
4039 "idx" => $idxformulaire,
4040 ));
4041 $dossier = $inst_lot->getVal("dossier");
4042 }
4043 }
4044
4045 // À cette étape si le dossier n'est toujours pas récupéré alors la
4046 // division ne pourra pas être récupérée
4047 if ($dossier === null) {
4048 //
4049 return null;
4050 }
4051
4052 $inst_dossier = $this->get_inst__om_dbform(array(
4053 "obj" => "dossier",
4054 "idx" => $dossier,
4055 ));
4056 $this->_division_from_dossier = $inst_dossier->getVal("division");
4057
4058 //
4059 return $this->_division_from_dossier;
4060
4061 }
4062
4063 /**
4064 *
4065 */
4066 function setDefaultValues() {
4067 $this->addHTMLHeadCss(
4068 array(
4069 "../app/lib/chosen/chosen.min.css",
4070 ),
4071 21
4072 );
4073 $this->addHTMLHeadJs(
4074 array(
4075 "../app/lib/chosen/chosen.jquery.min.js",
4076 ),
4077 21
4078 );
4079
4080 $this->addHTMLHeadCss(
4081 array(
4082 "../app/lib/gridjs/mermaid.min.css",
4083 ),
4084 22
4085 );
4086 $this->addHTMLHeadJs(
4087 array(
4088 "../app/lib/gridjs/gridjs.min.js",
4089 ),
4090 22
4091 );
4092 }
4093
4094
4095 /**
4096 * Permet de définir la configuration des liens du footer.
4097 *
4098 * @return void
4099 */
4100 protected function set_config__footer() {
4101 $footer = array();
4102 // Documentation du site
4103 $footer[] = array(
4104 "title" => __("Documentation"),
4105 "description" => __("Acceder a l'espace documentation de l'application"),
4106 "href" => "http://docs.openmairie.org/?project=openads&version=6.10&format=html&path=manuel_utilisateur",
4107 "target" => "_blank",
4108 "class" => "footer-documentation",
4109 );
4110
4111 // Portail openMairie
4112 $footer[] = array(
4113 "title" => __("openMairie.org"),
4114 "description" => __("Site officiel du projet openMairie"),
4115 "href" => "http://www.openmairie.org/catalogue/openads",
4116 "target" => "_blank",
4117 "class" => "footer-openmairie",
4118 );
4119 //
4120 $this->config__footer = $footer;
4121 }
4122
4123 /**
4124 * Surcharge - set_config__menu().
4125 *
4126 * @return void
4127 */
4128 protected function set_config__menu() {
4129 //
4130 $menu = array();
4131
4132 // {{{ Rubrique AUTORISATION
4133 //
4134 $rubrik = array(
4135 "title" => __("Autorisation"),
4136 "class" => "autorisation",
4137 "right" => "menu_autorisation"
4138 );
4139 //
4140 $links = array();
4141
4142 $links[] = array(
4143 "href" => "".OM_ROUTE_TAB."&obj=dossier_autorisation",
4144 "class" => "dossier_autorisation",
4145 "title" => __("Dossiers d'autorisation"),
4146 "right" => array("dossier_autorisation", "dossier_autorisation_tab", ),
4147 "open" => array("index.php|dossier_autorisation[module=tab]", "index.php|dossier_autorisation[module=form]", ),
4148 );
4149
4150 // Lien vers les dossiers d'autorisations qui ont une demande d'avis
4151 $links[] = array(
4152 "href" => "".OM_ROUTE_TAB."&obj=dossier_autorisation_avis",
4153 "class" => "dossier_autorisation",
4154 "title" => __("Dossiers d'autorisation"),
4155 "right" => array(
4156 "dossier_autorisation_avis",
4157 "dossier_autorisation_avis_tab",
4158 ),
4159 "open" => array("index.php|dossier_autorisation_avis[module=tab]", "index.php|dossier_autorisation[module=form]", ),
4160 );
4161
4162 //
4163 $rubrik['links'] = $links;
4164 //
4165 $menu[] = $rubrik;
4166 // }}}
4167
4168 // {{{ Rubrique GUICHET UNIQUE
4169 //
4170 $rubrik = array(
4171 "title" => __("Guichet Unique"),
4172 "class" => "guichet_unique",
4173 "right" => "menu_guichet_unique",
4174 );
4175 //
4176 $links = array();
4177 //
4178 $links[] = array(
4179 "href" => OM_ROUTE_DASHBOARD,
4180 "class" => "tableau-de-bord",
4181 "title" => __("tableau de bord"),
4182 "right" => "menu_guichet_unique_dashboard",
4183 "open" => array("index.php|[module=dashboard]",),
4184 );
4185 //
4186 $links[] = array(
4187 "class" => "category",
4188 "title" => __("nouvelle demande"),
4189 "right" => array(
4190 "demande",
4191 "demande_nouveau_dossier_ajouter",
4192 "demande_dossier_encours_ajouter", "demande_dossier_encours_tab",
4193 "demande_autre_dossier_ajouter", "demande_autre_dossier_tab",
4194 "demande_consulter","demande_tab",
4195 ),
4196 );
4197 $links[] = array(
4198 "title" => "<hr/>",
4199 "right" => array(
4200 "demande",
4201 "demande_dossier_encours_ajouter",
4202 "demande_dossier_encours_ajouter", "demande_dossier_encours_tab",
4203 ),
4204 );
4205 $links[] = array(
4206 "href" => "".OM_ROUTE_FORM."&obj=demande_nouveau_dossier&amp;action=0&amp;advs_id=&amp;tricol=&amp;valide=&amp;retour=tab&amp;new=",
4207 "class" => "nouveau-dossier",
4208 "title" => __("nouveau dossier"),
4209 "right" => array(
4210 "demande",
4211 "demande_nouveau_dossier_ajouter",
4212 ),
4213 "open" => array("index.php|demande_nouveau_dossier[module=form]",),
4214 );
4215 $links[] = array(
4216 "href" => "".OM_ROUTE_TAB."&obj=demande_dossier_encours",
4217 "class" => "dossier-existant",
4218 "title" => __("dossier en cours"),
4219 "right" => array(
4220 "demande",
4221 "demande_dossier_encours_ajouter",
4222 "demande_dossier_encours_tab",
4223 ),
4224 "open" => array("index.php|demande_dossier_encours[module=tab]", "index.php|demande_dossier_encours[module=form]"),
4225 );
4226 $links[] = array(
4227 "href" => "".OM_ROUTE_TAB."&obj=demande_autre_dossier",
4228 "class" => "autre-dossier",
4229 "title" => __("autre dossier"),
4230 "right" => array(
4231 "demande",
4232 "demande_autre_dossier_ajouter",
4233 "demande_autre_dossier_tab",
4234 ),
4235 "open" => array("index.php|demande_autre_dossier[module=tab]", "index.php|demande_autre_dossier[module=form]"),
4236 );
4237 $links[] = array(
4238 "title" => "<hr/>",
4239 "right" => array(
4240 "demande",
4241 "demande_consulter",
4242 "demande_tab"
4243 ),
4244 );
4245 $links[] = array(
4246 "href" => "".OM_ROUTE_TAB."&obj=demande",
4247 "class" => "pdf",
4248 "title" => __("recepisse"),
4249 "right" => array(
4250 "demande",
4251 "demande_consulter",
4252 "demande_tab"
4253 ),
4254 "open" => array("index.php|demande[module=tab]","index.php|demande[module=form]"),
4255 );
4256 $links[] = array(
4257 "title" => "<hr/>",
4258 "right" => array(
4259 "petitionnaire_frequent",
4260 "petitionnaire_frequent_consulter",
4261 "petitionnaire_frequent_tab"
4262 ),
4263 );
4264 $links[] = array(
4265 "href" => "".OM_ROUTE_TAB."&obj=petitionnaire_frequent",
4266 "class" => "petitionnaire_frequent",
4267 "title" => __("petitionnaire_frequent"),
4268 "right" => array(
4269 "petitionnaire_frequent",
4270 "petitionnaire_frequent_consulter",
4271 "petitionnaire_frequent_tab"
4272 ),
4273 "open" => array("index.php|petitionnaire_frequent[module=tab]","index.php|petitionnaire_frequent[module=form]"),
4274 );
4275 //
4276 $links[] = array(
4277 "class" => "category",
4278 "title" => __("affichage reglementaire"),
4279 "right" => array(
4280 "affichage_reglementaire_registre",
4281 "affichage_reglementaire_attestation",
4282 ),
4283 );
4284 $links[] = array(
4285 "title" => "<hr/>",
4286 "right" => array(
4287 "affichage_reglementaire_registre",
4288 "affichage_reglementaire_attestation",
4289 ),
4290 );
4291 $links[] = array(
4292 "href" => "".OM_ROUTE_FORM."&obj=demande_affichage_reglementaire_registre&action=110&idx=0",
4293 "class" => "affichage_reglementaire_registre",
4294 "title" => __("registre"),
4295 "right" => array(
4296 "affichage_reglementaire_registre",
4297 ),
4298 "open" => array("index.php|demande_affichage_reglementaire_registre[module=tab]", "index.php|demande_affichage_reglementaire_registre[module=form]"),
4299 );
4300 $links[] = array(
4301 "href" => "".OM_ROUTE_FORM."&obj=demande_affichage_reglementaire_attestation&action=120&idx=0",
4302 "class" => "affichage_reglementaire_attestation",
4303 "title" => __("attestation"),
4304 "right" => array(
4305 "affichage_reglementaire_attestation",
4306 ),
4307 "open" => array("index.php|demande_affichage_reglementaire_attestation[module=tab]", "index.php|demande_affichage_reglementaire_attestation[module=form]"),
4308 );
4309 //
4310 $rubrik['links'] = $links;
4311 //
4312 $menu[] = $rubrik;
4313 // }}}
4314
4315 // {{{ Rubrique QUALIFICATION
4316 //
4317 $rubrik = array(
4318 "title" => __("Qualification"),
4319 "class" => "qualification",
4320 "right" => "qualification_menu",
4321 );
4322 //
4323 $links = array();
4324 //
4325 $links[] = array(
4326 "href" => OM_ROUTE_DASHBOARD,
4327 "class" => "tableau-de-bord",
4328 "title" => __("tableau de bord"),
4329 "right" => "menu_qualification_dashboard",
4330 "open" => array("index.php|[module=dashboard]",),
4331 );
4332
4333 //
4334 $links[] = array(
4335 "href" => "".OM_ROUTE_TAB."&obj=dossier_qualifier_qualificateur",
4336 "class" => "dossier_qualifier_qualificateur",
4337 "title" => __("dossiers a qualifier"),
4338 "right" => array(
4339 "dossier_qualifier_qualificateur",
4340 "dossier_qualifier_qualificateur_tab",
4341 ),
4342 "open" => array("index.php|dossier_qualifier_qualificateur[module=tab]", "index.php|dossier_instruction[module=form]", ),
4343 );
4344
4345 //
4346 $rubrik['links'] = $links;
4347 //
4348 $menu[] = $rubrik;
4349 // }}}
4350
4351 // {{{ Rubrique INSTRUCTION
4352 //
4353 $rubrik = array(
4354 "title" => __("instruction"),
4355 "class" => "instruction",
4356 "right" => "menu_instruction",
4357 );
4358 //
4359 $links = array();
4360 //
4361 $links[] = array(
4362 "href" => OM_ROUTE_DASHBOARD,
4363 "class" => "tableau-de-bord",
4364 "title" => __("tableau de bord"),
4365 "right" => "menu_instruction_dashboard",
4366 "open" => array("index.php|[module=dashboard]",),
4367 );
4368 // Catégorie DOSSIERS D'INSTRUCTION
4369 $links[] = array(
4370 "class" => "category",
4371 "title" => __("dossiers d'instruction"),
4372 "right" => array(
4373 "dossier_instruction_mes_encours", "dossier_instruction_mes_encours_tab",
4374 "dossier_instruction_tous_encours", "dossier_instruction_tous_encours_tab",
4375 "dossier_instruction_mes_clotures", "dossier_instruction_mes_clotures_tab",
4376 "dossier_instruction_tous_clotures", "dossier_instruction_tous_clotures_tab",
4377 "dossier_instruction", "dossier_instruction_tab",
4378 "PC_modificatif", "PC_modificatif_tab",
4379 ),
4380 );
4381 $links[] = array(
4382 "title" => "<hr/>",
4383 "right" => array(
4384 "dossier_instruction_mes_encours", "dossier_instruction_mes_encours_tab",
4385 "dossier_instruction_tous_encours", "dossier_instruction_tous_encours_tab",
4386 ),
4387 );
4388 //
4389 $links[] = array(
4390 "href" => "".OM_ROUTE_TAB."&obj=dossier_instruction_mes_encours",
4391 "class" => "dossier_instruction_mes_encours",
4392 "title" => __("mes encours"),
4393 "right" => array("dossier_instruction_mes_encours", "dossier_instruction_mes_encours_tab", ),
4394 "open" => array("index.php|dossier_instruction_mes_encours[module=tab]", "index.php|dossier_instruction_mes_encours[module=form]", ),
4395 );
4396 //
4397 $links[] = array(
4398 "href" => "".OM_ROUTE_TAB."&obj=dossier_instruction_tous_encours",
4399 "class" => "dossier_instruction_tous_encours",
4400 "title" => __("tous les encours"),
4401 "right" => array("dossier_instruction_tous_encours", "dossier_instruction_tous_encours_tab", ),
4402 "open" => array("index.php|dossier_instruction_tous_encours[module=tab]", "index.php|dossier_instruction_tous_encours[module=form]", ),
4403 );
4404 //
4405 $links[] = array(
4406 "title" => "<hr/>",
4407 "right" => array(
4408 "dossier_instruction_mes_clotures", "dossier_instruction_mes_clotures_tab",
4409 "dossier_instruction_tous_clotures", "dossier_instruction_tous_clotures_tab",
4410 ),
4411 );
4412 //
4413 $links[] = array(
4414 "href" => "".OM_ROUTE_TAB."&obj=dossier_instruction_mes_clotures",
4415 "class" => "dossier_instruction_mes_clotures",
4416 "title" => __("mes clotures"),
4417 "right" => array("dossier_instruction_mes_clotures", "dossier_instruction_mes_clotures_tab", ),
4418 "open" => array("index.php|dossier_instruction_mes_clotures[module=tab]", "index.php|dossier_instruction_mes_clotures[module=form]", ),
4419 );
4420 //
4421 $links[] = array(
4422 "href" => "".OM_ROUTE_TAB."&obj=dossier_instruction_tous_clotures",
4423 "class" => "dossier_instruction_tous_clotures",
4424 "title" => __("tous les clotures"),
4425 "right" => array("dossier_instruction_tous_clotures", "dossier_instruction_tous_clotures_tab", ),
4426 "open" => array("index.php|dossier_instruction_tous_clotures[module=tab]", "index.php|dossier_instruction_tous_clotures[module=form]", ),
4427 );
4428 //
4429 $links[] = array(
4430 "title" => "<hr/>",
4431 "right" => array(
4432 "dossier_instruction", "dossier_instruction_tab",
4433 ),
4434 );
4435 //
4436 $links[] = array(
4437 "href" => "".OM_ROUTE_TAB."&obj=dossier_instruction",
4438 "class" => "dossier_instruction_recherche",
4439 "title" => __("recherche"),
4440 "right" => array("dossier_instruction", "dossier_instruction_tab", ),
4441 "open" => array("index.php|dossier_instruction[module=tab]", "index.php|dossier_instruction[module=form]", ),
4442 );
4443
4444 // Catégorier Qualification
4445 $links[] = array(
4446 "class" => "category",
4447 "title" => __("qualification"),
4448 "right" => array("dossier_qualifier", "architecte_frequent",),
4449 );
4450 //
4451 $links[] = array(
4452 "title" => "<hr/>",
4453 "right" => array("dossier_qualifier", "architecte_frequent", ),
4454 );
4455 //
4456 $links[] = array(
4457 "href" => "".OM_ROUTE_TAB."&obj=dossier_qualifier",
4458 "class" => "dossier_qualifier",
4459 "title" => __("dossiers a qualifier"),
4460 "right" => array("dossier_qualifier", "dossier_qualifier_tab", ),
4461 "open" => array("index.php|dossier_qualifier[module=tab]", "index.php|dossier_qualifier[module=form]", ),
4462 );
4463 //
4464 $links[] = array(
4465 "href" => "".OM_ROUTE_TAB."&obj=architecte_frequent",
4466 "class" => "architecte_frequent",
4467 "title" => __("architecte_frequent"),
4468 "right" => array("architecte_frequent", "architecte_frequent_tab", ),
4469 "open" => array("index.php|architecte_frequent[module=tab]", "index.php|architecte_frequent[module=form]", ),
4470 );
4471 // Catégorie CONSULTATIONS
4472 $links[] = array(
4473 "class" => "category",
4474 "title" => __("consultations"),
4475 "right" => array(
4476 "consultation",
4477 "consultation_mes_retours",
4478 "consultation_retours_ma_division",
4479 "consultation_tous_retours",
4480 ),
4481 );
4482 $links[] = array(
4483 "title" => "<hr/>",
4484 "right" => array(
4485 "consultation",
4486 "consultation_mes_retours",
4487 "consultation_retours_ma_division",
4488 "consultation_tous_retours",
4489 ),
4490 );
4491 $links[] = array(
4492 "href" => "".OM_ROUTE_TAB."&obj=consultation_mes_retours",
4493 "class" => "consultation_mes_retours",
4494 "title" => __("Mes retours"),
4495 "right" => array(
4496 "consultation",
4497 "consultation_mes_retours",
4498 "consultation_mes_retours_tab",
4499 ),
4500 "open" => array("index.php|consultation_mes_retours[module=tab]", "index.php|consultation_mes_retours[module=form]", ),
4501 );
4502 $links[] = array(
4503 "href" => "".OM_ROUTE_TAB."&obj=consultation_retours_ma_division",
4504 "class" => "consultation_retours_ma_division",
4505 "title" => __("Retours de ma division"),
4506 "right" => array(
4507 "consultation",
4508 "consultation_retours_ma_division",
4509 "consultation_retours_ma_division_tab",
4510 ),
4511 "open" => array("index.php|consultation_retours_ma_division[module=tab]", "index.php|consultation_retours_ma_division[module=form]", ),
4512 );
4513 $links[] = array(
4514 "href" => "".OM_ROUTE_TAB."&obj=consultation_tous_retours",
4515 "class" => "consultation_tous_retours",
4516 "title" => __("Tous les retours"),
4517 "right" => array(
4518 "consultation_tous_retours",
4519 "consultation_tous_retours_tab",
4520 ),
4521 "open" => array("index.php|consultation_tous_retours[module=tab]", "index.php|consultation_tous_retours[module=form]", ),
4522 );
4523 // Catégorie MESSAGES
4524 $links[] = array(
4525 "class" => "category",
4526 "title" => __("Messages"),
4527 "right" => array(
4528 "messages",
4529 "messages_mes_retours",
4530 "messages_retours_ma_division",
4531 "messages_tous_retours",
4532 ),
4533 );
4534 //
4535 $links[] = array(
4536 "title" => "<hr/>",
4537 "right" => array(
4538 "messages",
4539 "messages_mes_retours",
4540 "messages_retours_ma_division",
4541 "messages_tous_retours",
4542 ),
4543 );
4544 //
4545 $links[] = array(
4546 "href" => "".OM_ROUTE_TAB."&obj=messages_mes_retours",
4547 "class" => "messages_mes_retours",
4548 "title" => __("Mes messages"),
4549 "right" => array(
4550 "messages",
4551 "messages_mes_retours",
4552 "messages_mes_retours_tab",
4553 ),
4554 "open" => array("index.php|messages_mes_retours[module=tab]", "index.php|messages_mes_retours[module=form]", ),
4555 );
4556 //
4557 $links[] = array(
4558 "href" => "".OM_ROUTE_TAB."&obj=messages_retours_ma_division",
4559 "class" => "messages_retours_ma_division",
4560 "title" => __("Messages de ma division"),
4561 "right" => array(
4562 "messages",
4563 "messages_retours_ma_division",
4564 "messages_retours_ma_division_tab",
4565 ),
4566 "open" => array("index.php|messages_retours_ma_division[module=tab]", "index.php|messages_retours_ma_division[module=form]", ),
4567 );
4568 //
4569 $links[] = array(
4570 "href" => "".OM_ROUTE_TAB."&obj=messages_tous_retours",
4571 "class" => "messages_tous_retours",
4572 "title" => __("Tous les messages"),
4573 "right" => array(
4574 "messages",
4575 "messages_tous_retours",
4576 "messages_tous_retours_tab",
4577 ),
4578 "open" => array("index.php|messages_tous_retours[module=tab]", "index.php|messages_tous_retours[module=form]", ),
4579 );
4580 // Catégorie COMMISSIONS
4581 $links[] = array(
4582 "class" => "category",
4583 "title" => __("commissions"),
4584 "right" => array(
4585 "commission_mes_retours",
4586 "commission_mes_retours_tab",
4587 "commission_retours_ma_division",
4588 "commission_retours_ma_division_tab",
4589 "commission_tous_retours",
4590 "commission_tous_retours_tab",
4591 ),
4592 );
4593 $links[] = array(
4594 "title" => "<hr/>",
4595 "right" => array(
4596 "commission_mes_retours",
4597 "commission_mes_retours_tab",
4598 "commission_retours_ma_division",
4599 "commission_retours_ma_division_tab",
4600 "commission_tous_retours",
4601 "commission_tous_retours_tab",
4602 ),
4603 );
4604 $links[] = array(
4605 "href" => "".OM_ROUTE_TAB."&obj=commission_mes_retours",
4606 "class" => "commission_mes_retours",
4607 "title" => __("Mes retours"),
4608 "right" => array(
4609 "commission_mes_retours",
4610 "commission_mes_retours_tab",
4611 ),
4612 "open" => array("index.php|commission_mes_retours[module=tab]", "index.php|commission_mes_retours[module=form]", ),
4613 );
4614 $links[] = array(
4615 "href" => "".OM_ROUTE_TAB."&obj=commission_retours_ma_division",
4616 "class" => "commission_retours_ma_division",
4617 "title" => __("Retours de ma division"),
4618 "right" => array(
4619 "commission_retours_ma_division",
4620 "commission_retours_ma_division_tab",
4621 ),
4622 "open" => array("index.php|commission_retours_ma_division[module=tab]", "index.php|commission_retours_ma_division[module=form]", ),
4623 );
4624 $links[] = array(
4625 "href" => "".OM_ROUTE_TAB."&obj=commission_tous_retours",
4626 "class" => "commission_tous_retours",
4627 "title" => __("Tous les retours"),
4628 "right" => array(
4629 "commission_tous_retours",
4630 "commission_tous_retours_tab",
4631 ),
4632 "open" => array("index.php|commission_tous_retours[module=tab]", "index.php|commission_tous_retours[module=form]", ),
4633 );
4634
4635 //
4636 $rubrik['links'] = $links;
4637 //
4638 $menu[] = $rubrik;
4639 // }}}
4640
4641 // {{{ Rubrique Contentieux
4642 //
4643 $rubrik = array(
4644 "title" => __("Contentieux"),
4645 "class" => "contentieux",
4646 "right" => "menu_contentieux",
4647 );
4648 //
4649 $links = array();
4650 //
4651 $links[] = array(
4652 "href" => OM_ROUTE_DASHBOARD,
4653 "class" => "tableau-de-bord",
4654 "title" => __("tableau de bord"),
4655 "right" => "menu_contentieux_dashboard",
4656 "open" => array("index.php|[module=dashboard]", "index.php|dossier_contentieux_contradictoire[module=tab]", "index.php|dossier_contentieux_ait[module=tab]", "index.php|dossier_contentieux_audience[module=tab]", "index.php|dossier_contentieux_clotures[module=tab]", "index.php|dossier_contentieux_inaffectes[module=tab]", "index.php|dossier_contentieux_alerte_visite[module=tab]", "index.php|dossier_contentieux_alerte_parquet[module=tab]", ),
4657 );
4658 // Catégorie Nouvelle demande
4659 $links[] = array(
4660 "class" => "category",
4661 "title" => __("Nouvelle demande"),
4662 "right" => array(
4663 "demande_nouveau_dossier_contentieux_ajouter",
4664 ),
4665 );
4666 $links[] = array(
4667 "href" => "".OM_ROUTE_FORM."&obj=demande_nouveau_dossier_contentieux&amp;action=0&amp;advs_id=&amp;tricol=&amp;valide=&amp;retour=tab&amp;new=",
4668 "class" => "nouveau-dossier",
4669 "title" => __("nouveau dossier"),
4670 "right" => array(
4671 "demande_nouveau_dossier_contentieux_ajouter",
4672 ),
4673 "open" => array("index.php|demande_nouveau_dossier_contentieux[module=form]",),
4674 );
4675 // Catégorie Recours
4676 $links[] = array(
4677 "class" => "category",
4678 "title" => __("Recours"),
4679 "right" => array(
4680 "dossier_contentieux_mes_recours", "dossier_contentieux_mes_recours_tab",
4681 "dossier_contentieux_tous_recours", "dossier_contentieux_tous_recours_tab",
4682 ),
4683 );
4684 //
4685 $links[] = array(
4686 "href" => "".OM_ROUTE_TAB."&obj=dossier_contentieux_mes_recours",
4687 "class" => "dossier_contentieux_mes_recours",
4688 "title" => __("Mes recours"),
4689 "right" => array("dossier_contentieux_mes_recours", "dossier_contentieux_mes_recours_tab", ),
4690 "open" => array("index.php|dossier_contentieux_mes_recours[module=tab]", "index.php|dossier_contentieux_mes_recours[module=form]", ),
4691 );
4692 $links[] = array(
4693 "href" => "".OM_ROUTE_TAB."&obj=dossier_contentieux_tous_recours",
4694 "class" => "dossier_contentieux_tous_recours",
4695 "title" => __("Tous les recours"),
4696 "right" => array("dossier_contentieux_tous_recours", "dossier_contentieux_tous_recours_tab", ),
4697 "open" => array("index.php|dossier_contentieux_tous_recours[module=tab]", "index.php|dossier_contentieux_tous_recours[module=form]", ),
4698 );
4699 // Catégorie Infractions
4700 $links[] = array(
4701 "class" => "category",
4702 "title" => __("Infractions"),
4703 "right" => array(
4704 "dossier_contentieux_mes_infractions", "dossier_contentieux_mes_infractions_tab",
4705 "dossier_contentieux_toutes_infractions", "dossier_contentieux_toutes_infractions_tab",
4706 ),
4707 );
4708 //
4709 $links[] = array(
4710 "href" => "".OM_ROUTE_TAB."&obj=dossier_contentieux_mes_infractions",
4711 "class" => "dossier_contentieux_mes_infractions",
4712 "title" => __("Mes infractions"),
4713 "right" => array("dossier_contentieux_mes_infractions", "dossier_contentieux_mes_infractions_tab", ),
4714 "open" => array("index.php|dossier_contentieux_mes_infractions[module=tab]", "index.php|dossier_contentieux_mes_infractions[module=form]", ),
4715 );
4716 //
4717 $links[] = array(
4718 "href" => "".OM_ROUTE_TAB."&obj=dossier_contentieux_toutes_infractions",
4719 "class" => "dossier_contentieux_toutes_infractions",
4720 "title" => __("Toutes les infractions"),
4721 "right" => array("dossier_contentieux_toutes_infractions", "dossier_contentieux_toutes_infractions_tab", ),
4722 "open" => array("index.php|dossier_contentieux_toutes_infractions[module=tab]", "index.php|dossier_contentieux_toutes_infractions[module=form]", ),
4723 );
4724 // Catégorie MESSAGES
4725 $links[] = array(
4726 "class" => "category",
4727 "title" => __("Messages"),
4728 "right" => array(
4729 "messages_contentieux",
4730 "messages_contentieux_mes_retours",
4731 "messages_contentieux_retours_ma_division",
4732 "messages_contentieux_tous_retours",
4733 ),
4734 );
4735 //
4736 $links[] = array(
4737 "title" => "<hr/>",
4738 "right" => array(
4739 "messages_contentieux",
4740 "messages_contentieux_mes_retours",
4741 "messages_contentieux_retours_ma_division",
4742 "messages_contentieux_tous_retours",
4743 ),
4744 );
4745 //
4746 $links[] = array(
4747 "href" => "".OM_ROUTE_TAB."&obj=messages_contentieux_mes_retours",
4748 "class" => "messages_contentieux_mes_retours",
4749 "title" => __("Mes messages"),
4750 "right" => array(
4751 "messages_contentieux",
4752 "messages_contentieux_mes_retours",
4753 "messages_contentieux_mes_retours_tab",
4754 ),
4755 "open" => array("index.php|messages_contentieux_mes_retours[module=tab]", "index.php|messages_contentieux_mes_retours[module=form]", ),
4756 );
4757 //
4758 $links[] = array(
4759 "href" => "".OM_ROUTE_TAB."&obj=messages_contentieux_retours_ma_division",
4760 "class" => "messages_contentieux_retours_ma_division",
4761 "title" => __("Messages de ma division"),
4762 "right" => array(
4763 "messages_contentieux",
4764 "messages_contentieux_retours_ma_division",
4765 "messages_contentieux_retours_ma_division_tab",
4766 ),
4767 "open" => array("index.php|messages_contentieux_retours_ma_division[module=tab]", "index.php|messages_contentieux_retours_ma_division[module=form]", ),
4768 );
4769 //
4770 $links[] = array(
4771 "href" => "".OM_ROUTE_TAB."&obj=messages_contentieux_tous_retours",
4772 "class" => "messages_contentieux_tous_retours",
4773 "title" => __("Tous les messages"),
4774 "right" => array(
4775 "messages_contentieux",
4776 "messages_contentieux_tous_retours",
4777 "messages_contentieux_tous_retours_tab",
4778 ),
4779 "open" => array("index.php|messages_contentieux_tous_retours[module=tab]", "index.php|messages_contentieux_tous_retours[module=form]", ),
4780 );
4781
4782
4783 //
4784 $rubrik['links'] = $links;
4785 //
4786 $menu[] = $rubrik;
4787 // }}}
4788
4789 // {{{ Rubrique SUIVI
4790 //
4791 $rubrik = array(
4792 "title" => __("Suivi"),
4793 "class" => "suivi",
4794 "right" => "menu_suivi",
4795 );
4796 //
4797 $links = array();
4798 //
4799 $links[] = array(
4800 "href" => OM_ROUTE_DASHBOARD,
4801 "class" => "tableau-de-bord",
4802 "title" => __("tableau de bord"),
4803 "right" => "menu_suivi_dashboard",
4804 "open" => array("index.php|[module=dashboard]",),
4805 );
4806 $links[] = array(
4807 "class" => "category",
4808 "title" => __("suivi des pieces"),
4809 "right" => array(
4810 "instruction_suivi_retours_de_consultation", "instruction_suivi_mise_a_jour_des_dates",
4811 "instruction_suivi_envoi_lettre_rar", "instruction_suivi_bordereaux",
4812 "instruction_suivi_retours_de_consultation_consulter", "instruction_suivi_mise_a_jour_des_dates_consulter",
4813 "instruction_suivi_envoi_lettre_rar_consulter", "instruction_suivi_bordereaux_consulter",
4814 ),
4815 );
4816 //
4817 $links[] = array(
4818 "title" => "<hr/>",
4819 "right" => array(
4820 "instruction_suivi_retours_de_consultation", "instruction_suivi_mise_a_jour_des_dates",
4821 "instruction_suivi_envoi_lettre_rar", "instruction_suivi_bordereaux",
4822 "instruction_suivi_retours_de_consultation_consulter", "instruction_suivi_mise_a_jour_des_dates_consulter",
4823 "instruction_suivi_envoi_lettre_rar_consulter", "instruction_suivi_bordereaux_consulter",
4824 ),
4825 );
4826 //
4827 $links[] = array(
4828 "title" => "<hr/>",
4829 "right" => array(
4830 "instruction_suivi_mise_a_jour_des_dates", "instruction_suivi_mise_a_jour_des_dates_consulter",
4831 ),
4832 );
4833 //
4834 $links[] = array(
4835 "href" => "".OM_ROUTE_FORM."&obj=instruction_suivi_mise_a_jour_des_dates&action=170&idx=0",
4836 "class" => "suivi_mise_a_jour_des_dates",
4837 "title" => __("Mise a jour des dates"),
4838 "right" => array("instruction_suivi_mise_a_jour_des_dates", "instruction_suivi_mise_a_jour_des_dates_consulter", ),
4839 "open" => array("index.php|instruction_suivi_mise_a_jour_des_dates[module=tab]", "index.php|instruction_suivi_mise_a_jour_des_dates[module=form]"),
4840 );
4841 //
4842 $links[] = array(
4843 "title" => "<hr/>",
4844 "right" => array(
4845 "instruction_suivi_envoi_lettre_rar", "instruction_suivi_envoi_lettre_rar_consulter",
4846 ),
4847 );
4848 //
4849 $links[] = array(
4850 "href" => "".OM_ROUTE_FORM."&obj=instruction_suivi_envoi_lettre_rar&action=160&idx=0",
4851 "class" => "envoi_lettre_rar",
4852 "title" => __("envoi lettre AR"),
4853 "right" => array("instruction_suivi_envoi_lettre_rar", "instruction_suivi_envoi_lettre_rar_consulter", ),
4854 "open" => array("index.php|instruction_suivi_envoi_lettre_rar[module=tab]", "index.php|instruction_suivi_envoi_lettre_rar[module=form]"),
4855 );
4856 //
4857 $links[] = array(
4858 "title" => "<hr/>",
4859 "right" => array(
4860 "instruction_suivi_bordereaux", "instruction_suivi_bordereaux_consulter",
4861 ),
4862 );
4863 //
4864 $links[] = array(
4865 "href" => "".OM_ROUTE_FORM."&obj=instruction_suivi_bordereaux&action=150&idx=0",
4866 "class" => "bordereaux",
4867 "title" => __("Bordereaux"),
4868 "right" => array("instruction_suivi_bordereaux", "instruction_suivi_bordereaux_consulter", ),
4869 "open" => array("index.php|instruction_suivi_bordereaux[module=tab]", "index.php|instruction_suivi_bordereaux[module=form]"),
4870 );
4871 //
4872 $links[] = array(
4873 "href" => "".OM_ROUTE_FORM."&obj=bordereau_envoi_maire&action=190&idx=0",
4874 "class" => "bordereau_envoi_maire",
4875 "title" => __("Bordereau d'envoi au maire"),
4876 "right" => array("instruction_bordereau_envoi_maire","bordereau_envoi_maire"),
4877 "open" => array("index.php|bordereau_envoi_maire[module=form]",),
4878 );
4879 //
4880 $links[] = array(
4881 "class" => "category",
4882 "title" => __("Demandes d'avis"),
4883 "right" => array(
4884 "consultation_suivi_mise_a_jour_des_dates",
4885 "consultation_suivi_retours_de_consultation",
4886 ),
4887 );
4888 //
4889 $links[] = array(
4890 "href" => "".OM_ROUTE_FORM."&obj=consultation&idx=0&action=110",
4891 "class" => "demandes_avis_mise_a_jour_des_dates",
4892 "title" => __("Mise a jour des dates"),
4893 "right" => array("consultation_suivi_mise_a_jour_des_dates", ),
4894 "open" => array("index.php|consultation[module=form][action=110]"),
4895 );
4896 //
4897 $links[] = array(
4898 "href" => "".OM_ROUTE_FORM."&obj=consultation&idx=0&action=120",
4899 "class" => "consultation-retour",
4900 "title" => __("retours de consultation"),
4901 "right" => array("consultation_suivi_retours_de_consultation", ),
4902 "open" => array("index.php|consultation[module=form][action=120]", "index.php|consultation[module=form][action=100]", ),
4903 );
4904 // Catégorie COMMISSIONS
4905 $links[] = array(
4906 "class" => "category",
4907 "title" => __("commissions"),
4908 "right" => array(
4909 "commission",
4910 "commission_tab",
4911 "commission_demandes_passage",
4912 "commission_demandes_passage_tab",
4913 ),
4914 );
4915 //
4916 $links[] = array(
4917 "title" => "<hr/>",
4918 "right" => array(
4919 "commission",
4920 "commission_tab",
4921 "commission_demandes_passage",
4922 "commission_demandes_passage_tab",
4923 ),
4924 );
4925 //
4926 $links[] = array(
4927 "href" => "".OM_ROUTE_TAB."&obj=commission",
4928 "class" => "commissions",
4929 "title" => __("gestion"),
4930 "right" => array(
4931 "commission",
4932 ),
4933 "open" => array("index.php|commission[module=tab]", "index.php|commission[module=form]", ),
4934 );
4935 //
4936 $links[] = array(
4937 "href" => "".OM_ROUTE_TAB."&obj=commission_demandes_passage",
4938 "class" => "commissions-demande-passage",
4939 "title" => __("demandes"),
4940 "right" => array(
4941 "commission",
4942 "commission_demandes_passage",
4943 ),
4944 "open" => array("index.php|commission_demandes_passage[module=tab]", "index.php|commission_demandes_passage[module=form]", ),
4945 );
4946 //
4947 $rubrik['links'] = $links;
4948 //
4949 $menu[] = $rubrik;
4950 // }}}
4951
4952 // {{{ Rubrique DEMANDES D'AVIS
4953 //
4954 $rubrik = array(
4955 "title" => __("Demandes d'avis"),
4956 "class" => "demande_avis",
4957 "right" => "menu_demande_avis",
4958 );
4959 //
4960 $links = array();
4961 //
4962 $links[] = array(
4963 "href" => OM_ROUTE_DASHBOARD,
4964 "class" => "tableau-de-bord",
4965 "title" => __("tableau de bord"),
4966 "right" => "menu_demande_avis_dashboard",
4967 "open" => array("index.php|[module=dashboard]",),
4968 );
4969 //
4970 $links[] = array(
4971 "title" => "<hr/>",
4972 "right" => array(
4973 "demande_avis_encours", "demande_avis_encours_tab",
4974 "demande_avis_passee", "demande_avis_passee_tab",
4975 "demande_avis", "demande_avis_tab",
4976 ),
4977 );
4978 //
4979 $links[] = array(
4980 "href" => "".OM_ROUTE_TAB."&obj=demande_avis_encours",
4981 "class" => "demande_avis_encours",
4982 "title" => __("Demandes en cours"),
4983 "right" => array("demande_avis_encours", "demande_avis_encours_tab", ),
4984 "open" => array("index.php|demande_avis_encours[module=tab]", "index.php|demande_avis_encours[module=form]", ),
4985 );
4986
4987 $links[] = array(
4988 "href" => "".OM_ROUTE_TAB."&obj=demande_avis_passee",
4989 "class" => "demande_avis_passee",
4990 "title" => __("Demandes passees"),
4991 "right" => array("demande_avis_passee", "demande_avis_passee_tab", ),
4992 "open" => array("index.php|demande_avis_passee[module=tab]", "index.php|demande_avis_passee[module=form]", ),
4993 );
4994
4995 $links[] = array(
4996 "href" => "".OM_ROUTE_TAB."&obj=demande_avis",
4997 "class" => "demande_avis",
4998 "title" => __("Exports"),
4999 "right" => array("demande_avis", "demande_avis_tab", ),
5000 "open" => array("index.php|demande_avis[module=tab]", "index.php|demande_avis[module=form]", ),
5001 );
5002
5003 //
5004 $rubrik['links'] = $links;
5005 //
5006 $menu[] = $rubrik;
5007 // }}}
5008
5009
5010 // {{{ Rubrique NUMERISATION
5011 // Condition d'affichage de la rubrique
5012 if (isset($_SESSION['collectivite']) === true
5013 && $this->is_option_suivi_numerisation_enabled() === true) {
5014 //
5015 $rubrik = array(
5016 "title" => __("numerisation"),
5017 "class" => "numerisation",
5018 );
5019 //
5020 $links = array();
5021 //
5022 // --->
5023 $links[] = array(
5024 "class" => "category",
5025 "title" => __("traitement d'un lot"),
5026 "right" => array("num_dossier", "num_dossier_recuperation",
5027 "num_bordereau", "num_bordereau_tab", ) ,
5028 );
5029 //
5030 $links[] = array(
5031 "title" => "<hr/>",
5032 "right" => array("num_dossier_recuperation",
5033 "num_bordereau", "num_bordereau_tab", ) ,
5034 );
5035 //
5036 $links[] = array(
5037 "href" => OM_ROUTE_FORM."&obj=num_dossier_recuperation&idx=0&action=4",
5038 "class" => "num_dossier_recuperation",
5039 "title" => __("récupération du suivi des dossiers"),
5040 "right" => array( "num_dossier_recuperation", ) ,
5041 "open" => array( "index.php|num_dossier_recuperation[module=form]", ),
5042 );
5043 //
5044 $links[] = array(
5045 "title" => "<hr/>",
5046 "right" => array( "num_bordereau", "num_bordereau_tab", ) ,
5047 );
5048 //
5049 $links[] = array(
5050 "href" => OM_ROUTE_TAB."&obj=num_bordereau",
5051 "class" => "num_bordereau",
5052 "title" => __("tous les bordereaux"),
5053 "right" => array( "num_bordereau", "num_bordereau_tab", ),
5054 "open" => array("index.php|num_bordereau[module=tab]", "index.php|num_bordereau[module=form]", ),
5055 );
5056
5057 //
5058 // --->
5059 $links[] = array(
5060 "class" => "category",
5061 "title" => __("suivi dossier"),
5062 "right" => array("num_dossier_recuperation",
5063 "num_dossier", "num_dossier_tab",
5064 "num_dossier_a_attribuer", "num_dossier_a_attribuer_tab",
5065 "num_dossier_a_numeriser", "num_dossier_a_numeriser_tab",
5066 "num_dossier_traite", "num_dossier_traite_tab",
5067 ) ,
5068 );
5069 //
5070 $links[] = array(
5071 "title" => "<hr/>",
5072 "right" => array("num_dossier_recuperation",
5073 "num_dossier", "num_dossier_tab",
5074 "num_dossier_a_attribuer", "num_dossier_a_attribuer_tab",
5075 "num_dossier_a_numeriser", "num_dossier_a_numeriser_tab",
5076 "num_dossier_traite", "num_dossier_traite_tab",
5077 ) ,
5078 );
5079 //
5080 $links[] = array(
5081 "href" => OM_ROUTE_TAB."&obj=num_dossier_a_attribuer",
5082 "class" => "num_dossier_a_attribuer",
5083 "title" => __("num_dossier_a_attribuer"),
5084 "right" => array("num_dossier", "num_dossier_a_attribuer", "num_dossier_a_attribuer_tab",),
5085 "open" => array("index.php|num_dossier_a_attribuer[module=tab]","index.php|num_dossier_a_attribuer[module=form]", ),
5086 );
5087 //
5088 $links[] = array(
5089 "href" => OM_ROUTE_TAB."&obj=num_dossier_a_numeriser",
5090 "class" => "num_dossier_a_numeriser",
5091 "title" => __("num_dossier_a_numeriser"),
5092 "right" => array("num_dossier", "num_dossier_a_numeriser", "num_dossier_a_numeriser_tab",),
5093 "open" => array("index.php|num_dossier_a_numeriser[module=tab]","index.php|num_dossier_a_numeriser[module=form]", ),
5094 );
5095 //
5096 $links[] = array(
5097 "href" => OM_ROUTE_TAB."&obj=num_dossier_traite",
5098 "class" => "num_dossier_traite",
5099 "title" => __("num_dossier_traite"),
5100 "right" => array("num_dossier", "num_dossier_traite", "num_dossier_traite_tab",),
5101 "open" => array("index.php|num_dossier_traite[module=tab]","index.php|num_dossier_traite[module=form]", ),
5102 );
5103 //
5104 $links[] = array(
5105 "title" => "<hr/>",
5106 "right" => array( "num_dossier", "num_dossier_tab",) ,
5107 );
5108 //
5109 $links[] = array(
5110 "href" => OM_ROUTE_TAB."&obj=num_dossier",
5111 "class" => "num_dossier",
5112 "title" => __("tous les dossiers"),
5113 "right" => array("num_dossier", "num_dossier_tab",),
5114 "open" => array("index.php|num_dossier[module=tab]", "index.php|num_dossier[module=form]", ),
5115 );
5116
5117 //
5118 $rubrik['links'] = $links;
5119 //
5120 $menu["menu-rubrik-numerisation"] = $rubrik;
5121 // }}}
5122 }
5123
5124
5125 // Commentaire de la rubrique EXPORT qui n'est pas prévue d'être opérationnelle
5126 // dans cette version
5127 // {{{ Rubrique EXPORT
5128 //
5129 $rubrik = array(
5130 "title" => __("export / import"),
5131 "class" => "edition",
5132 "right" => "menu_export",
5133 );
5134 //
5135 $links = array();
5136
5137 //
5138 $links[] = array(
5139 "href" => "".OM_ROUTE_FORM."&obj=sitadel&action=6&idx=0",
5140 "class" => "sitadel",
5141 "title" => __("export sitadel"),
5142 "right" => "export_sitadel",
5143 "open" => "index.php|sitadel[module=form]",
5144 );
5145 //
5146 $links[] = array(
5147 "href" => "../app/versement_archives.php",
5148 "class" => "versement_archives",
5149 "title" => __("versement aux archives"),
5150 "right" => "versement_archives",
5151 "open" => "versement_archives.php|",
5152 );
5153 //
5154 $links[] = array(
5155 "href" => "../app/reqmo_pilot.php",
5156 "class" => "reqmo",
5157 "title" => __("statistiques a la demande"),
5158 "right" => "reqmo_pilot",
5159 "open" => "reqmo_pilot.php|",
5160 );
5161 //
5162 $links[] = array(
5163 "href" => OM_ROUTE_MODULE_REQMO,
5164 "class" => "reqmo",
5165 "title" => __("requetes memorisees"),
5166 "right" => "reqmo",
5167 "open" => array(
5168 "reqmo.php|",
5169 "index.php|[module=reqmo]",
5170 ),
5171 );
5172 //
5173 $rubrik['links'] = $links;
5174 //
5175 $menu[] = $rubrik;
5176 // }}}
5177
5178
5179 // {{{ Rubrique PARAMETRAGE
5180 //
5181 $rubrik = array(
5182 "title" => __("parametrage dossiers"),
5183 "class" => "parametrage-dossier",
5184 "right" => "menu_parametrage",
5185 );
5186 //
5187 $links = array();
5188 //
5189 $links[] = array(
5190 "class" => "category",
5191 "title" => __("dossiers"),
5192 "right" => array(
5193 "dossier_autorisation_type", "dossier_autorisation_type_tab",
5194 "dossier_autorisation_type_detaille",
5195 "dossier_autorisation_type_detaille_tab", "dossier_instruction_type",
5196 "dossier_instruction_type_tab", "cerfa", "cerfa_tab",
5197 ),
5198 );
5199 //
5200 $links[] = array(
5201 "title" => "<hr/>",
5202 "right" => array(
5203 "cerfa", "cerfa_tab",
5204 ),
5205 );
5206 //
5207 $links[] = array(
5208 "href" => "".OM_ROUTE_TAB."&obj=cerfa",
5209 "class" => "cerfa",
5210 "title" => __("cerfa"),
5211 "right" => array("cerfa", "cerfa_tab", ),
5212 "open" => array("index.php|cerfa[module=tab]", "index.php|cerfa[module=form]", ),
5213 );
5214 //
5215 $links[] = array(
5216 "title" => "<hr/>",
5217 "right" => array(
5218 "dossier_autorisation_type", "dossier_autorisation_type_tab",
5219 "dossier_autorisation_type_detaille",
5220 "dossier_autorisation_type_detaille_tab", "dossier_instruction_type",
5221 "dossier_instruction_type_tab",
5222 ),
5223 );
5224 //
5225 $links[] = array(
5226 "href" => "".OM_ROUTE_TAB."&obj=dossier_autorisation_type",
5227 "class" => "dossier_autorisation_type",
5228 "title" => __("type DA"),
5229 "right" => array("dossier_autorisation_type", "dossier_autorisation_type_tab", ),
5230 "open" => array("index.php|dossier_autorisation_type[module=tab]", "index.php|dossier_autorisation_type[module=form]", ),
5231 );
5232 //
5233 $links[] = array(
5234 "href" => "".OM_ROUTE_TAB."&obj=dossier_autorisation_type_detaille",
5235 "class" => "dossier_autorisation_type_detaille",
5236 "title" => __("type DA detaille"),
5237 "right" => array("dossier_autorisation_type_detaille", "dossier_autorisation_type_detaille_tab", ),
5238 "open" => array("index.php|dossier_autorisation_type_detaille[module=tab]", "index.php|dossier_autorisation_type_detaille[module=form]", ),
5239 );
5240 //
5241 $links[] = array(
5242 "href" => "".OM_ROUTE_TAB."&obj=dossier_instruction_type",
5243 "class" => "dossier_instruction_type",
5244 "title" => __("type DI"),
5245 "right" => array("dossier_instruction_type", "dossier_instruction_type_tab", ),
5246 "open" => array("index.php|dossier_instruction_type[module=tab]", "index.php|dossier_instruction_type[module=form]", ),
5247 );
5248 // Famille et Nature de travaux
5249 $links[] = array(
5250 "title" => "<hr/>",
5251 "right" => array(
5252 "famille_travaux", "famille_travaux_tab",
5253 "nature_travaux", "nature_travaux_tab",
5254 ),
5255 );
5256 //
5257 $links[] = array(
5258 "href" => "".OM_ROUTE_TAB."&obj=famille_travaux",
5259 "class" => "famille_travaux",
5260 "title" => __("Famille des travaux"),
5261 "right" => array("famille_travaux", "famille_travaux_tab", ),
5262 "open" => array(
5263 "index.php|famille_travaux[module=tab]",
5264 "index.php|famille_travaux[module=form][action=0]",
5265 "index.php|famille_travaux[module=form][action=1]",
5266 "index.php|famille_travaux[module=form][action=2]",
5267 "index.php|famille_travaux[module=form][action=3]",
5268 ),
5269 );
5270 //
5271 $links[] = array(
5272 "href" => "".OM_ROUTE_TAB."&obj=nature_travaux",
5273 "class" => "nature_travaux",
5274 "title" => __("Nature des travaux"),
5275 "right" => array("nature_travaux", "nature_travaux_tab", ),
5276 "open" => array(
5277 "index.php|nature_travaux[module=tab]",
5278 "index.php|nature_travaux[module=form][action=0]",
5279 "index.php|nature_travaux[module=form][action=1]",
5280 "index.php|nature_travaux[module=form][action=2]",
5281 "index.php|nature_travaux[module=form][action=3]",
5282 ),
5283 );
5284 //
5285 $links[] = array(
5286 "title" => "<hr/>",
5287 "right" => array(
5288 "contrainte", "contrainte_tab",
5289 "contrainte_souscategorie", "contrainte_souscategorie_tab",
5290 "contrainte_categorie", "contrainte_categorie_tab"
5291 ),
5292 );
5293 //
5294 $links[] = array(
5295 "href" => "".OM_ROUTE_TAB."&obj=contrainte",
5296 "class" => "contrainte",
5297 "title" => __("contrainte"),
5298 "right" => array("contrainte", "contrainte_tab", ),
5299 "open" => array(
5300 "index.php|contrainte[module=tab]",
5301 "index.php|contrainte[module=form][action=0]",
5302 "index.php|contrainte[module=form][action=1]",
5303 "index.php|contrainte[module=form][action=2]",
5304 "index.php|contrainte[module=form][action=3]",
5305 ),
5306 );
5307 $links[] = array(
5308 "href" => "".OM_ROUTE_TAB."&obj=enjeux",
5309 "class" => "enjeux",
5310 "title" => __("Enjeu"),
5311 "right" => array("enjeux", "enjeux_tab", ),
5312 "open" => array(
5313 "index.php|enjeux[module=tab]",
5314 "index.php|enjeux[module=form]",
5315 ),
5316 );
5317 //
5318 $links[] = array(
5319 "class" => "category",
5320 "title" => __("demandes"),
5321 "right" => array(
5322 "demande_type",
5323 "demande_type_tab", "demande_nature", "demande_nature_tab",
5324 ),
5325 );
5326 //
5327 $links[] = array(
5328 "title" => "<hr/>",
5329 "right" => array(
5330 "demande_type",
5331 "demande_type_tab", "demande_nature", "demande_nature_tab",
5332 ),
5333 );
5334 //
5335 $links[] = array(
5336 "href" => "".OM_ROUTE_TAB."&obj=demande_nature",
5337 "class" => "demande_nature",
5338 "title" => __("nature"),
5339 "right" => array("demande_nature", "demande_nature_tab", ),
5340 "open" => array("index.php|demande_nature[module=tab]", "index.php|demande_nature[module=form]", ),
5341 );
5342 //
5343 $links[] = array(
5344 "href" => "".OM_ROUTE_TAB."&obj=demande_type",
5345 "class" => "demande_type",
5346 "title" => __("type"),
5347 "right" => array("demande_type", "demande_type_tab",),
5348 "open" => array("index.php|demande_type[module=tab]", "index.php|demande_type[module=form]", ),
5349 );
5350 //
5351 $links[] = array(
5352 "class" => "category",
5353 "title" => __("workflows"),
5354 "right" => array(
5355 "workflows",
5356 "action", "action_tab", "etat",
5357 "etat_tab", "evenement", "evenement_tab", "bible", "bible_tab", "avis_decision",
5358 "avis_decision_tab", "avis_consultation", "avis_consultation_tab",
5359 "avis_decision_type", "avis_decision_type_tab",
5360 "avis_decision_nature", "avis_decision_nature_tab",
5361 ),
5362 );
5363
5364 //
5365 $links[] = array(
5366 "title" => "<hr/>",
5367 "right" => array(
5368 "workflows",
5369 "action", "action_tab", "etat",
5370 "etat_tab", "evenement", "evenement_tab", "bible", "bible_tab", "avis_decision",
5371 "avis_decision_tab", "avis_consultation", "avis_consultation_tab",
5372 "avis_decision_type", "avis_decision_type_tab",
5373 "avis_decision_nature", "avis_decision_nature_tab",
5374 ),
5375 );
5376 //
5377 $links[] = array(
5378 "href" => "../app/workflows.php",
5379 "class" => "workflows",
5380 "title" => __("workflows"),
5381 "right" => array("workflows", ),
5382 "open" => array("workflows.php|", ),
5383 );
5384 //
5385 $links[] = array(
5386 "title" => "<hr/>",
5387 "right" => array(
5388 "evenement", "evenement_tab",
5389 ),
5390 );
5391 //
5392 $links[] = array(
5393 "href" => "".OM_ROUTE_TAB."&obj=evenement",
5394 "class" => "evenement",
5395 "title" => __("evenement"),
5396 "right" => array("evenement", "evenement_tab", ),
5397 "open" => array("index.php|evenement[module=tab]", "index.php|evenement[module=form]", ),
5398 );
5399 //
5400 $links[] = array(
5401 "title" => "<hr/>",
5402 "right" => array(
5403 "action", "action_tab", "etat",
5404 "etat_tab", "avis_decision",
5405 "avis_decision_tab", "avis_decision_type", "avis_decision_type_tab",
5406 "avis_decision_nature", "avis_decision_nature_tab",
5407 ),
5408 );
5409 //
5410 $links[] = array(
5411 "href" => "".OM_ROUTE_TAB."&obj=etat",
5412 "class" => "workflow-etat",
5413 "title" => __("etat"),
5414 "right" => array("etat", "etat_tab", ),
5415 "open" => array("index.php|etat[module=tab]", "index.php|etat[module=form]", ),
5416 );
5417 //
5418 $links[] = array(
5419 "href" => "".OM_ROUTE_TAB."&obj=avis_decision",
5420 "class" => "avis_decision",
5421 "title" => __("avis decision"),
5422 "right" => array("avis_decision", "avis_decision_tab", ),
5423 "open" => array("index.php|avis_decision[module=tab]", "index.php|avis_decision[module=form]", ),
5424 );
5425 //
5426 $links[] = array(
5427 "href" => "".OM_ROUTE_TAB."&obj=avis_decision_type",
5428 "class" => "avis_decision_type",
5429 "title" => __("avis_decision_type"),
5430 "right" => array("avis_decision_type", "avis_decision_type_tab", ),
5431 "open" => array("index.php|avis_decision_type[module=tab]", "index.php|avis_decision_type[module=form]", ),
5432 );
5433 //
5434 $links[] = array(
5435 "href" => "".OM_ROUTE_TAB."&obj=avis_decision_nature",
5436 "class" => "avis_decision_nature",
5437 "title" => __("avis_decision_nature"),
5438 "right" => array("avis_decision_nature", "avis_decision_nature_tab", ),
5439 "open" => array("index.php|avis_decision_nature[module=tab]", "index.php|avis_decision_nature[module=form]", ),
5440 );
5441 //
5442 $links[] = array(
5443 "href" => "".OM_ROUTE_TAB."&obj=action",
5444 "class" => "action",
5445 "title" => __("action"),
5446 "right" => array("action", "action_tab", ),
5447 "open" => array("index.php|action[module=tab]", "index.php|action[module=form]", ),
5448 );
5449 //
5450 $links[] = array(
5451 "title" => "<hr/>",
5452 "right" => array(
5453 "bible", "bible_tab",
5454 ),
5455 );
5456 //
5457 $links[] = array(
5458 "href" => "".OM_ROUTE_TAB."&obj=bible",
5459 "class" => "bible",
5460 "title" => __("bible"),
5461 "right" => array("bible", "bible_tab", ),
5462 "open" => array("index.php|bible[module=tab]", "index.php|bible[module=form]", ),
5463 );
5464 //
5465 $links[] = array(
5466 "class" => "category",
5467 "title" => __("editions"),
5468 "right" => array(
5469 "om_etat", "om_etat_tab", "om_sousetat", "om_sousetat_tab",
5470 "om_lettretype", "om_lettretype_tab", "om_requete", "om_requete_tab",
5471 "om_logo", "om_logo_tab",
5472 ),
5473 );
5474 //
5475 $links[] = array(
5476 "title" => "<hr/>",
5477 "right" => array(
5478 "om_etat", "om_etat_tab", "om_lettretype", "om_lettretype_tab",
5479 ),
5480 );
5481 //
5482 $links[] = array(
5483 "href" => "".OM_ROUTE_TAB."&obj=om_etat",
5484 "class" => "om_etat",
5485 "title" => __("om_etat"),
5486 "right" => array("om_etat", "om_etat_tab", ),
5487 "open" => array("index.php|om_etat[module=tab]", "index.php|om_etat[module=form]", ),
5488 );
5489 //
5490 $links[] = array(
5491 "href" => "".OM_ROUTE_TAB."&obj=om_lettretype",
5492 "class" => "om_lettretype",
5493 "title" => __("om_lettretype"),
5494 "right" => array("om_lettretype", "om_lettretype_tab"),
5495 "open" => array("index.php|om_lettretype[module=tab]", "index.php|om_lettretype[module=form]", ),
5496 );
5497 //
5498 $links[] = array(
5499 "title" => "<hr/>",
5500 "right" => array(
5501 "om_logo", "om_logo_tab",
5502 ),
5503 );
5504 //
5505 $links[] = array(
5506 "href" => "".OM_ROUTE_TAB."&obj=om_logo",
5507 "class" => "om_logo",
5508 "title" => __("om_logo"),
5509 "right" => array("om_logo", "om_logo_tab", ),
5510 "open" => array("index.php|om_logo[module=tab]", "index.php|om_logo[module=form]", ),
5511 );
5512 //
5513 $rubrik['links'] = $links;
5514 //
5515 $menu[] = $rubrik;
5516 // }}}
5517
5518 // {{{ Rubrique PARAMETRAGE
5519 //
5520 $rubrik = array(
5521 "title" => __("parametrage"),
5522 "class" => "parametrage",
5523 "right" => "menu_parametrage",
5524 );
5525 //
5526 $links = array();
5527 //
5528 $links[] = array(
5529 "href" => "".OM_ROUTE_TAB."&obj=civilite",
5530 "class" => "civilite",
5531 "title" => __("civilite"),
5532 "right" => array("civilite", "civilite_tab", ),
5533 "open" => array("index.php|civilite[module=tab]", "index.php|civilite[module=form]", ),
5534 );
5535 //
5536 $links[] = array(
5537 "href" => "".OM_ROUTE_TAB."&obj=arrondissement",
5538 "class" => "arrondissement",
5539 "title" => __("arrondissement"),
5540 "right" => array("arrondissement", "arrondissement_tab", ),
5541 "open" => array("index.php|arrondissement[module=tab]", "index.php|arrondissement[module=form]", ),
5542 );
5543 //
5544 $links[] = array(
5545 "href" => "".OM_ROUTE_TAB."&obj=quartier",
5546 "class" => "quartier",
5547 "title" => __("quartier"),
5548 "right" => array("quartier", "quartier_tab", ),
5549 "open" => array("index.php|quartier[module=tab]", "index.php|quartier[module=form]", ),
5550 );
5551 //
5552 $links[] = array(
5553 "class" => "category",
5554 "title" => __("Organisation"),
5555 "right" => array(
5556 "direction", "direction_tab", "division", "division_tab", "instructeur_qualite",
5557 "instructeur_qualite_tab", "instructeur", "instructeur_tab", "groupe",
5558 "groupe_tab", "genre", "genre_tab", "signataire_habilitation",
5559 "signataire_habilitation_tab", "signataire_arrete", "signataire_arrete_tab",
5560 "taxe_amenagement_tab", "taxe_amenagement",
5561 ),
5562 );
5563 $links[] = array(
5564 "title" => "<hr/>",
5565 "right" => array(
5566 "direction", "direction_tab", "division", "division_tab", "instructeur_qualite",
5567 "instructeur_qualite_tab", "instructeur", "instructeur_tab", "groupe",
5568 "groupe_tab", "genre", "genre_tab", "signataire_arrete", "signataire_arrete_tab",
5569 "taxe_amenagement_tab", "taxe_amenagement",
5570 ),
5571 );
5572 //
5573 $links[] = array(
5574 "href" => "".OM_ROUTE_TAB."&obj=genre",
5575 "class" => "genre",
5576 "title" => __("genre"),
5577 "right" => array("genre", "genre_tab", ),
5578 "open" => array("index.php|genre[module=tab]", "index.php|genre[module=form]", ),
5579 );
5580 //
5581 $links[] = array(
5582 "href" => "".OM_ROUTE_TAB."&obj=groupe",
5583 "class" => "groupe",
5584 "title" => __("groupe"),
5585 "right" => array("groupe", "groupe_tab", ),
5586 "open" => array("index.php|groupe[module=tab]", "index.php|groupe[module=form]", ),
5587 );
5588 //
5589 $links[] = array(
5590 "href" => "".OM_ROUTE_TAB."&obj=direction",
5591 "class" => "direction",
5592 "title" => __("direction"),
5593 "right" => array("direction", "direction_tab", ),
5594 "open" => array("index.php|direction[module=tab]", "index.php|direction[module=form]", ),
5595 );
5596 //
5597 $links[] = array(
5598 "href" => "".OM_ROUTE_TAB."&obj=division",
5599 "class" => "division",
5600 "title" => __("division"),
5601 "right" => array("division", "division_tab", ),
5602 "open" => array("index.php|division[module=tab]", "index.php|division[module=form]", ),
5603 );
5604 //
5605 $links[] = array(
5606 "href" => "".OM_ROUTE_TAB."&obj=instructeur_qualite",
5607 "class" => "instructeur_qualite",
5608 "title" => __("instructeur_qualite"),
5609 "right" => array("instructeur_qualite", "instructeur_qualite_tab", ),
5610 "open" => array("index.php|instructeur_qualite[module=tab]", "index.php|instructeur_qualite[module=form]", ),
5611 );
5612 //
5613 $links[] = array(
5614 "href" => "".OM_ROUTE_TAB."&obj=instructeur",
5615 "class" => "instructeur",
5616 "title" => __("instructeur"),
5617 "right" => array("instructeur", "instructeur_tab", ),
5618 "open" => array("index.php|instructeur[module=tab]", "index.php|instructeur[module=form]", ),
5619 );
5620 //
5621 $links[] = array(
5622 "href" => "".OM_ROUTE_TAB."&obj=signataire_habilitation",
5623 "class" => "signataire_habilitation",
5624 "title" => __("signataire habilitation"),
5625 "right" => array("signataire_habilitation", "signataire_habilitation", ),
5626 "open" => array("index.php|signataire_habilitation[module=tab]", "index.php|signataire_habilitation[module=form]", ),
5627 );
5628 //
5629 $links[] = array(
5630 "href" => "".OM_ROUTE_TAB."&obj=signataire_arrete",
5631 "class" => "signataire_arrete",
5632 "title" => __("signataire arrete"),
5633 "right" => array("signataire_arrete", "signataire_arrete", ),
5634 "open" => array("index.php|signataire_arrete[module=tab]", "index.php|signataire_arrete[module=form]", ),
5635 );
5636 //
5637 $links[] = array(
5638 "href" => "".OM_ROUTE_TAB."&obj=taxe_amenagement",
5639 "class" => "taxe_amenagement",
5640 "title" => __("taxes"),
5641 "right" => array("taxe_amenagement", "taxe_amenagement_tab", ),
5642 "open" => array("index.php|taxe_amenagement[module=tab]", "index.php|taxe_amenagement[module=form]", ),
5643 );
5644 //
5645 $links[] = array(
5646 "class" => "category",
5647 "title" => __("gestion des commissions"),
5648 "right" => array(
5649 "commission_type", "commission_type_tab",
5650 ),
5651 );
5652 //
5653 $links[] = array(
5654 "title" => "<hr/>",
5655 "right" => array(
5656 "commission_type", "commission_type_tab",
5657 ),
5658 );
5659 //
5660 $links[] = array(
5661 "href" => "".OM_ROUTE_TAB."&obj=commission_type",
5662 "class" => "commission-type",
5663 "title" => __("commission_type"),
5664 "right" => array("commission_type", "commission_type_tab", ),
5665 "open" => array("index.php|commission_type[module=tab]", "index.php|commission_type[module=form]", ),
5666 );
5667 //
5668 $links[] = array(
5669 "class" => "category",
5670 "title" => __("gestion des consultations"),
5671 "right" => array(
5672 "avis_consultation", "avis_consultation_tab", "service", "service_tab",
5673 "service_categorie", "service_categorie_tab",
5674 "lien_service_service_categorie", "lien_service_service_categorie_tab",
5675 ),
5676 );
5677 //
5678 $links[] = array(
5679 "title" => "<hr/>",
5680 "right" => array(
5681 "avis_consultation", "avis_consultation_tab", "service", "service_tab",
5682 "service_categorie", "service_categorie_tab",
5683 "lien_service_service_categorie", "lien_service_service_categorie_tab",
5684 ),
5685 );
5686 //
5687 $links[] = array(
5688 "href" => "".OM_ROUTE_TAB."&obj=avis_consultation",
5689 "class" => "avis_consultation",
5690 "title" => __("avis consultation"),
5691 "right" => array("avis_consultation", "avis_consultation_tab", ),
5692 "open" => array("index.php|avis_consultation[module=tab]", "index.php|avis_consultation[module=form]", ),
5693 );
5694 //
5695 $links[] = array(
5696 "href" => "".OM_ROUTE_TAB."&obj=service",
5697 "class" => "service",
5698 "title" => __("service"),
5699 "right" => array("service", "service_tab", ),
5700 "open" => array("index.php|service[module=tab]", "index.php|service[module=form]", ),
5701 );
5702 $links[] = array(
5703 "href" => "".OM_ROUTE_TAB."&obj=service_categorie",
5704 "class" => "service_categorie",
5705 "title" => __("thematique des services"),
5706 "right" => array("service_categorie", "service_categorie_tab", ),
5707 "open" => array("index.php|service_categorie[module=tab]", "index.php|service_categorie[module=form]", ),
5708 );
5709 $links[] = array(
5710 "href" => "".OM_ROUTE_TAB."&obj=categorie_tiers_consulte",
5711 "class" => "categorie_tiers_consulte",
5712 "title" => __("catégorie des tiers consultés"),
5713 "right" => array("categorie_tiers_consulte", "categorie_tiers_consulte_tab", ),
5714 "open" => array("index.php|categorie_tiers_consulte[module=tab]", "index.php|categorie_tiers_consulte[module=form]", ),
5715 );
5716 $links[] = array(
5717 "href" => "".OM_ROUTE_TAB."&obj=tiers_consulte",
5718 "class" => "tiers_consulte",
5719 "title" => __("tiers"),
5720 "right" => array("tiers_consulte", "tiers_consulte_tab", ),
5721 "open" => array("index.php|tiers_consulte[module=tab]", "index.php|tiers_consulte[module=form]", ),
5722 );
5723 $links[] = array(
5724 "href" => "".OM_ROUTE_TAB."&obj=type_habilitation_tiers_consulte",
5725 "class" => "type_habilitation_tiers_consulte",
5726 "title" => __("type d'habilitation des tiers consultés"),
5727 "right" => array("type_habilitation_tiers_consulte", "type_habilitation_tiers_consulte_tab", ),
5728 "open" => array("index.php|type_habilitation_tiers_consulte[module=tab]", "index.php|type_habilitation_tiers_consulte[module=form]", ),
5729 );
5730 $links[] = array(
5731 "href" => "".OM_ROUTE_TAB."&obj=habilitation_tiers_consulte",
5732 "class" => "habilitation_tiers_consulte",
5733 "title" => __("habilitation des tiers consultés"),
5734 "right" => array("habilitation_tiers_consulte", "habilitation_tiers_consulte_tab", ),
5735 "open" => array("index.php|habilitation_tiers_consulte[module=tab]", "index.php|habilitation_tiers_consulte[module=form]", ),
5736 );
5737 $links[] = array(
5738 "href" => "".OM_ROUTE_TAB."&obj=specialite_tiers_consulte",
5739 "class" => "specialite_tiers_consulte",
5740 "title" => __("spécialité des tiers consultés"),
5741 "right" => array("specialite_tiers_consulte", "specialite_tiers_consulte_tab", ),
5742 "open" => array("index.php|specialite_tiers_consulte[module=tab]", "index.php|specialite_tiers_consulte[module=form]", ),
5743 );
5744 $links[] = array(
5745 "href" => "".OM_ROUTE_TAB."&obj=motif_consultation",
5746 "class" => "motif_consultation",
5747 "title" => __("motif de consultation"),
5748 "right" => array("motif_consultation", "motif_consultation_tab", ),
5749 "open" => array("index.php|motif_consultation[module=tab]", "index.php|motif_consultation[module=form]", ),
5750 );
5751
5752 // Gestion des documents
5753 $links[] = array(
5754 "class" => "category",
5755 "title" => __("Gestion des documents"),
5756 "right" => array(
5757 "document_type_categorie", "document_type_tab",
5758 "document_type", "document_type_tab",
5759 ),
5760 );
5761 //
5762 $links[] = array(
5763 "title" => "<hr/>",
5764 "right" => array(
5765 "document_type_categorie", "document_type_categorie_tab",
5766 "document_type", "document_type_tab",
5767 ),
5768 );
5769 //
5770 $links[] = array(
5771 "href" => "".OM_ROUTE_TAB."&obj=document_type_categorie",
5772 "class" => "document_type_categorie",
5773 "title" => __("catégorie des documents"),
5774 "right" => array("document_type_categorie", "document_type_categorie_tab", ),
5775 "open" => array("index.php|document_type_categorie[module=tab]", "index.php|document_type_categorie[module=form]", ),
5776 );
5777 $links[] = array(
5778 "href" => "".OM_ROUTE_TAB."&obj=document_type",
5779 "class" => "document_type",
5780 "title" => __("type des documents"),
5781 "right" => array("document_type", "document_type_tab", ),
5782 "open" => array("index.php|document_type[module=tab]", "index.php|document_type[module=form]", ),
5783 );
5784
5785 // Gestion des dossiers
5786 $links[] = array(
5787 "class" => "category",
5788 "title" => __("Gestion des dossiers"),
5789 "right" => array(
5790 "dossier_autorisation_type", "dossier_autorisation_type_tab",
5791 "dossier_autorisation_type_detaille",
5792 "dossier_autorisation_type_detaille_tab", "dossier_instruction_type",
5793 "dossier_instruction_type_tab",
5794 "autorite_competente", "autorite_competente_tab",
5795 "affectation_automatique", "affectation_automatique_tab",
5796 "pec_metier", "pec_metier_tab",
5797 ),
5798 );
5799 //
5800 $links[] = array(
5801 "title" => "<hr/>",
5802 "right" => array(
5803 "dossier_autorisation_type", "dossier_autorisation_type_tab",
5804 "dossier_autorisation_type_detaille",
5805 "dossier_autorisation_type_detaille_tab", "dossier_instruction_type",
5806 "dossier_instruction_type_tab",
5807 "autorite_competente", "autorite_competente_tab",
5808 "affectation_automatique", "affectation_automatique_tab",
5809 "pec_metier", "pec_metier_tab",
5810 ),
5811 );
5812 //
5813 $links[] = array(
5814 "href" => "".OM_ROUTE_TAB."&obj=etat_dossier_autorisation",
5815 "class" => "etat_dossier_autorisation",
5816 "title" => __("etat dossiers autorisations"),
5817 "right" => array("etat_dossier_autorisation", "etat_dossier_autorisation_tab", ),
5818 "open" => array("index.php|etat_dossier_autorisation[module=tab]", "index.php|etat_dossier_autorisation[module=form]", ),
5819 );
5820 //
5821 $links[] = array(
5822 "href" => "".OM_ROUTE_TAB."&obj=affectation_automatique",
5823 "class" => "affectation_automatique",
5824 "title" => __("affectation automatique"),
5825 "right" => array("affectation_automatique", "affectation_automatique_tab", ),
5826 "open" => array("index.php|affectation_automatique[module=tab]", "index.php|affectation_automatique[module=form]", ),
5827 );
5828 //
5829 $links[] = array(
5830 "href" => "".OM_ROUTE_TAB."&obj=autorite_competente",
5831 "class" => "autorite_competente",
5832 "title" => _ ("autorite")." ".__("competente"),
5833 "right" => array("autorite_competente", "autorite_competente_tab", ),
5834 "open" => array("index.php|autorite_competente[module=tab]", "index.php|autorite_competente[module=form]", ),
5835 );
5836 //
5837 $links[] = array(
5838 "href" => "".OM_ROUTE_TAB."&obj=phase",
5839 "class" => "phase",
5840 "title" => __("phase"),
5841 "right" => array("phase", "phase_tab", ),
5842 "open" => array("index.php|phase[module=tab]", "index.php|phase[module=form]", ),
5843 );
5844 //
5845 $links[] = array(
5846 "href" => "".OM_ROUTE_TAB."&obj=pec_metier",
5847 "class" => "pec_metier",
5848 "title" => __("pec_metier"),
5849 "right" => array("pec_metier", "pec_metier_tab", ),
5850 "open" => array("index.php|pec_metier[module=tab]", "index.php|pec_metier[module=form]", ),
5851 );
5852 //
5853 $links[] = array(
5854 "href" => "".OM_ROUTE_TAB."&obj=modele_rapport_instruction",
5855 "class" => "modele_rapport_instruction",
5856 "title" => __("Modèle d'analyse du rapport d'instruction"),
5857 "right" => array("modele_rapport_instruction", "modele_rapport_instruction_tab", ),
5858 "open" => array("index.php|modele_rapport_instruction[module=tab]", "index.php|modele_rapport_instruction[module=form]", ),
5859 );
5860
5861 // Gestion des pièces
5862 $links[] = array(
5863 "class" => "category",
5864 "title" => __("Gestion des pièces"),
5865 "right" => array(
5866 "document_numerise_type_categorie", "document_numerise_type_categorie_tab",
5867 "document_numerise_type",
5868 "document_numerise_type_tab", "document_numerise_traitement_metadonnees",
5869 "document_numerise_traitement_metadonnees_executer",
5870 ),
5871 );
5872 //
5873 $links[] = array(
5874 "title" => "<hr/>",
5875 "right" => array(
5876 "document_numerise_type_categorie", "document_numerise_type_categorie_tab",
5877 "document_numerise_type",
5878 "document_numerise_type_tab", "document_numerise_traitement_metadonnees",
5879 "document_numerise_traitement_metadonnees_executer",
5880 ),
5881 );
5882 //
5883 $links[] = array(
5884 "href" => "".OM_ROUTE_TAB."&obj=document_numerise_type_categorie",
5885 "class" => "document_numerise_type_categorie",
5886 "title" => __("Catégorie des pièces"),
5887 "right" => array(
5888 "document_numerise_type_categorie",
5889 "document_numerise_type_categorie_tab",
5890 ),
5891 "open" => array(
5892 "index.php|document_numerise_type_categorie[module=tab]",
5893 "index.php|document_numerise_type_categorie[module=form]",
5894 ),
5895 );
5896 //
5897 $links[] = array(
5898 "href" => "".OM_ROUTE_TAB."&obj=document_numerise_type",
5899 "class" => "document_numerise_type",
5900 "title" => __("Type des pièces"),
5901 "right" => array(
5902 "document_numerise_type",
5903 "document_numerise_type_tab",
5904 ),
5905 "open" => array(
5906 "index.php|document_numerise_type[module=tab]",
5907 "index.php|document_numerise_type[module=form][action=0]",
5908 "index.php|document_numerise_type[module=form][action=1]",
5909 "index.php|document_numerise_type[module=form][action=2]",
5910 "index.php|document_numerise_type[module=form][action=3]",
5911 ),
5912 );
5913 //
5914 $links[] = array(
5915 "href" => "".OM_ROUTE_TAB."&obj=lien_document_n_type_d_i_t",
5916 "class" => "lien_document_n_type_d_i_t",
5917 "title" => __("Nomenclature des pièces"),
5918 "right" => array(
5919 "lien_document_n_type_d_i_t",
5920 "lien_document_n_type_d_i_t_tab",
5921 ),
5922 "open" => array(
5923 "index.php|lien_document_n_type_d_i_t[module=tab]",
5924 "index.php|lien_document_n_type_d_i_t[module=form][action=0]",
5925 "index.php|lien_document_n_type_d_i_t[module=form][action=1]",
5926 "index.php|lien_document_n_type_d_i_t[module=form][action=2]",
5927 "index.php|lien_document_n_type_d_i_t[module=form][action=3]",
5928 ),
5929 );
5930 //
5931 $links[] = array(
5932 "href" => "".OM_ROUTE_FORM."&obj=document_numerise_traitement_metadonnees&action=100&idx=0",
5933 "class" => "document_numerise_traitement_metadonnees",
5934 "title" => __("Mise à jour des métadonnées"),
5935 "description" => __("Mettre à jour les métadonnées de tous les documents numérisés."),
5936 "right" => array(
5937 "document_numerise_traitement_metadonnees",
5938 "document_numerise_traitement_metadonnees_executer",
5939 ),
5940 "open" => array("index.php|document_numerise_traitement_metadonnees[module=form]", ),
5941 );
5942
5943 // Gestion des contentieux
5944 $links[] = array(
5945 "class" => "category",
5946 "title" => __("Gestion des contentieux"),
5947 "right" => array(
5948 "objet_recours", "objet_recours_tab", "moyen_souleve", "moyen_souleve_tab",
5949 "moyen_retenu_juge", "moyen_retenu_juge_tab",
5950 ),
5951 );
5952 //
5953 $links[] = array(
5954 "title" => "<hr/>",
5955 "right" => array(
5956 "objet_recours", "objet_recours_tab", "moyen_souleve", "moyen_souleve_tab",
5957 "moyen_retenu_juge", "moyen_retenu_juge_tab",
5958 ),
5959 );
5960 //
5961 $links[] = array(
5962 "href" => "".OM_ROUTE_TAB."&obj=objet_recours",
5963 "class" => "objet_recours",
5964 "title" => __("objet_recours"),
5965 "right" => array(
5966 "objet_recours", "objet_recours_tab",
5967 ),
5968 "open" => array(
5969 "index.php|objet_recours[module=tab]", "index.php|objet_recours[module=form]",
5970 ),
5971 );
5972 //
5973 $links[] = array(
5974 "href" => "".OM_ROUTE_TAB."&obj=moyen_souleve",
5975 "class" => "moyen_souleve",
5976 "title" => __("moyen_souleve"),
5977 "right" => array(
5978 "moyen_souleve", "moyen_souleve_tab",
5979 ),
5980 "open" => array(
5981 "index.php|moyen_souleve[module=tab]", "index.php|moyen_souleve[module=form]",
5982 ),
5983 );
5984 //
5985 $links[] = array(
5986 "href" => "".OM_ROUTE_TAB."&obj=moyen_retenu_juge",
5987 "class" => "moyen_retenu_juge",
5988 "title" => __("moyen_retenu_juge"),
5989 "right" => array(
5990 "moyen_retenu_juge", "moyen_retenu_juge_tab",
5991 ),
5992 "open" => array(
5993 "index.php|moyen_retenu_juge[module=tab]", "index.php|moyen_retenu_juge[module=form]",
5994 ),
5995 );
5996
5997 //
5998 $links[] = array(
5999 "class" => "category",
6000 "title" => __("géolocalisation"),
6001 "right" => array(
6002 "sig_groupe",
6003 "sig_sousgroupe",
6004 "sig_contrainte"
6005 ),
6006 );
6007 //
6008 $links[] = array(
6009 "href" => "".OM_ROUTE_TAB."&obj=sig_couche",
6010 "class" => "sig_couche",
6011 "title" => __("Couches"),
6012 "right" => array("sig_contrainte", "sig_contrainte_tab","sig_couche", "sig_couche_tab", ),
6013 "open" => array("index.php|sig_couche[module=tab]", "index.php|sig_couche[module=form]", ),
6014 );
6015 //
6016 $links[] = array(
6017 "href" => "".OM_ROUTE_TAB."&obj=sig_groupe",
6018 "class" => "sig_groupe",
6019 "title" => __("sig_groupe"),
6020 "right" => array(
6021 "sig_groupe", "sig_groupe_tab",
6022 ),
6023 "open" => array(
6024 "index.php|sig_groupe[module=tab]", "index.php|sig_groupe[module=form]",
6025 ),
6026 );
6027 //
6028 $links[] = array(
6029 "href" => "".OM_ROUTE_TAB."&obj=sig_sousgroupe",
6030 "class" => "sig_sousgroupe",
6031 "title" => __("sig_sousgroupe"),
6032 "right" => array(
6033 "sig_sousgroupe", "sig_sousgroupe_tab",
6034 ),
6035 "open" => array(
6036 "index.php|sig_sousgroupe[module=tab]", "index.php|sig_sousgroupe[module=form]",
6037 ),
6038 );
6039 //
6040 $links[] = array(
6041 "href" => "".OM_ROUTE_TAB."&obj=sig_contrainte",
6042 "class" => "sig_contrainte",
6043 "title" => __("sig_contrainte"),
6044 "right" => array(
6045 "sig_contrainte", "sig_contrainte_tab", "sig_attribut", "sig_attribut_tab"
6046 ),
6047 "open" => array(
6048 "index.php|sig_contrainte[module=tab]", "index.php|sig_contrainte[module=form]",
6049 ),
6050 );
6051 //
6052 $rubrik['links'] = $links;
6053 //
6054 $menu[] = $rubrik;
6055 // }}}
6056
6057 // {{{ Rubrique ADMINISTRATION
6058 //
6059 $rubrik = array(
6060 "title" => __("administration"),
6061 "class" => "administration",
6062 "right" => "menu_administration",
6063 );
6064 //
6065 $links = array();
6066 //
6067 // Renomme la collectivité en service
6068 $om_collectivite_title = __("om_collectivite");
6069 if (isset($_SESSION['collectivite']) === true
6070 && $this->is_option_renommer_collectivite_enabled() === true) {
6071 //
6072 $om_collectivite_title = __("service");
6073 }
6074 $links[] = array(
6075 "href" => "".OM_ROUTE_TAB."&obj=om_collectivite",
6076 "class" => "collectivite",
6077 "title" => $om_collectivite_title,
6078 "right" => array("om_collectivite", "om_collectivite_tab", ),
6079 "open" => array("index.php|om_collectivite[module=tab]", "index.php|om_collectivite[module=form]", ),
6080 );
6081 //
6082 $links[] = array(
6083 "href" => "".OM_ROUTE_TAB."&obj=om_parametre",
6084 "class" => "parametre",
6085 "title" => __("om_parametre"),
6086 "right" => array("om_parametre", "om_parametre_tab", ),
6087 "open" => array("index.php|om_parametre[module=tab]", "index.php|om_parametre[module=form]", ),
6088 );
6089 //
6090 $links[] = array(
6091 "title" => "<hr/>",
6092 "right" => array("commune", "commune_tab", )
6093 );
6094 $links[] = array(
6095 "href" => "".OM_ROUTE_TAB."&obj=commune",
6096 "title" => __("communes"),
6097 "right" => array("commune", "commune_tab"),
6098 "open" => array("index.php|commune[module=tab]", "index.php|commune[module=form]", ),
6099 );
6100 $links[] = array(
6101 "href" => "".OM_ROUTE_TAB."&obj=departement",
6102 "title" => __("départements"),
6103 "right" => array("departement", "departement_tab"),
6104 "open" => array("index.php|departement[module=tab]", "index.php|departement[module=form]")
6105 );
6106 $links[] = array(
6107 "href" => "".OM_ROUTE_TAB."&obj=region",
6108 "title" => __("régions"),
6109 "right" => array("region", "region_tab"),
6110 "open" => array("index.php|region[module=tab]", "index.php|region[module=form]")
6111 );
6112 //
6113 $links[] = array(
6114 "class" => "category",
6115 "title" => __("gestion des utilisateurs"),
6116 "right" => array(
6117 "om_utilisateur", "om_utilisateur_tab", "om_profil", "om_profil_tab",
6118 "om_droit", "om_droit_tab", "directory",
6119 ),
6120 );
6121 //
6122 $links[] = array(
6123 "title" => "<hr/>",
6124 "right" => array(
6125 "om_utilisateur", "om_utilisateur_tab", "om_profil", "om_profil_tab",
6126 "om_droit", "om_droit_tab",
6127 ),
6128 );
6129 //
6130 $links[] = array(
6131 "href" => "".OM_ROUTE_TAB."&obj=om_profil",
6132 "class" => "profil",
6133 "title" => __("om_profil"),
6134 "right" => array("om_profil", "om_profil_tab", ),
6135 "open" => array("index.php|om_profil[module=tab]", "index.php|om_profil[module=form]", ),
6136 );
6137 //
6138 $links[] = array(
6139 "href" => "".OM_ROUTE_TAB."&obj=om_droit",
6140 "class" => "droit",
6141 "title" => __("om_droit"),
6142 "right" => array("om_droit", "om_droit_tab", ),
6143 "open" => array("index.php|om_droit[module=tab]", "index.php|om_droit[module=form]", ),
6144 );
6145 //
6146 $links[] = array(
6147 "href" => "".OM_ROUTE_TAB."&obj=om_utilisateur",
6148 "class" => "utilisateur",
6149 "title" => __("om_utilisateur"),
6150 "right" => array("om_utilisateur", "om_utilisateur_tab", ),
6151 "open" => array(
6152 "index.php|om_utilisateur[module=tab]",
6153 "index.php|om_utilisateur[module=form][action=0]",
6154 "index.php|om_utilisateur[module=form][action=1]",
6155 "index.php|om_utilisateur[module=form][action=2]",
6156 "index.php|om_utilisateur[module=form][action=3]",
6157 ),
6158 );
6159 //
6160 $links[] = array(
6161 "title" => "<hr/>",
6162 "right" => array("om_utilisateur", "om_utilisateur_synchroniser", ),
6163 "parameters" => array("isDirectoryOptionEnabled" => true, ),
6164 );
6165 //
6166 $links[] = array(
6167 "href" => "".OM_ROUTE_FORM."&obj=om_utilisateur&idx=0&action=11",
6168 "class" => "annuaire",
6169 "title" => __("annuaire"),
6170 "right" => array("om_utilisateur", "om_utilisateur_synchroniser", ),
6171 "open" => array("index.php|om_utilisateur[module=form][action=11]", ),
6172 "parameters" => array("isDirectoryOptionEnabled" => true, ),
6173 );
6174 //
6175 $links[] = array(
6176 "class" => "category",
6177 "title" => __("tableaux de bord"),
6178 "right" => array(
6179 "om_widget", "om_widget_tab", "om_dashboard",
6180 ),
6181 );
6182 //
6183 $links[] = array(
6184 "title" => "<hr/>",
6185 "right" => array(
6186 "om_widget", "om_widget_tab", "om_dashboard",
6187 ),
6188 );
6189 //
6190 $links[] = array(
6191 "href" => "".OM_ROUTE_TAB."&obj=om_widget",
6192 "class" => "om_widget",
6193 "title" => __("om_widget"),
6194 "right" => array("om_widget", "om_widget_tab", ),
6195 "open" => array("index.php|om_widget[module=tab]", "index.php|om_widget[module=form]", ),
6196 );
6197 $links[] = array(
6198 "href" => "".OM_ROUTE_TAB."&obj=compteur",
6199 "class" => "compteur",
6200 "title" => __("Compteur & quota"),
6201 "right" => array("compteur", "compteur_tab", ),
6202 "open" => array("index.php|compteur[module=tab]", "index.php|compteur[module=form]", ),
6203 );
6204 //
6205 $links[] = array(
6206 "href" => "".OM_ROUTE_FORM."&obj=om_dashboard&amp;idx=0&amp;action=4",
6207 "class" => "om_dashboard",
6208 "title" => __("composition"),
6209 "right" => array("om_dashboard", ),
6210 "open" => array("index.php|om_dashboard[module=form][action=4]", ),
6211 );
6212 //
6213 $links[] = array(
6214 "class" => "category",
6215 "title" => __("sig"),
6216 "right" => array(
6217 "om_sig_map", "om_sig_map_tab", "om_sig_flux", "om_sig_flux_tab", "om_sig_extent", "om_sig_extent_tab",
6218 ),
6219 "parameters" => array("option_localisation" => "sig_interne", ),
6220 );
6221 //
6222 $links[] = array(
6223 "title" => "<hr/>",
6224 "right" => array(
6225 "om_sig_map", "om_sig_map_tab", "om_sig_flux", "om_sig_flux_tab", "om_sig_extent", "om_sig_extent_tab",
6226 ),
6227 "parameters" => array("option_localisation" => "sig_interne", ),
6228 );
6229 //
6230 $links[] = array(
6231 "href" => "".OM_ROUTE_TAB."&obj=om_sig_extent",
6232 "class" => "om_sig_extent",
6233 "title" => __("om_sig_extent"),
6234 "right" => array("om_sig_extent", "om_sig_extent_tab", ),
6235 "open" => array("index.php|om_sig_extent[module=tab]", "index.php|om_sig_extent[module=form]", ),
6236 "parameters" => array("option_localisation" => "sig_interne", ),
6237 );
6238 //
6239 $links[] = array(
6240 "href" => "".OM_ROUTE_TAB."&obj=om_sig_map",
6241 "class" => "om_sig_map",
6242 "title" => __("om_sig_map"),
6243 "right" => array("om_sig_map", "om_sig_map_tab", ),
6244 "open" => array("index.php|om_sig_map[module=tab]", "index.php|om_sig_map[module=form]", ),
6245 "parameters" => array("option_localisation" => "sig_interne", ),
6246 );
6247 //
6248 $links[] = array(
6249 "href" => "".OM_ROUTE_TAB."&obj=om_sig_flux",
6250 "class" => "om_sig_flux",
6251 "title" => __("om_sig_flux"),
6252 "right" => array("om_sig_flux", "om_sig_flux_tab", ),
6253 "open" => array("index.php|om_sig_flux[module=tab]", "index.php|om_sig_flux[module=form]", ),
6254 "parameters" => array("option_localisation" => "sig_interne", ),
6255 );
6256 //
6257 $links[] = array(
6258 "class" => "category",
6259 "title" => __("options avancees"),
6260 "right" => array("import", "gen", "om_requete", "om_requete_tab",
6261 "om_sousetat", "om_sousetat_tab",),
6262 );
6263 //
6264 $links[] = array(
6265 "title" => "<hr/>",
6266 "right" => array(
6267 "interface_referentiel_erp",
6268 ),
6269 );
6270 //
6271 $links[] = array(
6272 "href" => "../app/settings.php?controlpanel=interface_referentiel_erp",
6273 "class" => "interface_referentiel_erp",
6274 "title" => __("interface_referentiel_erp"),
6275 "right" => array("interface_referentiel_erp", ),
6276 "open" => array("settings.php|[controlpanel=interface_referentiel_erp]", ),
6277 );
6278 //
6279 $links[] = array(
6280 "title" => "<hr/>",
6281 "right" => array(
6282 "om_sousetat", "om_sousetat_tab",
6283 ),
6284 );
6285 //
6286 $links[] = array(
6287 "href" => "".OM_ROUTE_TAB."&obj=om_sousetat",
6288 "class" => "om_sousetat",
6289 "title" => __("om_sousetat"),
6290 "right" => array("om_sousetat", "om_sousetat_tab", ),
6291 "open" => array("index.php|om_sousetat[module=tab]", "index.php|om_sousetat[module=form]", ),
6292 );
6293 //
6294 $links[] = array(
6295 "title" => "<hr/>",
6296 "right" => array("om_requete", "om_requete_tab", ),
6297 );
6298 //
6299 $links[] = array(
6300 "href" => "".OM_ROUTE_TAB."&obj=om_requete",
6301 "class" => "om_requete",
6302 "title" => __("om_requete"),
6303 "right" => array("om_requete", "om_requete_tab", ),
6304 "open" => array("index.php|om_requete[module=tab]", "index.php|om_requete[module=form]", ),
6305 );
6306 //
6307 $links[] = array(
6308 "title" => "<hr/>",
6309 "right" => array("task", "task_tab", ),
6310 );
6311 //
6312 $links[] = array(
6313 "href" => "".OM_ROUTE_TAB."&obj=task",
6314 "class" => "task",
6315 "title" => __("Moniteur Plat'AU"),
6316 "right" => array("task", "task_tab", ),
6317 "open" => array("index.php|task[module=tab]", "index.php|task[module=form]", ),
6318 );
6319
6320 //Afficher le menu moniteur IDE'AU si l'option notification portal est activée.
6321 if (isset($_SESSION['collectivite']) === true
6322 && $this->get_param_option_notification() === PORTAL)
6323 {
6324 $links[] = array(
6325 "href" => "".OM_ROUTE_TAB."&obj=task_portal",
6326 "class" => "task_portal",
6327 "title" => __("Moniteur iDE'AU"),
6328 "right" => array("task_portal", "task_portal_tab", ),
6329 "open" => array("index.php|task_portal[module=tab]", "index.php|task_portal[module=form]", ),
6330 );
6331 }
6332
6333 //
6334 $links[] = array(
6335 "title" => "<hr/>",
6336 "right" => array("import", ),
6337 );
6338 //
6339 $links[] = array(
6340 "href" => OM_ROUTE_MODULE_IMPORT,
6341 "class" => "import",
6342 "title" => __("Import"),
6343 "description" => __("Ce module permet l'intégration de données dans l'application depuis des fichiers CSV."),
6344 "right" => array("import", ),
6345 "open" => array(
6346 "import.php|",
6347 "index.php|[module=import]",
6348 ),
6349 );
6350 //
6351 $links[] = array(
6352 "href" => "../app/import_specific.php",
6353 "class" => "import_specific",
6354 "title" => __("Import specifique"),
6355 "right" => array("import", ),
6356 "open" => array("import_specific.php|", ),
6357 );
6358 //
6359 $links[] = array(
6360 "title" => "<hr/>",
6361 "right" => array("gen", ),
6362 );
6363 //
6364 $links[] = array(
6365 "title" => __("Generateur"),
6366 "href" => OM_ROUTE_MODULE_GEN,
6367 "class" => "generator",
6368 "right" => array("gen", ),
6369 "open" => array(
6370 "gen.php|","genauto.php|", "gensup.php|", "genfull.php|",
6371 "genetat.php|", "gensousetat.php|", "genlettretype.php|",
6372 "genimport.php|",
6373 ),
6374 );
6375 //
6376 $links[] = array(
6377 "title" => "<hr/>",
6378 "right" => array("contrainte", "contrainte_synchronisation"),
6379 );
6380 //
6381 $links[] = array(
6382 "href" => "".OM_ROUTE_FORM."&obj=contrainte&action=100&idx=0",
6383 "class" => "contrainte",
6384 "title" => __("synchronisation des contraintes"),
6385 "right" => array("contrainte", "contrainte_synchronisation", ),
6386 "open" => array("index.php|contrainte[module=form][action=100]", ),
6387 "parameters" => array(
6388 "option_sig" => "sig_externe",
6389 ),
6390 );
6391 //
6392 $links[] = array(
6393 "href" => "".OM_ROUTE_FORM."&obj=dossier_instruction&action=126&idx=0",
6394 "class" => "geocoder",
6395 "title" => __("Géolocalisation des dossiers"),
6396 "right" => array("dossier_instruction_geocoder", ),
6397 "open" => array("index.php|dossier_instruction[module=form][action=126]", ),
6398 "parameters" => array(
6399 "option_sig" => "sig_externe",
6400 ),
6401 );
6402 //
6403 $rubrik['links'] = $links;
6404 //
6405 $menu[] = $rubrik;
6406 $this->config__menu = $menu;
6407 }
6408
6409 /**
6410 * Instanciation de la classe 'reqmo'.
6411 * (surcharge de la fonction pour ajouter la prise en compte
6412 * de la surcharge locale de la classe om_edition).
6413 *
6414 * @param array $args Arguments à passer au constructeur.
6415 * @return edition
6416 */
6417 function get_inst__om_reqmo($args = array()) {
6418 if (file_exists("../obj/om_reqmo.class.php")) {
6419 require_once "../obj/om_reqmo.class.php";
6420 $class_name = "om_reqmo";
6421 } else {
6422 require_once PATH_OPENMAIRIE."om_reqmo.class.php";
6423 $class_name = "reqmo";
6424 }
6425 return new $class_name();
6426 }
6427
6428 /**
6429 * Permet d'enregistrer un fichier dans la table 'storage'.
6430 *
6431 * @return mixed Identifiant du fichier dans la table storage ou false.
6432 */
6433 function store_file($filecontent, $filemetadata, $type, $info = null, $collectivite = null, $dossierFinal = false) {
6434 if ($collectivite === null) {
6435 $get_collectivite = $this->getCollectivite();
6436 $collectivite = $get_collectivite['om_collectivite_idx'];
6437 }
6438 $uid = $this->storage->create($filecontent, $filemetadata, "from_content", "storage.uid");
6439 if ($uid == 'OP_FAILURE') {
6440 return false;
6441 }
6442 $inst_storage = $this->get_inst__om_dbform(array(
6443 "obj" => "storage",
6444 "idx" => "]",
6445 ));
6446 $val = array(
6447 "storage" => '',
6448 "file" => "NEW",
6449 "creation_date" => date("Y-m-d"),
6450 "creation_time" => date("G:i:s"),
6451 "uid" => $uid,
6452 "filename" => $filemetadata["filename"],
6453 "size" => $filemetadata["size"],
6454 "mimetype" => $filemetadata["mimetype"],
6455 "type" => $type,
6456 "info" => $info,
6457 "om_collectivite" => $collectivite,
6458 "uid_dossier_final" => $dossierFinal
6459 );
6460 $ret = $inst_storage->ajouter($val);
6461 if ($ret !== true) {
6462 return false;
6463 }
6464 // Récupère l'identifiant dans le storage
6465 $id = $inst_storage->get_storage_id_by_uid($uid);
6466 //
6467 return $id;
6468 }
6469
6470 /**
6471 * Surcharge de la fonction d'affichage pour ajouter
6472 * un détecteur de bloqueur de pub (cassant l'application).
6473 *
6474 * @return void
6475 */
6476 function displayHTMLFooter() {
6477 parent::displayHTMLFooter();
6478 if (in_array($this->flag, array("login_and_nohtml", "nohtml", "login", "logout", "anonym")) !== true) {
6479 $this->ad_blocker_detector();
6480 }
6481 }
6482
6483 /**
6484 * "Fausse" surcharge de la méthode du même nom dans om_layout.
6485 * Ajoute la possibilité d'ajouter une class CSS à la balise legend.
6486 *
6487 * Cette methode permet d'ouvrir un fieldset
6488 */
6489 public function display_formulaire_debutFieldset($params) {
6490 // Ouverture du fieldset
6491 echo " <fieldset";
6492 echo (isset($params["identifier"]) ? " id=\"".$params["identifier"]."\"" : "");
6493 echo " class=\"cadre ui-corner-all ui-widget-content ".$params["action2"]."\">\n";
6494 echo " <legend class=\"ui-corner-all ui-widget-content ui-state-active ".$params["legend_class"]."\">";
6495 echo $params["action1"];
6496 echo " </legend>\n";
6497 // Ouverture du conteneur interne du fieldset
6498 echo " <div class=\"fieldsetContent\">\n";
6499 }
6500
6501 /**
6502 * Affiche un bloc de code Javascript
6503 * responsable de détecter les bloqueurs de pub
6504 * et d'afficher un message le cas échéant.
6505 */
6506 protected function ad_blocker_detector() {
6507
6508 printf(
6509 '<script type="text/javascript">
6510 var blocked = [];
6511 // jquery has not loaded
6512 if(typeof($) == "undefined" && typeof(jQuery) == "undefined") {
6513 blocked.push("jquery");
6514 }
6515 // tinyMCE has not loaded
6516 if(typeof(tinyMCE) == "undefined") {
6517 blocked.push("tinyMCE");
6518 }
6519 // locale has not loaded
6520 if(typeof(locale) == "undefined") {
6521 blocked.push("locale");
6522 }
6523 // om_layout has not loaded
6524 if(typeof(om_initialize_content) == "undefined") {
6525 blocked.push("om_layout");
6526 }
6527 // app script has not loaded
6528 if(typeof(app_script_t4Fv4a59uSU7MwpJ59Qp) == "undefined") {
6529 blocked.push("app_script");
6530 }
6531
6532 // something was blocked
6533 if(blocked.length > 0) {
6534
6535 // removing every node in the body
6536 while(document.body.firstChild) { document.body.removeChild(document.body.firstChild); }
6537
6538 // creating the message (node) and its style
6539 var msgNode = document.createElement("p");
6540 msgNode.id = "adblocker-detected";
6541 msgNode.style.position = "relative";
6542 msgNode.style.width = "calc(100%% - 60px)";
6543 msgNode.style.margin = "20px auto";
6544 msgNode.style.padding = "20px";
6545 msgNode.style.background = "#FEF8F6";
6546 msgNode.style.color = "#cd0a0a";
6547 msgNode.style.border = "1px solid #cd0a0a";
6548 msgNode.style.borderRadius = "4px";
6549 msgNode.style.gridColumns = "1 / -1";
6550 msgNode.innerHTML = "%s";
6551
6552 // appending the message (node) to the body
6553 document.body.insertBefore(msgNode, document.body.firstChild);
6554 }
6555 </script>',
6556 sprintf(
6557 '<span>%s</span><br/><br/><span>%s</span><br/><br/><span>%s</span>',
6558 __("Un bloqueur de publicité a été détecté, et ceci empêche l'application de fonctionner normalement."),
6559 __("Afin de rétablir le bon fonctionnement, il vous est nécessaire d'ajouter l'application à la liste blanche des applications autorisées (<small>pour cela, référez-vous à la documentation de votre extension bloqueuse de publicité</small>)."),
6560 __("<em>Pour information, ceci se produit parce que l'application se nomme openADS, or les bloqueurs de publicité ont tendance à bloquer tout ce qui contient la chaîne de caractères 'ads' (<small>publicité</small> en anglais) comme c'est le cas dans le nom open<strong>ADS</strong>.</em>")
6561 )
6562 );
6563 }
6564
6565 /**
6566 * Récupère l'identifiant de l'enregistrement par rapport aux arguments.
6567 *
6568 * @param string $idx_name Nom du champ de l'identifiant
6569 * @param string $table Nom de la table
6570 * @param string $condition_field Nom du champ pour la condition
6571 * @param string $condition_value Valeur du champ de condition
6572 *
6573 * @return mixed Résultat de la requête ou null
6574 */
6575 public function get_idx_by_args(array $args) {
6576 $where2 = '';
6577 if (isset($args['condition2_field']) === true
6578 && isset($args['condition2_value']) === true
6579 && $args['condition2_field'] !== ''
6580 && $args['condition2_field'] !== null
6581 && $args['condition2_value'] !== ''
6582 && $args['condition2_value'] !== null) {
6583 //
6584 $where2 = sprintf(" AND %s = '%s'", $args['condition2_field'], $args['condition2_value']);
6585 }
6586 $where3 = '';
6587 if (isset($args['condition3_field']) === true
6588 && isset($args['condition3_value']) === true
6589 && $args['condition3_field'] !== ''
6590 && $args['condition3_field'] !== null
6591 && $args['condition3_value'] !== ''
6592 && $args['condition3_value'] !== null) {
6593 //
6594 $where3 = sprintf(" AND %s = '%s'", $args['condition3_field'], $args['condition3_value']);
6595 }
6596 $order = '';
6597 if (isset($args['order_field']) === true
6598 && isset($args['order_asc_desc']) === true
6599 && $args['order_field'] !== ''
6600 && $args['order_field'] !== null
6601 && $args['order_asc_desc'] !== ''
6602 && $args['order_asc_desc'] !== null) {
6603 //
6604 $order = sprintf(" ORDER BY %s %s ", $args['order_field'], $args['order_asc_desc']);
6605 }
6606 $qres = $this->get_one_result_from_db_query(
6607 sprintf(
6608 "SELECT
6609 %s
6610 FROM
6611 %s%s
6612 WHERE
6613 %s = '%s'
6614 %s
6615 %s
6616 %s",
6617 $args['idx_name'],
6618 DB_PREFIXE,
6619 $args['table'],
6620 $args['condition_field'],
6621 $args['condition_value'],
6622 $where2,
6623 $where3,
6624 $order
6625 ),
6626 array(
6627 "origin" => __METHOD__,
6628 )
6629 );
6630 return $qres["result"];
6631 }
6632
6633 public function get_inst__by_other_idx(array $args) {
6634 // En cas de plusieurs résultat, instancie seulement le premier retourné
6635 $idx = $this->get_idx_by_args(array(
6636 'idx_name' => $args['obj'],
6637 'table' => $args['obj'],
6638 'condition_field' => $args['fk_field'],
6639 'condition_value' => $args['fk_idx'],
6640 'condition2_field' => isset($args['fk_field_2']) === true ? $args['fk_field_2'] : null,
6641 'condition2_value' => isset($args['fk_idx_2']) === true ? $args['fk_idx_2'] : null,
6642 'condition3_field' => isset($args['fk_field_3']) === true ? $args['fk_field_3'] : null,
6643 'condition3_value' => isset($args['fk_idx_3']) === true ? $args['fk_idx_3'] : null,
6644 'order_field' => isset($args['order_field']) === true ? $args['order_field'] : null,
6645 'order_asc_desc' => isset($args['order_asc_desc']) === true ? $args['order_asc_desc'] : null,
6646 ));
6647 $inst = $this->get_inst__om_dbform(array(
6648 'obj' => $args['obj'],
6649 'idx' => $idx,
6650 ));
6651 return $inst;
6652 }
6653
6654 /**
6655 * Retourne l'objet demandé avec ses propriétés remplis à partir des données en base
6656 * ou 'null' si l'objet n'est pas trouvé en base de données.
6657 *
6658 * @param string $class La classe de l'objet demandé
6659 * @param string $idx L'identifiant de l'objet en base de donnée
6660 * @param bool $onlyone Si vaut 'true', déclenche une exception s'il y a plus d'un résultat
6661 *
6662 * @return $mixed L'objet ou null
6663 *
6664 * (à partir de PHP 7.1 on pourra utiliser le ReturnType ?object)
6665 */
6666 public function findObjectById(string $class, string $idx, bool $onlyone = true) {
6667 $obj = null;
6668 if (!empty($class) && !empty($idx)) {
6669 $qres = $this->get_one_result_from_db_query(
6670 sprintf(
6671 'SELECT
6672 COUNT(%2$s)
6673 FROM
6674 %1$s%2$s
6675 WHERE
6676 %2$s::CHARACTER VARYING = \'%3$s\'',
6677 DB_PREFIXE,
6678 $class,
6679 $idx
6680
6681 ),
6682 array(
6683 "origin" => __METHOD__
6684 )
6685 );
6686 if ($qres["code"] !== "OK") {
6687 throw new RuntimeException("Failed database query (".$qres['message'].")");
6688 }
6689 $count = intval(strval($qres['result']));
6690 if ($count === 1) {
6691 $obj = $this->get_inst__om_dbform(array('obj' => $class, 'idx' => $idx));
6692 }
6693 elseif($count > 1 && $onlyone) {
6694 throw new RuntimeException("More than one result ($count) for '$class' ID '$idx'");
6695 }
6696 }
6697 $obj = $this->get_inst__om_dbform(array('obj' => $class, 'idx' => $idx));
6698 if ($obj->exists() !== true) {
6699 return null;
6700 }
6701 return $obj;
6702 }
6703
6704 /**
6705 * Retourne l'objet demandé avec ses propriétés remplis à partir des données en base
6706 * ou 'null' si l'objet n'est pas trouvé en base de données.
6707 *
6708 * @param string class La classe de l'objet demandé
6709 * @param string condition La clause WHERE de la requête SQL qui va être effectuée
6710 * @param string order (optionel) La clause ORDER BY de la requête SQL qui va être effectuée
6711 * @param string from (optionel) La clause FROM de la requête SQL qui va être effectuée
6712 * @param string onlyone (optionel) Si 'true': génère une exception si plus d'un résultat
6713 *
6714 * @return $mixed L'objet ou null
6715 *
6716 * @throw RuntimeException
6717 *
6718 * (à partir de PHP 7.1 on pourra utiliser le ReturnType ?object)
6719 */
6720 public function findObjectByCondition(string $class, string $condition, string $order = null,
6721 string $from = null, bool $onlyone = true) {
6722 $obj = null;
6723 if (!empty($class)) {
6724 $class = $this->db->escapeSimple($class);
6725 $from = ! empty($from) ?
6726 $from :
6727 sprintf(' FROM %s%s', DB_PREFIXE, $class);
6728 $condition = ! empty($condition) ?
6729 " WHERE $condition" :
6730 '';
6731 $order = ! empty($order) ?
6732 " ORDER BY $order" :
6733 '';
6734
6735 $sqlExist = sprintf(
6736 'SELECT
6737 COUNT(%1$s)
6738 %2$s
6739 %3$s',
6740 $class,
6741 $from,
6742 $condition
6743 );
6744
6745 $qres = $this->get_one_result_from_db_query(
6746 $sqlExist,
6747 array(
6748 "origin" => __METHOD__,
6749 "force_return" => true,
6750 )
6751 );
6752
6753 if ($qres["code"] !== "OK") {
6754 throw new RuntimeException("Failed database query (".$qres['message'].")");
6755 }
6756 $count = intval(strval($qres['result']));
6757 if(empty($count)) {
6758 return null;
6759 }
6760 if($count > 1 && $onlyone) {
6761 $this->addToLog(__METHOD__."(): get_one_result_from_db_query(\"".$sqlExist."\");", DEBUG_MODE);
6762 throw new RuntimeException("More than one result ($count) for '$class'");
6763 }
6764 $sqlID = sprintf(
6765 'SELECT
6766 %1$s
6767 %2$s
6768 %3$s
6769 %4$s
6770 LIMIT 1',
6771 $class,
6772 $from,
6773 $condition,
6774 $order
6775 );
6776 $qres = $this->get_one_result_from_db_query(
6777 $sqlID,
6778 array(
6779 "origin" => __METHOD__,
6780 "force_return" => true,
6781 )
6782 );
6783 if ($qres["code"] !== "OK") {
6784 throw new RuntimeException("Failed database query (".$qres['message'].")");
6785 }
6786 $idx = intval(strval($qres['result']));
6787 $obj = $this->get_inst__om_dbform(array('obj' => $class, 'idx' => $idx));
6788 }
6789 return $obj;
6790 }
6791
6792 /**
6793 * Récupère la totalité des objets d'un type donné.
6794 * Si l'argument $sqlFilter est non-vide alors il sera utilisé pour filtrer les objets.
6795 * Si l'argument $sqlOrder est non-vide alors il sera utilisé pour ordonner les objets.
6796 *
6797 * Note: le code de cette méthode est largement inspiré de dbform::init_record_data().
6798 *
6799 * @return array|false
6800 */
6801 public function getAllObjects(string $type, string $sqlfilter = '', string $sqlOrder = '') {
6802
6803 // objet "modèle" utilisé pour accéder aux variables nécessaires à la construction
6804 // de la requête SQL et aussi pour y stocker les infos communes à tous les objets de
6805 // ce type (ex: tailles des champs, etc.).
6806 $objectTemplate = $this->get_inst__om_dbform(array('obj' => $type));
6807
6808 // construction de la requpete SQL (éventuellement avec un filtre)
6809 $sqlSelectedColumns = $objectTemplate->get_var_sql_forminc__champs();
6810 if (! empty($objectTemplate->_var_from_sql_forminc__champs)) {
6811 $sqlSelectedColumns = $objectTemplate->_var_from_sql_forminc__champs;
6812 }
6813 $sqlSelectColumns = implode(', ', $sqlSelectedColumns);
6814 $sqlSelectFrom = $objectTemplate->get_var_sql_forminc__tableSelect();
6815 if (! empty($objectTemplate->_var_from_sql_forminc__tableSelect)) {
6816 $sqlSelectFrom = $objectTemplate->_var_from_sql_forminc__tableSelect;
6817 }
6818 $sqlSelectWhere = '';
6819 if (! empty($sqlfilter)) {
6820 $sqlSelectWhere = "WHERE $sqlfilter";
6821 }
6822 $sqlSelectOrder = $objectTemplate->table." ASC";
6823 if (! empty($sqlOrder)) {
6824 $sqlSelectOrder = $sqlOrder;
6825 }
6826 $sql = sprintf('SELECT %s FROM %s %s ORDER BY %s',
6827 $sqlSelectColumns,
6828 $sqlSelectFrom,
6829 $sqlSelectWhere,
6830 $sqlSelectOrder);
6831
6832 // exécution de la requête
6833 $this->addToLog(__METHOD__."() : sql query: $sql", VERBOSE_MODE);
6834 $res = $this->db->execute($this->db->prepare($sql));
6835 if ($this->isDatabaseError($res, true)) {
6836 $this->addToLog(
6837 __METHOD__."(): erreur SQL sur la table '".$objectTemplate->table."': ".
6838 $res->getMessage(), DEBUG_MODE);
6839 return false;
6840 }
6841
6842 // recuperation des informations sur la structure de la table
6843 // ??? compatibilite POSTGRESQL (len = -1, type vide, flags vide)
6844 $info = $res->tableInfo();
6845
6846 // Recuperation des infos
6847 foreach ($info as $index => $item) {
6848 $objectTemplate->champs[$index] = $item['name'];
6849 $objectTemplate->longueurMax[$index] = $item['len'];
6850 $objectTemplate->type[$index] = $item['type'];
6851 $objectTemplate->flags[$index] = $item['flags'];
6852 }
6853
6854 // création et remplissage des objets
6855 $allObjects = array();
6856 while ($row = $res->fetchRow()) {
6857 $object = new $type(null);
6858 foreach(array('champs', 'longueurMax', 'type', 'flags') as $key) {
6859 $object->$key = $objectTemplate->$key;
6860 }
6861 foreach ($row as $index => $item) {
6862 $object->val[$index] = $item;
6863 }
6864 $allObjects[] = $object;
6865 }
6866
6867 return $allObjects;
6868 }
6869
6870 /**
6871 * Cette méthode permet de transformer une chaine de caractère standard
6872 * en une chaine sans caractères spéciaux ni accents.
6873 *
6874 * NOTE: la convertion est de 1 caractère vers 1 caractères afin de permettre
6875 * à la fonction 'sqlNormalizeSearchValue()' d'effectuer la même conversion.
6876 *
6877 * @param string $string La chaine de caractère à normaliser
6878 *
6879 * @return string La chaine de caractère normalisée
6880 */
6881 public function normalize_string($string = "") {
6882 //
6883 $invalid = array('Š'=>'S', 'š'=>'s', 'Đ'=>'D', 'đ'=>'d', 'Ž'=>'Z',
6884 'ž'=>'z', 'Č'=>'C', 'č'=>'c', 'Ć'=>'C', 'ć'=>'c', 'À'=>'A', 'Á'=>'A',
6885 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E',
6886 'É'=>'E', 'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 'Ï'=>'I',
6887 'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O', 'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O',
6888 'Ù'=>'U', 'Ú'=>'U', 'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'S',
6889 'à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 'å'=>'a', 'æ'=>'a',
6890 'ç'=>'c', 'è'=>'e', 'é'=>'e', 'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i',
6891 'î'=>'i', 'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o', 'ô'=>'o',
6892 'õ'=>'o', 'ö'=>'o', 'ø'=>'o', 'ù'=>'u', 'ú'=>'u', 'û'=>'u', 'ý'=>'y',
6893 'ý'=>'y', 'þ'=>'b', 'ÿ'=>'y', 'Ŕ'=>'R', 'ŕ'=>'r', "`" => "_",
6894 "„" => "_", "`" => "_", "´" => "_", "“" => "_", "”" => "_",
6895 "{" => "_", "}" => "_", "~" => "_", "–" => "-",
6896 "’" => "_", "(" => "_", ")" => "_", "/"=>"-", "'"=>"_",
6897 );
6898 $string = str_replace(array_keys($invalid), array_values($invalid), $string);
6899 $string = strtolower($string);
6900 return $string;
6901 }
6902
6903 /**
6904 * Transforme une chaine en une suite d'instruction pSQL pour la normaliser.
6905 * En l'occurence cela supprimer les accents et la passe en casse minuscule.
6906 *
6907 * NOTE: la convertion est de 1 caractère vers 1 caractères afin de permettre
6908 * à la fonction 'normalize_string()' d'effectuer la même conversion.
6909 *
6910 * @param string $value Chaîne recherchée à normaliser.
6911 *
6912 * @return string
6913 */
6914 public function sqlNormalizeSearchValue($value){
6915 $value = html_entity_decode($value, ENT_QUOTES);
6916 // échappement des caractères spéciaux
6917 $value = pg_escape_string($value);
6918 // encodage
6919 if (DBCHARSET != 'UTF8' && HTTPCHARSET == 'UTF-8') {
6920 $value = utf8_decode($value);
6921 }
6922 // normalisation des caractères
6923 $value = " TRANSLATE(LOWER(".
6924 $value."::varchar), ".
6925 "'ŠšĐđŽžČčĆćÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýþÿŔŕ`„´“”{}~–’()/''', ".
6926 "'SsDdZzCcCcAAAAAAACEEEEIIIINOOOOOOUUUUYBSaaaaaaaceeeeiiiionoooooouuuybyRr________-___-_') ";
6927 return $value;
6928 }
6929
6930 /**
6931 * Retourne une valeur unique récupérée à partir d'une requête SQL "basique".
6932 *
6933 * Il faut fournir une (ou deux) valeur filtre qui va sélectionner la ligne à partir
6934 * de laquelle récupérer la valeur souhaitée.
6935 *
6936 * @param string $table La table sur laquelle faire la requête
6937 * @param string $columnSelect La colonne permettant de récupérer la valeur recherchée
6938 * @param string $columnWhere La colonne à laquelle la valeur '$value' va être comparée
6939 * @param string $value La valeur filtre qui permet de sélectionner une ligne
6940 * @param string $extraTable Une table supplémentaire pour tester une seconde valeur
6941 * @param string $extraColumn Une colonne supplémentaire pour tester une seconde valeur
6942 * @param string $extraValue La seconde valeur 'filtre' pour mieux sélectionner une ligne
6943 * @param bool $normalizeColumn Si vaut 'true' alors on normalise la colonne '$columnWhere'
6944 * @param bool $normalizeValue Si vaut 'true' alors on normalise la valeur '$value'
6945 */
6946 public function getSingleSqlValue(
6947 string $table, string $columnSelect, string $columnWhere, string $value,
6948 string $extraTable = null, string $extraColumn = null, string $extraValue = null,
6949 bool $normalizeColumn = true, bool $normalizeValue = true) {
6950
6951 // colonnes utilisées pour la clause WHERE
6952 $columnNormalized = $columnWhere;
6953 if ($normalizeColumn) {
6954 $columnNormalized = $this->sqlNormalizeSearchValue($columnWhere);
6955 }
6956 $valueNormalized = $this->db->escapeSimple($value);
6957 if ($normalizeValue) {
6958 $valueNormalized = $this->db->escapeSimple(strtolower(
6959 $this->normalize_string($value)));
6960 }
6961 // valeur utilisée pour la clause WHERE
6962 if (ctype_digit($value)) {
6963 $columnNormalized = "$table.$table";
6964 $valueNormalized = intval($value);
6965 }
6966
6967 // SQL de base
6968 $sql = sprintf("SELECT $columnSelect FROM ".DB_PREFIXE."$table WHERE %s = '%s'",
6969 $columnNormalized,
6970 $valueNormalized);
6971
6972 // s'il y a une colonne supplémentaire à ajouter à la clause WHERE
6973 if (! empty($extraColumn)) {
6974
6975 // si cette colonne provient d'une autre table, on ajoute cette autre table
6976 $tables = array($table);
6977 if (! empty($extraTable) && $extraTable != $table) {
6978 $tables[] = $extraTable;
6979 }
6980
6981 // construit le SQL avec les deux colonnes dans la clause WHERE
6982 $columnsNormalized = array($columnNormalized, $extraColumn);
6983 $valuesNormalized = array($valueNormalized, $extraValue);
6984 $sql = sprintf("SELECT $columnSelect FROM %s WHERE %s",
6985 DB_PREFIXE.implode(', '.DB_PREFIXE, $tables),
6986 implode(' AND ', array_map(
6987 function ($col, $val) {
6988 return "$col = '$val'";
6989 },
6990 $columnsNormalized, $valuesNormalized)));
6991 }
6992
6993 // exécute la requête en demandant en résultat une unique valeur
6994 $qres = $this->get_one_result_from_db_query(
6995 $sql,
6996 array(
6997 "origin" => __METHOD__,
6998 "force_return" => true,
6999 )
7000 );
7001
7002 // vérifie les erreurs
7003 if ($qres["code"] !== "OK") {
7004 throw new RuntimeException(__("Erreur de base de données.").' '.
7005 sprintf(__("Détails: %s"), $qres["message"]));
7006 }
7007 // si la ligne n'a pas été trouvée
7008 if ($qres["result"] === null) {
7009 throw new InvalidArgumentException(__(
7010 "L'objet $table '$valueNormalized' n'existe pas."));
7011 }
7012
7013 // renvoie la valeur trouvée
7014 return $qres["result"];
7015 }
7016
7017 /**
7018 * Vérifie si la saisie du numéro complet respecte la numérotation
7019 * réglementaire d'un dossier d'urbanisme (code de l'urbanisme A423-1 à A423-4)
7020 * et renvoie les différents éléments constituant du numéro de dossier.
7021 *
7022 * Attention: cette fonction pourrait confondre un code entité avec un suffixe,
7023 * c'est pourquoi il est nécessaire de supprimer tout code entité
7024 * d'un numéro de dossier avant de le passer à cette fonction.
7025 *
7026 * @param string $numero identifiant du dossier
7027 * @param bool $espaces si 'true' accepte les espaces, sinon non
7028 * @return array ['di' => [...], 'da' => [...]] contenant les éléments
7029 */
7030 public function numerotation_urbanisme(string $numero, bool $espaces = false) {
7031 // Masques
7032 $blank = $espaces ? '\s' : '';
7033 $base = '(?P<type>[A-Z]{2,3})'.$blank.
7034 '(?P<departement>[0-9]{3}|02[AB])(?P<commune>[0-9]{3})'.$blank.
7035 '(?P<annee>[0-9]{2})'.$blank.
7036 '(?P<division>[A-Z0-9])(?P<numero>[0-9]{4})';
7037 $pattern_di = "/^$base(?P<suffixe>[A-Z]{1,5})?(?P<num_suffixe>[0-9]{1,2})?$/i";
7038 $pattern_da = "/^$base$/i";
7039
7040 $result = array(
7041 "di" => array(),
7042 "da" => array(),
7043 );
7044
7045 if (preg_match($pattern_di, $numero, $matches_di) === 1) {
7046 $result["di"] = $matches_di;
7047 $numero = $matches_di['type'].$matches_di['departement'].$matches_di['commune'].
7048 $matches_di['annee'].$matches_di['division'].$matches_di['numero'];
7049 }
7050 if (preg_match($pattern_da, $numero, $matches_da) === 1) {
7051 $result["da"] = $matches_da;
7052 }
7053
7054 return $result;
7055 }
7056
7057 /**
7058 * Vérifie si un formulaire est ouvert dans le contexte d'un
7059 * dossier d'instruction. Pour cela vérifiesi le paramètre retourformulaire
7060 * prend une de ces valeurs :
7061 * - dossier_instruction
7062 * - dossier_instruction_mes_encours
7063 * - dossier_instruction_tous_encours
7064 * - dossier_instruction_mes_clotures
7065 * - dossier_instruction_tous_clotures
7066 * - dossier_contentieux_mes_infractions
7067 * - dossier_contentieux_toutes_infractions
7068 * - dossier_contentieux_mes_recours
7069 * - dossier_contentieux_tous_recours
7070 * - sous_dossier
7071 *
7072 * /!\ Pour l'affichage des références cadastrales dans le formulaire de modification
7073 * d'un dossier d'instruction cette condition est aussi utilisée mais en javascript.
7074 * Si cette méthode est modifiée il faut également aller modifier les conditions
7075 * dans app/js/script.js (~l1580)
7076 *
7077 * @return boolean
7078 */
7079 public function contexte_dossier_instruction() {
7080 $retourformulaire = $this->get_submitted_get_value("retourformulaire");
7081
7082 if ($retourformulaire == 'dossier_instruction' ||
7083 $retourformulaire == 'dossier_instruction_mes_encours' ||
7084 $retourformulaire == 'dossier_instruction_tous_encours' ||
7085 $retourformulaire == 'dossier_instruction_mes_clotures' ||
7086 $retourformulaire == 'dossier_instruction_tous_clotures' ||
7087 $retourformulaire == 'dossier_contentieux_mes_infractions' ||
7088 $retourformulaire == 'dossier_contentieux_toutes_infractions' ||
7089 $retourformulaire == "dossier_contentieux_mes_recours" ||
7090 $retourformulaire == "dossier_contentieux_tous_recours" ||
7091 $retourformulaire == "sous_dossier") {
7092 return true;
7093 }
7094 return false;
7095 }
7096
7097 /**
7098 * Calcule l'id d'un sous-formulaire d'un objet donné. Pour cela
7099 * récupère le fichier de paramétrage de l'objet (.inc) pour accéder
7100 * à la variable de paramétrage des sous-formulaires.
7101 * Vérifie pour chacun des formulaires paramétrés si l'utilisateur à
7102 * les permissions nécessaires pour y accéder. A partir de ces
7103 * informations calcule l'identifiant du sous-onglet.
7104 *
7105 * @param string nom du formulaire auquel appartiens le sous-formulaire
7106 * @return integer identifiant du sus-formulaire
7107 */
7108 public function get_ui_tabs($obj, $direct_field, $direct_form, $direct_action, $direct_idx) {
7109 $tabs_id = 1;
7110 // Rétrocompatibilité : il est possible que dans les scripts inclus
7111 // par cette méthode, la variable $f soit attendue et utilisée.
7112 // @deprecated Cette variable ne doit plus être utilisée.
7113 $f = $this;
7114
7115 // Initialisation des paramètres
7116 $params = array(
7117 // action sur l'objet parent
7118 "action" => array(
7119 "default_value" => "",
7120 ),
7121 // (optionnel) soit idx soit direct_field : identifiant de
7122 // l'objet contexte
7123 "idx" => array(
7124 "default_value" => "",
7125 )
7126 );
7127 foreach ($this->get_initialized_parameters($params) as $key => $value) {
7128 ${$key} = $value;
7129 }
7130 // Vérification des paramètres obligatoires
7131 if (empty($obj)
7132 || empty($action)
7133 || (empty($idx) && empty($direct_field))
7134 || empty($direct_form)
7135 || empty($direct_action)
7136 || empty($direct_idx)) {
7137
7138 return $tabs_id;
7139 }
7140 // Inclusion du script [sql/<OM_DB_PHPTYPE>/<OBJ>.inc.php]
7141 // L'objectif est de récupéré la liste des onglets pour extraire
7142 // l'identifiant de l'onglet sélectionné
7143 // - Variable utilisée $sousformulaire
7144 $standard_script_path = "../sql/".OM_DB_PHPTYPE."/".$obj.".inc.php";
7145 $core_script_path = PATH_OPENMAIRIE."sql/".OM_DB_PHPTYPE."/".$obj.".inc.php";
7146 $gen_script_path = "../gen/sql/".OM_DB_PHPTYPE."/".$obj.".inc.php";
7147 $custom_script_path = $this->get_custom("tab", $obj);
7148
7149 if ($custom_script_path !== null) {
7150 require_once $custom_script_path;
7151 } elseif (file_exists($standard_script_path) === false
7152 && file_exists($core_script_path) === true) {
7153 require_once $core_script_path;
7154 } elseif (file_exists($standard_script_path) === false
7155 && file_exists($gen_script_path) === true) {
7156 require_once $gen_script_path;
7157 } elseif (file_exists($standard_script_path) === true) {
7158 require $standard_script_path;
7159 }
7160
7161 if (empty($sousformulaire)) {
7162 return $tabs_id;
7163 }
7164
7165 foreach ($sousformulaire as $sousform) {
7166 $droit = array($sousform, $sousform."_tab");
7167
7168 if ($this->isAccredited($droit, "OR")) {
7169 if ($sousform == $direct_form) {
7170 break;
7171 }
7172 $tabs_id++;
7173 }
7174 }
7175 return $tabs_id;
7176 }
7177
7178
7179 /**
7180 * Récupère une requête sql et renvoie les éléments nécessaires
7181 * pour ajouter le filtrage de des groupes à cette requête.
7182 * Renvoie ces éléments sous la forme d'un tableau associatif
7183 * ex : array(
7184 * ['FROM'] => 'LEFT JOIN ...',
7185 * ['WHERE'] => '...'
7186 * );
7187 *
7188 * @param string requête sql à faire évoluer
7189 * @return array
7190 */
7191 public function get_sql_filtre_groupe($sql = '') {
7192 $sqlCplmt = array(
7193 'FROM' => '',
7194 'WHERE' => ''
7195 );
7196
7197 // Tableau temporaire contenant les clauses pour chaque groupe
7198 $group_clause = array();
7199 foreach ($_SESSION["groupe"] as $key => $value) {
7200 $group_clause[$key] = "(groupe.code = '".$key."'";
7201 if($value["confidentiel"] !== true) {
7202 $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
7203 }
7204 $group_clause[$key] .= ")";
7205 }
7206 // Ajout du cas ou le code du groupe est null
7207 $group_clause['EMPTY'] = '(groupe.code IS NULL AND dossier_autorisation_type.confidentiel IS NOT TRUE)';
7208 // Mise en chaîne des clauses
7209 $conditions = implode(" OR ", $group_clause);
7210 if ($conditions !== "") {
7211 // On ajout le WHERE si il n'est pas présent
7212 if (stripos($sql, "WHERE") === false) {
7213 $sqlCplmt['WHERE'] .= "WHERE ";
7214 } else {
7215 $sqlCplmt['WHERE'] .= " AND ";
7216 }
7217
7218 $sqlCplmt['WHERE'] .= "(".$conditions.")";
7219 }
7220
7221
7222 // Jointures manquantes dans la requête d'origine qui devront être ajouté
7223 // dans la requête complémentaire
7224 if (preg_match("/".DB_PREFIXE."dossier_autorisation(?!_)/i", $sql) === 0) {
7225 $sqlCplmt['FROM'] .= "
7226 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
7227 ON dossier_autorisation.dossier_autorisation = dossier.dossier_autorisation";
7228 }
7229 if (preg_match("/".DB_PREFIXE."dossier_autorisation_type_detaille(?!_)/i", $sql) === 0) {
7230 $sqlCplmt['FROM'] .= "
7231 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
7232 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille";
7233 }
7234 if (preg_match("/".DB_PREFIXE."dossier_autorisation_type(?!_)/i", $sql) === 0) {
7235 $sqlCplmt['FROM'] .= "
7236 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
7237 ON dossier_autorisation_type.dossier_autorisation_type = dossier_autorisation_type_detaille.dossier_autorisation_type";
7238 }
7239 if (preg_match("/".DB_PREFIXE."groupe(?!_)/i", $sql) === 0) {
7240 $sqlCplmt['FROM'] .= "
7241 LEFT JOIN ".DB_PREFIXE."groupe
7242 ON dossier_autorisation_type.groupe = groupe.groupe";
7243 }
7244
7245 return $sqlCplmt;
7246 }
7247
7248 /**
7249 * Récupère une requête sql et renvoie les éléments nécessaires
7250 * pour ajouter le filtrage de des groupes à cette requête.
7251 * Renvoie ces éléments sous la forme d'un tableau associatif
7252 * ex : array(
7253 * ['FROM'] => 'LEFT JOIN ...',
7254 * ['WHERE'] => '...'
7255 * );
7256 *
7257 * @param string requête sql à faire évoluer
7258 * @return array
7259 */
7260 public function get_sql_filtre_sous_dossier($sql = '') {
7261 $sqlCplmt = array(
7262 'FROM' => '',
7263 'WHERE' => ''
7264 );
7265 // On ajout le WHERE si il n'est pas présent
7266 $sqlCplmt['WHERE'] = ' AND dossier_instruction_type.sous_dossier IS NOT TRUE';
7267 if (stripos($sql, "WHERE") === false) {
7268 $sqlCplmt['WHERE'] = 'WHERE dossier_instruction_type.sous_dossier IS NOT TRUE';
7269 }
7270 // Jointures manquantes dans la requête d'origine qui devront être ajouté
7271 // dans la requête complémentaire
7272 if (preg_match("/".DB_PREFIXE."dossier_instruction_type(?!_)/i", $sql) === 0 ||
7273 preg_match("/".DB_PREFIXE."dossier_instruction_type(?!_)\s*(as|AS)/i", $sql) !== 0) {
7274 $sqlCplmt['FROM'] .= "
7275 LEFT JOIN ".DB_PREFIXE."dossier_instruction_type
7276 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type";
7277 }
7278
7279 return $sqlCplmt;
7280 }
7281
7282 /**
7283 * Récupère le code entité de la collectivité passé en paramètre ou de la
7284 * collectivité de l'utilisateur connecté.
7285 *
7286 * @param string $om_collectivite Identifiant de la collectivité
7287 *
7288 * @return string Code entité ou null
7289 */
7290 public function get_collectivite_code_entite($om_collectivite = null) {
7291 // Récupération des paramètres de la collectivité voulu
7292 $parameters = $this->getCollectivite($om_collectivite);
7293 //
7294 return isset($parameters['code_entite']) === true && empty($parameters['code_entite']) === false ? strval(trim($parameters['code_entite'])) : null;
7295 }
7296
7297 /**
7298 * Surcharge du "core" pour pouvoir utiliser une surcharge de l'abstracteur
7299 * du connecteur de stockage.
7300 */
7301 function setFilestorage() {
7302 $this->storage = false;
7303 if ($this->setFilestorageConfig()) {
7304 // surchage du "core"
7305 require_once __DIR__.'/om_filestorage.class.php';
7306 $this->storage = new om_filestorage($this->filestorage_config);
7307 }
7308 }
7309
7310 /**
7311 * Permet de remplacer les espaces insécables par des espaces sécables
7312 * pour la valeur d'un champ texte.
7313 *
7314 * @param string $value Valeur à traiter
7315 * @return string la valeur avec des espaces sécables
7316 */
7317 function replace_non_breaking_space($value) {
7318 return preg_replace("/ |&nbsp;/", ' ', $value);
7319 }
7320
7321 /**
7322 * Retourne la valeur du champ de l'element de la table passée en paramètre.
7323 *
7324 * @param string $table Table de l'element.
7325 * @param mixed $id Identifiant de l'element.
7326 * @param string $field Nom du champ dont la valeur est à récupérer.
7327 *
7328 * @return string Valeur du champ de l'element ou false si l'element n'existe pas.
7329 */
7330 public function get_value_of_element($table, $id, $field) {
7331 $instance = $this->get_inst__om_dbform(array(
7332 "obj" => $table,
7333 "idx" => $id,
7334 ));
7335 // Si l'élément existe et que le champ existe
7336 if ($instance->exists() === true
7337 && in_array($field, $instance->champs)) {
7338 //
7339 return $instance->getVal($field);
7340 }
7341 return false;
7342 }
7343
7344 /**
7345 * Surcharge pour pouvoir surcharger la classe 'om_edition'
7346 *
7347 * @param array $args Arguments à passer au constructeur.
7348 * @return edition
7349 */
7350 function get_inst__om_edition($args = array()) {
7351 require_once '../obj/om_edition.class.php';
7352 return new om_edition();
7353 }
7354
7355 /**
7356 * Renvoie une instance du stockage de données « supplémentaires
7357 *
7358 * @return extra_data_store_abs
7359 */
7360 public function get_extra_data_store() {
7361 return $this->extra_data_store;
7362 }
7363
7364 /**
7365 * Retire les balises HTML d'un message
7366 *
7367 * @param string $html_msg Le message avec des balises HTML
7368 *
7369 * @return string Le message sans les balises HTML
7370 */
7371 public function remove_html_tags(string $html_msg) {
7372 return strip_tags(
7373 str_replace('..', '.',
7374 str_replace('. . ', '. ',
7375 str_replace(array('<br>', '<br/>', '<br />'), '. ', $html_msg))));
7376 }
7377
7378 /**
7379 *
7380 * recuperer_parametrage_annexe
7381 * Récupère les paramétrage des annexes pour une instruction donnée.
7382 *
7383 * @param int intruction_id : Identifiant de l'instruction
7384 *
7385 * @return array : liste des parametres extraite de la table
7386 */
7387 function recuperer_parametrage_annexe($instruction_id){
7388
7389 $qres = $this->get_all_results_from_db_query(
7390 sprintf(
7391 'SELECT
7392 parametrage_annexe,
7393 instruction,
7394 document_object_type,
7395 document_object_type_id,
7396 condition
7397 FROM
7398 %sparametrage_annexe
7399 WHERE
7400 parametrage_annexe.instruction = %d',
7401 DB_PREFIXE,
7402 intval($instruction_id)
7403 ),
7404 array(
7405 'origin' => 'app/utils.class.php'
7406 )
7407 );
7408 return $qres['result'];
7409 }
7410
7411 /**
7412 * recuperer_derniere_annexe_par_dossier_type_condition
7413 *
7414 * Prend en paramètre un dossier, un état et un type de document
7415 * Puis à l’aide d’une requête récupère le document le plus récent correspondant aux paramètres
7416 *
7417 * Et renvoie l’id et la table d’appartenance du document
7418 *
7419 * @param string dossier_id : Identifiant du dossier
7420 * @param string objet : Objet sur lequel faire la recherche des annexes à renvoyées parmis : instruction, consultation, document_numerise
7421 * @param int search_element_id : ID de l'élément qui sera utilisé pour la recherche.
7422 * @param string condition : Identifiant de l'état, Null par Défault
7423 *
7424 * @return array : table de deux éléments : l’id et la table d’appartenance du document
7425 */
7426 function recuperer_derniere_annexe_par_dossier_type_condition(
7427 $dossier_id,
7428 $objet,
7429 $search_element_id,
7430 $condition = null,
7431 $type_platau_uniquement = false
7432 ){
7433
7434 // on prepare un sql de recherche
7435 $sql_search = '';
7436
7437 // renvoie l’id et la table d’appartenance du document
7438 $array_return = array();
7439
7440 // Si le document est de type 'consultation'
7441 if ($objet == 'consultation'
7442 && !empty($search_element_id)
7443 && in_array($condition, array ('service','tiers_consulte'))
7444 ) {
7445 // On recherche sur l'ID dossier
7446 // Et sur le service ou le tier_consulte selon la condition
7447 $search_consultation_origin = "AND consultation.$condition =".intval($search_element_id);
7448 // Et on récupère le dernier
7449 $sql_search = sprintf(
7450 'SELECT
7451 consultation.consultation
7452 FROM
7453 %1$sconsultation
7454 WHERE
7455 consultation.dossier = \'%2$s\'
7456 AND consultation.fichier IS NOT NULL
7457 %3$s
7458 ORDER BY consultation.date_retour DESC NULLS LAST
7459 LIMIT 1',
7460 DB_PREFIXE,
7461 $this->db->escapeSimple($dossier_id),
7462 $search_consultation_origin
7463 );
7464 }
7465
7466 // Si le document n'est pas liée aux 'document_numerise'
7467 if ($objet == 'document_numerise'
7468 && !empty($search_element_id)
7469 && !$type_platau_uniquement) {
7470 // On recherche sur l'ID dossier et
7471 // - Si le document est de type document_numerise.document_numerise_type = $search_element_id
7472 $search_document_numerise_type = "AND document_numerise.document_numerise_type = ".intval($search_element_id);
7473
7474 // On as réflechis à permetre uniquement les doctrav dans un flux platau
7475 // Mais nous ne s'avons pas trouver de type platau possible
7476 /* $join_document_numeriser_type_platau_uniquement = '';
7477 if ($type_platau_uniquement) {
7478 $join_document_numeriser_type_platau_uniquement = sprintf('
7479 INNER JOIN %1$sdocument_numeriser_type ON
7480 document_numeriser_type.document_numeriser_type = document_numerise.document_numerise_type
7481 AND LOWER(document_type_categorie.code) = \''.CODE_TYPE_DOC_TRAVAIL.'\'
7482 ',
7483 DB_PREFIXE
7484 );
7485 }
7486 */
7487
7488 // Et on récupère le dernier
7489 $sql_search = sprintf(
7490 'SELECT
7491 document_numerise.document_numerise
7492 FROM
7493 %1$sdocument_numerise
7494 WHERE
7495 document_numerise.dossier = \'%2$s\'
7496 %3$s
7497 ORDER BY document_numerise.date_creation DESC NULLS LAST
7498 LIMIT 1',
7499 DB_PREFIXE,
7500 $this->db->escapeSimple($dossier_id),
7501 $search_document_numerise_type
7502 );
7503 }
7504
7505 // Si le document est liée a l' 'instruction' on vérifie
7506 if ($objet == 'instruction' && ! empty($search_element_id)) {
7507 // On recherche sur l'ID dossier et
7508 // - Selon la condition si définie
7509 $search_conditions = '';
7510 $champ_tri = 'date_evenement';
7511 switch ($condition) {
7512 case 'finalise' :
7513 $search_conditions = 'AND om_final_instruction IS TRUE';
7514 $champ_tri = 'date_finalisation_courrier';
7515 break;
7516 case 'signe':
7517 $search_conditions = 'AND om_final_instruction IS TRUE AND date_retour_signature IS NOT NULL';
7518 $champ_tri = 'date_retour_signature';
7519 break;
7520 }
7521 // - Si le document est de instruction.document_instruction_type $search_element_id
7522 $search_document_type = sprintf(
7523 "AND instruction.evenement = '%s'",
7524 intval($search_element_id)
7525 );
7526
7527 $join_document_type_platau_uniquement = '';
7528 if ($type_platau_uniquement) {
7529 $join_document_type_platau_uniquement = sprintf('
7530 INNER JOIN %1$sdocument_type ON document_type.document_type = instruction.document_type_instruction
7531 INNER JOIN %1$sdocument_type_categorie ON
7532 document_type_categorie.document_type_categorie = document_type.document_type_categorie
7533 AND LOWER(document_type_categorie.code) = \''.PLATAU.'\'
7534 ',
7535 DB_PREFIXE
7536 );
7537 }
7538
7539 // Et on récupère le dernier
7540 $sql_search = sprintf(
7541 'SELECT
7542 instruction.instruction
7543 FROM
7544 %1$sinstruction
7545 %2$s
7546 WHERE
7547 instruction.dossier = \'%3$s\'
7548 AND om_fichier_instruction IS NOT NULL
7549 %4$s
7550 %5$s
7551 ORDER BY
7552 %6$s DESC NULLS LAST
7553 LIMIT 1',
7554 DB_PREFIXE,
7555 $join_document_type_platau_uniquement,
7556 $this->db->escapeSimple($dossier_id),
7557 $search_conditions,
7558 $search_document_type,
7559 $champ_tri
7560 );
7561 }
7562
7563 // Récupère le document si le sql de récupération a utilisé a été identifié.
7564 if (! empty($sql_search)) {
7565 $qres = $this->get_one_result_from_db_query(
7566 $sql_search,
7567 array(
7568 'origin' => __METHOD__
7569 )
7570 );
7571 // Si on a un résultat alors on construit le tableau permettant d'identifier
7572 // le document
7573 if (! empty($qres['result'])) {
7574 $array_return = array('objet' => $objet, 'id' => $qres['result']);
7575 }
7576 }
7577 return $array_return;
7578 }
7579
7580 /**
7581 * recuperer_documents_a_annexe
7582 *
7583 * Prend en paramètre une instruction
7584 * récupère le paramétrage des annexes via recuperer_parametrage_annexe()
7585 * puis boucle sur chacun des résultats en utilisant recuperer_derniere_annexe_par_dossier_type_condition()
7586 * pour constituer un tableau de documents à annexer et le renvoyer.
7587 *
7588 * @param int intruction_id : Identifiant de l'instruction
7589 * @param bool type_platau_uniquement : paramètre optionnel permettant de ne récupérer que les annexes dont le type_document est de type platau
7590 *
7591 * @return array : tableau de documents à annexer
7592 */
7593 function recuperer_documents_a_annexe($instruction_id, $type_platau_uniquement = false){
7594 // tableau de documents à annexer
7595 $annexe_array = array();
7596
7597 // Gestion du type de document :
7598 $instruction = $this->get_inst__om_dbform(array(
7599 "obj" => "instruction",
7600 "idx" => $instruction_id,
7601 ));
7602 if (count($instruction->val) > 0){
7603 // récupère le paramétrage des annexes pour l'instruction
7604 $params_list = $this->recuperer_parametrage_annexe($instruction_id);
7605
7606 // pour chacun des résultats constituer un tableau de documents à annexer
7607 foreach ($params_list as $param) {
7608 $annexe = $this->recuperer_derniere_annexe_par_dossier_type_condition(
7609 $instruction->getVal('dossier'),
7610 $param['document_object_type'],
7611 $param['document_object_type_id'],
7612 $param['condition'],
7613 $type_platau_uniquement
7614 );
7615 // Si une annexe a été récupérée , elle est ajoutée au tableau des annexes
7616 if (! empty($annexe)) {
7617 $annexe_array[] = $annexe;
7618 }
7619 }
7620 }
7621
7622 return $annexe_array;
7623 }
7624
7625 /**
7626 * Surcharge de core pour ne pas supprimer tous les utilisateurs lorsque le LDAP renvoie
7627 * une liste vide ou une erreur.
7628 */
7629 public function initSynchronization() {
7630
7631 // Si la configuration de l'annuaire n'est pas correcte alors on
7632 // retourne false
7633 if ($this->isDirectoryAvailable() != true) {
7634 $class = "error";
7635 $message = __("Erreur de configuration. Contactez votre administrateur.");
7636 $this->displayMessage($class, $message);
7637 return false;
7638 }
7639 $this->log(__METHOD__, "configuration LDAP OK", 'DEBUG', 'ldap');
7640
7641 // Authentification de l'administrateur du LDAP
7642 $auth = false;
7643 $auth = $this->connectDirectory($this->directory_config["ldap_admin_login"],
7644 $this->directory_config["ldap_admin_passwd"]);
7645 if ($auth == false) {
7646 $class = "error";
7647 $message = __("Mauvais parametres : l'authentification a l'annuaire n'est pas possible.");
7648 $this->log(__METHOD__, $message, 'ERROR', 'ldap');
7649 $this->displayMessage($class, $message);
7650 return null;
7651 }
7652 if ($auth) {
7653 $this->log(__METHOD__, "authentification LDAP OK", 'DEBUG', 'ldap');
7654
7655 // recheche des utilisateurs de l'annuaire
7656 $this->log(__METHOD__, "recherche LDAP ...", 'DEBUG', 'ldap');
7657 $this->log(__METHOD__, " base DN: ".
7658 var_export($this->directory_config['ldap_base_users'], true), 'DEBUG', 'ldap');
7659 $this->log(__METHOD__, " filtre: ".
7660 var_export($this->directory_config['ldap_user_filter'], true), 'DEBUG', 'ldap');
7661 $this->log(__METHOD__, ' attributs: array("*"))', 'DEBUG', 'ldap');
7662 $ldapResults = null;
7663
7664 foreach (array('ldap_base_users', 'ldap_user_filter') as $key) {
7665 if (empty($this->directory_config[$key])) {
7666 $class = "error";
7667 $message = __("Impossible de poursuivre la recherche des utilisateurs.").
7668 __("Une erreur est survenue lors de l'interrogation du serveur LDAP.");
7669 $message .= ! is_null($err_msg) ? $err_msg : '';
7670 $this->log(__METHOD__, $message, 'ERROR', 'ldap');
7671 $this->displayMessage($class, $message);
7672 return null;
7673 }
7674 }
7675
7676 $ldapResults = ldap_search($this->dt,
7677 $this->directory_config['ldap_base_users'],
7678 $this->directory_config['ldap_user_filter'],
7679 array("*"));
7680 $this->log(__METHOD__, "résultats: ".
7681 (gettype($ldapResults) == 'resource' ? "$ldapResults"
7682 : var_export($ldapResults, true)), 'DEBUG', 'ldap');
7683
7684 // en cas d'erreur
7685 list($err, $err_msg) = $this->ldap_get_last_error($this->dt);
7686 if ($err || $ldapResults === false) {
7687 $class = "error";
7688 $message = __("Impossible de poursuivre la recherche des utilisateurs.").
7689 __("Une erreur est survenue lors de l'interrogation du serveur LDAP.");
7690 $message .= ! is_null($err_msg) ? $err_msg : '';
7691 $this->log(__METHOD__, $message, 'ERROR', 'ldap');
7692 $this->displayMessage($class, $message);
7693 return null;
7694 }
7695
7696 // récupération des utilisateurs de l'annuaire
7697 $this->log(__METHOD__, "récupération des entrées de la requête LDAP ...", 'DEBUG', 'ldap');
7698 $ldapEntries = null;
7699 $ldapEntries = ldap_get_entries($this->dt, $ldapResults);
7700
7701 // log et vérification de la cohérences du nombre d'éléments retournés
7702 if (is_iterable($ldapEntries)) {
7703 $items_toplevel_count = count($ldapEntries);
7704 if (isset($ldapEntries['count'])) {
7705 $this->log(__METHOD__, "résultats ('count' key): ".$ldapEntries['count'], 'DEBUG', 'ldap');
7706 if (intval($ldapEntries['count']) != ($items_toplevel_count - 1)) {
7707 $this->log(__METHOD__,
7708 "items counting differs (".intval($ldapEntries['count']).
7709 " != ".($items_toplevel_count - 1).")", 'WARNING', 'ldap');
7710 }
7711 } else {
7712 $this->log(__METHOD__, "résultats ('count' toplevel): $items_toplevel_count", 'DEBUG', 'ldap');
7713 }
7714 } else {
7715 $this->log(__METHOD__, "résultats: ".var_export($ldapResults, true), 'DEBUG', 'ldap');
7716 }
7717
7718 // en cas d'erreur
7719 list($err, $err_msg) = $this->ldap_get_last_error($this->dt);
7720 if ($err) {
7721 $class = "error";
7722 $message = __("Impossible de poursuivre la recherche des utilisateurs. ").
7723 __("Une erreur est survenue lors de l'interrogation du serveur LDAP.");
7724 $message .= ! is_null($err_msg) ? ' '.$err_msg : '';
7725 $this->log(__METHOD__, $message, 'ERROR', 'ldap');
7726 $this->displayMessage($class, $message);
7727 return null;
7728 }
7729
7730 // si la liste du LDAP est vide
7731 if (empty($ldapEntries) || ! isset($ldapEntries['count']) || strval($ldapEntries['count']) == '0') {
7732 // on retourne un message d'erreur
7733 $class = "error";
7734 $message = __("Impossible de poursuivre la recherche des utilisateurs.").' '.
7735 __("Le traitement a été abandonné suite à une réponse incorrecte de l’annuaire.");
7736 $message .= ! is_null($err_msg) ? ' '.$err_msg : '';
7737 $this->log(__METHOD__, $message, 'ERROR', 'ldap');
7738 $this->displayMessage($class, $message);
7739 return null;
7740 }
7741
7742 // récupération des utilisateurs de la base de données
7743 $sql = "SELECT * ".
7744 "FROM ".DB_PREFIXE.$this->table_om_utilisateur." ".
7745 "WHERE UPPER(".$this->table_om_utilisateur_field_om_type.") = 'LDAP';";
7746 $sqlRes = $this->db->query($sql);
7747 $this->log(__METHOD__, "sql: ".var_export($sql, true), 'DEBUG', 'ldap');
7748 $this->isDatabaseError($sqlRes);
7749 $databaseEntries = array();
7750 while ($row =& $sqlRes->fetchrow(DB_FETCHMODE_ASSOC)) {
7751 array_push($databaseEntries, $row);
7752 }
7753 // tableau des utilisateurs se trouvant dans l'annuaire et non en base
7754 $userToAdd = array();
7755 // tableau des utilisateurs se trouvant dans la base et non en annuaire
7756 $userToDelete = $databaseEntries;
7757 // tableau des utilisateurs se trouvant dans la base et l'annuaire
7758 $userToUpdate = array();
7759
7760 $nbrDatabaseEntries = count($databaseEntries);
7761 $matched = false;
7762 // pour chaque utilisateur de l'annuaire on recherche s'il
7763 // existe dans la base un utilisateur ayant le même login
7764 for ($i=0; $i<$ldapEntries['count']; $i++) {
7765 for ($j=0; $j<$nbrDatabaseEntries; $j++) {
7766 if ($ldapEntries[$i][$this->directory_config["ldap_login_attrib"]][0] == $databaseEntries[$j]['login']) {
7767 unset($userToDelete[$j]);
7768 $matched = true;
7769 }
7770 }
7771 // si l'utilisateur de l'annuaire n'est pas dans la base, on
7772 // l'ajoute a la liste des utilisateurs a ajouter
7773 if ($matched == false) {
7774 array_push($userToAdd, $ldapEntries[$i]);
7775 // si l'utilisateur de l'annuaire est dans la base, on l'ajoute
7776 // a la liste des utilisateurs a mettre a jour
7777 } else {
7778 array_push($userToUpdate, $ldapEntries[$i]);
7779 }
7780 $matched = false;
7781 }
7782 $this->log(__METHOD__, "=> to add: ".count($userToAdd).", to update:".count($userToUpdate).", to delete: ".count($userToDelete), 'INFO', 'ldap');
7783 return array(
7784 "userToAdd" => $userToAdd,
7785 "userToDelete" => $userToDelete,
7786 "userToUpdate" => $userToUpdate,
7787 );
7788 }
7789 }
7790
7791 /**
7792 * Initialisation de la connexion au serveur LDAP.
7793 *
7794 * Se connecte à l'annuaire et essaye de s'authentifier. Retourne true en
7795 * cas de succès ou false en cas d'erreur.
7796 *
7797 * @param string $login Identifiant.
7798 * @param string $password Mot de passe.
7799 *
7800 * @return boolean
7801 */
7802 public function connectDirectory($login = "", $password = "") {
7803 // On recupere le tableau de parametres pour la connexion a la base
7804 $this->setDirectoryConfig();
7805
7806 // Instanciation de l'objet connexion a l'annuaire
7807 $this->log(__METHOD__, "initialisation de la connexion LDAP ...", 'DEBUG', 'ldap');
7808 $proto = $this->directory_config["ldap_proto"] ?? 'LDAP'; // or LDAPS
7809 $server = $this->directory_config["ldap_server"] ?? null;
7810 $port = $this->directory_config["ldap_server_port"] ?? 389;
7811 $this->log(__METHOD__, " proto: ".var_export($proto, true), 'DEBUG', 'ldap');
7812 $this->log(__METHOD__, " serveur: ".var_export($server, true), 'DEBUG', 'ldap');
7813 $this->log(__METHOD__, " port: ".var_export($port, true), 'DEBUG', 'ldap');
7814 $server_port = "$server:$port";
7815 $uri = "$proto://$server_port";
7816 if (($semicolon_pos = strrchr(':', $server)) !== false) {
7817 $srv_port = substr($semicolon_pos, 1);
7818 if (! empty($srv_port) && ! empty($port) && intval($srv_port) != intval($port)) {
7819 $this->authentication_message = __("L'application n'est pas en mesure de se connecteur au serveur LDAP. Contactez votre administrateur.").
7820 __(" Détail: ").sprintf(__("les paramètres du serveur sont incorrectes (%s)."), "serveur: $server, port: $port");
7821 $this->log(__METHOD__, $this->authentication_message, 'ERROR', 'ldap');
7822 return false;
7823 }
7824 $server_port = $server;
7825 $uri = "$proto://$server_port";
7826 }
7827 $this->log(__METHOD__, " uri: ".var_export($uri, true), 'DEBUG', 'ldap');
7828 $this->dt = ldap_connect($uri);
7829 if ($this->dt === false) {
7830 $this->authentication_message = __("L'application n'est pas en mesure de se connecteur au serveur LDAP. Contactez votre administrateur.").
7831 __(" Détail: ").sprintf(__("les paramètres du serveur sont incorrectes (%s)."), $server_port);
7832 $this->log(__METHOD__, $this->authentication_message, 'ERROR', 'ldap');
7833 return false;
7834 }
7835 if (($proto_vers_no_setup = $this->directory_config['ldap_proto_vers_no_setup'] ?? false) !== true) {
7836 $proto_vers = $this->directory_config['ldap_proto_vers'] ?? 3;
7837 if (ldap_set_option($this->dt, LDAP_OPT_PROTOCOL_VERSION, $proto_vers) !== true) {
7838 $this->authentication_message = __("L'application n'est pas en mesure de se connecteur au serveur LDAP. Contactez votre administrateur.").
7839 __(" Détail: ").sprintf(__("impossible de définir le numéro de version du protocole (%s)."), var_export($proto_vers, true));
7840 $this->log(__METHOD__, $this->authentication_message, 'ERROR', 'ldap');
7841 return false;
7842 }
7843 $this->log(__METHOD__, " version: ".var_export($proto_vers, true), 'DEBUG', 'ldap');
7844 }
7845 $this->log(__METHOD__, "initialisé", 'INFO', 'ldap');
7846
7847 $this->log(__METHOD__, "connexion et authentification LDAP ...", 'DEBUG', 'ldap');
7848 $this->log(__METHOD__, " login: ".var_export($login, true), 'DEBUG', 'ldap');
7849 @$ldap_connect_user = ldap_bind($this->dt, $login, $password);
7850
7851 // en cas d'erreur d'authentification
7852 if ($ldap_connect_user !== true) {
7853 $error = ldap_error($this->dt);
7854 if ($error == "Invalid credentials") {
7855 $this->authentication_message = __("Votre identifiant ou votre mot de passe est incorrect.");
7856 $error_log_mode = 'WARNING';
7857 } else {
7858 $this->authentication_message = __("L'application n'est pas en mesure de vous identifier pour l'instant. Contactez votre administrateur.");
7859 $error_log_mode = 'ERROR';
7860 }
7861 $this->log(__METHOD__, $this->authentication_message.' Détails: '.$error, $error_log_mode, 'ldap');
7862 } else {
7863 $this->log(__METHOD__, "connecté et authentifié", 'INFO', 'ldap');
7864 }
7865 return $ldap_connect_user;
7866 }
7867
7868 /**
7869 * Deconnexion avec le serveur LDAP
7870 *
7871 * @return bool Etat du succes de la deconnexion
7872 * @access public
7873 */
7874 public function disconnectDirectory() {
7875 $res = ldap_unbind($this->dt);
7876
7877 // en cas d'erreur
7878 if ($res !== true) {
7879 $err_msg = null;
7880 if (is_resource($this->dt)) {
7881 list($err, $err_msg) = $this->ldap_get_last_error($this->dt);
7882 }
7883 $class = "error";
7884 $message = __("Impossible de poursuivre la recherche des utilisateurs.").
7885 __("Une erreur est survenue lors de la déconnexion du serveur LDAP.");
7886 $message .= ! is_null($err_msg) ? ' '.$err_msg : '';
7887 $this->log(__METHOD__, $message, 'WARNING', 'ldap');
7888 } else {
7889 $this->log(__METHOD__, "déconnecté", 'INFO', 'ldap');
7890 }
7891 return $res;
7892 }
7893
7894 /**
7895 * Met à jour la table 'utilisateur' avec les opérations de synchronisation
7896 * calculées auparavant.
7897 *
7898 * @param array $users Liste des opérations de synchronisation à mener.
7899 *
7900 * @return boolean
7901 */
7902 public function synchronizeUsers($users) {
7903
7904 // ajout des utilisateurs
7905 $attribError = false;
7906 if (is_array($users) && array_key_exists('userToAdd', $users)) {
7907 $this->log(__METHOD__, "ajout des utilisateurs ...", 'DEBUG', 'ldap');
7908 foreach ($users['userToAdd'] as $user) {
7909 if (!array_key_exists($this->directory_config['ldap_login_attrib'], $user)) {
7910 $attribError = true;
7911 continue;
7912 }
7913
7914 $res = null;
7915 $valF = $this->getValFUserToAdd($user);
7916
7917 $login = $valF[$this->table_om_utilisateur_field_login] ?? null;
7918 $profil = $valF[$this->table_om_utilisateur_field_om_profil] ?? null;
7919 $collectivite = $valF[$this->table_om_utilisateur_field_om_collectivite] ?? null;
7920 $this->log(__METHOD__, " + ".
7921 sprintf('%38s | %4s | %4s', $login, $profil, $collectivite), 'DEBUG', 'ldap');
7922
7923 $res = $this->db->autoExecute(DB_PREFIXE.$this->table_om_utilisateur, $valF, DB_AUTOQUERY_INSERT);
7924 if ($this->isDatabaseError($res, true)) {
7925 $class = "error";
7926 $message = __("Erreur de base de donnees. Contactez votre administrateur.");
7927 $this->log(__METHOD__, $message, 'ERROR', 'ldap');
7928 $this->displayMessage($class, $message);
7929 return false;
7930 }
7931 }
7932 }
7933
7934 // suppression des utilisateurs
7935 if (is_array($users) && array_key_exists('userToDelete', $users)) {
7936 $this->log(__METHOD__, "suppression des utilisateurs ...", 'DEBUG', 'ldap');
7937 foreach ($users['userToDelete'] as $user) {
7938 $om_utilisateur = $this->get_inst__om_dbform(array(
7939 "obj" => "om_utilisateur",
7940 "idx" => $user[$this->table_om_utilisateur_field_id],
7941 ));
7942 $value_om_utilisateur = array(
7943 $this->table_om_utilisateur_field_id => $user[$this->table_om_utilisateur_field_id],
7944 );
7945
7946 $id = $om_utilisateur->getVal($this->table_om_utilisateur_field_id) ?? null;
7947 $login = $om_utilisateur->getVal($this->table_om_utilisateur_field_login) ?? null;
7948 $profil = $om_utilisateur->getVal($this->table_om_utilisateur_field_om_profil) ?? null;
7949 $collectivite = $om_utilisateur->getVal($this->table_om_utilisateur_field_om_collectivite) ?? null;
7950 $this->log(__METHOD__, " - ".
7951 sprintf('%5d | %30s | %4s | %4s', $id, $login, $profil, $collectivite), 'DEBUG', 'ldap');
7952
7953 $om_utilisateur->supprimer($value_om_utilisateur, $this->db, DEBUG);
7954 }
7955 }
7956
7957 // mise a jour des utilisateurs
7958 if (is_array($users) && array_key_exists('userToUpdate', $users)) {
7959 $this->log(__METHOD__, "mise à jour des utilisateurs ...", 'DEBUG', 'ldap');
7960 foreach ($users['userToUpdate'] as $user) {
7961 $user_datas = $this->getValFUserToUpdate($user);
7962 $user_login = $user_datas[$this->table_om_utilisateur_field_login];
7963
7964 $id = $user_datas[$this->table_om_utilisateur_field_id] ?? null;
7965 $login = $user_login;
7966 $profil = $user_datas[$this->table_om_utilisateur_field_om_profil] ?? null;
7967 $collectivite = $user_datas[$this->table_om_utilisateur_field_om_collectivite] ?? null;
7968 $this->log(__METHOD__, " ~ ".
7969 sprintf('%5d | %30s | %4s | %4s', $id, $login, $profil, $collectivite), 'DEBUG', 'ldap');
7970
7971 unset($user_datas[$this->table_om_utilisateur_field_id]);
7972 unset($user_datas[$this->table_om_utilisateur_field_login]);
7973
7974 $res = $this->db->autoExecute(
7975 DB_PREFIXE.$this->table_om_utilisateur,
7976 $user_datas, DB_AUTOQUERY_UPDATE,
7977 $this->table_om_utilisateur_field_login."='".$user_login."'");
7978 if ($this->isDatabaseError($res, true)) {
7979 $class = "error";
7980 $message = __("Erreur de base de donnees. Contactez votre administrateur.");
7981 $this->log(__METHOD__, $message, 'ERROR', 'ldap');
7982 $this->displayMessage($class, $message);
7983 return false;
7984 }
7985 }
7986 }
7987
7988 // en cas d'erreur d'attribut
7989 if ($attribError) {
7990 $class = "error";
7991 $message = sprintf(
7992 __("Certains enregistrements provenant du LDAP ne possedent pas l'attribut %s."),
7993 $this->directory_config['ldap_login_attrib']).' '.__("Ils ne peuvent donc pas etre synchronises.");
7994 $this->log(__METHOD__, $message, 'ERROR', 'ldap');
7995 $this->displayMessage($class, $message);
7996 }
7997
7998 // succès
7999 $class = "ok";
8000 $message = __("La synchronisation des utilisateurs est terminee.");
8001 $this->log(__METHOD__, $message, 'INFO', 'ldap');
8002 $this->displayMessage($class, $message);
8003 return true;
8004 }
8005
8006 /**
8007 * Cette methode permet verifier si la fonctionnalite annuaire est
8008 * disponible ou non. Si le support n'est pas active sur le serveur alors
8009 * les fonctions utilisees ne seront pas disponibles.
8010 *
8011 * @return boolean
8012 */
8013 function isDirectoryAvailable() {
8014 if (! function_exists('ldap_connect')) {
8015 $this->log(__METHOD__,
8016 __("Les fonctions LDAP ne sont pas disponibles sur cette installation."),
8017 'ERROR', 'ldap');
8018 return false;
8019 }
8020 if ($this->setDirectoryConfig() == false) {
8021 return false;
8022 }
8023 return true;
8024 }
8025
8026 /**
8027 * Renvoie si une erreur LDAP a eut lieu et son texte détaillé.
8028 *
8029 * @param resource $conn La connexion au LDAP
8030 *
8031 * @return array Format (error<boolean>, message<string|null>)
8032 */
8033 public function ldap_get_last_error($conn) {
8034 if (! is_resource($conn)) {
8035 $this->log(__METHOD__, "Échec de la récupération du message de diagnostique LDAP ".
8036 "(la connexion LDAP fournie n'est pas valide: ".gettype($conn).")", 'WARNING', 'ldap');
8037 return array(false, null);
8038 }
8039 $errno = ldap_errno($conn);
8040 $err = $errno !== 0; // LDAP_SUCCESS
8041 $msg = null;
8042 if ($err) {
8043 $msg = ldap_err2str($errno).' ('.var_export($errno, true).')';
8044 $msg_detail = null;
8045 if (ldap_get_option($conn, LDAP_OPT_DIAGNOSTIC_MESSAGE, $msg_detail) !== false) {
8046 if (! empty($msg_detail)) {
8047 $msg .= '. '.__("Détail").': '.$msg_detail;
8048 }
8049 } else {
8050 $this->log(__METHOD__, "Échec de la récupération du message de diagnostique LDAP ".
8051 "(pendant la construction du message d'erreur d'une autre erreur LDAP: [$errno] $msg)",'WARNING', 'ldap');
8052 }
8053 }
8054 return array($err, $msg);
8055 }
8056 }

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26