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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

1 mbroquet 3730 <?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 softime 8329 if (file_exists("../dyn/locales.inc.php") === true) {
14     require_once "../dyn/locales.inc.php";
15     }
16 mbroquet 3730
17     /**
18     *
19     */
20 softime 8329 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 softime 9282 * TCPDF specific config
30     */
31     define('K_TCPDF_EXTERNAL_CONFIG', true);
32     define('K_TCPDF_CALLS_IN_HTML', true);
33 softime 12847 define('K_PATH_FONTS', '../app/fonts/');
34 softime 9282
35     /**
36 softime 8329 * 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 softime 9282 getcwd()."/../php/pear",
46     getcwd()."/../php/db",
47 softime 8329 getcwd()."/../php/fpdf",
48     getcwd()."/../php/phpmailer",
49     getcwd()."/../php/tcpdf",
50     )
51     )
52     );
53 mbroquet 3730
54 softime 8329 /**
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 mbroquet 3730 /**
80     *
81     */
82 softime 8329 if (file_exists("../dyn/debug.inc.php") === true) {
83     require_once "../dyn/debug.inc.php";
84     }
85 mbroquet 3730
86     /**
87     *
88     */
89     (defined("PATH_OPENMAIRIE") ? "" : define("PATH_OPENMAIRIE", ""));
90    
91     /**
92 softime 11228 * 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 softime 18436 * 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 softime 13137 * 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 softime 17542 * 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 mbroquet 3730 *
112     */
113     require_once PATH_OPENMAIRIE."om_application.class.php";
114    
115 softime 17542 require_once __DIR__."/module_manager.class.php";
116     use Module\module_manager;
117    
118 softime 18436 require_once __DIR__.'/extra_data_store.impl_2_tables.php';
119    
120 mbroquet 3730 /**
121     *
122     */
123     class utils extends application {
124    
125 fmichon 4471 /**
126 softime 8329 * 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 fmichon 4471 * 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 softime 8329 /**
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 softime 15037 /**
161     * Stockage des paramètres des collectivités.
162     *
163     * @var array
164     */
165     protected $collectivitiesParameters = array();
166    
167 softime 17542 /**
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 softime 18436 * Instance du stockage de données « supplémentaires »
199     */
200     public $extra_data_store;
201    
202     /**
203 softime 17542 * 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 softime 18769 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 softime 17542 }
219     }
220    
221 softime 18769
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 softime 17542 $this->module_manager = new module_manager($this);
231 softime 18436
232     $this->extra_data_store = new extra_data_store_2_tables($this);
233 softime 17542 }
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 softime 19592 public function log(string $method, string $message, string $level = 'DEBUG',
246     string $filename = 'debug', int $method_max_len = 52) {
247 softime 18436 if (! isset($this->log_levels[$level])) {
248 softime 17542 $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 softime 19592 $log_dir = dirname(__DIR__).'/var/log';
256 softime 17542 $log_file = $filename.'.log';
257     $log_path = "$log_dir/$log_file";
258    
259 softime 19592 $method_len = $method_max_len;
260 softime 17542 $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 mbroquet 3730 // {{{
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 softime 15650
298 softime 15037 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 mbroquet 3730
302 softime 15037 //// BEGIN - SURCHARGE OPENADS
303 mbroquet 3730
304 softime 15037 // 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 softime 4749 && 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 softime 15037 // 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 mbroquet 3730
334 softime 15037 //// END - SURCHARGE OPENADS
335 mbroquet 3730
336 softime 15037 // 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 mbroquet 3730 }
345 softime 15037 // Renvoie la liste des paramètres de la collectivité voulue
346     return $this->collectivitiesParameters[$om_collectivite_idx];
347 mbroquet 3730 }
348    
349     /**
350 softime 10573 * 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 softime 14064 * 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 softime 18436 * 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 mbroquet 3730 * 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 softime 14064 $idx = $this->get_collectivite_par_niveau(2);
470 mbroquet 3730 // S'il n'y a pas de collectivité de niveau 2
471     if ($idx == null || $idx == '') {
472     // Compte le nombre de collectivité
473 softime 14064 $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 mbroquet 3730 // S'il y qu'une collectivité
487     if ($count == 1) {
488     // Récupère l'identifiant de la seule collectivité
489 softime 14064 $idx = $this->get_collectivite_par_niveau(1);
490 mbroquet 3730 }
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 softime 7996 $instance = $this->get_inst__om_dbform(array(
508     "obj" => $table,
509     "idx" => $id,
510     ));
511 mbroquet 3730 if($instance->getVal($instance->clePrimaire) != '') {
512     return $instance->getVal('om_collectivite');
513     }
514     return false;
515     }
516    
517    
518     /**
519 softime 6929 * 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 mbroquet 3730 */
526 softime 6929 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 softime 14064 $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 softime 6929 //
546 mbroquet 3730 return true;
547     }
548 softime 6929 //
549 mbroquet 3730 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 softime 11876 public $user_is_tiers = NULL;
560 mbroquet 3730 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 softime 18876 if(isset($_SESSION['login']) && !empty($_SESSION['login'])) {
574 softime 14542
575 mbroquet 3730 // Récupération des infos utilisateur
576 softime 14542 $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 mbroquet 3730
597 softime 14542 // On ne récupère que la 1ere ligne
598     $this->om_utilisateur = array_shift($qres['result']);
599    
600 mbroquet 3730 // Récupère le profil et test si c'est un
601 softime 14064 $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 mbroquet 3730 // 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 softime 14542 $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 mbroquet 3730 // Si il y a un resultat c'est un instructeur
683 softime 9245 if (is_array($tempInstr) === true && count($tempInstr) > 0) {
684 mbroquet 3730 $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 softime 14542
690 mbroquet 3730 // Récupération des infos de services consultés
691 softime 14542 $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 softime 11876 );
710 softime 14542
711     foreach ($qres['result'] as $result) {
712     $this->om_utilisateur['service'][]=$result;
713 mbroquet 3730 }
714 softime 14542
715 mbroquet 3730 // 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 softime 11876
722    
723     // Récupération des infos de tiers consultés
724 softime 14542 $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 softime 11876 );
743 softime 14542
744     foreach ($qres['result'] as $result) {
745     $this->om_utilisateur['tiers'][]=$result;
746 softime 11876 }
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 mbroquet 3730 }
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 softime 11876 * 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 mbroquet 3730 * 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 softime 6565 $return = false;
861    
862 softime 7996 $object_instance = $this->get_inst__om_dbform(array(
863     "obj" => $obj,
864     "idx" => "]",
865     ));
866 mbroquet 3730 // 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 softime 6565 if($this->isUserInstructeur() === true &&
869 softime 18876 ($object_instance->getDivisionFromDossier($idx) == $_SESSION["division"] ||
870 softime 6565 ($obj == "instruction" &&
871     $object_instance->isInstrCanChangeDecision($idx) === true))) {
872 mbroquet 3730
873 softime 6565 $return = true;
874 mbroquet 3730 }
875    
876     return $return;
877     }
878    
879 softime 6565
880 mbroquet 3730 /**
881 softime 6565 * Ajout de variables de session contenant la division pour permettre une
882     * utilisation plus efficace dans les requetes.
883 mbroquet 3730 *
884 softime 6565 * @param array $utilisateur Tableau d'informations de l'utilisateur.
885 mbroquet 3730 */
886 softime 6929 function triggerAfterLogin($utilisateur = NULL) {
887 softime 14542
888 softime 6565 // Récupération de la division de l'utilisateur.
889 softime 14542 $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 softime 6565 );
907 softime 14542
908     // On ne récupère que la 1ere ligne
909     $row = array_shift($qres['result']);
910    
911 softime 6565 // Enregistrement de la division en session
912 mbroquet 3730 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 softime 14542
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 softime 6565 );
943 softime 14542
944     $resGroupes=$qres['result'];
945    
946 softime 6565 // Si aucun résultat alors récupération du paramétrage des groupes du profil
947 softime 14542 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 softime 6565 );
971 softime 14542
972     $resGroupes = $qres['result'];
973 softime 6565 }
974     $_SESSION["groupe"] = array();
975     // Enregistrement des groupe en session
976 softime 14542 foreach ($resGroupes as $result) {
977     // $resGroupes=$result;
978     if ($result["confidentiel"] === 't') {
979     $result["confidentiel"] = true;
980 softime 6565 } else {
981 softime 14542 $result["confidentiel"] = false;
982 softime 6565 }
983 softime 14542 if ($result["enregistrement_demande"] === 't') {
984     $result["enregistrement_demande"] = true;
985 softime 6565 } else {
986 softime 14542 $result["enregistrement_demande"] = false;
987 softime 6565 }
988 softime 14542 $_SESSION["groupe"][$result["code"]] = array(
989     "confidentiel" => $result["confidentiel"],
990     "enregistrement_demande" => $result["enregistrement_demande"],
991     "libelle" => $result["libelle"],
992 softime 6565 );
993     }
994     }
995 mbroquet 3730
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 softime 16749 /**
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 softime 18769 * Authentifie un utilisateur à partir de son login.
1035 softime 16749 *
1036 softime 18769 * @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 softime 16749 *
1040 softime 18769 * @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 softime 16749 *
1077 softime 18769 * @return array format: (bool authenticated, string message, array data)
1078 softime 16749 */
1079 softime 18769 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 softime 16749 }
1106 softime 18769 $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 softime 16749 }
1117    
1118     /**
1119     * Cette methode permet d'effectuer toutes les verifications et les
1120     * traitements necessaires pour la gestion de l'authentification des
1121 softime 18769 * utilisateurs a l'application.
1122 softime 16749 *
1123     * @return void
1124     */
1125 softime 18769 function login() {
1126 softime 16749 // 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 softime 18769 $this->came_from = $came_from;
1137    
1138 softime 16749 // Debug
1139 softime 18769 $this->log(__METHOD__, "start", 'DEBUG', 'auth');
1140     $this->redirect_authenticated_users();
1141 softime 16749 // 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 softime 18769 $this->log(__METHOD__, "end (don't wantToAuthenticate)", 'DEBUG', 'auth');
1147     return;
1148 softime 16749 }
1149 softime 18769 // 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 softime 16749 // On recupere le login et le mot de passe de l'utilisateur qui
1160     // demande l'authentification
1161 softime 18769 $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 softime 16749 // On procede a l'authentification
1184 softime 18769 $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 softime 16749 if ($authenticated) {
1229     $user_infos = $this->retrieveUserProfile($login);
1230     }
1231 softime 18769 $this->log(__METHOD__, "user infos: ".var_export($user_infos, true), 'DEBUG', 'auth');
1232 softime 16749 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 softime 18769 $this->disconnectDatabase();
1244 softime 16749 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 softime 18769 $this->addToMessage('error', $this->authentication_message);
1259 softime 16749 }
1260 softime 18769 $this->log(__METHOD__, "end", 'DEBUG', 'auth');
1261 softime 16749 }
1262    
1263     /**
1264 softime 18769 * Affiche le formulaire de login.
1265 softime 16749 *
1266 softime 18769 * @return void
1267 softime 16749 */
1268 softime 18769 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 softime 16749 }
1336 softime 18769 $form->setSelect("coll", $contenu);
1337     if (isset($_SESSION['coll'])) {
1338     $form->setVal("coll", $_SESSION['coll']);
1339     }
1340 softime 16749 }
1341 softime 18769
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 softime 18876 if (isset($this->config['password_reset']) && $this->config['password_reset'] == true) {
1359 softime 18769 $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 softime 16749 }
1385    
1386     /**
1387 softime 18769 * Redirige les utilisateurs authentifiés vers le tableau de bord.
1388 softime 16749 *
1389 softime 18769 * @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 softime 16749 *
1407 softime 18769 * 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 softime 16749 * @access public
1412     */
1413 softime 18769 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 softime 16749 ),
1439     );
1440 softime 18769 foreach ($this->get_initialized_parameters($params) as $key => $value) {
1441     ${$key} = $value;
1442 softime 16749 }
1443 softime 18769 $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 softime 16749 }
1453 softime 18769 // 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 softime 16749 }
1532    
1533 softime 18769 /**
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 mbroquet 3730 // }}}
1557    
1558    
1559     // {{{ GESTION DES FICHIERS
1560    
1561     /**
1562     *
1563     */
1564     function notExistsError ($explanation = NULL) {
1565     // message
1566     $message_class = "error";
1567 softime 18876 $message = __("Cette page n'existe pas.");
1568 mbroquet 3730 $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 softime 14064 if ($idx != '') {
1587 mbroquet 3730 //On récupère le statut de l'état du dossier à partir de l'identifiant du
1588     //dossier d'instruction
1589 softime 14064 $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 mbroquet 3730 }
1608     return $statut;
1609     }
1610    
1611     /**
1612     * Formate le champ pour le type Timestamp
1613 softime 8989 * @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 mbroquet 3730 */
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 softime 8989 // Date en affichage
1628 mbroquet 3730 $date_show = explode ('/', $date[0]);
1629    
1630     // Contrôle la composition de la date
1631 softime 18876 if (count ($date_db) != 3 && count ($date_show) != 3) {
1632 mbroquet 3730 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 softime 14542 * @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 mbroquet 3730 *
1675     * @return array (array(prefixe, quartier, section, parcelle), ...)
1676     */
1677 softime 14542 function parseParcelles($strParcelles, $collectivite_idx = null, $dossier_id = null) {
1678 mbroquet 3730
1679 softime 19592 // 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 mbroquet 3730 $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 softime 10573 // Si le contenu de la parcelle est vide on passe à la suite
1687 softime 14542 if (strval($parcelles) === ""){
1688     continue;
1689 softime 10573 }
1690 mbroquet 3730 // Tableau des champs de la ligne de références cadastrales
1691     $reference_tab = array();
1692 softime 10573 // 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 mbroquet 3730 }
1697 softime 10573
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 softime 19307 } 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 softime 10573 }
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 softime 14542 // 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 mbroquet 3730 // 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 softime 14542 if ($collectivite_idx !== null
1768     && $collectivite_idx !== false) {
1769 mbroquet 3730 // 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 softime 18876 if( $ancien_ref_parc == "" || $reference_tab[$i-1] == "/") {
1777 mbroquet 3730 // 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 softime 14542 $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 mbroquet 3730 }
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 softime 14064 $qres = $this->get_one_result_from_db_query(
1821     sprintf(
1822     'SELECT
1823 mbroquet 3730 arrondissement.code_impots
1824     FROM
1825 softime 14064 %1$sarrondissement
1826     LEFT JOIN %1$squartier
1827     ON quartier.arrondissement = arrondissement.arrondissement
1828 mbroquet 3730 WHERE
1829 softime 14064 quartier.code_impots = \'%2$s\'',
1830     DB_PREFIXE,
1831     $quartier
1832     ),
1833     array(
1834     "origin" => __METHOD__,
1835     )
1836     );
1837 mbroquet 3730 }
1838     // Retour
1839 softime 14064 $code_impots = ! isset($qres["result"]) || $qres["result"] === null ?
1840     '' :
1841     $qres["result"];
1842 mbroquet 3730 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 softime 14064 $arrondissement = $this->get_arrondissement_code_impot($value["quartier"]);
1867 mbroquet 3730
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 softime 7996 $object = $this->get_inst__om_dbform(array(
1907     "obj" => $table,
1908     "idx" => "]",
1909     ));
1910 mbroquet 3730
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 softime 17542 /**
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 softime 18876 $error_msg = __("La valeur %s du champ %s est invalide, 'NULL' losque est utilisé doit être la seule valeur du champ.");
1963 softime 17542 return array(
1964     false,
1965     sprintf(
1966     $error_msg,
1967     '<b>'.$rule.'</b>',
1968 softime 18876 '<b>'.__($rule_name).'</b>'
1969 softime 17542 )
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 softime 18876 $error_msg = __("La valeur %s du champ %s, n'est pas une chaine 'x mois' ou 'x jours' valide.");
2000 softime 17542 return array(
2001     false,
2002     sprintf(
2003     $error_msg,
2004     '<b>'.$operand.'</b>',
2005 softime 18876 '<b>'.__($rule_name).'</b>'
2006 softime 17542 )
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 softime 18436
2026 mbroquet 3730 /**
2027     * Récupère la lettre type lié à un événement
2028     * @param integer $evenement L'identifiant de l'événement
2029 softime 14542 * @return integer Retourne l'idenfiant de la lettre-type ou true
2030 mbroquet 3730 */
2031     function getLettreType($evenement){
2032 softime 14542
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 softime 12847 );
2048 softime 14542
2049     $lettretype = null;
2050 softime 15835 if ($qres['row_count'] > 0) {
2051 softime 14542 $row = array_shift($qres['result']);
2052 mbroquet 3730 $lettretype = $row['lettretype'];
2053 softime 18436 }
2054 mbroquet 3730 return $lettretype;
2055     }
2056 softime 18436
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 mbroquet 3730
2076 softime 18436
2077 mbroquet 3730 /**
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 softime 14064 $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 softime 19307 INNER JOIN %1$sdossier_instruction_type
2090     ON dossier_autorisation_type_detaille.dossier_autorisation_type_detaille = dossier_instruction_type.dossier_autorisation_type_detaille
2091 softime 14064 INNER JOIN %1$sdossier
2092 softime 19307 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
2093    
2094 softime 14064 WHERE
2095     dossier.dossier = \'%2$s\'',
2096     DB_PREFIXE,
2097     $this->db->escapeSimple($idxDossier)
2098     ),
2099     array(
2100     "origin" => __METHOD__,
2101     )
2102 softime 12847 );
2103 softime 14064 return $qres["result"];
2104 mbroquet 3730 }
2105    
2106     /**
2107 fmichon 4708 * 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 softime 14064 $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 softime 19307 INNER JOIN %1$sdossier_instruction_type
2121     ON dossier_autorisation_type_detaille.dossier_autorisation_type_detaille = dossier_instruction_type.dossier_autorisation_type_detaille
2122 softime 14064 INNER JOIN %1$sdossier
2123 softime 19307 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
2124 softime 14064 WHERE
2125     dossier.dossier = \'%2$s\'',
2126     DB_PREFIXE,
2127     $this->db->escapeSimple($idxDossier)
2128     ),
2129     array(
2130     "origin" => __METHOD__,
2131     )
2132 softime 12847 );
2133 softime 14064 return $qres["result"];
2134 fmichon 4708 }
2135    
2136     /**
2137 mbroquet 3730 * 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 softime 14542 $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 mbroquet 3730
2170     // Valeurs clonées
2171     $valF = array();
2172 softime 14542
2173     foreach ($qres['result'] as $result) {
2174     $valF = $result;
2175 mbroquet 3730 }
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 softime 7996 $clone_obj = $this->get_inst__om_dbform(array(
2182     "obj" => $obj,
2183     "idx" => "]",
2184     ));
2185 mbroquet 3730 // 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 softime 8989 $clone_obj->ajouter($valF);
2196 mbroquet 3730 // 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 softime 18876 $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 softime 7996 $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 mbroquet 3730 // 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 softime 14542 $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 mbroquet 3730
2244     // Pour chaque élément associé
2245 softime 14542 foreach ($qres['result'] as $result) {
2246 mbroquet 3730 // Identifiant de l'objet associé à copier
2247 softime 14542 $idxsf = $result[$objsf];
2248 mbroquet 3730
2249     // Valeurs clonées
2250 softime 14542 $valF = $result;
2251 mbroquet 3730 // 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 softime 7996 $clone_objsf = $this->get_inst__om_dbform(array(
2257     "obj" => $objsf,
2258     "idx" => "]",
2259     ));
2260 mbroquet 3730 // 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 softime 8989 $clone_objsf->ajouter($valF);
2272 mbroquet 3730 // 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 softime 7996 $message .= sprintf(
2279 softime 18876 __("La copie de l'enregistrement %s avec l'identifiant %s s'est effectuee avec succes"),
2280     "<span class='bold'>".__($objsf)."</span>",
2281 softime 7996 "<span class='bold'>".$idxsf."</span>"
2282     )."<br />";
2283 mbroquet 3730
2284     // Ajout de l'identifant au tableau des résultat
2285 softime 14542 $resArray[$objsf.'_'.$result[$objsf]] = $clone_objsf_id;
2286 mbroquet 3730 } 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 softime 9282 if (count($groupes) > 0) {
2425 mbroquet 3730 // 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 softime 9245 // On force le type du paramètre $delay
2471     $delay = intval($delay);
2472 mbroquet 3730
2473 softime 17542 // On force le type en minuscules
2474     $type = strtolower($type);
2475    
2476 mbroquet 3730 // Si un type n'est pas définit
2477 softime 17542 if ($type != "mois" && $type != "jour" && $type != "jours") {
2478 mbroquet 3730 //
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 softime 17542 if ($type == "jour" || $type == "jours") {
2584 mbroquet 3730 //
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 softime 10713
2653 softime 8477 /**
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 mbroquet 3730
2668 softime 8477 //
2669     return false;
2670     }
2671    
2672    
2673    
2674 mbroquet 3730 /**
2675     * Vérifie que l'option d'accès au portail citoyen est activée.
2676     *
2677 softime 7366 * @param integer $om_collectivite Identifiant de la collectivité.
2678     *
2679 mbroquet 3730 * @return boolean
2680     */
2681 softime 7366 public function is_option_citizen_access_portal_enabled($om_collectivite=null) {
2682 mbroquet 3730 //
2683 softime 7366 $parameters = $this->getCollectivite($om_collectivite);
2684 mbroquet 3730 //
2685 softime 7366 if (isset($parameters['option_portail_acces_citoyen']) === true
2686     && $parameters['option_portail_acces_citoyen'] === 'true') {
2687 mbroquet 3730 //
2688 softime 7366 return true;
2689 mbroquet 3730 }
2690    
2691     //
2692 softime 7366 return false;
2693 mbroquet 3730 }
2694    
2695 softime 7366
2696 nmeucci 4108 /**
2697 softime 4626 * Vérifie que l'option du SIG est activée.
2698     *
2699     * @return boolean
2700     */
2701 softime 7996 public function is_option_sig_enabled($om_collectivite=null) {
2702 softime 4626 //
2703 softime 7996 $parameters = $this->getCollectivite($om_collectivite);
2704 softime 4626 //
2705 softime 7996 if (isset($parameters['option_sig']) === true
2706     && $parameters['option_sig'] === 'sig_externe') {
2707 softime 4626 //
2708 softime 7996 return true;
2709 softime 4626 }
2710 softime 7996 //
2711     return false;
2712     }
2713 softime 4626
2714 softime 7996 /**
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 softime 4626 //
2721 softime 7996 $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 softime 4626 }
2731    
2732 softime 6929
2733 softime 4626 /**
2734 softime 6929 * 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 softime 7521 /**
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 softime 6929
2771 softime 7521 //
2772     return false;
2773     }
2774    
2775 softime 8593 /**
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 softime 7685
2792 softime 8593 //
2793     return false;
2794     }
2795    
2796    
2797 softime 6929 /**
2798 softime 7685 * 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 softime 8329 /**
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 softime 7685
2840     /**
2841 softime 8989 * 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 softime 10573 * 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 softime 8989 * 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 softime 11418 * 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 softime 9245 * 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 softime 13137 $qres = $this->get_one_result_from_db_query(
2964     sprintf(
2965     'SELECT
2966     valeur
2967     FROM
2968     %1$som_parametre
2969     WHERE
2970 softime 14064 libelle = \'option_suivi_numerisation\'',
2971     DB_PREFIXE
2972 softime 13137 ),
2973     array(
2974     "origin" => __METHOD__,
2975     "force_return" => true,
2976     )
2977 softime 9245 );
2978 softime 13137 if ($qres["code"] === "OK"
2979     && $qres["result"] === "true") {
2980 softime 9245 //
2981     return true;
2982     }
2983     }
2984    
2985     //
2986     return false;
2987     }
2988    
2989 softime 10573 // 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 softime 9245 /**
3019 softime 10573 * [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 softime 10808 /**
3057 softime 12654 * 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 softime 10808 * Méthode permettant de récupérer le paramètrage de l'option
3075     * option_notification
3076     *
3077 softime 12433 * @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 softime 10808 */
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 softime 10573
3091 softime 10808 /**
3092 softime 10968 * Méthode permettant de récupérer le paramètrage de l'option
3093 softime 12433 * 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 softime 15835 * 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 softime 12433 * Méthode permettant de récupérer le paramètrage de l'option
3148 softime 10968 * 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 softime 11418 * 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 softime 15218 * 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 softime 11876 * 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 softime 10808 * 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 softime 11876 private function get_notification_demandeur_parametre_courriel_type($om_collectivite = null) {
3244 softime 10808 // Phrases types par défaut
3245 softime 11876 $result = array();
3246 softime 10808 // 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 softime 11876 /**
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 softime 12654 /**
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 softime 15037 * 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 softime 12654 * 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 softime 15037 /**
3438 softime 15218 * 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 softime 15037 *
3441     * @param integer $om_collectivite Identifiant de la collectivité.
3442     *
3443 softime 15218 * @return int Valeur maximale du nombre d'annexe notifiable
3444 softime 15037 */
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 softime 15218 // 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 softime 15037 $nb_annexe_max = intVal($parameters['parametre_notification_max_annexes']);
3455     }
3456     return $nb_annexe_max;
3457     }
3458    
3459 softime 19307 /**
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 softime 10573 ));
3496 softime 19307
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 softime 10573
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 softime 14064 /**
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 softime 10573
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 softime 10713 * 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 softime 12433 * 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 nmeucci 4108 * 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 mbroquet 3730
3643 nmeucci 4108
3644 softime 3976 /**
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 nmeucci 3981 /**
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 nmeucci 3980 public function compose_generate_table($id, $headers, $rows) {
3685 nmeucci 3981 //
3686     $html = '';
3687 nmeucci 3980 // Début conteneur
3688 nmeucci 3981 $html .= '<div id="'.$id.'">';
3689 nmeucci 3980 // Début tableau
3690 nmeucci 3981 $html .= '<table class="tab-tab">';
3691 nmeucci 3980 // Début entête
3692 nmeucci 3981 $html .= '<thead>';
3693     $html .= '<tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">';
3694 nmeucci 3980 // 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 nmeucci 3981 $html .= '<th class="title col-'.$i.$col.'">';
3705     $html .= '<span class="name">';
3706     $html .= $header;
3707     $html .= '</span>';
3708     $html .= '</th>';
3709 nmeucci 3980 }
3710     // Fin entête
3711 nmeucci 3981 $html .= '</tr>';
3712     $html .= '</thead>';
3713 nmeucci 3980 // Début corps
3714 nmeucci 3981 $html .= '<tbody>';
3715 nmeucci 3980 // Lignes
3716     foreach ($rows as $cells) {
3717     // Début ligne
3718 nmeucci 3981 $html .= '<tr class="tab-data">';
3719 nmeucci 3980 // 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 nmeucci 3981 $html .= '<td class="title col-'.$j.$col.'">';
3728     $html .= '<span class="name">';
3729     $html .= $cell;
3730     $html .= '</span>';
3731     $html .= '</td>';
3732 nmeucci 3980 }
3733     // Fin ligne
3734 nmeucci 3981 $html .= "</tr>";
3735 nmeucci 3980 }
3736     // Fin corps
3737 nmeucci 3981 $html .= '</tbody>';
3738 nmeucci 3980 // Fin tableau
3739 nmeucci 3981 $html .= '</table>';
3740 nmeucci 3980 // Fin conteneur
3741 nmeucci 3981 $html .= '</div>';
3742     //
3743     return $html;
3744 nmeucci 3980 }
3745 nmeucci 4156
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 nhaye 4218
3771     /**
3772 fmichon 4708 * 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 softime 7366
3782 fmichon 4708 /**
3783 softime 7366 * Vérifie que l'option référentiel ERP est activée.
3784 fmichon 4708 *
3785 softime 7366 * @param integer $om_collectivite Identifiant de la collectivité.
3786 fmichon 4708 *
3787     * @return boolean
3788     */
3789 softime 7366 public function is_option_referentiel_erp_enabled($om_collectivite=null) {
3790 fmichon 4708 //
3791 softime 7366 $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 fmichon 4708 }
3798 softime 7366
3799 fmichon 4708 //
3800 softime 7366 return false;
3801 fmichon 4708 }
3802 softime 10713
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 fmichon 4708
3820 softime 10713 //
3821     return false;
3822     }
3823 softime 7366
3824 softime 14064 /**
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 softime 10713
3840 fmichon 4708 /**
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 nhaye 4218 * 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 softime 14064 $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 nhaye 4218 );
3879 softime 14064
3880     if ($qres["code"] !== "OK") {
3881 nhaye 4218 return false;
3882     }
3883     if ($return_type === 'array') {
3884 softime 14064 return explode($separator, $qres["result"]);
3885 nhaye 4218 }
3886 softime 14064 return $qres["result"];
3887 nhaye 4218 }
3888 nhaye 5254
3889 softime 6565 /**
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 softime 18876 && $_SESSION['groupe'][$groupe]['confidentiel'] === true)
3919 softime 6565 || 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 softime 14542 public function get_type_from_db($table, $column = null) {
3955 softime 6565
3956 softime 14542 $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 softime 7366
3982 softime 14542 $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 softime 7366 /**
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 softime 12847 || $this->contexte_dossier_instruction()) {
4030 softime 7366
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 softime 14064 $inst_lot = $this->get_inst__om_dbform(array(
4038     "obj" => "lot",
4039     "idx" => $idxformulaire,
4040     ));
4041     $dossier = $inst_lot->getVal("dossier");
4042 softime 7366 }
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 softime 14064 $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 softime 7366
4058     //
4059     return $this->_division_from_dossier;
4060    
4061     }
4062    
4063 softime 8329 /**
4064 softime 8593 *
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 softime 10573
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 softime 8593 }
4093    
4094 softime 11418
4095     /**
4096 softime 8329 * 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 softime 19592 "href" => "http://docs.openmairie.org/?project=openads&version=6.10&format=html&path=manuel_utilisateur",
4107 softime 8329 "target" => "_blank",
4108     "class" => "footer-documentation",
4109     );
4110 softime 7366
4111 softime 8329 // 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 softime 15650 "title" => __("Autorisation"),
4136 softime 8329 "class" => "autorisation",
4137 softime 15650 "right" => "menu_autorisation"
4138 softime 8329 );
4139     //
4140     $links = array();
4141    
4142     $links[] = array(
4143     "href" => "".OM_ROUTE_TAB."&obj=dossier_autorisation",
4144     "class" => "dossier_autorisation",
4145 softime 18876 "title" => __("Dossiers d'autorisation"),
4146 softime 8329 "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 softime 18876 "title" => __("Dossiers d'autorisation"),
4155 softime 8329 "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 softime 18876 "title" => __("Guichet Unique"),
4172 softime 8329 "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 softime 18876 "title" => __("tableau de bord"),
4182 softime 8329 "right" => "menu_guichet_unique_dashboard",
4183     "open" => array("index.php|[module=dashboard]",),
4184     );
4185     //
4186     $links[] = array(
4187     "class" => "category",
4188 softime 18876 "title" => __("nouvelle demande"),
4189 softime 8329 "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 softime 18876 "title" => __("nouveau dossier"),
4209 softime 8329 "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 softime 18876 "title" => __("dossier en cours"),
4219 softime 8329 "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 softime 18876 "title" => __("autre dossier"),
4230 softime 8329 "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 softime 18876 "title" => __("recepisse"),
4249 softime 8329 "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 softime 18876 "title" => __("petitionnaire_frequent"),
4268 softime 8329 "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 softime 18876 "title" => __("affichage reglementaire"),
4279 softime 8329 "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 softime 18876 "title" => __("registre"),
4295 softime 8329 "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 softime 18876 "title" => __("attestation"),
4304 softime 8329 "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 softime 18876 "title" => __("Qualification"),
4319 softime 8329 "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 softime 18876 "title" => __("tableau de bord"),
4329 softime 8329 "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 softime 18876 "title" => __("dossiers a qualifier"),
4338 softime 8329 "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 softime 18876 "title" => __("instruction"),
4355 softime 8329 "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 softime 18876 "title" => __("tableau de bord"),
4365 softime 8329 "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 softime 18876 "title" => __("dossiers d'instruction"),
4372 softime 8329 "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 softime 18876 "title" => __("mes encours"),
4393 softime 8329 "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 softime 18876 "title" => __("tous les encours"),
4401 softime 8329 "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 softime 18876 "title" => __("mes clotures"),
4417 softime 8329 "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 softime 18876 "title" => __("tous les clotures"),
4425 softime 8329 "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 softime 18876 "title" => __("recherche"),
4440 softime 8329 "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 softime 18876 "title" => __("qualification"),
4448 softime 8329 "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 softime 18876 "title" => __("dossiers a qualifier"),
4460 softime 8329 "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 softime 18876 "title" => __("architecte_frequent"),
4468 softime 8329 "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 softime 18876 "title" => __("consultations"),
4475 softime 8329 "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 softime 18876 "title" => __("Mes retours"),
4495 softime 8329 "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 softime 18876 "title" => __("Retours de ma division"),
4506 softime 8329 "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 softime 18876 "title" => __("Tous les retours"),
4517 softime 8329 "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 softime 18876 "title" => __("Messages"),
4527 softime 8329 "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 softime 18876 "title" => __("Mes messages"),
4549 softime 8329 "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 softime 18876 "title" => __("Messages de ma division"),
4561 softime 8329 "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 softime 18876 "title" => __("Tous les messages"),
4573 softime 8329 "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 softime 18876 "title" => __("commissions"),
4584 softime 8329 "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 softime 18876 "title" => __("Mes retours"),
4608 softime 8329 "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 softime 18876 "title" => __("Retours de ma division"),
4618 softime 8329 "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 softime 18876 "title" => __("Tous les retours"),
4628 softime 8329 "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 softime 18876 "title" => __("Contentieux"),
4645 softime 8329 "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 softime 18876 "title" => __("tableau de bord"),
4655 softime 8329 "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 softime 18876 "title" => __("Nouvelle demande"),
4662 softime 8329 "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 softime 18876 "title" => __("nouveau dossier"),
4670 softime 8329 "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 softime 18876 "title" => __("Recours"),
4679 softime 8329 "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 softime 18876 "title" => __("Mes recours"),
4689 softime 8329 "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 softime 18876 "title" => __("Tous les recours"),
4696 softime 8329 "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 softime 18876 "title" => __("Infractions"),
4703 softime 8329 "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 softime 18876 "title" => __("Mes infractions"),
4713 softime 8329 "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 softime 18876 "title" => __("Toutes les infractions"),
4721 softime 8329 "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 softime 18876 "title" => __("Messages"),
4728 softime 8329 "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 softime 18876 "title" => __("Mes messages"),
4750 softime 8329 "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 softime 18876 "title" => __("Messages de ma division"),
4762 softime 8329 "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 softime 18876 "title" => __("Tous les messages"),
4774 softime 8329 "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 softime 18876 "title" => __("Suivi"),
4793 softime 8329 "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 softime 18876 "title" => __("tableau de bord"),
4803 softime 8329 "right" => "menu_suivi_dashboard",
4804     "open" => array("index.php|[module=dashboard]",),
4805     );
4806     $links[] = array(
4807     "class" => "category",
4808 softime 18876 "title" => __("suivi des pieces"),
4809 softime 8329 "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 softime 18876 "title" => __("Mise a jour des dates"),
4838 softime 8329 "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 softime 18876 "title" => __("envoi lettre AR"),
4853 softime 8329 "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 softime 18876 "title" => __("Bordereaux"),
4868 softime 8329 "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 softime 18876 "title" => __("Bordereau d'envoi au maire"),
4876 softime 8329 "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 softime 18876 "title" => __("Demandes d'avis"),
4883 softime 8329 "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 softime 18876 "title" => __("Mise a jour des dates"),
4893 softime 8329 "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 softime 18876 "title" => __("retours de consultation"),
4901 softime 8329 "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 softime 18876 "title" => __("commissions"),
4908 softime 8329 "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 softime 18876 "title" => __("gestion"),
4930 softime 8329 "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 softime 18876 "title" => __("demandes"),
4940 softime 8329 "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 softime 18876 "title" => __("Demandes d'avis"),
4956 softime 8329 "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 softime 18876 "title" => __("tableau de bord"),
4966 softime 8329 "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 softime 18876 "title" => __("Demandes en cours"),
4983 softime 8329 "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 softime 18876 "title" => __("Demandes passees"),
4991 softime 8329 "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 softime 18876 "title" => __("Exports"),
4999 softime 8329 "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 softime 9245 // {{{ 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 softime 8329 // 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 softime 18876 "title" => __("export / import"),
5131 softime 8329 "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 softime 18876 "title" => __("export sitadel"),
5142 softime 8329 "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 softime 18876 "title" => __("versement aux archives"),
5150 softime 8329 "right" => "versement_archives",
5151     "open" => "versement_archives.php|",
5152     );
5153     //
5154     $links[] = array(
5155     "href" => "../app/reqmo_pilot.php",
5156     "class" => "reqmo",
5157 softime 18876 "title" => __("statistiques a la demande"),
5158 softime 8329 "right" => "reqmo_pilot",
5159     "open" => "reqmo_pilot.php|",
5160     );
5161     //
5162 softime 9245 $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 softime 8329 $rubrik['links'] = $links;
5174     //
5175     $menu[] = $rubrik;
5176     // }}}
5177    
5178    
5179     // {{{ Rubrique PARAMETRAGE
5180     //
5181     $rubrik = array(
5182 softime 18876 "title" => __("parametrage dossiers"),
5183 softime 8329 "class" => "parametrage-dossier",
5184     "right" => "menu_parametrage",
5185     );
5186     //
5187     $links = array();
5188     //
5189     $links[] = array(
5190     "class" => "category",
5191 softime 18876 "title" => __("dossiers"),
5192 softime 8329 "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 softime 18876 "title" => __("cerfa"),
5211 softime 8329 "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 softime 18876 "title" => __("type DA"),
5229 softime 8329 "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 softime 18876 "title" => __("type DA detaille"),
5237 softime 8329 "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 softime 18876 "title" => __("type DI"),
5245 softime 8329 "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 softime 14542 // 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 softime 8329 //
5257     $links[] = array(
5258 softime 14542 "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 softime 8329 "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 softime 18876 "title" => __("contrainte"),
5298 softime 8329 "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 softime 15973 $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 softime 8329 //
5318     $links[] = array(
5319     "class" => "category",
5320 softime 18876 "title" => __("demandes"),
5321 softime 8329 "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 softime 18876 "title" => __("nature"),
5339 softime 8329 "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 softime 18876 "title" => __("type"),
5347 softime 8329 "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 softime 18876 "title" => __("workflows"),
5354 softime 8329 "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 softime 10573 "avis_decision_type", "avis_decision_type_tab",
5360     "avis_decision_nature", "avis_decision_nature_tab",
5361 softime 8329 ),
5362     );
5363 softime 10573
5364 softime 8329 //
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 softime 10573 "avis_decision_type", "avis_decision_type_tab",
5373     "avis_decision_nature", "avis_decision_nature_tab",
5374 softime 8329 ),
5375     );
5376     //
5377     $links[] = array(
5378     "href" => "../app/workflows.php",
5379     "class" => "workflows",
5380 softime 18876 "title" => __("workflows"),
5381 softime 8329 "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 softime 18876 "title" => __("evenement"),
5396 softime 8329 "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 softime 10573 "avis_decision_tab", "avis_decision_type", "avis_decision_type_tab",
5406     "avis_decision_nature", "avis_decision_nature_tab",
5407 softime 8329 ),
5408     );
5409     //
5410     $links[] = array(
5411     "href" => "".OM_ROUTE_TAB."&obj=etat",
5412     "class" => "workflow-etat",
5413 softime 18876 "title" => __("etat"),
5414 softime 8329 "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 softime 18876 "title" => __("avis decision"),
5422 softime 8329 "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 softime 10573 "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 softime 8329 "href" => "".OM_ROUTE_TAB."&obj=action",
5444     "class" => "action",
5445 softime 18876 "title" => __("action"),
5446 softime 8329 "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 softime 18876 "title" => __("bible"),
5461 softime 8329 "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 softime 18876 "title" => __("editions"),
5468 softime 8329 "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 softime 18876 "title" => __("om_etat"),
5486 softime 8329 "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 softime 18876 "title" => __("om_lettretype"),
5494 softime 8329 "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 softime 18876 "title" => __("om_logo"),
5509 softime 8329 "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 softime 18876 "title" => __("parametrage"),
5522 softime 8329 "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 softime 18876 "title" => __("civilite"),
5532 softime 8329 "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 softime 18876 "title" => __("arrondissement"),
5540 softime 8329 "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 softime 18876 "title" => __("quartier"),
5548 softime 8329 "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 softime 18876 "title" => __("Organisation"),
5555 softime 8329 "right" => array(
5556     "direction", "direction_tab", "division", "division_tab", "instructeur_qualite",
5557     "instructeur_qualite_tab", "instructeur", "instructeur_tab", "groupe",
5558 softime 11585 "groupe_tab", "genre", "genre_tab", "signataire_habilitation",
5559     "signataire_habilitation_tab", "signataire_arrete", "signataire_arrete_tab",
5560 softime 8329 "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 softime 18876 "title" => __("genre"),
5577 softime 8329 "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 softime 18876 "title" => __("groupe"),
5585 softime 8329 "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 softime 18876 "title" => __("direction"),
5593 softime 8329 "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 softime 18876 "title" => __("division"),
5601 softime 8329 "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 softime 18876 "title" => __("instructeur_qualite"),
5609 softime 8329 "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 softime 18876 "title" => __("instructeur"),
5617 softime 8329 "right" => array("instructeur", "instructeur_tab", ),
5618     "open" => array("index.php|instructeur[module=tab]", "index.php|instructeur[module=form]", ),
5619     );
5620     //
5621     $links[] = array(
5622 softime 11585 "href" => "".OM_ROUTE_TAB."&obj=signataire_habilitation",
5623     "class" => "signataire_habilitation",
5624 softime 18876 "title" => __("signataire habilitation"),
5625 softime 11585 "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 softime 8329 "href" => "".OM_ROUTE_TAB."&obj=signataire_arrete",
5631     "class" => "signataire_arrete",
5632 softime 18876 "title" => __("signataire arrete"),
5633 softime 8329 "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 softime 18876 "title" => __("taxes"),
5641 softime 8329 "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 softime 18876 "title" => __("gestion des commissions"),
5648 softime 8329 "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 softime 18876 "title" => __("commission_type"),
5664 softime 8329 "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 softime 18876 "title" => __("gestion des consultations"),
5671 softime 8329 "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 softime 18876 "title" => __("avis consultation"),
5691 softime 8329 "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 softime 18876 "title" => __("service"),
5699 softime 8329 "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 softime 18876 "title" => __("thematique des services"),
5706 softime 8329 "right" => array("service_categorie", "service_categorie_tab", ),
5707     "open" => array("index.php|service_categorie[module=tab]", "index.php|service_categorie[module=form]", ),
5708     );
5709 softime 11585 $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 softime 14064 "title" => __("tiers"),
5720 softime 11585 "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 softime 18436
5752     // Gestion des documents
5753     $links[] = array(
5754     "class" => "category",
5755 softime 18876 "title" => __("Gestion des documents"),
5756 softime 18436 "right" => array(
5757     "document_type_categorie", "document_type_tab",
5758     "document_type", "document_type_tab",
5759     ),
5760     );
5761 softime 8329 //
5762     $links[] = array(
5763 softime 18436 "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 softime 18876 "title" => __("catégorie des documents"),
5774 softime 18436 "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 softime 18876 "title" => __("type des documents"),
5781 softime 18436 "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 softime 8329 "class" => "category",
5788 softime 18876 "title" => __("Gestion des dossiers"),
5789 softime 8329 "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 softime 10573 "affectation_automatique", "affectation_automatique_tab",
5796     "pec_metier", "pec_metier_tab",
5797 softime 8329 ),
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 softime 10573 "affectation_automatique", "affectation_automatique_tab",
5809     "pec_metier", "pec_metier_tab",
5810 softime 8329 ),
5811     );
5812     //
5813     $links[] = array(
5814     "href" => "".OM_ROUTE_TAB."&obj=etat_dossier_autorisation",
5815     "class" => "etat_dossier_autorisation",
5816 softime 18876 "title" => __("etat dossiers autorisations"),
5817 softime 8329 "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 softime 18876 "title" => __("affectation automatique"),
5825 softime 8329 "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 softime 18876 "title" => _ ("autorite")." ".__("competente"),
5833 softime 8329 "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 softime 18876 "title" => __("phase"),
5841 softime 8329 "right" => array("phase", "phase_tab", ),
5842     "open" => array("index.php|phase[module=tab]", "index.php|phase[module=form]", ),
5843     );
5844 softime 10573 //
5845     $links[] = array(
5846     "href" => "".OM_ROUTE_TAB."&obj=pec_metier",
5847     "class" => "pec_metier",
5848 softime 18876 "title" => __("pec_metier"),
5849 softime 10573 "right" => array("pec_metier", "pec_metier_tab", ),
5850     "open" => array("index.php|pec_metier[module=tab]", "index.php|pec_metier[module=form]", ),
5851     );
5852 softime 17542 //
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 softime 8329
5861 softime 18436 // Gestion des pièces
5862 softime 8329 $links[] = array(
5863     "class" => "category",
5864 softime 18876 "title" => __("Gestion des pièces"),
5865 softime 8329 "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 softime 18876 "title" => __("Catégorie des pièces"),
5887 softime 8329 "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 softime 18876 "title" => __("Type des pièces"),
5901 softime 8329 "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 softime 10573 "href" => "".OM_ROUTE_TAB."&obj=lien_document_n_type_d_i_t",
5916     "class" => "lien_document_n_type_d_i_t",
5917 softime 18876 "title" => __("Nomenclature des pièces"),
5918 softime 10573 "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 softime 8329 "href" => "".OM_ROUTE_FORM."&obj=document_numerise_traitement_metadonnees&action=100&idx=0",
5933     "class" => "document_numerise_traitement_metadonnees",
5934 softime 18876 "title" => __("Mise à jour des métadonnées"),
5935     "description" => __("Mettre à jour les métadonnées de tous les documents numérisés."),
5936 softime 8329 "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 softime 18876 "title" => __("Gestion des contentieux"),
5947 softime 8329 "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 softime 18876 "title" => __("objet_recours"),
5965 softime 8329 "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 softime 18876 "title" => __("moyen_souleve"),
5977 softime 8329 "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 softime 18876 "title" => __("moyen_retenu_juge"),
5989 softime 8329 "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 softime 10573 $links[] = array(
5999     "class" => "category",
6000 softime 18876 "title" => __("géolocalisation"),
6001 softime 10573 "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 softime 18876 "title" => __("Couches"),
6012 softime 10573 "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 softime 18876 "title" => __("sig_groupe"),
6020 softime 10573 "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 softime 18876 "title" => __("sig_sousgroupe"),
6032 softime 10573 "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 softime 18876 "title" => __("sig_contrainte"),
6044 softime 10573 "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 softime 8329 $rubrik['links'] = $links;
6053     //
6054     $menu[] = $rubrik;
6055     // }}}
6056    
6057     // {{{ Rubrique ADMINISTRATION
6058     //
6059     $rubrik = array(
6060 softime 18876 "title" => __("administration"),
6061 softime 8329 "class" => "administration",
6062     "right" => "menu_administration",
6063     );
6064     //
6065     $links = array();
6066     //
6067 softime 10573 // 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 softime 8329 $links[] = array(
6075     "href" => "".OM_ROUTE_TAB."&obj=om_collectivite",
6076     "class" => "collectivite",
6077 softime 10573 "title" => $om_collectivite_title,
6078 softime 8329 "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 softime 18876 "title" => __("om_parametre"),
6086 softime 8329 "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 softime 10573 "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 softime 8329 "class" => "category",
6115 softime 18876 "title" => __("gestion des utilisateurs"),
6116 softime 8329 "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 softime 18876 "title" => __("om_profil"),
6134 softime 8329 "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 softime 18876 "title" => __("om_droit"),
6142 softime 8329 "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 softime 18876 "title" => __("om_utilisateur"),
6150 softime 8329 "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 softime 18876 "title" => __("annuaire"),
6170 softime 8329 "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 softime 18876 "title" => __("tableaux de bord"),
6178 softime 8329 "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 softime 18876 "title" => __("om_widget"),
6194 softime 8329 "right" => array("om_widget", "om_widget_tab", ),
6195     "open" => array("index.php|om_widget[module=tab]", "index.php|om_widget[module=form]", ),
6196     );
6197 softime 13528 $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 softime 8329 //
6205     $links[] = array(
6206     "href" => "".OM_ROUTE_FORM."&obj=om_dashboard&amp;idx=0&amp;action=4",
6207     "class" => "om_dashboard",
6208 softime 18876 "title" => __("composition"),
6209 softime 8329 "right" => array("om_dashboard", ),
6210     "open" => array("index.php|om_dashboard[module=form][action=4]", ),
6211     );
6212     //
6213     $links[] = array(
6214     "class" => "category",
6215 softime 18876 "title" => __("sig"),
6216 softime 8329 "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 softime 18876 "title" => __("om_sig_extent"),
6234 softime 8329 "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 softime 18876 "title" => __("om_sig_map"),
6243 softime 8329 "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 softime 18876 "title" => __("om_sig_flux"),
6252 softime 8329 "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 softime 18876 "title" => __("options avancees"),
6260 softime 8329 "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 softime 18876 "title" => __("interface_referentiel_erp"),
6275 softime 8329 "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 softime 18876 "title" => __("om_sousetat"),
6290 softime 8329 "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 softime 18876 "title" => __("om_requete"),
6303 softime 8329 "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 softime 10573 "right" => array("task", "task_tab", ),
6310     );
6311     //
6312     $links[] = array(
6313     "href" => "".OM_ROUTE_TAB."&obj=task",
6314     "class" => "task",
6315 softime 18876 "title" => __("Moniteur Plat'AU"),
6316 softime 10573 "right" => array("task", "task_tab", ),
6317     "open" => array("index.php|task[module=tab]", "index.php|task[module=form]", ),
6318     );
6319 softime 10968
6320     //Afficher le menu moniteur IDE'AU si l'option notification portal est activée.
6321 softime 14064 if (isset($_SESSION['collectivite']) === true
6322     && $this->get_param_option_notification() === PORTAL)
6323 softime 10968 {
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 softime 10573 //
6334     $links[] = array(
6335     "title" => "<hr/>",
6336 softime 8329 "right" => array("import", ),
6337     );
6338     //
6339     $links[] = array(
6340     "href" => OM_ROUTE_MODULE_IMPORT,
6341     "class" => "import",
6342 softime 9245 "title" => __("Import"),
6343     "description" => __("Ce module permet l'intégration de données dans l'application depuis des fichiers CSV."),
6344 softime 8329 "right" => array("import", ),
6345 softime 9245 "open" => array(
6346     "import.php|",
6347     "index.php|[module=import]",
6348     ),
6349 softime 8329 );
6350     //
6351     $links[] = array(
6352     "href" => "../app/import_specific.php",
6353     "class" => "import_specific",
6354 softime 18876 "title" => __("Import specifique"),
6355 softime 8329 "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 softime 18876 "title" => __("Generateur"),
6366 softime 8329 "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 softime 10573 "title" => "<hr/>",
6378     "right" => array("contrainte", "contrainte_synchronisation"),
6379     );
6380     //
6381     $links[] = array(
6382 softime 8329 "href" => "".OM_ROUTE_FORM."&obj=contrainte&action=100&idx=0",
6383     "class" => "contrainte",
6384 softime 18876 "title" => __("synchronisation des contraintes"),
6385 softime 8329 "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 softime 18876 "title" => __("Géolocalisation des dossiers"),
6396 softime 8329 "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 softime 8640
6409     /**
6410 softime 9245 * 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 softime 8989 * Permet d'enregistrer un fichier dans la table 'storage'.
6430     *
6431     * @return mixed Identifiant du fichier dans la table storage ou false.
6432     */
6433 softime 11418 function store_file($filecontent, $filemetadata, $type, $info = null, $collectivite = null, $dossierFinal = false) {
6434 softime 8989 if ($collectivite === null) {
6435     $get_collectivite = $this->getCollectivite();
6436     $collectivite = $get_collectivite['om_collectivite_idx'];
6437     }
6438 softime 10573 $uid = $this->storage->create($filecontent, $filemetadata, "from_content", "storage.uid");
6439 softime 8989 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 softime 11418 "uid_dossier_final" => $dossierFinal
6459 softime 8989 );
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 softime 9511 if (in_array($this->flag, array("login_and_nohtml", "nohtml", "login", "logout", "anonym")) !== true) {
6479 softime 8989 $this->ad_blocker_detector();
6480     }
6481     }
6482    
6483     /**
6484 softime 10968 * "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 softime 8989 * 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 softime 15650 msgNode.style.gridColumns = "1 / -1";
6550 softime 8989 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 softime 9245 __("<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 softime 8989 )
6562     );
6563     }
6564    
6565 softime 10573 /**
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 softime 11876 $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 softime 13137 $qres = $this->get_one_result_from_db_query(
6607     sprintf(
6608 softime 14064 "SELECT
6609     %s
6610     FROM
6611     %s%s
6612     WHERE
6613     %s = '%s'
6614     %s
6615     %s
6616     %s",
6617 softime 13137 $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 softime 10573 );
6630 softime 13137 return $qres["result"];
6631 softime 10573 }
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 softime 11876 '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 softime 10573 ));
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 softime 13528 * @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 softime 10573 *
6662     * @return $mixed L'objet ou null
6663     *
6664     * (à partir de PHP 7.1 on pourra utiliser le ReturnType ?object)
6665     */
6666 softime 13528 public function findObjectById(string $class, string $idx, bool $onlyone = true) {
6667 softime 10573 $obj = null;
6668     if (!empty($class) && !empty($idx)) {
6669 softime 14064 $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 softime 10573 }
6689 softime 14064 $count = intval(strval($qres['result']));
6690 softime 13528 if ($count === 1) {
6691 softime 10573 $obj = $this->get_inst__om_dbform(array('obj' => $class, 'idx' => $idx));
6692     }
6693 softime 13528 elseif($count > 1 && $onlyone) {
6694     throw new RuntimeException("More than one result ($count) for '$class' ID '$idx'");
6695     }
6696 softime 10573 }
6697 softime 14064 $obj = $this->get_inst__om_dbform(array('obj' => $class, 'idx' => $idx));
6698     if ($obj->exists() !== true) {
6699     return null;
6700     }
6701 softime 10573 return $obj;
6702     }
6703    
6704     /**
6705 softime 13528 * 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 softime 17036 public function findObjectByCondition(string $class, string $condition, string $order = null,
6721 softime 13528 string $from = null, bool $onlyone = true) {
6722     $obj = null;
6723     if (!empty($class)) {
6724 softime 14064 $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 softime 17036
6745 softime 14064 $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 softime 13528 }
6756 softime 14064 $count = intval(strval($qres['result']));
6757 softime 13528 if(empty($count)) {
6758     return null;
6759     }
6760     if($count > 1 && $onlyone) {
6761 softime 14064 $this->addToLog(__METHOD__."(): get_one_result_from_db_query(\"".$sqlExist."\");", DEBUG_MODE);
6762 softime 13528 throw new RuntimeException("More than one result ($count) for '$class'");
6763     }
6764 softime 14064 $sqlID = sprintf(
6765     'SELECT
6766     %1$s
6767     %2$s
6768     %3$s
6769 softime 17036 %4$s
6770 softime 14064 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 softime 13528 }
6786 softime 14064 $idx = intval(strval($qres['result']));
6787 softime 13528 $obj = $this->get_inst__om_dbform(array('obj' => $class, 'idx' => $idx));
6788     }
6789     return $obj;
6790     }
6791    
6792     /**
6793 softime 10573 * 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 softime 18876 if (DBCHARSET != 'UTF8' && HTTPCHARSET == 'UTF-8') {
6920 softime 10573 $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 softime 14064 $qres = $this->get_one_result_from_db_query(
6995     $sql,
6996     array(
6997     "origin" => __METHOD__,
6998     "force_return" => true,
6999     )
7000     );
7001 softime 10573
7002     // vérifie les erreurs
7003 softime 14064 if ($qres["code"] !== "OK") {
7004 softime 10573 throw new RuntimeException(__("Erreur de base de données.").' '.
7005 softime 14064 sprintf(__("Détails: %s"), $qres["message"]));
7006 softime 10573 }
7007     // si la ligne n'a pas été trouvée
7008 softime 14064 if ($qres["result"] === null) {
7009 softime 10573 throw new InvalidArgumentException(__(
7010     "L'objet $table '$valueNormalized' n'existe pas."));
7011     }
7012    
7013     // renvoie la valeur trouvée
7014 softime 14064 return $qres["result"];
7015 softime 10573 }
7016    
7017     /**
7018 softime 14064 * Vérifie si la saisie du numéro complet respecte la numérotation
7019 softime 10573 * réglementaire d'un dossier d'urbanisme (code de l'urbanisme A423-1 à A423-4)
7020 softime 14064 * et renvoie les différents éléments constituant du numéro de dossier.
7021 softime 10573 *
7022 softime 14064 * 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 softime 10573 */
7030 softime 14064 public function numerotation_urbanisme(string $numero, bool $espaces = false) {
7031 softime 10573 // Masques
7032 softime 14064 $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 softime 11418 $pattern_di = "/^$base(?P<suffixe>[A-Z]{1,5})?(?P<num_suffixe>[0-9]{1,2})?$/i";
7038     $pattern_da = "/^$base$/i";
7039 softime 10573
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 softime 11418 $numero = $matches_di['type'].$matches_di['departement'].$matches_di['commune'].
7048     $matches_di['annee'].$matches_di['division'].$matches_di['numero'];
7049 softime 10573 }
7050     if (preg_match($pattern_da, $numero, $matches_da) === 1) {
7051     $result["da"] = $matches_da;
7052     }
7053    
7054     return $result;
7055     }
7056 softime 12847
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 softime 15973 $sqlCplmt['WHERE'] = 'WHERE dossier_instruction_type.sous_dossier IS NOT TRUE';
7269 softime 12847 }
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 softime 14542
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 softime 15218 /**
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 softime 15650
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 softime 16749
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 softime 17542
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 softime 18436
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 softime 18769
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 softime 18876 if (is_array($users) && array_key_exists('userToAdd', $users)) {
7907 softime 18769 $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 softime 18876 if (is_array($users) && array_key_exists('userToDelete', $users)) {
7936 softime 18769 $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 softime 18876 if (is_array($users) && array_key_exists('userToUpdate', $users)) {
7959 softime 18769 $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 softime 8989 }

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26