Subversion Repositories Applications.gtt

Rev

Rev 11 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
// +------------------------------------------------------------------------------------------------------+
// | PHP version 5.1.1                                                                                    |
// +------------------------------------------------------------------------------------------------------+
// | Copyright (C) 2006 Tela Botanica (accueil@tela-botanica.org)                                         |
// +------------------------------------------------------------------------------------------------------+
// | This file is part of eFlore.                                                                         |
// |                                                                                                      |
// | Foobar is free software; you can redistribute it and/or modify                                       |
// | it under the terms of the GNU General Public License as published by                                 |
// | the Free Software Foundation; either version 2 of the License, or                                    |
// | (at your option) any later version.                                                                  |
// |                                                                                                      |
// | Foobar is distributed in the hope that it will be useful,                                            |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of                                       |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                        |
// | GNU General Public License for more details.                                                         |
// |                                                                                                      |
// | You should have received a copy of the GNU General Public License                                    |
// | along with Foobar; if not, write to the Free Software                                                |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                            |
// +------------------------------------------------------------------------------------------------------+
// CVS : $Id$
/**
* Classe Calendrier
*
* Description
*
*@package Calendrier
//Auteur original :
*@version 1
*@author        Dorian BANNIER <dbannier@aol.com>
//Autres auteurs :
*@version 3
*@author        Shaheen ABDOOL RAHEEM <shaheenar50@hotmail.com>
*@version 4
*@author        Jean-Pascal MILCENT <jpm@clapas.org>
*@author        aucun
*@copyright     Tela-Botanica 2000-2006
*@version       $Revision$ $Date$
// +------------------------------------------------------------------------------------------------------+
*/

/**
* Classe calendrier pour gerer le calendrier pour un mois et une annee 
*
*@param annee
*@param mois 
*@param premier jour du mois 
*@param semaine
*@param l'url du resultat affiche
*@param liste de noms des jours
*@param liste de noms des mois
*@param liste des jours feries du mois
*/
class Calendrier
{
        private $annee;   
        private $mois;
        private $semaine;
        private $jour; 
        
        private $nom_jours = array();
        private $nom_mois = array();
        
        private $liste_feries = array();  
        
        /** contient le nom des variables que recevra l'url spécifié
        * @var string
        */
        var $var_jour = "jour";
        var $var_mois = "mois";
        var $var_annee = "annee";

        /**
        *constructeur de la classe calendrier
        *toutes les variables sont initialises  avec les donnees 
        *de la date du jour si on ne passe aucune date en parametre
        *sinon on initialise le calendrier avec 
        *@param semaine
        *@param annee
        */
        public function __construct($semaine = null, $annee = null)
        {
                if (is_null($semaine)) {
                        $semaine = date('W', time());
                }
                if (is_null($annee)) {
                        // TODO : vérifier le standard ISO-8601
                        $annee = date('Y', time());
                }
                $tableau = $this->donnerLundiEtDimancheSemaine($semaine, $annee);
                
                $this->jour = date('d',mktime(0,0,0,1,$tableau[0],$annee));
                $this->semaine = $semaine;
                $this->mois = date('n',mktime(0,0,0,1,$tableau[0],$annee));
                $this->annee = $annee;
                
                $this->nom_jours = array (GESTION_LUN_L, GESTION_MAR_L, GESTION_MER_L, GESTION_JEU_L, GESTION_VEN_L, GESTION_SAM_L ,GESTION_DIM_L); 
                $this->nom_mois = array(1 => "Janvier","Février","Mars","Avril","Mai","Juin","Juillet", "Août","Septembre","Octobre","Novembre","Décembre");
                
                $this->liste_feries = $this->calculerJoursFeries($this->annee);
        }
        
        public function getAnnee()
        {
                return $this->annee;
        }
        
        public function getMois()
        {
                return $this->mois;
        }
        
        public function getSemaine()
        {
                return $this->semaine;
        }
        
        public function getJour()
        {
                return $this->jour;
        }
        
