source: pmb4.2/trunk/fuentes/pmb/classes/tache_calendar.class.php @ 815

Last change on this file since 815 was 815, checked in by jrpelegrina, 4 years ago

Initial release of pmb 4.2

  • Property svn:executable set to *
File size: 14.7 KB
Line 
1<?php
2// +-------------------------------------------------+
3// © 2002-2012 PMB Services / www.sigb.net pmb@sigb.net et contributeurs (voir www.sigb.net)
4// +-------------------------------------------------+
5// $Id: tache_calendar.class.php,v 1.9 2015-04-03 11:16:19 jpermanne Exp $
6
7if (stristr($_SERVER['REQUEST_URI'], ".class.php")) die("no access");
8
9class tache_calendar {
10        var $new_date = array();                                                                //nouvelle date
11        var $nouvelle_date;                                                                             // valeur de la date en chaîne de caractères
12        var $defaut_min;
13       
14        function tache_calendar($num_planificateur) {
15                global $base_path;
16
17                if ($num_planificateur) {
18                        //renseignements Jour J
19                        $date_du_jour = getdate();
20                        $this->new_date["ANNEE"] = $date_du_jour["year"];
21                        $this->new_date["MOIS"] = $date_du_jour["mon"];
22                        $this->new_date["JOUR"] = $date_du_jour["mday"];
23                        $this->calcul_next_exec($num_planificateur);
24                }
25        }
26       
27        function calcul_next_exec($num_planificateur) {
28                global $dbh;
29               
30                $sql = "SELECT id_planificateur, num_type_tache, libelle_tache, perio_heure, perio_minute, perio_jour_mois, perio_jour, perio_mois
31                                FROM planificateur WHERE id_planificateur=".$num_planificateur;
32                $res = pmb_mysql_query($sql, $dbh);
33                if ($res) {
34                        while ($obj_sql=pmb_mysql_fetch_object($res)) {
35                                //renseignements Jour J
36                                $date_du_jour = getdate();
37                               
38                                //utile pour le calcul de l'heure et de la minute
39                                $date_today = $date_du_jour["year"]."-".$date_du_jour["mon"]."-".$date_du_jour["mday"];                                 
40                               
41                                //renvoit 1 si année bissextile, 0 sinon
42                                $annee_bissextile = date('L', today());
43                                //Valeurs bdd
44                                $jour_mois_bdd = explode(',',$obj_sql->perio_jour_mois);
45                                $jour_semaine_bdd = explode(',',$obj_sql->perio_jour);
46                                $mois_bdd = explode(',',$obj_sql->perio_mois);
47                                $heure_bdd = $obj_sql->perio_heure;
48                                $minute_bdd = $obj_sql->perio_minute;
49
50                                $this->calcul_date($jour_semaine_bdd, $jour_mois_bdd, $mois_bdd);
51
52                                //calcul de la minute
53                                $this->calcul_minute_exec($minute_bdd,$date_today,$date_du_jour,$jour_semaine_bdd, $mois_bdd, $jour_mois_bdd);
54               
55                                //calcul de l'heure
56                                $this->calcul_heure_exec($heure_bdd,$date_today,$date_du_jour,$jour_semaine_bdd, $mois_bdd, $jour_mois_bdd);
57                               
58                                //la date calculée est identique à la date du jour
59                                if (($date_du_jour["year"] == $this->new_date["ANNEE"]) && ($date_du_jour["mon"] == $this->new_date["MOIS"]) && ($date_du_jour["mday"] == $this->new_date["JOUR"])) {
60                                        //formatage de l'heure calculée
61                                        $this->new_date["HEURE"] = (strlen($this->new_date["HEURE"]) == "1" ? "0".$this->new_date["HEURE"] : $this->new_date["HEURE"]);
62                                        $this->new_date["MINUTE"] = (strlen($this->new_date["MINUTE"]) == "1" ? "0".$this->new_date["MINUTE"] : $this->new_date["MINUTE"]);
63                                        if (($this->new_date["HEURE"] == $date_du_jour["hours"]) && ($this->new_date["MINUTE"] == $date_du_jour["minutes"])) {
64                                                $this->recalcule_date($jour_semaine_bdd, $mois_bdd, $jour_mois_bdd);
65                                        }
66                                }
67                                //formatage de l'heure calculée
68                                $this->new_date["HEURE"] = (strlen($this->new_date["HEURE"]) == "1" ? "0".$this->new_date["HEURE"] : $this->new_date["HEURE"]);
69                                $this->new_date["MINUTE"] = (strlen($this->new_date["MINUTE"]) == "1" ? "0".$this->new_date["MINUTE"] : $this->new_date["MINUTE"]);
70                        }
71                }
72        }
73
74        //calcul de la date
75        function calcul_date($days_of_week, $days_of_month, $month_of_year) {
76                $calendar = array(
77                        '1' => '31','2' => '28','3' => '31','4' => '30','5' => '31','6' => '30','7' => '31',
78                        '8' => '31','9' => '30','10' => '31','11' => '30','12' => '31'
79                );
80               
81                //Vérification de la périodicité pour éviter la boucle infinie
82                $check_periodicite = false;
83                if (($days_of_month[0] != '*') && ($month_of_year[0] != '*')) {
84                        foreach ($month_of_year as $month) {
85                                foreach ($days_of_month as $day) {
86                                        if ($day <= $calendar[$month]) {
87                                                $check_periodicite = true;
88                                        }
89                                }
90                        }
91                } else {
92                        $check_periodicite = true;
93                }
94                if (!$check_periodicite) {
95                        $this->new_date["ANNEE"] = "0000";
96                        $this->new_date["MOIS"] = "00";
97                        $this->new_date["JOUR"] = "00";
98                        $this->nouvelle_date = $this->new_date["ANNEE"]."-".$this->new_date["MOIS"]."-".$this->new_date["JOUR"];
99                        return;
100                }
101               
102                /* Calcul du mois */
103                if ($month_of_year[0] != '*') {
104                        $annee_courante = false;
105                        for ($i=0; $i<sizeof($month_of_year); $i++) {
106                                if (($month_of_year[$i] >= $this->new_date["MOIS"]) && (!$annee_courante)) {
107                                        $annee_courante = true;
108                                        $this->new_date["MOIS"] = $month_of_year[$i];
109                                }
110                        }
111                        if (!$annee_courante) {
112                                $this->new_date["ANNEE"]++;
113                                $this->new_date["MOIS"] = $month_of_year[0];
114                                if ($days_of_month[0] != '*') {
115                                        $this->new_date["JOUR"] = $days_of_month[0];
116                                } else {
117                                        $this->new_date["JOUR"] = '1';
118                                }
119                        }
120                }
121                if ($days_of_month[0] != '*') {
122                        $trouve = false;
123                        while (!$trouve) {
124                                foreach ($days_of_month as $i=>$day) {
125                                        if (($day >= $this->new_date["JOUR"]) && ($day <= $calendar[$this->new_date["MOIS"]])) {
126                                                $this->new_date["JOUR"] = $day;
127                                                $timestamp = mktime (0, 0, 0, $this->new_date["MOIS"]*1, $this->new_date["JOUR"]*1, $this->new_date["ANNEE"]*1);
128                                                if ($days_of_week[0] != '*') {
129                                                        if (in_array(date("N", $timestamp),$days_of_week)) {
130                                                                $trouve = true;
131                                                        }
132                                                } else {
133                                                        $trouve = true;
134                                                }
135                                        }
136                                        if ($trouve) break;
137                                }
138                                if (!$trouve) {
139                                        $this->new_date["JOUR"] = $days_of_month[0];
140                                        if ($month_of_year[0] != '*') {
141                                                $boolean_mois = false;
142                                                foreach ($month_of_year as $i=>$month) {
143                                                        if (($month > $this->new_date["MOIS"]) && ($month <= 12)) {
144                                                                $this->new_date["MOIS"] = $month;
145                                                                $boolean_mois = true;
146                                                        }
147                                                        if ($boolean_mois) break;
148                                                }
149                                                if (!$boolean_mois) {
150                                                        $this->new_date["MOIS"] = $month_of_year[0];
151                                                        $this->new_date["ANNEE"]++;
152                                                }
153                                        } else {
154                                                $this->new_date["MOIS"]++;
155                                                if ($this->new_date["MOIS"] > '12') {
156                                                        $this->new_date["MOIS"] = '1';
157                                                        $this->new_date["ANNEE"]++;
158                                                }
159                                        }
160                                }
161                        }       
162                } elseif ($days_of_week[0] != '*') {
163                        $trouve = false;
164                        while (!$trouve) {
165                                $timestamp = mktime (0, 0, 0, $this->new_date["MOIS"]*1, $this->new_date["JOUR"]*1, $this->new_date["ANNEE"]*1);
166                                while ($this->new_date["JOUR"] <= $calendar[$this->new_date["MOIS"]]) {
167                                        $timestamp = mktime (0, 0, 0, $this->new_date["MOIS"]*1, $this->new_date["JOUR"]*1, $this->new_date["ANNEE"]*1);
168                                        if (in_array(date("N", $timestamp),$days_of_week)) {
169                                                $trouve = true;
170                                        } else {
171                                                $this->new_date["JOUR"]++;
172                                        }
173                                        if ($trouve) break;
174                                }
175                                if (!$trouve) {
176                                        $this->new_date["JOUR"] = '01';
177                                        if ($month_of_year[0] != '*') {
178                                                $boolean_mois = false;
179                                                foreach ($month_of_year as $i=>$month) {
180                                                        if (($month > $this->new_date["MOIS"]) && ($month <= 12)) {
181                                                                $this->new_date["MOIS"] = $month;
182                                                                $boolean_mois = true;
183                                                        }
184                                                        if ($boolean_mois) break;
185                                                }
186                                                if (!$boolean_mois) {
187                                                        $this->new_date["MOIS"] = $month_of_year[0];
188                                                        $this->new_date["ANNEE"]++;
189                                                }
190                                        } else {
191                                                $this->new_date["MOIS"]++;
192                                                if ($this->new_date["MOIS"] > '12') {
193                                                        $this->new_date["MOIS"] = '1';
194                                                        $this->new_date["ANNEE"]++;
195                                                }
196                                        }
197                                }
198                        }
199                       
200                } else {
201                        if ($this->new_date["JOUR"] > $calendar[$this->new_date["MOIS"]]) {
202                                $this->new_date["JOUR"] = '01';
203                                $this->new_date["MOIS"]++;
204                                if ($this->new_date["MOIS"] > '12') {
205                                        $this->new_date["MOIS"] = '1';
206                                        $this->new_date["ANNEE"]++;
207                                }
208                        } 
209                }
210                $this->nouvelle_date = $this->new_date["ANNEE"]."-".$this->new_date["MOIS"]."-".$this->new_date["JOUR"];
211        }
212               
213        function recalcule_date($jour_semaine_bdd, $mois_bdd, $jour_mois_bdd) {
214                $this->new_date["JOUR"]++;
215                $this->calcul_date($jour_semaine_bdd,$jour_mois_bdd,$mois_bdd);
216        }
217       
218       
219        /* Calcul de la minute de la prochaine exécution
220         * Paramètre $minute_bdd qui est une châine de caractères de la base qui doit être analysée
221         */
222        function calcul_minute_exec($minute_bdd,$date_today,$date_du_jour,$jour_semaine_bdd, $mois_bdd, $jour_mois_bdd) {
223                //calcul de la minute, analyse de la chaîne
224                if ($minute_bdd != '*') {
225                        // heure saisie au format statique, exemple: 3 ou 03 pour 3h
226                        if (preg_match("#^([0-9]{1})$#", $minute_bdd) || preg_match("#^([0-9]{2})$#", $minute_bdd)) {
227                                $this->new_date["MINUTE"] = $minute_bdd;
228                                $this->defaut_min = $minute_bdd;
229                        }
230                        //cela veut dire qu'il s'agit d'un intervalle
231                        if (strstr($minute_bdd,"-")) {
232                                $tab_m = explode("-", $minute_bdd);
233                                $value = "1";
234                                // action répétitive différente de l'heure, ex: toutes les 2 heures
235                                if (preg_match("#(\{[0-9]{1}\})$#", $minute_bdd) || preg_match("#(\{[0-9]{2}\})$#", $minute_bdd)) {
236                                        //valeur de l'incrémentation
237                                        $value = substr($minute_bdd, strpos($minute_bdd, "{")+1, -1);
238                                        $tab_m = explode("-", substr($minute_bdd, 0, strpos($minute_bdd, "{")));
239                                }
240                                // même date, intervalle croissant ou décroissant ?
241                                if ($date_today == $this->nouvelle_date) {
242                                        $this->defaut_min = $tab_m[0];
243                                        $val = $tab_m[0];
244                                        if ($value != "") {
245                                                while (!($val > $date_du_jour["minutes"])) {
246                                                        $val = $val + $value;
247                                                }
248                                        }
249                                        if ($tab_m[0] < $tab_m[1]) {
250                                                if (($date_du_jour["minutes"] > $tab_m[1]) || ($date_du_jour["minutes"] < $tab_m[0]) ) {
251                                                        $this->new_date["MINUTE"] = $tab_m[0];
252                                                } else if ($val > $tab_m[1]) {
253                                                        $this->new_date["MINUTE"] = $tab_m[0];
254                                                } else {
255                                                        $this->new_date["MINUTE"] = $val;
256                                                }
257                                        } else if ($tab_m[0] > $tab_m[1]) {
258                                                $tab_m[1] = "59";
259                                                // Pas très simple à gérer ??
260                                                if (($val > $tab_m[0]) && ($val < $tab_m[1])) {
261                                                        $this->new_date["MINUTE"] = $val;
262                                                } else {
263                                                        $this->new_date["MINUTE"] = $tab_m[0];
264                                                }
265                                        } else {
266                                                $this->new_date["MINUTE"] = $tab_m[0];
267                                        }       
268                                } else {
269                                        $this->new_date["MINUTE"] = $tab_m[0];
270                                } 
271                        }
272                } else {
273                        if ($date_today == $this->nouvelle_date) {
274                                $this->defaut_min = $minute_bdd;
275                                if ($date_du_jour["minutes"]+1 >= '60') {
276                                        $this->new_date["MINUTE"] = "00";
277                                } else {
278                                        $this->new_date["MINUTE"] = $date_du_jour["minutes"]+1;
279                                }
280                        } else {
281                                $this->new_date["MINUTE"] = "00";
282                        }
283                }
284        }
285       
286        function calcul_heure_exec($heure_bdd,$date_today,$date_du_jour,$jour_semaine_bdd, $mois_bdd, $jour_mois_bdd) {
287        //calcul de l'heure, analyse de la chaîne
288                if ($heure_bdd != '*') {
289                        // heure saisie au format statique, exemple: 3 ou 03 pour 3h
290                        if (preg_match("#^([0-9]{1})$#", $heure_bdd) || preg_match("#^([0-9]{2})$#", $heure_bdd)) {
291                                // date identique, (heure courante > heure planifiée ? recalcule la date : heure planifiée)
292                                if ($date_today == $this->nouvelle_date) {
293                                        if ($date_du_jour["hours"] > $heure_bdd) {
294                                                //il faut recalculer la date...
295                                                $this->recalcule_date($jour_semaine_bdd, $mois_bdd, $jour_mois_bdd);
296                                        } else if (($date_du_jour["hours"] == $heure_bdd) && ($date_du_jour["minutes"] > $this->new_date["MINUTE"])) {
297                                                //il faut recalculer la date...
298                                                $this->recalcule_date($jour_semaine_bdd, $mois_bdd, $jour_mois_bdd);
299                                        } else if (($date_du_jour["hours"] != $heure_bdd) && ($this->defaut_min == "*")) {
300                                                $this->new_date["MINUTE"] = "00";
301                                        }
302                                }
303                                //valeur de l'heure quoiqu'il arrive car elle est statique
304                                $this->new_date["HEURE"] = $heure_bdd;
305                        } 
306                        if (strstr($heure_bdd,"-")) {
307                                //cela veut dire qu'il s'agit d'un intervalle
308                                $tab_h = explode("-", $heure_bdd);
309                                $value = "1";
310                                // action répétitive différente de l'heure, ex: toutes les 2 heures
311                                if (preg_match("#(\{[0-9]{1}\})$#", $heure_bdd) || preg_match("#(\{[0-9]{2}\})$#", $heure_bdd)) {
312                                        $value = substr($heure_bdd, strpos($heure_bdd, "{")+1, -1);
313                                        $tab_h = explode("-", substr($heure_bdd, 0, strpos($heure_bdd, "{")));
314                                }
315                                //même date, intervalle croissant ou décroissant ?
316                                if ($date_today == $this->nouvelle_date) {
317                                        $val = $tab_h[0];
318                                        if ($value != "") {
319                                                while (!($val >= $date_du_jour["hours"])) {
320                                                        $val = $val + $value;
321                                                } 
322                                                if (($val == $date_du_jour["hours"]) && ($this->new_date["MINUTE"] <= $date_du_jour["minutes"])) {
323                                                        $val = $val + $value;
324                                                }
325                                        }
326                                        if ($tab_h[0] < $tab_h[1]) {
327                                                if ($date_du_jour["hours"] > $tab_h[1]) {
328                                                        // il faut donc recalculer la date...
329                                                        $this->recalcule_date($jour_semaine_bdd, $mois_bdd, $jour_mois_bdd);
330                                                        $this->new_date["HEURE"] = $tab_h[0];
331                                                        $this->new_date["MINUTE"] = ($this->defaut_min == "*" ? "00" : $this->defaut_min);
332                                                } else if (($date_du_jour["minutes"] >= $this->new_date["MINUTE"]) && (($val > $tab_h[1]))) {
333                                                        // il faut donc recalculer la date...
334                                                        $this->recalcule_date($jour_semaine_bdd, $mois_bdd, $jour_mois_bdd);
335                                                        $this->new_date["HEURE"] = $tab_h[0];
336                                                        $this->new_date["MINUTE"] = ($this->defaut_min == "*" ? "00" : $this->defaut_min);;
337                                                } else if (($date_du_jour["minutes"] > $this->new_date["MINUTE"]) && (($val <= $tab_h[1]))) {
338                                                        $this->new_date["HEURE"] = $val;
339                                                } else if (($date_du_jour["minutes"] < $this->new_date["MINUTE"]) && (($val <= $tab_h[1])) && ($val > $date_du_jour["hours"])) {
340                                                        $this->new_date["HEURE"] = $val;
341                                                        $this->new_date["MINUTE"] = ($this->defaut_min == "*" ? "00" : $this->defaut_min);
342                                                } else if ($date_du_jour["hours"] < $tab_h[0]){
343                                                        //elle doit récupérer la valeur courante ...
344                                                        $this->new_date["HEURE"] = $tab_h[0];                                                   
345                                                } else {
346                                                        $this->new_date["HEURE"] = $date_du_jour["hours"];
347                                                }
348                                        } else if ($tab_h[0] > $tab_h[1]) {
349                                                $tab_h[1] = "23";
350                                                if ($date_du_jour["hours"] <= $val) {
351                                                        $this->new_date["HEURE"] = $val;
352                                                } else {
353                                                        // il faut recalculer la date...
354                                                        $this->recalcule_date($jour_semaine_bdd, $mois_bdd, $jour_mois_bdd);
355                                                        // on initialise l'heure à 00h
356                                                        $this->new_date["HEURE"] = "00";
357                                                }
358                                                if (($date_du_jour["minutes"] >= $this->new_date["MINUTE"]) 
359                                                        && ($this->new_date["HEURE"] == $date_du_jour["hours"])
360                                                        && ($this->new_date["HEURE"]+$value <= "23")) {
361                                                        $this->new_date["HEURE"] = $this->new_date["HEURE"] + $value;
362                                                }       
363                                                if (($this->new_date["HEURE"] < $tab_h[0]) && ($date_du_jour["hours"] <= $tab_h[0])) {
364                                                        $this->new_date["HEURE"] = $date_du_jour["hours"];
365                                                }
366                                        } else {
367                                                $this->new_date["HEURE"] = $tab_h[0];
368                                        }
369                                } else {
370                                        $this->new_date["HEURE"] = $tab_h[0];
371                                }
372                        }
373                } else {
374                        if ($date_today == $this->nouvelle_date) {
375                                if ($this->new_date["MINUTE"] < $date_du_jour["minutes"]) {
376                                        if ($date_du_jour["hours"]+1 < 24) {
377                                                $this->new_date["HEURE"] = $date_du_jour["hours"]+1;
378                                        } else {
379                                                // il faut recalculer la date...
380                                                $this->recalcule_date($jour_semaine_bdd, $mois_bdd, $jour_mois_bdd);
381                                                // on initialise l'heure à 00h
382                                                $this->new_date["HEURE"] = "00";
383                                        }
384                                } else {
385                                        $this->new_date["HEURE"] = $date_du_jour["hours"];
386                                }
387                        } else {
388                                // on initialise l'heure à 00h
389                                $this->new_date["HEURE"] = "00";
390                        }
391                }
392        }
393}
Note: See TracBrowser for help on using the repository browser.