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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 7685 - (hide annotations)
Thu Jan 11 15:26:41 2018 UTC (7 years ago) by softime
File size: 72243 byte(s)
* Merge de la version 4.6.0

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     require_once "../dyn/locales.inc.php";
14    
15     /**
16     *
17     */
18     require_once "../dyn/include.inc.php";
19    
20     /**
21     *
22     */
23     require_once "../dyn/debug.inc.php";
24    
25     /**
26     *
27     */
28     (defined("PATH_OPENMAIRIE") ? "" : define("PATH_OPENMAIRIE", ""));
29    
30     /**
31     *
32     */
33     require_once PATH_OPENMAIRIE."om_application.class.php";
34    
35     /**
36     *
37     */
38     class utils extends application {
39    
40 fmichon 4471 /**
41     * Gestion du favicon de l'application.
42     *
43     * @var mixed Configuration niveau application.
44     */
45     var $html_head_favicon = '../app/img/favicon.ico';
46    
47 softime 7685 /**
48     *
49     */
50     protected $route__dashboard = "../scr/dashboard.php?";
51     protected $route__login = "../scr/login.php?";
52     protected $route__logout = "../scr/logout.php?";
53     protected $route__password = "../scr/password.php?";
54     protected $route__password_reset = "../scr/login.php?mode=password_reset";
55     protected $route__tab = "../scr/tab.php?";
56     protected $route__soustab = "../scr/soustab.php?";
57     protected $route__form = "../scr/form.php?";
58     protected $route__sousform = "../scr/sousform.php?";
59     protected $route__map = "../scr/map.php?";
60     protected $route__module_edition = "../scr/edition.php?";
61     protected $route__module_import = "../scr/import.php?";
62     protected $route__module_reqmo = "../scr/reqmo.php?";
63     protected $route__module_gen = "../scr/gen.php?";
64    
65 mbroquet 3730 // {{{
66    
67     /**
68     * SURCHARGE DE LA CLASSE OM_APPLICATION.
69     *
70     * @see Documentation sur la méthode parent 'om_application:getCollectivite'.
71     */
72     function getCollectivite($om_collectivite_idx = null) {
73     // On vérifie si une valeur a été passée en paramètre ou non.
74     if ($om_collectivite_idx === null) {
75     // Cas d'utilisation n°1 : nous sommes dans le cas où on
76     // veut récupérer les informations de la collectivité de
77     // l'utilisateur et on stocke l'info dans un flag.
78     $is_get_collectivite_from_user = true;
79     // On initialise l'identifiant de la collectivité
80     // à partir de la variable de session de l'utilisateur.
81     $om_collectivite_idx = $_SESSION['collectivite'];
82     } else {
83     // Cas d'utilisation n°2 : nous sommes dans le cas où on
84     // veut récupérer les informations de la collectivité
85     // passée en paramètre et on stocke l'info dans le flag.
86     $is_get_collectivite_from_user = false;
87     }
88     //
89     $collectivite_parameters = parent::getCollectivite($om_collectivite_idx);
90    
91     //// BEGIN - SURCHARGE OPENADS
92    
93     // Ajout du paramétrage du sig pour la collectivité
94     if (file_exists("../dyn/var.inc")) {
95     include "../dyn/var.inc";
96     }
97     if (file_exists("../dyn/sig.inc.php")) {
98     include "../dyn/sig.inc.php";
99     }
100 softime 4760 if (!isset($sig_externe)) {
101     $sig_externe = "sig-default";
102     }
103 mbroquet 3730 $idx_multi = $this->get_idx_collectivite_multi();
104    
105 softime 4749 if (isset($collectivite_parameters['om_collectivite_idx'])
106     && isset($conf[$sig_externe][$collectivite_parameters['om_collectivite_idx']])
107     && isset($conf[$sig_externe]["sig_treatment_mod"])
108     && isset($collectivite_parameters["option_sig"])
109     && $collectivite_parameters["option_sig"] == "sig_externe"
110 mbroquet 3730 ) {
111    
112     // Cas numéro 1 : conf sig définie sur la collectivité et option sig active
113     $collectivite_parameters["sig"] = $conf[$sig_externe][$collectivite_parameters['om_collectivite_idx']];
114 nhaye 4099 $collectivite_parameters["sig"]["sig_treatment_mod"] = $conf[$sig_externe]["sig_treatment_mod"];
115 mbroquet 3730
116 softime 4749 } elseif($idx_multi != ''
117     && isset($conf[$sig_externe][$idx_multi])
118     && isset($conf[$sig_externe]["sig_treatment_mod"])
119     && isset($collectivite_parameters["option_sig"])
120     && $collectivite_parameters["option_sig"] == "sig_externe") {
121 mbroquet 3730 // Cas numéro : conf sig définie sur la collectivité multi et
122     // option_sig activé pour la collectivité mono
123     $collectivite_parameters["sig"] = $conf[$sig_externe][$idx_multi];
124 nhaye 4099 $collectivite_parameters["sig"]["sig_treatment_mod"] = $conf[$sig_externe]["sig_treatment_mod"];
125 mbroquet 3730 }
126    
127     //// END - SURCHARGE OPENADS
128    
129     // Si on se trouve dans le cas d'utilisation n°1
130     if ($is_get_collectivite_from_user === true) {
131     // Alors on stocke dans l'attribut collectivite le tableau de
132     // paramètres pour utilisation depuis la méthode 'getParameter'.
133     $this->collectivite = $collectivite_parameters;
134     }
135     // On retourne le tableau de paramètres.
136     return $collectivite_parameters;
137     }
138    
139     /**
140     * Retourne l'identifiant de la collectivité multi ou l'identifiant de la
141     * seule collectivité dans le cas d'une installation mono.
142     *
143     * @return integer Identifiant de la collectivité multi.
144     */
145     public function get_idx_collectivite_multi() {
146     // Récupère l'identifiant de la collectivité de niveau 2
147     $sql = "SELECT om_collectivite FROM ".DB_PREFIXE."om_collectivite WHERE niveau = '2'";
148     $idx = $this->db->getOne($sql);
149     $this->addToLog(__METHOD__.": db->getOne(\"".$sql."\");", VERBOSE_MODE);
150     $this->isDatabaseError($idx);
151    
152     // S'il n'y a pas de collectivité de niveau 2
153     if ($idx == null || $idx == '') {
154    
155     // Compte le nombre de collectivité
156     $sql = "SELECT count(om_collectivite) FROM ".DB_PREFIXE."om_collectivite";
157     $count = $this->db->getOne($sql);
158     $this->addToLog(__METHOD__.": db->getOne(\"".$sql."\");", VERBOSE_MODE);
159     $this->isDatabaseError($count);
160    
161     // S'il y qu'une collectivité
162     if ($count == 1) {
163    
164     // Récupère l'identifiant de la seule collectivité
165     $sql = "SELECT om_collectivite FROM ".DB_PREFIXE."om_collectivite WHERE niveau = '1'";
166     $idx = $this->db->getOne($sql);
167     $this->addToLog(__METHOD__.": db->getOne(\"".$sql."\");", VERBOSE_MODE);
168     $this->isDatabaseError($idx);
169     }
170    
171     }
172    
173     // Retourne l'identifiant
174     return $idx;
175     }
176    
177    
178     /**
179     * Retourne l'identifiant de la collectivité de l'element de la table passée
180     * en paramètre.
181     *
182     * @param string $table Table de l'element.
183     * @param mixed $id Identifiant de l'element.
184     *
185     * @return string identifiant de la collectivite ou false si l'element n'existe pas.
186     */
187     public function get_collectivite_of_element($table, $id) {
188     require_once '../obj/'.$table.'.class.php';
189     $instance = new $table($id, $this->db, null);
190     if($instance->getVal($instance->clePrimaire) != '') {
191     return $instance->getVal('om_collectivite');
192     }
193     return false;
194     }
195    
196    
197     /**
198 softime 6929 * Retourne vrai si la collectivité passée en paramètre ou la collectivité
199     * de l'utilisateur connecté est mono.
200     *
201     * @param string $id Identifiant de la collectivité.
202     *
203     * @return boolean
204 mbroquet 3730 */
205 softime 6929 public function isCollectiviteMono($id = null) {
206     // Si on ne passe pas de collectivité en argument
207     if ($id == null) {
208     // On vérifie la collectivité stockée en session de l'utilisateur
209     // connecté
210     $res = false;
211     if ($_SESSION['niveau'] === '1') {
212     //
213     $res = true;
214     }
215     //
216     return $res;
217     }
218    
219     // Requête SQL
220 mbroquet 3730 $sql = "SELECT niveau FROM ".DB_PREFIXE."om_collectivite WHERE om_collectivite = ".$id;
221     $niveau = $this->db->getOne($sql);
222     $this->addToLog(__METHOD__.": db->getOne(\"".$sql."\");", VERBOSE_MODE);
223     $this->isDatabaseError($niveau);
224 softime 6929
225     //
226     if ($niveau === '1') {
227     //
228 mbroquet 3730 return true;
229     }
230 softime 6929 //
231 mbroquet 3730 return false;
232     }
233    
234 softime 6929
235 mbroquet 3730 // }}}
236    
237     // {{{
238    
239     var $om_utilisateur = array();
240     var $user_is_instr = NULL;
241     var $user_is_service = NULL;
242     var $user_is_admin = NULL;
243     var $user_is_service_ext = NULL;
244     var $user_is_qualificateur = NULL;
245     var $user_is_chef = NULL;
246     var $user_is_divisionnaire = NULL;
247     var $user_is_service_int = NULL;
248    
249     /**
250     * Méthode de récupération des informations de l'utilisateur connecté.
251     */
252     function getUserInfos() {
253    
254     // Si l'utilisateur est loggé $_SESSION existe
255     if(isset($_SESSION['login']) AND !empty($_SESSION['login'])) {
256    
257     // Récupération des infos utilisateur
258     $sqlUser = "SELECT om_utilisateur, nom, email, login, om_collectivite, om_profil ".
259     "FROM ".DB_PREFIXE."om_utilisateur WHERE login = '".$_SESSION['login']."'";
260     $resUser=$this->db->query($sqlUser);
261     $this->addToLog("getUserInfos(): db->query(\"".$sqlUser."\");", VERBOSE_MODE);
262     if ( database::isError($resUser)){
263     die();
264     }
265     $this->om_utilisateur=&$resUser->fetchRow(DB_FETCHMODE_ASSOC);
266    
267     // Récupère le profil et test si c'est un
268     $sqlProfil = "SELECT libelle FROM ".DB_PREFIXE."om_profil WHERE om_profil = ".$this->om_utilisateur['om_profil'];
269     $resProfil=$this->db->getOne($sqlProfil);
270     $this->addToLog("getUserInfos(): db->getOne(\"".$sqlProfil."\");", VERBOSE_MODE);
271     if (database::isError($resProfil)){
272     die();
273     }
274     // Sauvegarde le libelle du profil
275     $this->om_utilisateur["libelle_profil"] = $resProfil;
276    
277     // si c'est un administrateur technique
278     // XXX Mauvaise méthode, il faut utiliser isAccredited
279     if ($resProfil == "ADMINISTRATEUR TECHNIQUE"
280     || $resProfil == "ADMINISTRATEUR FONCTIONNEL") {
281     $this->user_is_admin = true;
282     } else {
283     $this->user_is_admin = false;
284     }
285    
286     //si c'est un service externe
287     if ($resProfil == "SERVICE CONSULTÉ") {
288     $this->user_is_service_ext = true;
289     } else {
290     $this->user_is_service_ext = false;
291     }
292    
293     //si c'est un service interne
294     if ($resProfil == "SERVICE CONSULTÉ INTERNE") {
295     $this->user_is_service_int = true;
296     } else {
297     $this->user_is_service_int = false;
298     }
299    
300     // si c'est un qualificateur
301     if ($resProfil == "QUALIFICATEUR") {
302     $this->user_is_qualificateur = true;
303     } else {
304     $this->user_is_qualificateur = false;
305     }
306    
307     // si c'est un chef de service
308     if ($resProfil == "CHEF DE SERVICE") {
309     $this->user_is_chef = true;
310     } else {
311     $this->user_is_chef = false;
312     }
313    
314     // si c'est un divisionnaire
315     if ($resProfil == "DIVISIONNAIRE") {
316     $this->user_is_divisionnaire = true;
317     } else {
318     $this->user_is_divisionnaire = false;
319     }
320    
321     // Récupération des infos instructeur
322     $sqlInstr = "SELECT instructeur.instructeur, instructeur.nom, instructeur.telephone,
323     division.division, division.code, division.libelle ".
324     "FROM ".DB_PREFIXE."instructeur INNER JOIN ".DB_PREFIXE."division ON division.division=instructeur.division ".
325     "WHERE instructeur.om_utilisateur = ".$this->om_utilisateur['om_utilisateur'];
326     $resInstr=$this->db->query($sqlInstr);
327     $this->addToLog("getUserInfos(): db->query(\"".$sqlInstr."\");", VERBOSE_MODE);
328     if ( database::isError($resInstr)){
329     die();
330     }
331     $tempInstr=&$resInstr->fetchRow(DB_FETCHMODE_ASSOC);
332     // Si il y a un resultat c'est un instructeur
333     if(count($tempInstr)>0) {
334     $this->user_is_instr=true;
335     $this->om_utilisateur = array_merge($this->om_utilisateur,$tempInstr);
336     } else {
337     $this->user_is_instr=false;
338     }
339    
340     // Récupération des infos de services consultés
341     $sqlServ = "SELECT service.service, service.abrege, service.libelle ".
342     "FROM ".DB_PREFIXE."service ".
343     "INNER JOIN ".DB_PREFIXE."lien_service_om_utilisateur ON lien_service_om_utilisateur.service=service.service ".
344     "WHERE lien_service_om_utilisateur.om_utilisateur = ".$this->om_utilisateur['om_utilisateur'];
345     $resServ=$this->db->query($sqlServ);
346     $this->addToLog("getUserInfos(): db->query(\"".$sqlServ."\");", VERBOSE_MODE);
347     if ( database::isError($resServ)){
348     die();
349     }
350    
351     while ($tempServ=&$resServ->fetchRow(DB_FETCHMODE_ASSOC)) {
352     $this->om_utilisateur['service'][]=$tempServ;
353     }
354     // Si il y a un resultat c'est un utilisateur de service
355     if(isset($this->om_utilisateur['service'])) {
356     $this->user_is_service=true;
357     } else {
358     $this->user_is_service=false;
359     }
360     }
361     }
362    
363     /**
364     * getter user_is_service
365     */
366     function isUserService() {
367     //
368     if (is_null($this->user_is_service)) {
369     //
370     $this->getUserInfos();
371     }
372     //
373     return $this->user_is_service;
374     }
375    
376     /**
377     * getter user_is_instr
378     */
379     function isUserInstructeur() {
380     //
381     if (is_null($this->user_is_instr)) {
382     //
383     $this->getUserInfos();
384     }
385     //
386     return $this->user_is_instr;
387     }
388    
389     function isUserAdministrateur() {
390     //
391     if (is_null($this->user_is_admin)) {
392     //
393     $this->getUserInfos();
394     }
395     //
396     return $this->user_is_admin;
397     }
398    
399     /**
400     * getter user_is_service_ext
401     */
402     function isUserServiceExt() {
403     //
404     if (is_null($this->user_is_service_ext)) {
405     //
406     $this->getUserInfos();
407     }
408     //
409     return $this->user_is_service_ext;
410     }
411    
412     /**
413     * getter user_is_service_int
414     */
415     function isUserServiceInt() {
416     //
417     if (is_null($this->user_is_service_int)) {
418     //
419     $this->getUserInfos();
420     }
421     //
422     return $this->user_is_service_int;
423     }
424    
425     /**
426     * getter user_is_qualificateur
427     */
428     function isUserQualificateur() {
429     //
430     if (is_null($this->user_is_qualificateur)) {
431     //
432     $this->getUserInfos();
433     }
434     //
435     return $this->user_is_qualificateur;
436     }
437    
438     /**
439     * getter user_is_chef
440     */
441     function isUserChef() {
442     //
443     if (is_null($this->user_is_chef)) {
444     //
445     $this->getUserInfos();
446     }
447     //
448     return $this->user_is_chef;
449     }
450    
451     /**
452     * getter user_is_divisionnaire
453     */
454     function isUserDivisionnaire() {
455     //
456     if (is_null($this->user_is_divisionnaire)) {
457     //
458     $this->getUserInfos();
459     }
460     //
461     return $this->user_is_divisionnaire;
462     }
463    
464     /**
465     * Méthode permettant de définir si l'utilisateur connecté peut ajouter un
466     * événement d'instruction
467     *
468     * @param integer $idx identifiant du dossier
469     * @param string $obj objet
470     *
471     * @return boolean true si il peut false sinon
472     */
473     function isUserCanAddObj($idx, $obj) {
474     // Si il à le droit "bypass" il peut ajouter
475     if($this->isAccredited($obj."_ajouter_bypass") === true) {
476     return true;
477     }
478     if($this->isAccredited(array($obj."_ajouter", $obj), "OR") === false) {
479     return false;
480     }
481 softime 6565
482    
483     // On inclut le script qui déclare la classe à instancier
484     require_once "../obj/".$obj.".class.php";
485     $return = false;
486    
487     $object_instance = new $obj(
488     ']',
489     $this->db,
490     0
491     );
492 mbroquet 3730 // Si il n'est pas dans la même division on défini le retour comme faux
493     // à moins qu'il ai un droit de changement de decision
494 softime 6565 if($this->isUserInstructeur() === true &&
495     ($object_instance->getDivisionFromDossier($idx) == $_SESSION["division"] or
496     ($obj == "instruction" &&
497     $object_instance->isInstrCanChangeDecision($idx) === true))) {
498 mbroquet 3730
499 softime 6565 $return = true;
500 mbroquet 3730 }
501    
502     return $return;
503     }
504    
505 softime 6565
506 mbroquet 3730 /**
507 softime 6565 * Ajout de variables de session contenant la division pour permettre une
508     * utilisation plus efficace dans les requetes.
509 mbroquet 3730 *
510 softime 6565 * @param array $utilisateur Tableau d'informations de l'utilisateur.
511 mbroquet 3730 */
512 softime 6929 function triggerAfterLogin($utilisateur = NULL) {
513 softime 6565 // Récupération de la division de l'utilisateur.
514 mbroquet 3730 $sql = "SELECT instructeur.division, division.code
515 softime 6565 FROM ".DB_PREFIXE."instructeur
516     LEFT JOIN ".DB_PREFIXE."division
517     ON instructeur.division = division.division
518     WHERE instructeur.om_utilisateur='".$utilisateur["om_utilisateur"]."'";
519 mbroquet 3730 $res = $this->db->query($sql);
520 softime 6565 $this->addToLog(
521     "triggerAfterLogin(): db->query(\"".$sql."\");",
522     VERBOSE_MODE
523     );
524     if (database::isError($res)) {
525 mbroquet 3730 die();
526     }
527     $row = $res->fetchrow(DB_FETCHMODE_ASSOC);
528 softime 6565 // Enregistrement de la division en session
529 mbroquet 3730 if (isset($row["division"]) && $row["division"] != NULL) {
530     $_SESSION["division"] = $row["division"];
531     $_SESSION["division_code"] = $row["code"];
532     } else {
533     $_SESSION["division"] = "0";
534     $_SESSION["division_code"] = "";
535     }
536 softime 6565 // Récupération du paramétrage des groupes de l'utilisateur.
537     $sqlGroupes = "SELECT groupe.code, lien_om_utilisateur_groupe.confidentiel, lien_om_utilisateur_groupe.enregistrement_demande, groupe.libelle
538     FROM ".DB_PREFIXE."groupe
539     RIGHT JOIN ".DB_PREFIXE."lien_om_utilisateur_groupe ON
540     lien_om_utilisateur_groupe.groupe = groupe.groupe
541 softime 6674 WHERE lien_om_utilisateur_groupe.login = '".$utilisateur["login"] ."'
542 softime 6565 ORDER BY libelle";
543     $resGroupes = $this->db->query($sqlGroupes);
544     $this->addToLog(
545     "triggerAfterLogin(): db->query(\"".$sqlGroupes."\");",
546     VERBOSE_MODE
547     );
548     if (database::isError($resGroupes)) {
549     die();
550     }
551     // Si aucun résultat alors récupération du paramétrage des groupes du profil
552     if ($resGroupes->numRows() === 0) {
553     $sqlGroupes = "SELECT groupe.code, lien_om_profil_groupe.confidentiel, lien_om_profil_groupe.enregistrement_demande, groupe.libelle
554     FROM ".DB_PREFIXE."groupe
555     RIGHT JOIN ".DB_PREFIXE."lien_om_profil_groupe ON
556     lien_om_profil_groupe.groupe = groupe.groupe
557     AND om_profil = ".$utilisateur["om_profil"] ."
558     ORDER BY libelle";
559     $resGroupes = $this->db->query($sqlGroupes);
560     $this->addToLog(
561     "triggerAfterLogin(): db->query(\"".$sqlGroupes."\");",
562     VERBOSE_MODE
563     );
564     if (database::isError($resGroupes)) {
565     die();
566     }
567     }
568     $_SESSION["groupe"] = array();
569     // Enregistrement des groupe en session
570     while ($row = $resGroupes->fetchrow(DB_FETCHMODE_ASSOC)) {
571     if ($row["confidentiel"] === 't') {
572     $row["confidentiel"] = true;
573     } else {
574     $row["confidentiel"] = false;
575     }
576     if ($row["enregistrement_demande"] === 't') {
577     $row["enregistrement_demande"] = true;
578     } else {
579     $row["enregistrement_demande"] = false;
580     }
581     $_SESSION["groupe"][$row["code"]] = array(
582     "confidentiel" => $row["confidentiel"],
583     "enregistrement_demande" => $row["enregistrement_demande"],
584     "libelle" => $row["libelle"],
585     );
586     }
587     }
588 mbroquet 3730
589     // Affichage des actions supplémentaires
590     function displayActionExtras() {
591     // Affichage de la division si l'utilisateur en possède une
592     if ($_SESSION["division"] != 0) {
593     echo "\t\t\t<li class=\"action-division\">";
594     echo "(".$_SESSION['division_code'].")";
595     echo "</li>\n";
596     }
597     }
598    
599     // }}}
600    
601    
602     // {{{ GESTION DES FICHIERS
603    
604     /**
605     *
606     */
607     function notExistsError ($explanation = NULL) {
608     // message
609     $message_class = "error";
610     $message = _("Cette page n'existe pas.");
611     $this->addToMessage ($message_class, $message);
612     //
613     $this->setFlag(NULL);
614     $this->display();
615    
616     //
617     die();
618     }
619    
620     // }}}
621     /**
622     * Retourne le statut du dossier d'instruction
623     * @param string $idx Identifiant du dossier d'instruction
624     * @return string Le statut du dossier d'instruction
625     */
626     function getStatutDossier($idx){
627    
628     $statut = '';
629    
630     //Si l'identifiant du dossier d'instruction fourni est correct
631     if ( $idx != '' ){
632    
633     //On récupère le statut de l'état du dossier à partir de l'identifiant du
634     //dossier d'instruction
635     $sql = "SELECT etat.statut
636     FROM ".DB_PREFIXE."dossier
637     LEFT JOIN
638     ".DB_PREFIXE."etat
639     ON
640     dossier.etat = etat.etat
641     WHERE dossier ='".$idx."'";
642     $statut = $this->db->getOne($sql);
643     $this->addToLog("getStatutDossier() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
644     if ( database::isError($statut)){
645     die();
646     }
647     }
648     return $statut;
649     }
650    
651     /**
652     * Formate le champ pour le type Timestamp
653     * @param date $date_str Date
654     * @param boolean $show Format pour l'affichage
655     * @return mixed False si le traitement échoue ou la date formatée
656     */
657     function formatTimestamp ($date_str, $show = true) {
658    
659     // Sépare la date et l'heure
660     $date = explode(" ", $date_str);
661     if (count($date) != 2) {
662     return false;
663     }
664    
665     // Date en BDD
666     $date_db = explode ('-', $date[0]);
667     // Date en affichage
668     $date_show = explode ('/', $date[0]);
669    
670     // Contrôle la composition de la date
671     if (count ($date_db) != 3 and count ($date_show) != 3) {
672     return false;
673     }
674    
675     if (count ($date_db) == 3) {
676     // Vérifie que c'est une date valide
677     if (!checkdate($date_db[1], $date_db[2], $date_db[0])) {
678     return false;
679     }
680     // Si c'est pour l'affichage de la date
681     if ($show == true) {
682     return $date_db [2]."/".$date_db [1]."/".$date_db [0]." ".$date[1];
683     } else {
684     return $date[0];
685     }
686     }
687    
688     //
689     if (count ($date_show) == 3) {
690     // Vérifie que c'est une date valide
691     if (!checkdate($date_show[1], $date_show[0], $date_show[2])) {
692     return false;
693     }
694     // Si c'est pour l'affichage de la date
695     if ($show == true) {
696     return $date[0];
697     } else {
698     return $date_show [2]."-".$date_show [1]."-".$date_show [0]." ".$date[1];
699     }
700    
701     }
702     return false;
703    
704     }
705    
706     /**
707     * Permet de calculer la liste des parcelles à partir de la chaîne passée en paramètre
708     * et la retourner sous forme d'un tableau associatif
709     *
710     * @param string $strParcelles Chaîne de la parcelles.
711     * @param string $collectivite_idx Collectivite de la parcelle.
712     *
713     * @return array (array(prefixe, quartier, section, parcelle), ...)
714     */
715     function parseParcelles($strParcelles, $collectivite_idx = null) {
716    
717     // Séparation des lignes
718     $references = explode(";", $strParcelles);
719     $liste_parcelles = array();
720    
721     // On boucle sur chaque ligne pour ajouter la liste des parcelles de chaque ligne
722     foreach ($references as $parcelles) {
723    
724     // On transforme la chaîne de la ligne de parcelles en tableau
725     $ref = str_split($parcelles);
726     // Les 1er caractères sont numériques
727     $num = true;
728    
729     // Tableau des champs de la ligne de références cadastrales
730     $reference_tab = array();
731     $temp = "";
732     foreach ($ref as $carac) {
733    
734     // Permet de tester si le caractère courant est de même type que le précédent
735     if(is_numeric($carac) === $num) {
736     $temp .= $carac;
737     } else {
738     // Bascule
739     $num = !$num;
740     // On stock le champ
741     $reference_tab[] = $temp;
742     // re-init de la valeur temporaire pour le champ suivant
743     $temp = $carac;
744     }
745     }
746     // Stockage du dernier champ sur lequel il n'y a pas eu de bascule
747     $reference_tab[] = $temp;
748     // Calcul des parcelles
749     $quartier = $reference_tab[0];
750     $sect = $reference_tab[1];
751    
752     $ancien_ref_parc = "";
753     for ($i=2; $i < count($reference_tab); $i+=2) {
754     if($collectivite_idx != null) {
755     // Récupération du code impot de l'arrondissement
756     $collectivite = $this->getCollectivite($collectivite_idx);
757     $parc["prefixe"] = $this->get_arrondissement_code_impot($quartier);
758     }
759     $parc["quartier"] = $quartier;
760     // Met en majuscule si besoin
761     $parc["section"] = strtoupper($sect);
762     if( $ancien_ref_parc == "" OR $reference_tab[$i-1] == "/") {
763     // 1ere parcelle ou parcelle individuelle
764     // Compléte par des "0" le début de la chaîne si besoin
765     $parc["parcelle"] = str_pad($reference_tab[$i], 4, "0", STR_PAD_LEFT);
766     // Ajout d'une parcelle à la liste
767     $liste_parcelles[] = $parc;
768     } elseif ($reference_tab[$i-1] == "A") {
769     // Interval de parcelles
770     for ($j=$ancien_ref_parc+1; $j <= $reference_tab[$i]; $j++) {
771     // Compléte par des "0" le début de la chaîne si besoin
772     $parc["parcelle"] = str_pad($j, 4, "0", STR_PAD_LEFT);
773     // Ajout d'une parcelle à la liste
774     $liste_parcelles[] = $parc;
775     }
776     }
777     //Gestion des erreurs
778     else{
779    
780     echo _("Une erreur de formattage a ete detecte dans la reference cadastrale du dossier ").$this->row['dossier'];
781     }
782     // Sauvegarde de la référence courante de parcelle
783     $ancien_ref_parc = $reference_tab[$i];
784     }
785     }
786    
787     return $liste_parcelles;
788     }
789    
790    
791     /**
792     * Récupère le code impôt par rapport au quartier.
793     *
794     * @param string $quartier Numéro de quartier.
795     * @return string Code impôts.
796     */
797     protected function get_arrondissement_code_impot($quartier) {
798     // Initialisation
799     $code_impots = "";
800     // Si le quartier fournis est correct
801     if ($quartier != "") {
802     // Requête SQL
803     $sql = "SELECT
804     arrondissement.code_impots
805     FROM
806     ".DB_PREFIXE."arrondissement
807     LEFT JOIN
808     ".DB_PREFIXE."quartier
809     ON
810     quartier.arrondissement = arrondissement.arrondissement
811     WHERE
812     quartier.code_impots = '".$quartier."'";
813    
814     }
815     $code_impots = $this->db->getOne($sql);
816     if ($code_impots === null) {
817     $code_impots = "";
818     }
819     $this->isDatabaseError($code_impots);
820     // Retour
821     return $code_impots;
822     }
823    
824    
825     /**
826     * Formate les parcelles en ajoutant le code impôt
827     * @param array $liste_parcelles Tableau des parcelles
828     * @return string Liste des parcelles formatées
829     */
830     function formatParcelleToSend($liste_parcelles) {
831    
832     //
833     $wParcelle = array();
834    
835     //Formatage des références cadastrales pour l'envoi
836     foreach ($liste_parcelles as $value) {
837    
838     // On ajoute les données dans le tableau que si quartier + section + parcelle
839     // a été fourni
840     if ($value["quartier"] !== ""
841     && $value["section"] !== ""
842     && $value["parcelle"] !== ""){
843    
844     //On récupère le code impôt de l'arrondissement
845     $arrondissement = $this->getCodeImpotByQuartier($value["quartier"]);
846    
847     //On ajoute la parcelle, si un arrondissement a été trouvé
848     if ($arrondissement!=="") {
849     //
850     $wParcelle[] = $arrondissement.$value["quartier"].
851     str_pad($value["section"], 2, " ", STR_PAD_LEFT).
852     $value["parcelle"];
853     }
854     }
855     }
856    
857     //
858     return $wParcelle;
859     }
860    
861     /**
862     * Récupère le code impôt par rapport au quartier
863     * @param string $quartier Numéro de quartier
864     * @return string Code impôt
865     */
866     function getCodeImpotByQuartier($quartier) {
867    
868     $arrondissement = "";
869    
870     // Si le quartier fournis est correct
871     if ($quartier != "") {
872    
873     // Requête SQL
874     $sql = "SELECT
875     arrondissement.code_impots
876     FROM
877     ".DB_PREFIXE."arrondissement
878     LEFT JOIN
879     ".DB_PREFIXE."quartier
880     ON
881     quartier.arrondissement = arrondissement.arrondissement
882     WHERE
883     quartier.code_impots = '".$quartier."'";
884     $this->addToLog("getCodeImpotByQuartier() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
885     $arrondissement = $this->db->getOne($sql);
886     $this->isDatabaseError($arrondissement);
887     }
888    
889     // Retour
890     return $arrondissement;
891     }
892    
893    
894     /**
895     * Retourne true si tous les paramètres du SIG externe ont bien été définis
896     * @return bool true/false
897     */
898     public function issetSIGParameter($idx) {
899     $collectivite_idx = $this->get_collectivite_of_element("dossier", $idx);
900     $collectivite = $this->getCollectivite($collectivite_idx);
901     if(isset($collectivite["sig"])) {
902     return true;
903     } else {
904     return false;
905     }
906     }
907    
908     /**
909     * Permet de vérifier que des champs existe dans une table
910     * @param array $list_fields Liste des champs à tester
911     * @param string $table Table où les champs doivent exister
912     * @return mixed Retourne les champs qui n'existent pas
913     * ou true
914     */
915     public function check_field_exist($list_fields, $table) {
916    
917     // Instance de la classe en paramètre
918     require_once "../obj/".$table.".class.php";
919     $object = new $table("]", $this->db, DEBUG);
920    
921     // Récupère les champs de la table
922     foreach ($object->champs as $champ) {
923     $list_column[] = $champ;
924     }
925    
926     // Tableau des champs en erreur
927     $error_fields = array();
928    
929     // Pour chaque champ à tester
930     foreach ($list_fields as $value) {
931    
932     // S'il n'apparaît pas dans la liste des champs possible
933     if (!in_array($value, $list_column)) {
934    
935     // Alors le champ est ajouté au tableau des erreurs
936     $error_fields[] = $value;
937     }
938     }
939    
940     // Si le tableau des erreurs n'est pas vide on le retourne
941     if (count($error_fields) > 0) {
942     return $error_fields;
943     }
944    
945     // Sinon on retourne le booléen true
946     return true;
947    
948     }
949    
950     /*
951     *
952     */
953     /**
954     * Récupère la lettre type lié à un événement
955     * @param integer $evenement L'identifiant de l'événement
956     * @return integer Retourne l'idenfiant de la lettre-type ou true
957     */
958     function getLettreType($evenement){
959    
960     $lettretype = NULL;
961    
962     $sql =
963     "SELECT
964     lettretype
965     FROM
966     ".DB_PREFIXE."evenement
967     WHERE
968     evenement = $evenement";
969    
970     $this->addToLog("getLettreType() : db->query(\"".$sql."\")", VERBOSE_MODE);
971     $res = $this->db->query($sql);
972     if ( database::isError($res)){
973     die();
974     }
975    
976     if ( $res->numrows() > 0 ){
977    
978     $row=& $res->fetchRow(DB_FETCHMODE_ASSOC);
979     $lettretype = $row['lettretype'];
980     }
981    
982     return $lettretype;
983     }
984    
985     /**
986     * Retourne le type de dossier d'autorisation du dossier courant :
987     * @param $idxDossier Le numéro du dossier d'instruction
988     * @return le code du type détaillée de dossier d'autorisation
989     **/
990     function getDATDCode($idxDossier) {
991     $sql = "SELECT dossier_autorisation_type_detaille.code
992     FROM ".DB_PREFIXE."dossier_autorisation_type_detaille
993     INNER JOIN ".DB_PREFIXE."dossier_autorisation
994     ON dossier_autorisation_type_detaille.dossier_autorisation_type_detaille =
995     dossier_autorisation.dossier_autorisation_type_detaille
996     INNER JOIN ".DB_PREFIXE."dossier ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
997     WHERE dossier.dossier = '".$idxDossier."'";
998     $res = $this->db->getOne($sql);
999     $this->addToLog("getDATDCode() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
1000     if ( database::isError($res)){
1001     die();
1002     }
1003     return $res;
1004     }
1005    
1006     /**
1007 fmichon 4708 * Retourne le type de dossier d'autorisation du dossier courant :
1008     * @param $idxDossier Le numéro du dossier d'instruction
1009     * @return le code du type de dossier d'autorisation
1010     **/
1011     function getDATCode($idxDossier) {
1012     $sql = "
1013     SELECT
1014     dossier_autorisation_type.code
1015     FROM
1016     ".DB_PREFIXE."dossier_autorisation_type
1017     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
1018     ON dossier_autorisation_type.dossier_autorisation_type=dossier_autorisation_type_detaille.dossier_autorisation_type
1019     INNER JOIN ".DB_PREFIXE."dossier_autorisation
1020     ON dossier_autorisation_type_detaille.dossier_autorisation_type_detaille=dossier_autorisation.dossier_autorisation_type_detaille
1021     INNER JOIN ".DB_PREFIXE."dossier
1022     ON dossier.dossier_autorisation=dossier_autorisation.dossier_autorisation
1023     WHERE
1024     dossier.dossier = '".$idxDossier."'
1025     ";
1026     $res = $this->db->getOne($sql);
1027     $this->addToLog(__METHOD__."(): db->getOne(\"".$sql."\")", VERBOSE_MODE);
1028     if ( database::isError($res)){
1029     die();
1030     }
1031     return $res;
1032     }
1033    
1034     /**
1035 mbroquet 3730 * Permet de copier un enregistrement
1036     * @param mixed $idx Identifiant de l'enregistrment
1037     * @param string $obj Objet de l'enregistrment
1038     * @param string $objsf Objets associés
1039     * @return array Tableau des nouveaux id et du message
1040     */
1041     function copier($idx, $obj, $objsf) {
1042    
1043     // Tableau de résultat
1044     $resArray = array();
1045     // Message retourné à l'utilisateur
1046     $message = "";
1047     // Type du message (valid ou error)
1048     $message_type = "valid";
1049    
1050     // Requête SQL permettant de récupérer les informations sur l'objet métier
1051     $sql = "SELECT *
1052     FROM ".DB_PREFIXE.$obj."
1053     WHERE ".$obj." = ".$idx;
1054     $res = $this->db->query($sql);
1055     $this->isDatabaseError($res);
1056    
1057     // Valeurs clonées
1058     $valF = array();
1059     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
1060     // Recupère la valeur
1061     $valF = $row;
1062     }
1063    
1064     // Valeurs non clonées
1065     // Identifiant modifié pour que ça soit un ajout
1066     $valF[$obj] = "]";
1067    
1068     // Inclus la classe de l'objet métier
1069     require_once "../obj/".$obj.".class.php";
1070    
1071     // Instance de l'objet métier
1072     $clone_obj = new $obj("]", $this->db, DEBUG);
1073     // Si dans l'objet métier la fonction "copier" existe
1074     if (method_exists($clone_obj, "update_for_copy")) {
1075     // Traitement sur les valeurs du duplicata
1076     $valF = $clone_obj->update_for_copy($valF, $objsf, DEBUG);
1077     // Recupère les messages retourné par la fonction
1078     $message .= $valF['message'];
1079     // Supprime les messages de la liste des valeurs
1080     unset($valF['message']);
1081     }
1082     // Ajoute le duplicata
1083     $clone_obj->ajouter($valF, $this->db, DEBUG);
1084     // Si aucune erreur se produit dans la classe instanciée
1085     if ($clone_obj->correct === true) {
1086     // Récupère l'identifiant de l'objet créé
1087     $clone_obj_id = $clone_obj->valF[$obj];
1088    
1089     // Message
1090     $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 />";
1091    
1092     // Ajout de l'identifant au tableau des résultat
1093     $resArray[$obj.'_'.$idx] = $clone_obj_id;
1094    
1095     // S'il y a au moins un objet metier associé
1096     if ($objsf != "") {
1097     // Liste des objet métier associés
1098     $list_objsf = explode(",", $objsf);
1099     // Pour chaque objet associé
1100     foreach ($list_objsf as $key => $objsf) {
1101     // Inclus la classe de l'objet métier associé
1102     require_once "../obj/".$objsf.".class.php";
1103    
1104     // Requête SQL permettant de récupérer les informations sur
1105     // l'objet métier associé
1106     $sql = "SELECT *
1107     FROM ".DB_PREFIXE.$objsf."
1108     WHERE ".$obj." = ".$idx;
1109     $res = $this->db->query($sql);
1110     $this->isDatabaseError($res);
1111    
1112     // Pour chaque élément associé
1113     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
1114     // Identifiant de l'objet associé à copier
1115     $idxsf = $row[$objsf];
1116    
1117     // Valeurs clonées
1118     $valF = $row;
1119     // Valeurs non clonées
1120     $valF[$obj] = $clone_obj_id;
1121     // Identifiant modifié pour que ça soit un ajout
1122     $valF[$objsf] = "]";
1123     // Instance de l'objet métier associé
1124     $clone_objsf = new $objsf("]", $this->db, DEBUG);
1125     // Si dans l'objet métier associé
1126     // la fonction "copier" existe
1127     if (method_exists($clone_objsf, "update_for_copy")) {
1128     // Traitement sur les valeurs du duplicata
1129     $valF = $clone_objsf->update_for_copy($valF, $objsf, DEBUG);
1130     // Recupère les messages retourné par la fonction
1131     $message .= $valF['message'];
1132     // Supprime les messages de la liste des valeurs
1133     unset($valF['message']);
1134     }
1135     // Ajoute le duplicata
1136     $clone_objsf->ajouter($valF, $this->db, DEBUG);
1137     // Si aucune erreur se produit dans la classe instanciée
1138     if ($clone_objsf->correct === true) {
1139     // Récupère l'identifiant de l'objet créé
1140     $clone_objsf_id = $clone_objsf->valF[$objsf];
1141    
1142     // Message
1143     $message .= sprintf(_("La copie de l'enregistrement %s avec l'identifiant %s s'est effectuee avec succes"), "<span class='bold'>"._($objsf)."</span>", "<span class='bold'>".$idxsf."</span>")."<br />";
1144    
1145     // Ajout de l'identifant au tableau des résultat
1146     $resArray[$objsf.'_'.$row[$objsf]] = $clone_objsf_id;
1147     } else {
1148    
1149     // Message d'erreur récupéré depuis la classe
1150     $message .= $clone_objsf->msg;
1151     // Type du message
1152     $message_type = "error";
1153     }
1154     }
1155     }
1156     }
1157     //
1158     } else {
1159    
1160     // Message d'erreur récupéré depuis la classe
1161     $message .= $clone_obj->msg;
1162     // Type du message
1163     $message_type = "error";
1164     }
1165    
1166     // Ajout du message au tableau des résultats
1167     $resArray['message'] = $message;
1168     // Ajout du type de message au tableau des résultats
1169     $resArray['message_type'] = $message_type;
1170    
1171     // Retourne le tableau des résultats
1172     return $resArray;
1173     }
1174    
1175     /**
1176     * Cette fonction prend en entrée le ou les paramètres du &contrainte qui sont entre
1177     * parenthèses (un ensemble de paramètres séparés par des points-virgules). Elle
1178     * sépare les paramètres et leurs valeurs puis construit et retourne un tableau
1179     * associatif qui contient pour les groupes et sous-groupes :
1180     * - un tableau de valeurs, avec un nom de groupe ou sous-groupe par ligne
1181     * pour les autres options :
1182     * - la valeur de l'option
1183     *
1184     * @param string $contraintes_param Chaîne contenant tous les paramètres
1185     *
1186     * @return array Tableau associatif avec paramètres et valeurs séparés
1187     */
1188     function explodeConditionContrainte($contraintes_param) {
1189    
1190     // Initialisation des variables
1191     $return = array();
1192     $listGroupes = "";
1193     $listSousgroupes = "";
1194     $service_consulte = "";
1195     $affichage_sans_arborescence = "";
1196    
1197     // Sépare toutes les conditions avec leurs valeurs et les met dans un tableau
1198     $contraintes_params = explode(";", $contraintes_param);
1199    
1200     // Pour chaque paramètre de &contraintes
1201     foreach ($contraintes_params as $value) {
1202     // Récupère le mot-clé "liste_groupe" et les valeurs du paramètre
1203     if (strstr($value, "liste_groupe=")) {
1204     // On enlève le mots-clé "liste_groupe=", on garde les valeurs
1205     $listGroupes = str_replace("liste_groupe=", "", $value);
1206     }
1207     // Récupère le mot-clé "liste_ssgroupe" et les valeurs du paramètre
1208     if (strstr($value, "liste_ssgroupe=")) {
1209     // On enlève le mots-clé "liste_ssgroupe=", on garde les valeurs
1210     $listSousgroupes = str_replace("liste_ssgroupe=", "", $value);
1211     }
1212     // Récupère le mot-clé "service_consulte" et la valeur du paramètre
1213     if (strstr($value, "service_consulte=")) {
1214     // On enlève le mots-clé "service_consulte=", on garde sa valeur
1215     $service_consulte = str_replace("service_consulte=", "", $value);
1216     }
1217     // Récupère le mot-clé "affichage_sans_arborescence" et la valeur du
1218     // paramètre
1219     if (strstr($value, "affichage_sans_arborescence=")) {
1220     // On enlève le mots-clé "affichage_sans_arborescence=", on garde la valeur
1221     $affichage_sans_arborescence = str_replace("affichage_sans_arborescence=", "", $value);
1222     }
1223     }
1224    
1225     // Récupère dans des tableaux la liste des groupes et sous-groupes qui
1226     // doivent être utilisés lors du traitement de la condition
1227     if ($listGroupes != "") {
1228     $listGroupes = array_map('trim', explode(",", $listGroupes));
1229     }
1230     if ($listSousgroupes != "") {
1231     $listSousgroupes = array_map('trim', explode(",", $listSousgroupes));
1232     }
1233    
1234     // Tableau à retourner
1235     $return['groupes'] = $listGroupes;
1236     $return['sousgroupes'] = $listSousgroupes;
1237     $return['service_consulte'] = $service_consulte;
1238     $return['affichage_sans_arborescence'] = $affichage_sans_arborescence;
1239     return $return;
1240     }
1241    
1242     /**
1243     * Méthode qui complète la clause WHERE de la requête SQL de récupération des
1244     * contraintes, selon les paramètres fournis. Elle permet d'ajouter une condition sur
1245     * les groupes, sous-groupes et les services consultés.
1246     *
1247     * @param $string $part Contient tous les paramètres fournis à &contraintes séparés
1248     * par des points-virgules, tel que définis dans l'état.
1249     * array[] $conditions Paramètre optionnel, contient les conditions déjà explosées
1250     * par la fonction explodeConditionContrainte()
1251     *
1252     * @return string Contient les clauses WHERE à ajouter à la requête SQL principale.
1253     */
1254     function traitement_condition_contrainte($part, $conditions = NULL) {
1255    
1256     // Initialisation de la condition
1257     $whereContraintes = "";
1258     // Lorsqu'on a déjà les conditions explosées dans le paramètre $conditions, on
1259     // utilise ces données. Sinon, on appelle la méthode qui explose la chaîne de
1260     // caractères contenant l'ensemble des paramètres.
1261     if (is_array($conditions)){
1262     $explodeConditionContrainte = $conditions;
1263     }
1264     else {
1265     $explodeConditionContrainte = $this->explodeConditionContrainte($part);
1266     }
1267     // Récupère les groupes, sous-groupes et service_consulte pour la condition
1268     $groupes = $explodeConditionContrainte['groupes'];
1269     $sousgroupes = $explodeConditionContrainte['sousgroupes'];
1270     $service_consulte = $explodeConditionContrainte['service_consulte'];
1271    
1272     // Pour chaque groupe
1273     if ($groupes != "") {
1274     foreach ($groupes as $key => $groupe) {
1275     // Si le groupe n'est pas vide
1276     if (!empty($groupe)) {
1277     // Choisit l'opérateur logique
1278     $op_logique = $key > 0 ? 'OR' : 'AND (';
1279     // Ajoute la condition
1280     $whereContraintes .= " ".$op_logique." lower(trim(both E'\n\r\t' from contrainte.groupe)) = lower('"
1281     .pg_escape_string($groupe)."')";
1282     }
1283     }
1284     // S'il y a des valeurs dans groupe
1285     if (count($groupe) > 0) {
1286     // Ferme la parenthèse
1287     $whereContraintes .= " ) ";
1288     }
1289     }
1290    
1291     // Pour chaque sous-groupe
1292     if ($sousgroupes != "") {
1293     foreach ($sousgroupes as $key => $sousgroupe) {
1294     // Si le sous-groupe n'est pas vide
1295     if (!empty($sousgroupe)) {
1296     // Choisit l'opérateur logique
1297     $op_logique = $key > 0 ? 'OR' : 'AND (';
1298     // Ajoute la condition
1299     $whereContraintes .= " ".$op_logique." lower(trim(both E'\n\r\t' from contrainte.sousgroupe)) = lower('"
1300     .pg_escape_string($sousgroupe)."')";
1301     }
1302     }
1303     // S'il y a des valeurs dans sous-groupe
1304     if (count($sousgroupes) > 0) {
1305     // Ferme la parenthèse
1306     $whereContraintes .= " ) ";
1307     }
1308     }
1309    
1310     // Si l'option service_consulte n'est pas vide
1311     if ($service_consulte != "") {
1312     // Ajoute la condition
1313     $whereContraintes .= " AND service_consulte = cast(lower('".$service_consulte."') as boolean) ";
1314     }
1315    
1316     // Condition retournée
1317     return $whereContraintes;
1318     }
1319    
1320     /**
1321     * Calcule une date par l'ajout ou la soustraction de mois ou de jours.
1322     *
1323     * @param date $date Date de base (format dd-mm-yyyy)
1324     * @param integer $delay Délais à ajouter
1325     * @param string $operator Opérateur pour le calcul ("-" ou "+")
1326     * @param string $type Type de calcul (mois ou jour)
1327     *
1328     * @return date Date calculée
1329     */
1330     function mois_date($date, $delay, $operator = "+", $type = "mois") {
1331    
1332     // Si un type n'est pas définit
1333     if ($type != "mois" && $type != "jour") {
1334     //
1335     return null;
1336     }
1337    
1338     // Si aucune date n'a été fournie ou si ce n'est pas une date correctement
1339     // formatée
1340     if ( is_null($date) || $date == "" ||
1341     preg_match('/[0-9]{4}-[0-9]{2}-[0-9]{2}/', $date) == 0 ){
1342     return null;
1343     }
1344    
1345     // Si l'opérateur n'est pas définit
1346     if ($operator != "+" && $operator != "-") {
1347     //
1348     return null;
1349     }
1350    
1351     // Découpage de la date
1352     $temp = explode("-", $date);
1353     $day = (int) $temp[2];
1354     $month = (int) $temp[1];
1355     $year = (int) $temp[0];
1356    
1357     // Si c'est un calcul sur des mois
1358     // Le calcul par mois ne se fait pas comme le calcul par jour car
1359     // les fonctions PHP ne réalisent pas les calculs réglementaires
1360     if ($type == "mois") {
1361    
1362     // Si c'est une addition
1363     if ($operator == '+') {
1364     // Année à ajouter
1365     $year += floor($delay / 12);
1366     // Mois restant
1367     $nb_month = ($delay % 12);
1368     // S'il y a des mois restant
1369     if ($nb_month != 0) {
1370     // Ajout des mois restant
1371     $month += $nb_month;
1372     // Si ça dépasse le mois 12 (décembre)
1373     if ($month > 12) {
1374     // Soustrait 12 au mois
1375     $month -= 12;
1376     // Ajoute 1 à l'année
1377     $year += 1;
1378     }
1379     }
1380     }
1381    
1382     // Si c'est une soustraction
1383     if ($operator == "-") {
1384     // Année à soustraire
1385     $year -= floor($delay / 12);
1386     // Mois restant
1387     $nb_month = ($delay % 12);
1388     // S'il y a des mois restant
1389     if ($nb_month != 0) {
1390     // Soustrait le délais
1391     $month -= $nb_month;
1392     // Si ça dépasse le mois 1 (janvier)
1393     if ($month < 1) {
1394     // Soustrait 12 au mois
1395     $month += 12;
1396     // Ajoute 1 à l'année
1397     $year -= 1;
1398     }
1399     }
1400     }
1401    
1402     // Calcul du nombre de jours dans le mois sélectionné
1403     switch($month) {
1404     // Mois de février
1405     case "2":
1406     if ($year % 4 == 0 && $year % 100 != 0 || $year % 400 == 0) {
1407     $day_max = 29;
1408     } else {
1409     $day_max = 28;
1410     }
1411     break;
1412     // Mois d'avril, juin, septembre et novembre
1413     case "4":
1414     case "6":
1415     case "9":
1416     case "11":
1417     $day_max = 30;
1418     break;
1419     // Mois de janvier, mars, mai, juillet, août, octobre et décembre
1420     default:
1421     $day_max = 31;
1422     }
1423    
1424     // Si le jour est supérieur au jour maximum du mois
1425     if ($day > $day_max) {
1426     // Le jour devient le jour maximum
1427     $day = $day_max;
1428     }
1429    
1430     // Compléte le mois et le jour par un 0 à gauche si c'est un chiffre
1431     $month = str_pad($month, 2, "0", STR_PAD_LEFT);
1432     $day = str_pad($day, 2, "0", STR_PAD_LEFT);
1433    
1434     // Résultat du calcul
1435     $date_result = $year."-".$month."-".$day;
1436     }
1437    
1438     // Si c'est un calcul sur des jours
1439     if ($type == "jour") {
1440     //
1441     $datetime = new DateTime($date);
1442     // Si le délai est un numérique
1443     if (is_numeric($delay)) {
1444     // Modifie la date
1445     $datetime->modify($operator.$delay.' days');
1446     }
1447     // Résultat du calcul
1448     $date_result = $datetime->format('Y-m-d');
1449     }
1450    
1451     // Retourne la date calculée
1452     return $date_result;
1453     }
1454    
1455     /**
1456     * Vérifie la valididité d'une date.
1457     *
1458     * @param string $pDate Date à vérifier
1459     *
1460     * @return boolean
1461     */
1462     function check_date($pDate) {
1463    
1464     // Vérifie si c'est une date valide
1465     if (preg_match("/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/", $pDate, $date)
1466     && checkdate($date[2], $date[3], $date[1])
1467     && $date[1] >= 1900) {
1468     //
1469     return true;
1470     }
1471    
1472     //
1473     return false;
1474     }
1475    
1476     /**
1477     * Permet de tester le bypass
1478     *
1479     * @param string $obj le nom de l'objet
1480     * @param string $permission_suffix
1481     * @return boolean
1482     */
1483     function can_bypass($obj="", $permission_suffix=""){
1484     //On teste le droit bypass
1485     if ($permission_suffix!=""&&$obj!=""&&
1486     $this->isAccredited($obj."_".$permission_suffix."_bypass")){
1487     return true;
1488     }
1489     return false;
1490     }
1491    
1492    
1493     /**
1494     * Vérifie l'option de numérisation.
1495     *
1496     * @return boolean
1497     */
1498     public function is_option_digitalization_folder_enabled() {
1499     //
1500     if ($this->getParameter("option_digitalization_folder") !== true) {
1501     //
1502     return false;
1503     }
1504     //
1505     return true;
1506     }
1507    
1508    
1509     /**
1510     * Vérifie que l'option d'accès au portail citoyen est activée.
1511     *
1512 softime 7366 * @param integer $om_collectivite Identifiant de la collectivité.
1513     *
1514 mbroquet 3730 * @return boolean
1515     */
1516 softime 7366 public function is_option_citizen_access_portal_enabled($om_collectivite=null) {
1517 mbroquet 3730 //
1518 softime 7366 $parameters = $this->getCollectivite($om_collectivite);
1519 mbroquet 3730 //
1520 softime 7366 if (isset($parameters['option_portail_acces_citoyen']) === true
1521     && $parameters['option_portail_acces_citoyen'] === 'true') {
1522 mbroquet 3730 //
1523 softime 7366 return true;
1524 mbroquet 3730 }
1525    
1526     //
1527 softime 7366 return false;
1528 mbroquet 3730 }
1529    
1530 softime 7366
1531 nmeucci 4108 /**
1532 softime 4626 * Vérifie que l'option du SIG est activée.
1533     *
1534     * @return boolean
1535     */
1536     public function is_option_sig_enabled() {
1537     //
1538     $option = $this->getParameter("option_sig");
1539     //
1540 softime 4662 if ($option !== 'sig_externe' && $option !== 'sig_interne') {
1541 softime 4626 //
1542     return false;
1543     }
1544    
1545     //
1546     return true;
1547     }
1548    
1549 softime 6929
1550 softime 4626 /**
1551 softime 6929 * Vérifie que l'option de simulation des taxes est activée.
1552     *
1553     * @param integer $om_collectivite Identifiant de la collectivité.
1554     *
1555     * @return boolean
1556     */
1557     public function is_option_simulation_taxes_enabled($om_collectivite=null) {
1558     //
1559     $parameters = $this->getCollectivite($om_collectivite);
1560     //
1561     if (isset($parameters['option_simulation_taxes']) === true
1562     && $parameters['option_simulation_taxes'] === 'true') {
1563     //
1564     return true;
1565     }
1566    
1567     //
1568     return false;
1569     }
1570    
1571 softime 7521 /**
1572     * Vérifie que l'option de prévisualisation de l'édition est activée.
1573     *
1574     * @param integer $om_collectivite Identifiant de la collectivité.
1575     *
1576     * @return boolean
1577     */
1578     public function is_option_preview_pdf_enabled($om_collectivite=null) {
1579     //
1580     $parameters = $this->getCollectivite($om_collectivite);
1581     //
1582     if (isset($parameters['option_previsualisation_edition']) === true
1583     && $parameters['option_previsualisation_edition'] === 'true') {
1584     //
1585     return true;
1586     }
1587 softime 6929
1588 softime 7521 //
1589     return false;
1590     }
1591    
1592 softime 7685
1593 softime 6929 /**
1594 softime 7685 * Vérifie que l'option de finalisation automatique des instructions tacites
1595     * et retours est activée..
1596     *
1597     * @param integer $om_collectivite Identifiant de la collectivité.
1598     *
1599     * @return boolean
1600     */
1601     public function is_option_finalisation_auto_enabled($om_collectivite = null) {
1602     //
1603     $parameters = $this->getCollectivite($om_collectivite);
1604     //
1605     if (isset($parameters['option_final_auto_instr_tacite_retour']) === true
1606     && $parameters['option_final_auto_instr_tacite_retour'] === 'true') {
1607     //
1608     return true;
1609     }
1610    
1611     //
1612     return false;
1613     }
1614    
1615    
1616     /**
1617 nmeucci 4108 * Vérifie le niveau de la collectivité de l'utilisateur connecté
1618     *
1619     * @return boolean
1620     */
1621     function has_collectivite_multi() {
1622     $idx_multi = $this->get_idx_collectivite_multi();
1623     if (intval($_SESSION['collectivite']) === intval($idx_multi)) {
1624     return true;
1625     }
1626     return false;
1627     }
1628 mbroquet 3730
1629 nmeucci 4108
1630 softime 3976 /**
1631     * Pour un path absolu donné, retourne le relatif à la racine de
1632     * l'application.
1633     *
1634     * @param string $absolute Chemin absolu.
1635     *
1636     * @return mixed Faux si échec sinon chemin relatif.
1637     */
1638     public function get_relative_path($absolute) {
1639     if ($this->get_path_app() === false) {
1640     return false;
1641     }
1642     $path_app = $this->get_path_app();
1643     return str_replace($path_app, '', $absolute);
1644     }
1645    
1646    
1647     /**
1648     * Retourne le path absolu de la racine de l'application
1649     *
1650     * @return mixed Faux si échec sinon chemin absolu
1651     */
1652     public function get_path_app() {
1653     $match = array();
1654     preg_match( '/(.*)\/[a-zA-Z0-9]+\/\.\.\/core\/$/', PATH_OPENMAIRIE, $match);
1655     // On vérifie qu'il n'y a pas d'erreur
1656     if (isset($match[1]) === false) {
1657     return false;
1658     }
1659     return $match[1];
1660     }
1661    
1662 nmeucci 3981 /**
1663     * Compose un tableau et retourne son code HTML
1664     *
1665     * @param string $id ID CSS du conteneur
1666     * @param array $headers entêtes de colonnes
1667     * @param array $rows lignes
1668     * @return string code HTML
1669     */
1670 nmeucci 3980 public function compose_generate_table($id, $headers, $rows) {
1671 nmeucci 3981 //
1672     $html = '';
1673 nmeucci 3980 // Début conteneur
1674 nmeucci 3981 $html .= '<div id="'.$id.'">';
1675 nmeucci 3980 // Début tableau
1676 nmeucci 3981 $html .= '<table class="tab-tab">';
1677 nmeucci 3980 // Début entête
1678 nmeucci 3981 $html .= '<thead>';
1679     $html .= '<tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">';
1680 nmeucci 3980 // Colonnes
1681     $nb_colonnes = count($headers);
1682     $index_last_col = $nb_colonnes - 1;
1683     foreach ($headers as $i => $header) {
1684     if ($i === 0) {
1685     $col = ' firstcol';
1686     }
1687     if ($i === $index_last_col) {
1688     $col = ' lastcol';
1689     }
1690 nmeucci 3981 $html .= '<th class="title col-'.$i.$col.'">';
1691     $html .= '<span class="name">';
1692     $html .= $header;
1693     $html .= '</span>';
1694     $html .= '</th>';
1695 nmeucci 3980 }
1696     // Fin entête
1697 nmeucci 3981 $html .= '</tr>';
1698     $html .= '</thead>';
1699 nmeucci 3980 // Début corps
1700 nmeucci 3981 $html .= '<tbody>';
1701 nmeucci 3980 // Lignes
1702     foreach ($rows as $cells) {
1703     // Début ligne
1704 nmeucci 3981 $html .= '<tr class="tab-data">';
1705 nmeucci 3980 // Cellules
1706     foreach ($cells as $j => $cell) {
1707     if ($j === 0) {
1708     $col = ' firstcol';
1709     }
1710     if ($j === $index_last_col) {
1711     $col = ' lastcol';
1712     }
1713 nmeucci 3981 $html .= '<td class="title col-'.$j.$col.'">';
1714     $html .= '<span class="name">';
1715     $html .= $cell;
1716     $html .= '</span>';
1717     $html .= '</td>';
1718 nmeucci 3980 }
1719     // Fin ligne
1720 nmeucci 3981 $html .= "</tr>";
1721 nmeucci 3980 }
1722     // Fin corps
1723 nmeucci 3981 $html .= '</tbody>';
1724 nmeucci 3980 // Fin tableau
1725 nmeucci 3981 $html .= '</table>';
1726 nmeucci 3980 // Fin conteneur
1727 nmeucci 3981 $html .= '</div>';
1728     //
1729     return $html;
1730 nmeucci 3980 }
1731 nmeucci 4156
1732     /**
1733     * Retourne le login de l'utilisateur connecté + entre parenthèses son nom
1734     * s'il en a un.
1735     *
1736     * @return string myLogin OU myLogin (myName)
1737     */
1738     public function get_connected_user_login_name() {
1739     // Requête et stockage des informations de l'user connecté
1740     $this->getUserInfos();
1741     // Si le nom existe et est défini on le récupère
1742     $nom = "";
1743     if (isset($this->om_utilisateur["nom"])
1744     && !empty($this->om_utilisateur["nom"])) {
1745     $nom = trim($this->om_utilisateur["nom"]);
1746     }
1747     // Définition de l'émetteur : obligatoirement son login
1748     $emetteur = $_SESSION['login'];
1749     // Définition de l'émetteur : + éventuellement son nom
1750     if ($nom != "") {
1751     $emetteur .= " (".$nom.")";
1752     }
1753     // Retour
1754     return $emetteur;
1755     }
1756 nhaye 4218
1757     /**
1758 fmichon 4708 * Cette méthode permet d'interfacer le module 'Settings'.
1759     */
1760     function view_module_settings() {
1761     //
1762     require_once "../obj/settings.class.php";
1763     $settings = new settings();
1764     $settings->view_main();
1765     }
1766    
1767 softime 7366
1768 fmichon 4708 /**
1769 softime 7366 * Vérifie que l'option référentiel ERP est activée.
1770 fmichon 4708 *
1771 softime 7366 * @param integer $om_collectivite Identifiant de la collectivité.
1772 fmichon 4708 *
1773     * @return boolean
1774     */
1775 softime 7366 public function is_option_referentiel_erp_enabled($om_collectivite=null) {
1776 fmichon 4708 //
1777 softime 7366 $parameters = $this->getCollectivite($om_collectivite);
1778     //
1779     if (isset($parameters['option_referentiel_erp']) === true
1780     && $parameters['option_referentiel_erp'] === 'true') {
1781     //
1782     return true;
1783 fmichon 4708 }
1784 softime 7366
1785 fmichon 4708 //
1786 softime 7366 return false;
1787 fmichon 4708 }
1788    
1789 softime 7366
1790 fmichon 4708 /**
1791     * Interface avec le référentiel ERP.
1792     */
1793     function send_message_to_referentiel_erp($code, $infos) {
1794     //
1795     require_once "../obj/interface_referentiel_erp.class.php";
1796     $interface_referentiel_erp = new interface_referentiel_erp();
1797     $ret = $interface_referentiel_erp->send_message_to_referentiel_erp($code, $infos);
1798     return $ret;
1799     }
1800    
1801     /**
1802 nhaye 4218 * Récupère la liste des identifiants des collectivités
1803     *
1804     * @param string $return_type 'string' ou 'array' selon que l'on retourne
1805     * respectivement une chaîne ou un tableau
1806     * @param string $separator caractère(s) séparateur(s) employé(s) lorsque
1807     * l'on retourne une chaîne, inutilisé si tableau
1808     * @return mixed possibilité de boolean/string/array :
1809     * false si erreur BDD sinon résultat
1810     */
1811     public function get_list_id_collectivites($return_type = 'string', $separator = ',') {
1812     $sql = "
1813     SELECT
1814     array_to_string(
1815     array_agg(om_collectivite),
1816     '".$separator."'
1817     ) as list_id_collectivites
1818     FROM ".DB_PREFIXE."om_collectivite";
1819     $list = $this->db->getone($sql);
1820     $this->addTolog(
1821     __FILE__." - ".__METHOD__." : db->getone(\"".$sql."\");",
1822     VERBOSE_MODE
1823     );
1824     if ($this->isDatabaseError($list, true)) {
1825     return false;
1826     }
1827     if ($return_type === 'array') {
1828     return explode($separator, $list);
1829     }
1830     return $list;
1831     }
1832 nhaye 5254
1833 softime 6565 /**
1834     * Teste si l'utilisateur connecté appartient au groupe indiqué en paramètre
1835     * ou s'il a le goupe bypass.
1836     *
1837     * @param string $groupe Code du groupe : ADS / CTX / CU / RU / ERP.
1838     * @return boolean vrai si utilisateur appartient au groupe fourni
1839     */
1840     public function is_user_in_group($groupe) {
1841     if (isset($_SESSION['groupe']) === true
1842     && (array_key_exists($groupe, $_SESSION['groupe']) === true
1843     || array_key_exists("bypass", $_SESSION['groupe']) === true)) {
1844     return true;
1845     }
1846     return false;
1847     }
1848    
1849     /**
1850     * CONDITION - can_user_access_dossiers_confidentiels_from_groupe
1851     *
1852     * Permet de savoir si le type de dossier d'autorisation du dossier courant est
1853     * considéré comme confidentiel ou si l'utilisateur a le groupe bypass.
1854     *
1855     * @param string $groupe Code du groupe : ADS / CTX / CU / RU / ERP.
1856     * @return boolean true si l'utilisateur à accès aux dossiers confidentiels du groupe
1857     * passé en paramètre, sinon false.
1858     *
1859     */
1860     public function can_user_access_dossiers_confidentiels_from_groupe($groupe) {
1861     if ((isset($_SESSION['groupe'][$groupe]['confidentiel']) === true
1862     AND $_SESSION['groupe'][$groupe]['confidentiel'] === true)
1863     || array_key_exists("bypass", $_SESSION['groupe']) === true) {
1864     return true;
1865     }
1866     return false;
1867     }
1868    
1869     public function starts_with($haystack, $needle) {
1870     $length = strlen($needle);
1871     return (substr($haystack, 0, $length) === $needle);
1872     }
1873    
1874     public function ends_with($haystack, $needle) {
1875     $length = strlen($needle);
1876     if ($length == 0) {
1877     return true;
1878     }
1879     return (substr($haystack, -$length) === $needle);
1880     }
1881    
1882     /**
1883     * Récupère le type définit dans la base de données des champs d'une table
1884     * entière ou d'un champs si celui-ci est précisé.
1885     *
1886     * Liste des types BDD :
1887     * - int4
1888     * - varchar
1889     * - bool
1890     * - numeric
1891     * - text
1892     *
1893     * @param string $table Nom de la table.
1894     * @param string $column Nom de la colonne (facultatif).
1895     *
1896     * @return array
1897     */
1898     public function get_type_from_db($table, $column = null) {
1899     // Composition de la requête
1900     $sql_select = ' SELECT column_name, udt_name ';
1901     $sql_from = ' FROM information_schema.columns ';
1902     $sql_where = ' WHERE table_schema = \''.str_replace('.', '', DB_PREFIXE).'\' AND table_name = \''.$table.'\' ';
1903     $sql_order = ' ORDER BY ordinal_position ';
1904    
1905     // Si une colonne est précisé
1906     if ($column !== null || $column !== '') {
1907     //
1908     $sql_where .= ' AND column_name = \''.$column.'\' ';
1909     }
1910    
1911     // Requête SQL
1912     $sql = $sql_select.$sql_from.$sql_where.$sql_order;
1913     // Exécution de la requête
1914     $res = $this->db->query($sql);
1915     // Log
1916     $this->addToLog(__METHOD__."() : db->query(\"".$sql."\");", VERBOSE_MODE);
1917     // Erreur BDD
1918     $this->isDatabaseError($res);
1919     //
1920     $list_type = array();
1921     while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
1922     $list_type[$row['column_name']] = $row['udt_name'];
1923     }
1924    
1925     // Retourne la liste des codes
1926     return $list_type;
1927     }
1928    
1929 softime 7366
1930     /**
1931     * Cette méthode permet de récupérer le code de division correspondant
1932     * au dossier sur lequel on se trouve.
1933     *
1934     * Méthode identique à la méthode getDivisionFromDossier() de la classe
1935     * om_dbform à l'exception d'un cas de récupération du numéro de dossier par
1936     * la méthode getVal(). Cette exception permet d'utiliser cette méthode dans
1937     * les scripts instanciant seulement la classe utils tel que les *.inc.php.
1938     *
1939     * @param string $dossier Identifiant du dossier d'instruction.
1940     *
1941     * @return string Code de la division du dossier en cours
1942     */
1943     public function get_division_from_dossier_without_inst($dossier = null) {
1944    
1945     // Cette méthode peut être appelée plusieurs fois lors d'une requête.
1946     // Pour éviter de refaire le traitement de recherche de la division
1947     // alors on vérifie si nous ne l'avons pas déjà calculé.
1948     if (isset($this->_division_from_dossier) === true
1949     && $this->_division_from_dossier !== null) {
1950     // Log
1951     $this->addToLog(__METHOD__."() : retour de la valeur déjà calculée - '".$this->_division_from_dossier."'", EXTRA_VERBOSE_MODE);
1952     // On retourne la valeur déjà calculée
1953     return $this->_division_from_dossier;
1954     }
1955    
1956     // Récupère le paramétre retourformulaire présent dans l'URL
1957     $retourformulaire = $this->getParameter("retourformulaire");
1958     // Récupère le paramétre idxformulaire présent dans l'URL
1959     $idxformulaire = $this->getParameter("idxformulaire");
1960    
1961     // Si le dossier n'est pas passé en paramètre de la méthode
1962     if ($dossier === null) {
1963    
1964     // La méthode de récupération du dossier diffère selon le contexte
1965     // du formulaire
1966     if ($retourformulaire === "dossier"
1967     || $retourformulaire === "dossier_instruction"
1968     || $retourformulaire === "dossier_instruction_mes_encours"
1969     || $retourformulaire === "dossier_instruction_tous_encours"
1970     || $retourformulaire === "dossier_instruction_mes_clotures"
1971     || $retourformulaire === "dossier_instruction_tous_clotures"
1972     || $retourformulaire === "dossier_contentieux_mes_infractions"
1973     || $retourformulaire === "dossier_contentieux_toutes_infractions"
1974     || $retourformulaire === "dossier_contentieux_mes_recours"
1975     || $retourformulaire === "dossier_contentieux_tous_recours") {
1976    
1977     // Récupère le numéro du dossier depuis le paramètre
1978     // idxformulaire présent dans l'URL
1979     $dossier = $idxformulaire;
1980     }
1981     //
1982     if ($retourformulaire === "lot") {
1983    
1984     // Requête SQL
1985     $sql = sprintf("SELECT dossier FROM ".DB_PREFIXE."lot WHERE lot = %s", $idxformulaire);
1986     // Récupère l'identifiant du dossier
1987     $dossier = $this->db->getone($sql);
1988     // Log
1989     $this->addToLog(__METHOD__."() : db->query(\"".$dossier."\");", VERBOSE_MODE);
1990     // Erreur BDD
1991     $this->isDatabaseError($dossier);
1992     }
1993     }
1994    
1995     // À cette étape si le dossier n'est toujours pas récupéré alors la
1996     // division ne pourra pas être récupérée
1997     if ($dossier === null) {
1998     //
1999     return null;
2000     }
2001    
2002     // Requête SQL
2003     $sql = sprintf("SELECT division FROM ".DB_PREFIXE."dossier WHERE dossier = '%s'", $dossier);
2004     // Récupère l'identifiant de la division du dossier
2005     $this->_division_from_dossier = $this->db->getOne($sql);
2006     // Log
2007     $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\")", VERBOSE_MODE);
2008     // Erreur BDD
2009     $this->isDatabaseError($this->_division_from_dossier);
2010    
2011     //
2012     return $this->_division_from_dossier;
2013    
2014     }
2015    
2016    
2017 mbroquet 3730 }
2018    
2019     ?>

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26