        /**
        *Calcule les dates des jours fériés pour la france.
        *Renvoie un tableau contenant la liste de dates par mois.
        *Les dates sont de la forme timestamp unix.
        *
        *@param integer l'année pour laquelle on veut les jours fériés.
        *@return array tableau des dates fériées.
        */
        public function calculerJoursFeries($annee)
        {
                $tab = array(   mktime(0,0,0,1,1,$annee), 
                                                $this->donnerDatePaques($annee),
                                                mktime(0,0,0,5,1,$annee),
                                        mktime(0,0,0,5,8,$annee),
                                        $this->donnerDateAscension($annee),
                                        $this->donnerDatePentecote($annee),
                                        mktime(0,0,0,7,14,$annee),
                                        mktime(0,0,0,8,15,$annee),
                                        mktime(0,0,0,11,1,$annee),
                                        mktime(0,0,0,11,11,$annee),
                                        mktime(0,0,0,12,25,$annee));
                return $tab;
        } 
        
        /**
        *Calcule la date du lundi de Pâques.
        *
        *@param integer l'année pour laquelle on veut connaître la date de Pâques
        *@return integer le timestamp du lundi de Pâques
        */
        public function donnerDatePaques($annee)
        {
                $date_paques = easter_date($annee);
                $lundi_paques = mktime( date("H", $date_paques),
                                                                date("i", $date_paques),
                                                                date("s", $date_paques),
                                                                date("m", $date_paques),
                                                                date("d", $date_paques) + 1,
                                                                date("Y", $date_paques));
                return $lundi_paques;
        }
        /**
        *Calcule la date de l'ascension.
        *
        *@param integer l'année pour laquelle on veut connaître la date de l'ascencion
        *@return integer le timestamp de l'ascencion
        */
        public function donnerDateAscension($annee)
        {
                $date_paques = easter_date($annee);
                $date_ascension = mktime(       date("H", $date_paques),
                                                                        date("i", $date_paques),
                                                                        date("s", $date_paques),
                                                                        date("m", $date_paques),
                                                                        date("d", $date_paques) + 39,
                                                                        date("Y", $date_paques));
                return $date_ascension;
        }

        /**
        *Calcule la date du lundi de la pentecote
        *Renvoie un timestamp
        *renvoie cette derniere
        */
        public function donnerDatePentecote($annee)
        {
                $date_paques = easter_date($annee);
                $date_ascension = $this->donnerDateAscension($annee);
                $date_pentecote = mktime(       date("H", $date_ascension),
                                                                        date("i", $date_ascension),
                                                                        date("s", $date_ascension),
                                                                        date("m", $date_ascension),
                                                                        date("d", $date_ascension) + 11,
                                                                        date("Y", $date_ascension)); 
                return $date_pentecote;
        }

        /**
        *Donne le type de jour de la semaine au format numérique du premier jour du mois.
        *
        *@return integer le numéro de 1 (lundi) à 7 (dimanche) correspondant au type du premier jour du mois.
        */
        function donnerTypePremierJourMois()
        {
                $intPremierJour = date("w", mktime(0, 0, 0, $this->getMois(), 1, $this->getAnnee()));
                if ($intPremierJour == 0) {
                        $intPremierJour = 7; // si c'est un dimanche
                }
                return $intPremierJour;
        }

        /**
        *Calcule le dernier jour du mois
        *@param : annee, mois
        *renvoie un entier
        */
        function donnerDernierJourMois()
        {
                $h = $this->donnerNbreJoursMois();
                $intDernierJour = date("w", mktime(0, 0, 0, $this->getMois(), $h, $this->getAnnee()));
                if($intDernierJour == 0) {
                        $intDernierJour = 7; // si c'est un dimanche
                }
                return $intDernierJour;
        }
        
        /**
        *Calcule le nombre de jours dans un mois 
        *@return integer le nombre de jour dans le mois.
        */
        function donnerNbreJoursMois()
        {
                return date("t", mktime(0, 0, 0, $this->getMois(), 1, $this->getAnnee()));
        }

        /**
        *Calcule la semaine suivante
        */
        function donnerSemaineSuivante()
        {
                if ($this->getSemaine() == date('W', mktime(0, 0, 0, 12, 31, $this->getAnnee()))) {
                        $tab['semaine'] = 1;
                        $tab['annee'] = $this->getAnnee() + 1;
                } else {
                        $tab['semaine'] = $this->getSemaine() + 1;
                        $tab['annee'] = $this->getAnnee();
                }
                return $tab;
        }

