/[openfoncier]/branches/3.14.0-b13/obj/utils.class.php
ViewVC logotype

Diff of /branches/3.14.0-b13/obj/utils.class.php

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 531 by nhaye, Mon Oct 22 16:21:15 2012 UTC revision 3241 by nhaye, Mon Jan 12 15:48:15 2015 UTC
# Line 38  require_once PATH_OPENMAIRIE."om_applica Line 38  require_once PATH_OPENMAIRIE."om_applica
38  class utils extends application {  class utils extends application {
39    
40      /**      /**
41       * Constructeur       * Cette methode permet d'affecter des parametres dans un attribut de
42         * l'objet.
43       *       *
44       * @param       * @return void
      * @param  
      * @param  
      * @param  
      * @param  
45       */       */
46      function __construct($flag = NULL, $right = NULL, $title = NULL, $icon = NULL, $help = NULL) {      function setMoreParams() {
47            parent::setMoreParams();
48            $this->set_submitted_value();
49        }
50    
51          //      function set_submitted_value() {
52          $this->timestart = microtime(true);          if(isset($_GET) and !empty($_GET)) {
53                foreach ($_GET as $key => $value) {
54                    $this->submitted_get_value[$key]=$this->clean_break($value);
55                }
56            }
57            if(isset($_POST) and !empty($_POST)) {
58                foreach ($_POST as $key => $value) {
59                    $this->submitted_post_value[$key]=$this->clean_break($value);
60                }
61            }
62        }
63    
64          // Logger      // {{{
65          $this->addToLog("__construct() : 0.000 sec", VERBOSE_MODE);      
66        /**
67         *
68         */
69        function isAccredited($obj = NULL, $operator = "AND") {
70            // Lorsque l'utilisateur a le login 'admin' alors il est authorisé à
71            // accéder à toutes les fonctions du logiciel
72            // XXX à modifier pour changer ça vers un profil et non un login utilisateur
73            if ($_SESSION["login"] == "admin") {
74                return true;
75            }
76            // Fonctionnement standard
77            return parent::isAccredited($obj, $operator);
78        }
79        
80        // }}}
81    
82          // Logger      // {{{
         $this->addToLog("__construct()", EXTRA_VERBOSE_MODE);  
83    
84          // Instanciation de la classe message      var $om_utilisateur = array();
85          $this->m = new message();      var $user_is_instr = NULL;
86        var $user_is_service = NULL;
87        var $user_is_admin = NULL;
88        var $user_is_service_ext = NULL;
89        var $user_is_qualificateur = NULL;
90        var $user_is_chef = NULL;
91        var $user_is_divisionnaire = NULL;
92        var $user_is_service_int = NULL;
93    
94          //      /**
95          $this->setParamsFromFiles();       * Méthode de récupération des informations de l'utilisateur connecté.
96          $this->checkParams();       */
97        function getUserInfos() {
98            
99            // Si l'utilisateur est loggé $_SESSION existe
100            if(isset($_SESSION['login']) AND !empty($_SESSION['login'])) {
101                
102                // Récupération des infos utilisateur
103                $sqlUser = "SELECT om_utilisateur, nom, email, login, om_collectivite, om_profil ".
104                "FROM ".DB_PREFIXE."om_utilisateur WHERE login = '".$_SESSION['login']."'";
105                $resUser=$this->db->query($sqlUser);
106                $this->addToLog("getUserInfos(): db->query(\"".$sqlUser."\");", VERBOSE_MODE);
107                if ( database::isError($resUser)){
108                    die();
109                }
110                $this->om_utilisateur=&$resUser->fetchRow(DB_FETCHMODE_ASSOC);
111    
112          //              // Récupère le profil et test si c'est un
113          $this->setDefaultValues();              $sqlProfil = "SELECT libelle FROM ".DB_PREFIXE."om_profil WHERE om_profil = ".$this->om_utilisateur['om_profil'];
114                $resProfil=$this->db->getOne($sqlProfil);
115                $this->addToLog("getUserInfos(): db->getOne(\"".$sqlProfil."\");", VERBOSE_MODE);
116                if (database::isError($resProfil)){
117                    die();
118                }
119                // Sauvegarde le libelle du profil
120                $this->om_utilisateur["libelle_profil"] = $resProfil;
121    
122          // Transformation des cinq éléments paramètres en attribut de l'objet              // si c'est un administrateur technique
123          $this->setFlag($flag);              // XXX Mauvaise méthode, il faut utiliser isAccredited
124          $this->setTitle($title);              if ($resProfil == "ADMINISTRATEUR TECHNIQUE"
125          $this->setRight($right);                  || $resProfil == "ADMINISTRATEUR FONCTIONNEL") {
126          $this->setHelp($help);                  $this->user_is_admin = true;
127          $this->setIcon($icon);              } else {
128                    $this->user_is_admin = false;
129                }
130    
131          // Vérification de l'authentification de l'utilisateur et stockage du              //si c'est un service externe
132          // résultat en attribut de l'objet              if ($resProfil == "SERVICE CONSULTÉ") {
133          $this->authenticated = $this->isAuthenticated();                  $this->user_is_service_ext = true;
134                } else {
135                    $this->user_is_service_ext = false;
136                }
137    
138          // Déconnexion de l'utilisateur              //si c'est un service interne
139          if ($this->flag == "logout") {              if ($resProfil == "SERVICE CONSULTÉ INTERNE") {
140              $this->logout();                  $this->user_is_service_int = true;
141          }              } else {
142                    $this->user_is_service_int = false;
143                }
144    
145          // Connexion de l'utilisateur              // si c'est un qualificateur
146          if ($this->flag == "login") {              if ($resProfil == "QUALIFICATEUR") {
147              $this->login();                  $this->user_is_qualificateur = true;
148          }              } else {
149                    $this->user_is_qualificateur = false;
150                }
151    
152          // Demande de redéfinition du mot de passe              // si c'est un chef de service
153          if ($this->flag == "password_reset") {              if ($resProfil == "CHEF DE SERVICE") {
154              if ($this->authenticated) {                  $this->user_is_chef = true;
155                  $this->redirectAuthenticatedUsers();              } else {
156                    $this->user_is_chef = false;
157              }              }
         }  
158    
159          //              // si c'est un divisionnaire
160          if ($this->authenticated) {              if ($resProfil == "DIVISIONNAIRE") {
161              // Connexion à la base de données si l'utilisateur est authentifié                  $this->user_is_divisionnaire = true;
162              $this->connectDatabase();              } else {
163              // on verifie que l'utilisateur connecté est toujours valide                  $this->user_is_divisionnaire = false;
164              if (!defined('REST_REQUEST')) {              }
165                  $this->checkIfUserIsAlwaysValid();              
166                // Récupération des infos instructeur
167                $sqlInstr = "SELECT instructeur.instructeur, instructeur.nom, instructeur.telephone,
168                division.division, division.code, division.libelle ".
169                "FROM ".DB_PREFIXE."instructeur INNER JOIN ".DB_PREFIXE."division ON division.division=instructeur.division ".
170                "WHERE instructeur.om_utilisateur = ".$this->om_utilisateur['om_utilisateur'];
171                $resInstr=$this->db->query($sqlInstr);
172                $this->addToLog("getUserInfos(): db->query(\"".$sqlInstr."\");", VERBOSE_MODE);
173                if ( database::isError($resInstr)){
174                    die();
175                }
176                $tempInstr=&$resInstr->fetchRow(DB_FETCHMODE_ASSOC);
177                // Si il y a un resultat c'est un instructeur
178                if(count($tempInstr)>0) {
179                    $this->user_is_instr=true;
180                    $this->om_utilisateur = array_merge($this->om_utilisateur,$tempInstr);
181                } else {
182                    $this->user_is_instr=false;
183                }
184                
185                // Récupération des infos de services consultés
186                $sqlServ = "SELECT service.service, service.abrege, service.libelle ".
187                "FROM ".DB_PREFIXE."service ".
188                "INNER JOIN ".DB_PREFIXE."lien_service_om_utilisateur ON lien_service_om_utilisateur.service=service.service ".
189                "WHERE lien_service_om_utilisateur.om_utilisateur = ".$this->om_utilisateur['om_utilisateur'];
190                $resServ=$this->db->query($sqlServ);
191                $this->addToLog("getUserInfos(): db->query(\"".$sqlServ."\");", VERBOSE_MODE);
192                if ( database::isError($resServ)){
193                    die();
194                }
195                
196                while ($tempServ=&$resServ->fetchRow(DB_FETCHMODE_ASSOC)) {
197                    $this->om_utilisateur['service'][]=$tempServ;
198                }
199                // Si il y a un resultat c'est un utilisateur de service
200                if(isset($this->om_utilisateur['service'])) {
201                    $this->user_is_service=true;
202                } else {
203                    $this->user_is_service=false;
204              }              }
205          }          }
206        }
207    
208        /**
209         * getter user_is_service
210         */
211        function isUserService() {
212          //          //
213          if (!in_array($this->flag, $this->special_flags)) {          if (is_null($this->user_is_service)) {
   
214              //              //
215              $this->getAllRights();              $this->getUserInfos();
   
             //  
             $this->getCollectivite();  
   
             //  
             $this->isAuthorized();  
   
216          }          }
   
217          //          //
218          $this->setMoreParams();          return $this->user_is_service;
   
         // Affichage HTML  
         $this->display();  
   
219      }      }
       
       
       
         /**  
      * Desctructeur de la classe, cette methode (appelee automatiquement)  
      * permet d'afficher le footer de la page, le footer HTML, et de  
      * deconnecter la base de donnees  
      *  
      * @return void  
      */  
     function __destruct() {  
220    
221          // Footer      /**
222          if (!defined('REST_REQUEST')) {       * getter user_is_instr
223              $this->displayFooter();       */
224        function isUserInstructeur() {
225            //
226            if (is_null($this->user_is_instr)) {
227                //
228                $this->getUserInfos();
229          }          }
230            //
231            return $this->user_is_instr;
232        }
233    
234          // Deconnexion SGBD      function isUserAdministrateur() {
235          $this->disconnectDatabase();          //
236            if (is_null($this->user_is_admin)) {
237          // Logger              //
238          $this->addToLog("__destruct()", EXTRA_VERBOSE_MODE);              $this->getUserInfos();
   
         // Logger  
         $this->addToLog("__destruct() : ".$this->elapsedtime()." sec", VERBOSE_MODE);  
   
         // Affichage des logs  
         logger::instance()->displayLog();  
   
         // Footer HTML  
         if (!defined('REST_REQUEST')) {  
             $this->displayHTMLFooter();  
239          }          }
240            //
241            return $this->user_is_admin;
242      }      }
243    
   
   
244      /**      /**
245       * Cette methode permet de charger les differents fichiers de configs dans       * getter user_is_service_ext
      * des attributs de la classe  
      *  
      * @return void  
246       */       */
247      function setParamsFromFiles() {      function isUserServiceExt() {
   
248          //          //
249          if (file_exists("../dyn/config.inc.php")) {          if (is_null($this->user_is_service_ext)) {
250              include_once("../dyn/config.inc.php");              //
251          }              $this->getUserInfos();
         if (isset($config)) {  
             $this->config = $config;  
252          }          }
   
253          //          //
254          if (file_exists("../dyn/database.inc.php")) {          return $this->user_is_service_ext;
255              include("../dyn/database.inc.php");      }
         }  
256    
257          if (isset($conn)) {      /**
258              $this->conn = $conn;       * getter user_is_service_int
259         */
260        function isUserServiceInt() {
261            //
262            if (is_null($this->user_is_service_int)) {
263              //              //
264              foreach($this->conn as $key => $conn) {              $this->getUserInfos();
                 $this->database[$key] = array(  
                     'title' => $conn[0],  
                     'phptype' => $conn[1],  
                     'dbsyntax' => $conn[2],  
                     'username' => $conn[3],  
                     'password' => $conn[4],  
                     'protocol' => $conn[5],  
                     'hostspec' => $conn[6],  
                     'port' => $conn[7],  
                     'socket' => $conn[8],  
                     'database' => $conn[9],  
                     'formatdate' => $conn[10],  
                     'schema' => $conn[11],  
                     'prefixe' => (isset($conn[12]) ? $conn[12]: ""),  
                     'directory' => (isset($conn[13]) ? $conn[13]: ""),  
                     'mail' => (isset($conn[14]) ? $conn[14]: ""),  
                 );  
             }  
265          }          }
   
266          //          //
267          if (file_exists("../dyn/directory.inc.php")) {          return $this->user_is_service_int;
268              include_once("../dyn/directory.inc.php");      }
         }  
         if (isset($directory)) {  
             $this->directory = $directory;  
         }  
269    
270        /**
271         * getter user_is_qualificateur
272         */
273        function isUserQualificateur() {
274          //          //
275          if (file_exists("../dyn/mail.inc.php")) {          if (is_null($this->user_is_qualificateur)) {
276              include_once("../dyn/mail.inc.php");              //
277          }              $this->getUserInfos();
         if (isset($mail)) {  
             $this->mail = $mail;  
278          }          }
   
279          //          //
280          if (file_exists("../dyn/menu.inc.php")) {          return $this->user_is_qualificateur;
281              include_once("../dyn/menu.inc.php");      }
         }  
         if (isset($menu)) {  
             $this->menu = $menu;  
         }  
282    
283        /**
284         * getter user_is_chef
285         */
286        function isUserChef() {
287          //          //
288          if (file_exists("../dyn/actions.inc.php")) {          if (is_null($this->user_is_chef)) {
289              include_once("../dyn/actions.inc.php");              //
290          }              $this->getUserInfos();
         if (isset($actions)) {  
             $this->actions = $actions;  
291          }          }
   
292          //          //
293          if (file_exists("../dyn/shortlinks.inc.php")) {          return $this->user_is_chef;
294              include_once("../dyn/shortlinks.inc.php");      }
         }  
         if (isset($shortlinks)) {  
             $this->shortlinks = $shortlinks;  
         }  
295    
296        /**
297         * getter user_is_divisionnaire
298         */
299        function isUserDivisionnaire() {
300          //          //
301          if (file_exists("../dyn/footer.inc.php")) {          if (is_null($this->user_is_divisionnaire)) {
302              include_once("../dyn/footer.inc.php");              //
303          }              $this->getUserInfos();
         if (isset($footer)) {  
             $this->footer = $footer;  
304          }          }
305            //
306            return $this->user_is_divisionnaire;
307        }
308    
309        // Ajout de variables de session contenant la division pour permettre une
310        // utilisation plus efficace dans les requetes
311        function triggerAfterLogin($utilisateur = NULL) {
312            //
313            $sql = "SELECT instructeur.division, division.code
314            FROM ".DB_PREFIXE."instructeur
315            LEFT JOIN ".DB_PREFIXE."division
316            ON instructeur.division = division.division
317            WHERE instructeur.om_utilisateur='".$utilisateur["om_utilisateur"]."'";
318            $res = $this->db->query($sql);
319            $this->addToLog("triggerAfterLogin(): db->query(\"".$sql."\");", VERBOSE_MODE);
320            if ( database::isError($res)){
321                die();
322            }
323            $row = $res->fetchrow(DB_FETCHMODE_ASSOC);
324          //          //
325          if (file_exists("../dyn/version.inc.php")) {          if (isset($row["division"]) && $row["division"] != NULL) {
326              include_once("../dyn/version.inc.php");              $_SESSION["division"] = $row["division"];
327                $_SESSION["division_code"] = $row["code"];
328            } else {
329                $_SESSION["division"] = "0";
330                $_SESSION["division_code"] = "";
331          }          }
332          if (isset($version)) {  
333              $this->version = $version;      }    
334    
335        // Affichage des actions supplémentaires
336        function displayActionExtras() {
337            // Affichage de la division si l'utilisateur en possède une
338            if ($_SESSION["division"] != 0) {
339                echo "\t\t\t<li class=\"action-division\">";
340                echo "(".$_SESSION['division_code'].")";
341                echo "</li>\n";
342          }          }
343        }
344    
345        // }}}
346    
347        
348        function getDivisionFromDossier($dossier) {
349            //
350            $sql = "select division from ".DB_PREFIXE."dossier ";
351            $sql .= " where dossier='".$dossier."'";
352            //
353            $division = $this->db->getOne($sql);
354            $this->addToLog("getDivisionFromDossier(): db->getone(\"".$sql."\")", VERBOSE_MODE);
355            database::isError($division);
356            //
357            return $division;
358      }      }
359    
360        // {{{ GESTION DES FICHIERS
361            
362      /**      /**
      * Cette méthode permet de vérifier si l'utilisateur est autorisé ou non à  
      * accéder à un élément et permet d'agir en conséquence  
363       *       *
      * @param  
      * @return mixed  
364       */       */
365      function isAuthorized($obj = NULL, $operator = "AND") {      function notExistsError ($explanation = NULL) {
366            // message
367            $message_class = "error";
368            $message = _("Cette page n'existe pas.");
369            $this->addToMessage ($message_class, $message);
370          //          //
371          if ($obj == NULL) {          $this->setFlag(NULL);
372              $obj = $this->right;          $this->display();
373          }          
374          //          //
375          if ($obj == NULL) {          die();
376              return true;      }
377        
378         // }}}
379        /**
380         * Retourne le statut du dossier d'instruction
381         * @param string $idx Identifiant du dossier d'instruction
382         * @return string Le statut du dossier d'instruction
383         */
384        function getStatutDossier($idx){
385            
386            $statut = '';
387            
388            //Si l'identifiant du dossier d'instruction fourni est correct
389            if ( $idx != '' ){
390                
391                //On récupère le statut de l'état du dossier à partir de l'identifiant du
392                //dossier d'instruction
393                $sql = "SELECT etat.statut
394                    FROM ".DB_PREFIXE."dossier
395                    LEFT JOIN
396                        ".DB_PREFIXE."etat
397                        ON
398                            dossier.etat = etat.etat
399                    WHERE dossier ='".$idx."'";
400                $statut = $this->db->getOne($sql);
401                $this->addToLog("getStatutDossier() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
402                if ( database::isError($statut)){
403                    die();
404                }
405          }          }
406            return $statut;
407        }
408    
409          // L'utilisateur n'est pas autorisé à accéder à l'élément      /**
410          if (!$this->isAccredited($obj, $operator)) {       * Formate le champ pour le type Timestamp
411         * @param  date  $date_str          Date
412         * @param  boolean $show            Format pour l'affichage
413         * @return mixed                    False si le traitement échoue ou la date formatée
414         */
415        function formatTimestamp ($date_str, $show = true) {
416    
417              //          // Sépare la date et l'heure
418              $message_class = "error";          $date = explode(" ", $date_str);
419              $message = _("Droits insuffisants. Vous n'avez pas suffisament de ".          if (count($date) != 2) {
420                           "droits pour acceder a cette page.");              return false;
421              $this->addToMessage($message_class, $message);          }
422    
423              //          // Date en BDD
424              $this->setFlag(NULL);          $date_db = explode ('-', $date[0]);
425              if (!defined('REST_REQUEST')) {                  // Date en affichage
426                  $this->display();          $date_show = explode ('/', $date[0]);
             }  
427    
428              // Arrêt du script          // Contrôle la composition de la date
429              die();          if (count ($date_db) != 3 and count ($date_show) != 3) {
430                return false;
431            }
432    
433            if (count ($date_db) == 3) {
434                // Vérifie que c'est une date valide
435                if (!checkdate($date_db[1], $date_db[2], $date_db[0])) {
436                    return false;
437                }
438                // Si c'est pour l'affichage de la date
439                if ($show == true) {
440                    return $date_db [2]."/".$date_db [1]."/".$date_db [0]." ".$date[1];
441                } else {
442                    return $date[0];
443                }
444          }          }
445    
446          // L'utilisateur est autorisé à accéder à l'élément          //
447          return true;          if (count ($date_show) == 3) {
448                // Vérifie que c'est une date valide
449                if (!checkdate($date_show[1], $date_show[0], $date_show[2])) {
450                    return false;
451                }
452                // Si c'est pour l'affichage de la date
453                if ($show == true) {
454                    return $date[0];
455                } else {
456                    return $date_show [2]."-".$date_show [1]."-".$date_show [0]." ".$date[1];
457                }
458    
459            }
460            return false;
461    
462      }      }
463    
464        /**
465         * Permet de calculer la liste des parcelles à partir de la chaîne passée en paramètre
466         * et la retourner sous forme d'un tableau associatif
467         *
468         * @param  string $strParcelles chaîne de la parcelles
469         * @return array (array(quartier, section, parcelle), ...)
470         */
471        function parseParcelles($strParcelles) {
472            
473            // Séparation des lignes
474            $references = explode(";", $strParcelles);
475            $liste_parcelles = array();
476            
477            // On boucle sur chaque ligne pour ajouter la liste des parcelles de chaque ligne
478            foreach ($references as $parcelles) {
479                
480                // On transforme la chaîne de la ligne de parcelles en tableau
481                $ref = str_split($parcelles);
482                // Les 1er caractères sont numériques
483                $num = true;
484                
485                // Tableau des champs de la ligne de références cadastrales
486                $reference_tab = array();
487                $temp = "";
488                foreach ($ref as $carac) {
489                    
490                    // Permet de tester si le caractère courant est de même type que le précédent
491                    if(is_numeric($carac) === $num) {
492                        $temp .= $carac;
493                    } else {
494                        // Bascule
495                        $num = !$num;
496                        // On stock le champ
497                        $reference_tab[] = $temp;
498                        // re-init de la valeur temporaire pour le champ suivant
499                        $temp = $carac;
500                    }
501                }
502                // Stockage du dernier champ sur lequel il n'y a pas eu de bascule
503                $reference_tab[] = $temp;
504                // Calcul des parcelles
505                $quartier = $reference_tab[0];
506                $sect = $reference_tab[1];
507    
508                $ancien_ref_parc = "";
509                for ($i=2; $i < count($reference_tab); $i+=2) {
510                    $parc["quartier"] = $quartier;
511                    // Met en majuscule si besoin
512                    $parc["section"] = strtoupper($sect);
513                    if( $ancien_ref_parc == "" OR $reference_tab[$i-1] == "/") {
514                        // 1ere parcelle ou parcelle individuelle
515                        // Compléte par des "0" le début de la chaîne si besoin
516                        $parc["parcelle"] = str_pad($reference_tab[$i], 4, "0", STR_PAD_LEFT);
517                        // Ajout d'une parcelle à la liste
518                        $liste_parcelles[] = $parc;
519                    } elseif ($reference_tab[$i-1] == "A") {
520                        // Interval de parcelles
521                        for ($j=$ancien_ref_parc+1; $j <= $reference_tab[$i]; $j++) {
522                            // Compléte par des "0" le début de la chaîne si besoin
523                            $parc["parcelle"] = str_pad($j, 4, "0", STR_PAD_LEFT);
524                            // Ajout d'une parcelle à la liste
525                            $liste_parcelles[] = $parc;
526                        }
527                    }
528                    //Gestion des erreurs
529                    else{
530                        
531                        echo _("Une erreur de formattage a ete detecte dans la reference cadastrale du dossier ").$this->row['dossier'];
532                    }
533                    // Sauvegarde de la référence courante de parcelle
534                    $ancien_ref_parc = $reference_tab[$i];
535                }
536            }
537    
538            return $liste_parcelles;
539        }
540    
541      /**      /**
542       *       * Formate les parcelles en ajoutant le code impôt
543         * @param  array    $liste_parcelles   Tableau des parcelles
544         * @return string                      Liste des parcelles formatées
545       */       */
546      function setDatabaseConfig() {      function formatParcelleToSend($liste_parcelles) {
547    
548          // On recupere la liste des cles du tableau associatif de configuration          //
549          // de la connexion aux bases de donnees          $wParcelle = array();
         $database_keys = array_keys($this->database);  
         // Si il y a plusieurs cles  
         if (count($database_keys) != 0) {  
             // On configure la premiere par defaut  
             $coll = $database_keys[0];  
         } else { // Si il n'y a aucune cle  
             // Aucune base n'est configuree dans le fichier de configuration  
             // donc on affiche un message d'erreur  
             $class = "error";  
             $message = _("Erreur de configuration. Contactez votre administrateur.");  
             $this->addToMessage($class, $message);  
             // Debug  
             $this->addToLog("setDatabaseConfig(): ERR", DEBUG_MODE);  
             $this->addToLog("ERR: "._("Aucune entree dans le fichier de configuration"), DEBUG_MODE);  
             // On affiche la structure de la page  
             $this->setFlag(NULL);  
             $this->display();  
             // On arrete le traitement en cours  
             die();  
         }  
550    
551          // Si la variable coll (representant la cle de la base sur laquelle          //Formatage des références cadastrales pour l'envoi
552          // nous travaillons) n'est pas en variable SESSION ou est en variable          foreach ($liste_parcelles as $value) {
553          // SESSION mais n'existe pas dans les cles du tableau associatif de                  
554          // configuration de la connexion aux bases de donnees              // On ajoute les données dans le tableau que si quartier + section + parcelle
555          if (!isset($_SESSION['coll']) or              // a été fourni
556              (isset($_SESSION['coll']) and              if ($value["quartier"] !== ""
557               !isset($this->database[$_SESSION['coll']]))) {                  && $value["section"] !== ""
558              // On configure la premiere par defaut                  && $value["parcelle"] !== ""){
559              $_SESSION['coll'] = $coll;                  
560          } else {                  //On récupère le code impôt de l'arrondissement
561              // On recupere la cle du tableau associatif de configuration de la                  $arrondissement = $this->getCodeImpotByQuartier($value["quartier"]);
562              // connexion aux bases de donnees correspondante a la base de                  
563              // donnees sur laquelle nous travaillons                  //On ajoute la parcelle, si un arrondissement a été trouvé
564              $coll = $_SESSION['coll'];                  if ($arrondissement!=="") {
565                        //
566                        $wParcelle[] = $arrondissement.$value["quartier"].
567                            str_pad($value["section"], 2, " ", STR_PAD_LEFT).
568                            $value["parcelle"];
569                    }
570                }
571          }          }
572    
573          // On renvoi le tableau de parametres pour la connexion a la base          //
574          $this->database_config = $this->database[$coll];          return $wParcelle;
575      }      }
576    
577            /**
578          /**       * Récupère le code impôt par rapport au quartier
579       * Cette méthode permet de se connecter à la base de données       * @param  string $quartier Numéro de quartier
580       * @return void       * @return string           Code impôt
581       */       */
582      function connectDatabase() {      function getCodeImpotByQuartier($quartier) {
         // On inclus la classe d'abstraction de base de donnees  
         require_once PATH_OPENMAIRIE."om_database.class.php";  
         // On recupere le tableau de parametres pour la connexion a la base  
         $this->setDatabaseConfig();  
         // On fixe les options  
         $options = array(  
             'debug' => 2,  
             'portability' => DB_PORTABILITY_ALL,  
         );  
         // Instanciation de l'objet connexion a la base de donnees  
         $db = database::connect($this->database_config, $options);  
         // Logger  
         $this->addToLog("connectDatabase(): "._("Tentative de connexion au SGBD"), EXTRA_VERBOSE_MODE);  
         // Traitement particulier de l'erreur en cas d'erreur de connexion a la  
         // base de donnees  
         if (database::isError($db, true)) {  
             // Deconnexion de l'utilisateur  
             $this->logout();  
             // On affiche la page de login a l'ecran  
             $this->setFlag("login");  
             // On affiche un message d'erreur convivial pour l'utilisateur  
             $class = "error";  
             $message = _("Erreur de base de donnees. Contactez votre administrateur.");  
             $this->addToMessage($class, $message);  
             // On affiche la page  
             if (!defined('REST_REQUEST')) {  
                 $this->display();  
             }  
             // On arrete le script  
             die();  
         } else {  
             // On affecte la resource a l'attribut de la classe du meme nom  
             $this->db = $db;  
             // Logger  
             $this->addToLog("connectDatabase(): Connexion [".$this->database_config["phptype"]."] '".$this->database_config['database']."' OK", EXTRA_VERBOSE_MODE);  
   
             // Compatibilite anterieure (deprecated)  
             $this->phptype = $this->database_config["phptype"];  
             $this->formatdate = $this->database_config["formatdate"];  
             $this->schema = $this->database_config["schema"];  
583    
584              // Definition des constantes pour l'acces aux informations de la base          $arrondissement = "";
585              // donnees facilement.  
586              $temp = "";          // Si le quartier fournis est correct
587              if ($this->database_config["schema"] != "") {          if ($quartier != "") {
588                  $temp = $this->database_config["schema"].".";  
589              }              // Requête SQL
590              $temp = $temp.$this->database_config["prefixe"];              $sql = "SELECT
591              define("DB_PREFIXE", $temp);                          arrondissement.code_impots
592              define("FORMATDATE", $this->database_config["formatdate"]);                      FROM
593                            ".DB_PREFIXE."arrondissement
594              // Definition des constantes pour l'acces aux informations de la base                      LEFT JOIN
595              // donnees facilement.                          ".DB_PREFIXE."quartier
596              define("OM_DB_FORMATDATE", $this->database_config["formatdate"]);                          ON
597              define("OM_DB_PHPTYPE", $this->database_config["phptype"]);                              quartier.arrondissement = arrondissement.arrondissement
598              define("OM_DB_DATABASE", $this->database_config["database"]);                      WHERE
599              define("OM_DB_SCHEMA", $this->database_config["schema"]);                          quartier.code_impots = '".$quartier."'";
600              define("OM_DB_TABLE_PREFIX", $this->database_config["prefixe"]);              $this->addToLog("getCodeImpotByQuartier() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
601                $arrondissement = $this->db->getOne($sql);
602                $this->isDatabaseError($arrondissement);
603          }          }
604    
605            // Retour
606            return $arrondissement;
607      }      }
608    
609        /**
610         * Vérification des paramètres
611         */
612        function checkParams() {
613            parent::checkParams();
614    
615            (isset($this->config['path_scan']) ? "" : $this->config['path_scan'] = '../trs/numerisation/');
616            
617            $default_sig_elyx = array(
618                'wsdl' => '../tests/wsurbanisme.wsdl',
619                'login' => 'sig',
620                'password' => 'sig',
621            );
622            (isset($this->config['sig_elyx']) ? "" : $this->config['sig_elyx'] = $default_sig_elyx);
623        }
624    
625      /**      /**
626       *       * Retourne true si tous les paramètres du SIG externe ont bien été définis
627       *       * @return bool true/false
628       */       */
629      function isDatabaseError($dbobj = NULL, $return = false) {      public function issetSIGParameter() {
630            if($this->getParameter("sig_web_server") != NULL AND
631                $this->getParameter("sig_web_server") != "" AND
632                $this->getParameter("sig_couche_emprise_dossier") != NULL AND
633                $this->getParameter("sig_couche_emprise_dossier") != "" AND
634                $this->getParameter("sig_couche_affichage_dossier") != NULL AND
635                $this->getParameter("sig_couche_affichage_dossier") != "" AND
636                $this->getParameter("sig_couche_affichage_parcelle") != NULL AND
637                $this->getParameter("sig_couche_affichage_parcelle") != "") {
638                return true;
639            } else {
640                return false;
641            }
642        }
643    
644          //      /**
645          if (database::isError($dbobj, $return)) {       * Permet de vérifier que des champs existe dans une table
646         * @param  array  $list_fields Liste des champs à tester
647         * @param  string $table       Table où les champs doivent exister
648         * @return mixed               Retourne les champs qui n'existent pas
649         *                             ou true
650         */
651        public function check_field_exist($list_fields, $table) {
652    
653              if ($return == true) {          // Instance de la classe en paramètre
654            require_once "../obj/".$table.".class.php";
655            $object = new $table("]", $this->db, DEBUG);
656    
657                  //          // Récupère les champs de la table
658                  return true;          foreach ($object->champs as $champ) {
659                $list_column[] = $champ;
660            }
661    
662              }          // Tableau des champs en erreur
663            $error_fields = array();
664    
665              //          // Pour chaque champ à tester
666              $class = "error";          foreach ($list_fields as $value) {
667              $message = _("Erreur de base de donnees. Contactez votre administrateur.");              
668              $this->addToMessage($class, $message);              // S'il n'apparaît pas dans la liste des champs possible
669                if (!in_array($value, $list_column)) {
             // Logger  
             $this->addToLog("isDatabaseError(): ".$dbobj->getDebugInfo(), DEBUG_MODE);  
             $this->addToLog("isDatabaseError(): ".$dbobj->getMessage(), DEBUG_MODE);  
670    
671              //                  // Alors le champ est ajouté au tableau des erreurs
672              $this->setFlag(NULL);                  $error_fields[] = $value;
             if (!defined('REST_REQUEST')) {  
                 $this->display();  
                 //  
                 die();  
673              }              }
674            }
675    
676            // Si le tableau des erreurs n'est pas vide on le retourne
677            if (count($error_fields) > 0) {
678                return $error_fields;
679          }          }
680    
681          //          // Sinon on retourne le booléen true
682          return false;          return true;
683    
684      }      }
       
685    
686                /*
687         *
688         */
689      /**      /**
690       *       * Récupère la lettre type lié à un événement
691       * @return void       * @param  integer  $evenement L'identifiant de l'événement
692         * @return integer             Retourne l'idenfiant de la lettre-type                             ou true
693       */       */
694      function displayMessage($class = "", $message = "") {      function getLettreType($evenement){
695          if (!defined('REST_REQUEST')) {          
696              $this->m->displayMessage($class, $message);           $lettretype = NULL;
697            
698             $sql =
699                "SELECT
700                    lettretype
701                FROM
702                    ".DB_PREFIXE."evenement
703                WHERE
704                    evenement = $evenement";
705                
706            $this->addToLog("getLettreType() : db->query(\"".$sql."\")", VERBOSE_MODE);
707            $res = $this->db->query($sql);
708            if ( database::isError($res)){
709                die();
710          }          }
711            
712            if ( $res->numrows() > 0 ){
713                    
714                $row=& $res->fetchRow(DB_FETCHMODE_ASSOC);
715                $lettretype = $row['lettretype'];
716            }
717          
718            return $lettretype;
719      }      }
   
720            
721      /**      /**
722       *       * Retourne le type de dossier d'autorisation du dossier courant :
723         * @param $idxDossier Le numéro du dossier d'instruction
724         * @return le code du type détaillée de dossier d'autorisation
725         **/
726        function getDATDCode($idxDossier) {
727            $sql = "SELECT dossier_autorisation_type_detaille.code
728                    FROM ".DB_PREFIXE."dossier_autorisation_type_detaille
729                    INNER JOIN ".DB_PREFIXE."dossier_autorisation
730                        ON dossier_autorisation_type_detaille.dossier_autorisation_type_detaille =
731                           dossier_autorisation.dossier_autorisation_type_detaille
732                    INNER JOIN ".DB_PREFIXE."dossier ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
733                    WHERE dossier.dossier = '".$idxDossier."'";
734            $res = $this->db->getOne($sql);
735            $this->addToLog("getDATDCode() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
736            if ( database::isError($res)){
737                die();
738            }
739            return $res;
740        }
741    
742        /**
743         * Permet de copier un enregistrement
744         * @param  mixed $idx   Identifiant de l'enregistrment
745         * @param  string $obj   Objet de l'enregistrment
746         * @param  string $objsf Objets associés
747         * @return array        Tableau des nouveaux id et du message
748       */       */
749      function addToLog($message, $type = DEBUG_MODE) {      function copier($idx, $obj, $objsf) {
750          //  
751          if (!defined('REST_REQUEST')) {          // Tableau de résultat
752              logger::instance()->log("class ".get_class($this)." - ".$message, $type);          $resArray = array();
753            // Message retourné à l'utilisateur
754            $message = "";
755            // Type du message (valid ou error)
756            $message_type = "valid";
757    
758            // Requête SQL permettant de récupérer les informations sur l'objet métier
759            $sql = "SELECT *
760                    FROM ".DB_PREFIXE.$obj."
761                    WHERE ".$obj." = ".$idx;
762            $res = $this->db->query($sql);
763            $this->isDatabaseError($res);
764    
765            // Valeurs clonées
766            $valF = array();
767            while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
768                // Recupère la valeur
769                $valF = $row;
770            }
771    
772            // Valeurs non clonées
773            // Identifiant modifié pour que ça soit un ajout
774            $valF[$obj] = "]";
775    
776            // Inclus la classe de l'objet métier
777            require_once "../obj/".$obj.".class.php";
778    
779            // Instance de l'objet métier
780            $clone_obj = new $obj("]", $this->db, DEBUG);
781            // Si dans l'objet métier la fonction "copier" existe
782            if (method_exists($clone_obj, "copier")) {
783                // Traitement sur les valeurs du duplicata
784                $valF = $clone_obj->copier($valF, $objsf, DEBUG);
785                // Recupère les messages retourné par la fonction
786                $message .= $valF['message'];
787                // Supprime les messages de la liste des valeurs
788                unset($valF['message']);
789            }
790            // Ajoute le duplicata
791            $clone_obj->ajouter($valF, $this->db, DEBUG);
792            // Si aucune erreur se produit dans la classe instanciée
793            if ($clone_obj->correct === true) {
794                // Récupère l'identifiant de l'objet créé
795                $clone_obj_id = $clone_obj->valF[$obj];
796    
797                // Message
798                $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 />";
799    
800                // Ajout de l'identifant au tableau des résultat
801                $resArray[$obj.'_'.$idx] = $clone_obj_id;
802    
803                // S'il y a au moins un objet metier associé
804                if ($objsf != "") {
805                    // Liste des objet métier associés
806                    $list_objsf = explode(",", $objsf);
807                    // Pour chaque objet associé
808                    foreach ($list_objsf as $key => $objsf) {
809                        // Inclus la classe de l'objet métier associé
810                        require_once "../obj/".$objsf.".class.php";
811    
812                        // Requête SQL permettant de récupérer les informations sur
813                        // l'objet métier associé
814                        $sql = "SELECT *
815                                FROM ".DB_PREFIXE.$objsf."
816                                WHERE ".$obj." = ".$idx;
817                        $res = $this->db->query($sql);
818                        $this->isDatabaseError($res);                    
819    
820                        // Pour chaque élément associé
821                        while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
822                            // Identifiant de l'objet associé à copier
823                            $idxsf = $row[$objsf];
824    
825                            // Valeurs clonées
826                            $valF = $row;
827                            // Valeurs non clonées
828                            $valF[$obj] = $clone_obj_id;
829                            // Identifiant modifié pour que ça soit un ajout
830                            $valF[$objsf] = "]";
831                            // Instance de l'objet métier associé
832                            $clone_objsf = new $objsf("]", $this->db, DEBUG);
833                            // Si dans l'objet métier associé
834                            // la fonction "copier" existe
835                            if (method_exists($clone_objsf, "copier")) {
836                                // Traitement sur les valeurs du duplicata
837                                $valF = $clone_objsf->copier($valF, $objsf, DEBUG);
838                                // Recupère les messages retourné par la fonction
839                                $message .= $valF['message'];
840                                // Supprime les messages de la liste des valeurs
841                                unset($valF['message']);
842                            }
843                            // Ajoute le duplicata
844                            $clone_objsf->ajouter($valF, $this->db, DEBUG);
845                            // Si aucune erreur se produit dans la classe instanciée
846                            if ($clone_objsf->correct === true) {
847                                // Récupère l'identifiant de l'objet créé
848                                $clone_objsf_id = $clone_objsf->valF[$objsf];
849    
850                                // Message
851                                $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 />";
852    
853                                // Ajout de l'identifant au tableau des résultat
854                                $resArray[$objsf.'_'.$row[$objsf]] = $clone_objsf_id;
855                            } else {
856    
857                                // Message d'erreur récupéré depuis la classe
858                                $message .= $clone_objsf->msg;
859                                // Type du message
860                                $message_type = "error";
861                            }
862                        }
863                    }
864                }
865            //    
866            } else {
867    
868                // Message d'erreur récupéré depuis la classe
869                $message .= $clone_obj->msg;
870                // Type du message
871                $message_type = "error";
872          }          }
873    
874            // Ajout du message au tableau des résultats
875            $resArray['message'] = $message;
876            // Ajout du type de message au tableau des résultats
877            $resArray['message_type'] = $message_type;
878    
879            // Retourne le tableau des résultats
880            return $resArray;
881      }      }
882        
883      /**      /**
884       * Envoie un mail avec piece jointe       * Permet de détailler les conditions pour l'affichage des contraintes dans
885       *       * une édition.
886       * @param string $title Titre du mail       * @param string $contraintes_param    Chaine des conditions
887       * @param string $message Corps du mail       *
888       * @param string $recipient Destinataire du mail       * @return array                        Conditions
      * @param array $file Destinataire du mail  
      * @access public  
      * @return bool True si le mail est correctement envoye, false sinon.  
889       */       */
890      public function sendMail($title, $message, $recipient, $file = array()) {      function explodeConditionContrainte($contraintes_param) {
891            
892          @include_once "../php/phpmailer/class.phpmailer.php";          // Initialisation des variables
893            $return = array();
894            $listGroupes = "";
895            $listSousgroupes = "";
896            $service_consulte = "";
897    
898            // Coupe la condition au ";"
899            // Doit séparer groupe et sous-groupe
900            $contraintes_params = explode(";", $contraintes_param);
901                    
902          if (!class_exists("PHPMailer")) {          // Pour chaque paramètres
903              $this->addToLog("sendMail(): !class_exists(\"PHPMailer\")", DEBUG_MODE);          foreach ($contraintes_params as $value) {
904              return false;              // Si le mot-clés "liste_groupe="
905                if (strstr($value, "liste_groupe=")) {
906                    // On enlève le mots-clés "liste_groupe="
907                    $listGroupes = str_replace("liste_groupe=", "", $value);
908                }
909                // Si le mot-clés "liste_ssgroupe="
910                if (strstr($value, "liste_ssgroupe=")) {
911                    // On enlève le mots-clés "liste_ssgroupe="
912                    $listSousgroupes = str_replace("liste_ssgroupe=", "", $value);
913                }
914                // Si le mot-clés "service_consulte="
915                if (strstr($value, "service_consulte=")) {
916                    // On enlève le mots-clés "service_consulte="
917                    $service_consulte = str_replace("service_consulte=", "", $value);
918                }
919          }          }
920    
921          //          // Récupère la liste des groupes et sous-groupes qui doivent
922          $this->setMailConfig();          // être utilisés pour la condition
923                    if ($listGroupes != "") {
924          //              $listGroupes = explode(",", $listGroupes);
         if ($this->mail_config == false) {  
             $this->addToLog("sendMail(): aucune configuration mail", DEBUG_MODE);  
             return false;  
925          }          }
926                    if ($listSousgroupes != "") {
927          //              $listSousgroupes = explode(",", $listSousgroupes);
928          $mail = new PHPMailer(true);          }
929            
930            // Tableau à retourner
931            $return['groupes'] = $listGroupes;
932            $return['sousgroupes'] = $listSousgroupes;
933            $return['service_consulte'] = $service_consulte;
934    
935          //          //
936          $mail->IsSMTP();          return $return;
937          $mail->Username = $this->mail_config["mail_username"];      }
938          $mail->Password = $this->mail_config["mail_pass"];  
939          if ($this->mail_config["mail_username"] == '') {      /**
940              $mail->SMTPAuth = false;       * Traitement pour créer la condition sur les contraintes dans les éditions.
941          } else {       * @param string $part SQL et parti du pdf (sql, titre ou corps)
942              $mail->SMTPAuth = true;       *
943         * @return string      Condition pour la requête sur les contraintes
944         */
945        function traitement_condition_contrainte($part) {
946    
947            // Initialisationd de la condition
948            $whereContraintes = "";
949    
950            // Détaille la condtion
951            $explodeConditionContrainte = $this->explodeConditionContrainte($part);
952    
953            // Récupère les groupes, sous-groupes et service_consulte pour la condition
954            $groupes = $explodeConditionContrainte['groupes'];
955            $sousgroupes = $explodeConditionContrainte['sousgroupes'];
956            $service_consulte = $explodeConditionContrainte['service_consulte'];
957    
958            // Pour chaque groupe
959            if ($groupes != "") {
960                foreach ($groupes as $key => $groupe) {
961                    // Si le groupe n'est pas vide
962                    if (!empty($groupe)) {
963                        // Choisit l'opérateur logique
964                        $op_logique = $key > 0 ? 'OR' : 'AND (';
965                        // Ajoute la condition
966                        $whereContraintes .= " ".$op_logique." lower(trim(both E'\n\r\t' from contrainte.groupe)) = lower('"
967                            .pg_escape_string($groupe)."')";
968                    }
969                }
970                // S'il y a des valeurs dans groupe
971                if (count($groupe) > 0) {
972                    // Ferme la parenthèse
973                    $whereContraintes .= " ) ";
974                }
975          }          }
976          $mail->Port = $this->mail_config["mail_port"];  
977          $mail->Host = $this->mail_config["mail_host"];          // Pour chaque sous-groupe
978          $mail->AddReplyTo($this->mail_config["mail_from"], $this->mail_config["mail_from_name"]);          if ($sousgroupes != "") {
979          $mail->From = $this->mail_config["mail_from"];              foreach ($sousgroupes as $key => $sousgroupe) {
980          $mail->FromName = $this->mail_config["mail_from_name"];                  // Si le sous-groupe n'est pas vide
981          foreach (explode(",",$recipient) as $adresse) {                  if (!empty($sousgroupe)) {
982              if (!$this->checkValidEmailAddress($adresse)) {                      // Choisit l'opérateur logique
983                  $this->addToLog("sendMail(): courriel incorrect ".$adresse, DEBUG_MODE);                      $op_logique = $key > 0 ? 'OR' : 'AND (';
984                  return false;                      // Ajoute la condition
985              } else                      $whereContraintes .= " ".$op_logique." lower(trim(both E'\n\r\t' from contrainte.sousgroupe)) = lower('"
986                  $mail->AddAddress(trim($adresse));                          .pg_escape_string($sousgroupe)."')";
987                    }
988                }
989                // S'il y a des valeurs dans sous-groupe
990                if (count($sousgroupes) > 0) {
991                    // Ferme la parenthèse
992                    $whereContraintes .= " ) ";
993                }
994          }          }
995          $mail->IsHTML(true);  
996                    // Si l'option service_consulte n'est pas vide
997          // Corps du message          if ($service_consulte != "") {
998          $mail_body ="<html>";              // Ajoute la condition
999          $mail_body .= "<head><title>".$title."</title></head>";              $whereContraintes .= " AND service_consulte = cast(lower('".$service_consulte."') as boolean) ";
1000          $mail_body .= "<body>".$message."</body>";          }
1001          $mail_body .= "</html>";  
1002                    // Condition retournée
1003          $mail->Subject  = $title;          return $whereContraintes;
1004          $mail->MsgHTML($mail_body);      }
1005          foreach($file as $oneFile) {  
1006        /**
1007         * Calcule une date par l'ajout ou la soustraction de mois
1008         * @param date    $date     Date de base
1009         * @param integer $delay    Délais à ajouter (en mois)
1010         * @param string  $operator Opérateur pour le calcul ("-" ou "+")
1011         *
1012         * @return date             Date calculée
1013         */
1014        function mois_date($date, $delay, $operator = "+") {
1015                            
1016              if($oneFile['stream']){          // Si aucune date n'a été fournie ou si ce n'est pas une date correctement formatée
1017                  $mail->AddStringAttachment($oneFile['content'], $oneFile['title'], $oneFile['encoding'] = 'base64',$oneFile['type'] = 'application/octet-stream');          if ( is_null($date) || $date == "" ||
1018              } else{              preg_match('/[0-9]{4}-[0-9]{2}-[0-9]{2}/', $date) == 0 ){
1019                  $mail->AddAttachment($oneFile['url']);              return null;
1020            }
1021    
1022            // Découpage de la date
1023            $temp = explode("-", $date);
1024            $day = (int) $temp[2];
1025            $month = (int) $temp[1];
1026            $year = (int) $temp[0];
1027    
1028            // Si c'est une addition
1029            if ($operator == '+') {
1030                // Année à ajouter
1031                $year += floor($delay / 12);
1032                // Mois restant
1033                $nb_month = ($delay % 12);
1034                // S'il y a des mois restant
1035                if ($nb_month != 0) {
1036                    // Ajout des mois restant
1037                    $month += $nb_month;
1038                    // Si ça dépasse le mois 12 (décembre)
1039                    if ($month > 12) {
1040                        // Soustrait 12 au mois
1041                        $month -= 12;
1042                        // Ajoute 1 à l'année
1043                        $year += 1;
1044                    }
1045              }              }
1046          }          }
1047          // Envoie de l'email  
1048          if ($mail->Send()) {          // Si c'est une soustraction
1049              return true;          if ($operator == "-") {
1050          } else {              // Année à soustraire
1051              $this->addToLog("sendMail(): ".$mail->ErrorInfo, DEBUG_MODE);              $year -= floor($delay / 12);
1052              return false;              // Mois restant
1053                $nb_month = ($delay % 12);
1054                // S'il y a des mois restant
1055                if ($nb_month != 0) {
1056                    // Soustrait le délais
1057                    $month -= $nb_month;
1058                    // Si ça dépasse le mois 1 (janvier)
1059                    if ($month < 1) {
1060                        // Soustrait 12 au mois
1061                        $month += 12;
1062                        // Ajoute 1 à l'année
1063                        $year -= 1;
1064                    }
1065                }
1066          }          }
1067    
1068            // Calcul du nombre de jours dans le mois sélectionné
1069            switch($month) {
1070                // Mois de février
1071                case "2":
1072                    if ($year % 4 == 0 && $year % 100 != 0 || $year % 400 == 0) {
1073                        $day_max = 29;
1074                    } else {
1075                        $day_max = 28;
1076                    }
1077                break;
1078                // Mois d'avril, juin, septembre et novembre
1079                case "4":
1080                case "6":
1081                case "9":
1082                case "11":
1083                    $day_max = 30;
1084                break;
1085                // Mois de janvier, mars, mai, juillet, août, octobre et décembre
1086                default:
1087                    $day_max = 31;
1088            }
1089    
1090            // Si le jour est supérieur au jour maximum du mois
1091            if ($day > $day_max) {
1092                // Le jour devient le jour maximum
1093                $day = $day_max;
1094            }
1095    
1096            // Compléte le mois et le jour par un 0 à gauche si c'est un chiffre
1097            $month = str_pad($month, 2, "0", STR_PAD_LEFT);
1098            $day = str_pad($day, 2, "0", STR_PAD_LEFT);
1099    
1100            // Retourne la date calculée
1101            return $year."-".$month."-".$day ;
1102      }      }
1103    
1104        /**
1105         * Vérifie la valididité d'une date.
1106         *
1107         * @param string $pDate Date à vérifier
1108         *
1109         * @return boolean
1110         */
1111        function check_date($pDate) {
1112    
1113            // Vérifie si c'est une date valide
1114            if (preg_match("/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/", $pDate, $date)
1115                && checkdate($date[2], $date[3], $date[1])
1116                && $date[1] >= 1900) {
1117                //
1118                return true;
1119            }
1120    
1121            //
1122            return false;
1123        }
1124  }  }
1125    
1126  ?>  ?>

Legend:
Removed from v.531  
changed lines
  Added in v.3241

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26