        /**
        *Calule la semaine précédente
        */
        function donnerSemainePrecedente()
        {
                if ($this->getSemaine() == 1) {
                        $tab['semaine'] = date('W', mktime(0, 0, 0, 12, 31, ($this->getAnnee() - 1)));
                        $tab['annee'] = $this->annee - 1;
                } else {
                        $tab['semaine'] = $this->semaine - 1 ;
                        $tab['annee'] = $this->annee;
                }
                return $tab;
        }

        /**
        *Calucule le mois suivant
        *renvoie l'annee et le mois suivant sous forme de chiffre
        *dans un tableau
        */
        function donnerMoisSuivant()
        {
                if ($this->mois == 12) {
                        $tab['mois'] = 1;
                        $tab['annee'] = $this->annee + 1;
                } else {
                        $tab['mois'] = $this->mois + 1;
                        $tab['annee'] = $this->annee;
                }
                return $tab;
        }
   
        /**
        *Calcule le mois precedent
        *renvoie l'annee et le mois precedent sous forme de chiffre
        */
        function donnerMoisPrecedent()
        {
                if ($this->mois == 1) {
                        $tab['mois'] = 12;
                        $tab['annee'] = $this->annee - 1;
                } else {
                        $tab['mois'] = $this->mois - 1;
                        $tab['annee'] = $this->annee;
                }
                return $tab;  
        }
   
   /**
        *Renvoie la date du lundi et dimanche d'une semaine
        *a partir du numero de semaine
        *       
        *@return un tableau contenat le timestamp unix de lundi et dimanche 
        *de la semaine en question
        */
        function donnerLundiEtDimancheSemaine()
        {
                if ((date("w", mktime(0, 0, 0, 1, 1, $this->getAnnee())) <= 4) && (date("w", mktime(0, 0, 0, 1, 1, $this->getAnnee())) != 0)) {
                        $nbre_jour = ($this->getSemaine() - 1) * 7;
                } else {
                        $nbre_jour = ($this->getSemaine()) * 7;
                }
                
                if (date("w", mktime(0, 0, 0, 1, 1, $this->getAnnee())) == 0) {
                        $nbre_jour += 7;
                } else {
                        $nbre_jour += 7 - ((date("w", mktime(0, 0, 0, 1, 1, $this->getAnnee())) - 1) % 7);
                }
                $nbre_jour_7 = $nbre_jour - 6;
                return array($nbre_jour_7, $nbre_jour);
        }

        /**
        *Indique si une date est fériée ou non
        *renvoie 1 si férié
        *0 sinon
        */
        function etreFerie($date)
        {
                if (in_array($date, $this->liste_feries)) {
                        return 1;
                } else {
                        return 0;
                }
        }

        /**
        *Affiche un calendrier naviguable par semaine
        *option pour cliquer sur une semaine donnee
        *utilisation de la bibliotheque HTML/TABLE de PEAR
        *@param numero de semaine et annee
        */
        function afficherCalendrier($annee)
        {
                $id="CALENDRIER";
                $text=/*"</tr></td>".*/"<div id=\"calendrier\">";
                //initialisation des donnees
                $intPremierJour = &Calendrier::premierJourMois($this->mois,$this->annee);
                $intNbJoursMois = &Calendrier::nbJourMois($this->mois,$this->annee);
                $prevMonth=&Calendrier::prevMonth($this->mois,$this->annee);
                $intNbJourPrec=&Calendrier::nbJourMois($prevMonth[0],$prevMonth[1]);
                $intDernierJour=&Calendrier::dernierJourMois($this->mois,$this->annee); 
                //calcul du lundi et dimanche de la semaine courante
                //calcul de l'annee
                $tabLundiDimanche =& Calendrier::lundiEtDimancheSemaine($this->semaine,$annee);
                //creation de la table HTML representant le calendrier
                $tableAttrs = array("class" =>$id,"width" => "300");
                //creation de la barre de navigation
                //semaine precedente
                $tabPrevWeek=&Calendrier::prevWeek();
                $text.="<a href=".$GLOBALS['urlBase'].GESTION_TRAVAIL."&semaine=";
                $text.=$tabPrevWeek[0]."&annee=".$tabPrevWeek[1].">";
                $text.="<<"."</a>";
                
                //semaine courante
                $text.='<button>';
                $text.=date('d/m/y',mktime(0,0,0,1,$tabLundiDimanche[0],$annee));
                $text.='  --  ';
                $text.=date('d/m/y',mktime(0,0,0,1,$tabLundiDimanche[1],$annee));
                $text.='</button>';
                //semaine suivante
                $tabNextWeek= &Calendrier::nextWeek();
                $text.="<a href=".$GLOBALS['urlBase'].GESTION_TRAVAIL."&semaine=";
                $text.=$tabNextWeek[0]."&annee=".$tabNextWeek[1].">";
                $text.=">>"."</a>";
                $table = new HTML_Table($tableAttrs);
                $table -> setAutoGrow(true);
                $table->addRow($this->nom_jours);
                //remplissage de la premiere ligne
                //test si on est dans la semaine courante 
                //si dimanche egale a la fin de la semaine
                $semCourante=(date('d',mktime(0,0,0,1,$tabLundiDimanche[1],$annee))==(7-$intPremierJour+1));
                $p=1;
                for($i=1; $i<=7;$i++) {
                if ($i<$intPremierJour and $semCourante) {//mois prec et semaine courante 
                                $elem[$i-1]="<div id=\"moisprecedent\">".($intNbJourPrec-$intPremierJour+$i+1); 
                        } elseif ($i<$intPremierJour and !$semCourante) {//mois prec et pas semaien courante
                                $semaineL=date('W',mktime(0,0,0,$prevMonth[0],($intNbJourPrec-$intPremierJour+$i+1),$prevMonth[1]));
                                $elem[$i-1]= "<a href=".$this->url."?action=".GESTION_TRAVAIL."&semaine=$semaineL"."&annee=$prevMonth[1]".">".($intNbJourPrec-$intPremierJour+$i+1)."</a>"; 
                        } elseif ($i>=$intPremierJour and $semCourante) {//mois courant et semaine courante
                                $elem[$i-1] = "<div id=\"jourcourant\">".$p."</div>";
                                $p++;
                        } else {//mois courant et pas semaine courante
                                $semaineL=date('W',mktime(0,0,0,$this->mois,$p,$this->annee));
                                $elem[$i-1] = "<a href=".$this->url."?action=".GESTION_TRAVAIL."&semaine=$semaineL";
                                $elem[$i-1] .="&annee=".$this->annee.">".$p."</a>";
                                $p++;
                        }
                }
                $table->addRow($elem);
                //remplissage du reste des lignes
                $i=0; //indice du tableau  
                //lundi de la semaien courante
                // $t=&Calendrier::lundiEtDimancheSemaine($this->semaine,$this->annee);
                $lundiCourant=date('d',mktime(0,0,0,1,$tabLundiDimanche[0],$annee));
                $semCourante2=0;
                for ($f=$p; $f<=$intNbJoursMois ; $f++) {
                        if ($f==$lundiCourant and $i==0) {
                                $semCourante2=1;//booleen
                        }
                        //calcul de la semaine courante
                        $semaineL2=date('W',mktime(0,0,0,$this->mois,$f,$this->annee));
                        if ($semCourante2==1) {
                                $elem[$i]= "<div id=\"jourcourant\">".$f."</div>";
                        } else {
                                $elem[$i]="<a href=".$this->url."?action=".GESTION_TRAVAIL."&semaine=$semaineL2";
                                $elem[$i].="&annee=".$this->annee.">".$f."</a>";
                        }
                        if ($i==6) {
                                $i=0;
                                if ($semCourante2==1) {
                                        $semCourante2=0;
                                }
                                $table->addRow($elem);
                        } else {
                                $i++;
                        }
                }
                //remplissage de la derniere ligne
                $semaineL3=date('W',mktime(0,0,0,$this->mois,$intNbJoursMois,$this->annee));
                if ($semCourante2==0) {
                        for ($d=$i; $d<=6;$d++) {
                                $s=$d-$i+1;
                                $elem[$d]="<a href=".$this->url."?action=".GESTION_TRAVAIL."&semaine=$semaineL2";
                                $elem[$d].="&annee=".$this->annee.">".$s."</a>";
                        }
                } else {
                        for ($d=$i; $d<=6;$d++) {
                                $elem[$d]= ($d-$i+1);
                        }
                }
                $table->addRow($elem);
                $text.=$table->toHtml();
                $text .= "</div>";
                return $text;
        }
}
?>