Bonjour à tous,

Pour un autre projet, j'avais repris et utilser une class pour calculer le nombre de jour ouvrable entre deux date.

J'ai créé un crontoller pour faire des demandes de vanaces et va calculer le nombre de jour ouvrable entre les deux dates choisis pas l'utilisateur.

Cette classe fonctionne bien jusqu'à aujourdhui, mais je passe maintenant sur CakePHP et je suis toujours à la trène sur certain point de cake.

Je ne sais pas comment utiliser cette classe donc je vous mets le code, plus bas.

J'ai pensé la mettre dans mon controller Holiday.php en retirant la ligne "Class ExtractOpenDays", mais ca pas marcher.
Sur le coup, je pensais la mettre en tant que plugin, mais la je ne sais absolument pas comment faire.

Pourriez-vous me guider pour que je puisse le faire le plus simplement possible?

je vous remercie

Voici le code de cette classe, pour info

<?php
Class ExtractOpenDays{
    protected $dd_start;
    protected $mm_start;
    protected $yy_start;

    protected $dd_end;
    protected $mm_end;
    protected $yy_end;

    protected $mm_end_tmp;

    protected $yearWasInferior = 0;
    //protected $reset_day = 0;

    public $arr_bank_holidays; //array
//  public $arr_bank_holidays = array();
    protected $stop_loop_at;
    public $resultat = 0;

    function __construct($date1,$date2){ //dateStart dateEnd
        $arr_date1 = explode("-", $date1);
        $this->yy_start = $arr_date1[0];
        $this->mm_start = $arr_date1[1]; // Ne pas mettre de zéro
        $this->dd_start = $arr_date1[2];        
        $arr_date2 = explode("-", $date2);
        $this->yy_end = $arr_date2[0];
        $this->mm_end = $arr_date2[1];  // Ne pas mettre de zéro quand le ciffre est inférieur à 10
        $this->dd_end = $arr_date2[2];

    }

    function Calculate(){
        for($yy = $this->yy_start; $yy <= $this->yy_end; $yy++){
            $this-> Filter_by_year($yy);    
        }
    }

    function Jours_ferier($year){
        foreach($this->arr_bank_holidays as $key => $value){
            $arr_bank_holiday$key] = $year.'-'.$value;          
        }
        $arr_bank_holiday_religious = array_merge($arr_bank_holiday,$this->Jours_ferier_religieux($year));
        return $arr_bank_holiday_religious;
    }

    function Jours_ferier_religieux($year){ //Paques, assencion, panquote
        //Paques
            $easterDate = easter_date($year);
            $easterDay = date('j', $easterDate);
            $easterMonth = date('n', $easterDate);
            $easterYear = date('Y', $easterDate);

        $good_friday = date('Y-m-d',mktime(0, 0, 0, $easterMonth, $easterDay - 2, $easterYear));
        //Lundi de PAques
        $lundi_paques = date('Y-m-d',mktime(0, 0, 0, $easterMonth, $easterDay + 1, $easterYear));
        //Assencion +40 jour après paques
        $ascencion = date('Y-m-d',mktime(0, 0, 0, $easterMonth, $easterDay + 39, $easterYear));

        //pentecote lundi qui suit le 7eme dimanche apèrs paques
        $pentecote = date('Y-m-d',mktime(0, 0, 0, $easterMonth, $easterDay + 50, $easterYear));

        $arr_bank_religous = array();
        array_push($arr_bank_religous,$good_friday,$lundi_paques,$ascencion,$pentecote);

        return $arr_bank_religous;  
    }

    function Filter_by_year($year){

        ($year == $this->yy_end) ? $this->reset_month = 1 : $this->reset_month = 0;

        switch($year){
            case ($year < $this->yy_end) :
                echo '<p><b>'.$year.'</b></p>';

                if($this->yearWasInferior < 1){
                    $this->mm_end_tmp = $this->mm_end;
                }
                $this->yearWasInferior = 1;

                $this->mm_end = 12;

                $this->Extract_by_month($year);

            break;

            case ($year == $this->yy_end) :
                #   echo '<p><b>'.$year.'</b></p>';

                if($this->yearWasInferior == 1 AND $this->mm_end == 12){
                    //$this->mm_end_tmp;
                    $this->mm_end = $this->mm_end_tmp;
                    $this->mm_start = 01;
                    $this->dd_start = 01;
                }

                $this->Extract_by_month($year);
            break;
        }
    }
    function Extract_by_month($year){

        for($m=$this->mm_start; $m <= $this->mm_end; $m++){
            $date_array_m =explode("-",date("Y-m-d-l-W-L-t", mktime(0, 0, 0, $m, $this->dd_start, $year)));
            //print_r($date_array_m); //Array ( [0] => year [1] => mount [2] => day [3] => Thursday [4] => week [5] => bissextile [6] => count_day )

            if($m < $this->mm_end){
                $this->stop_loop_at = $date_array_m[6];
            }elseif($m == $this->mm_end AND $year < $this->yy_end ){
                $this->stop_loop_at = $date_array_m[6];
            }else{
                $this->stop_loop_at = $this->dd_end;
            }

            $this->Extract_days($year,$m);
            if($this->yearWasInferior == 1 AND $m == 12) $this->mm_start=1; 
        }
    }

    function Extract_days($year,$m){

            // Remet la boucle à 1 jour, si on passe à un autre mois.
            if($m > $this->mm_start){
                $this->dd_start = 1;
            }

            //Arrete de compter soit à 30 ou 31 ou 28, sauf si on a atteind $mm_end, il s'arretera alors de compter à $dd_end
            //($m == $mm_end) ? $stop_count_at = $dd_end : $stop_count_at = $date_array_m[6];

            for($d=$this->dd_start; $d<=$this->stop_loop_at; $d++){ 
                $date_array_d = explode("-",date("Y-m-d-l", mktime(0, 0, 0, $m, $d, $year)));
                $jour_numeric = date('w',strtotime($date_array_d[0].'-'.$date_array_d[1].'-'.$date_array_d[2]));

        // Si un jour est un samedi ou dimanche, ne compte pas
                if($jour_numeric == 6 OR $jour_numeric == 0 ){

                }elseif(!in_array($date_array_d[0].'-'.$date_array_d[1].'-'.$date_array_d[2], $this->Jours_ferier($year))){     
                        //echo '{'.$date_array_m[0].'='.$y.'}<br>';

                    #echo ''.$this->resultat.']';
                    #echo $date_array_d[0].'-'.$date_array_d[1].'-'.$date_array_d[2].'-'.$date_array_d[3];
                    #echo '<br>';
                        $this->resultat++;
                }else{
                    #echo 'Public holiday<br>';
                }
            }
        }

}

function CalculateNbOfWorkingDay($from, $until){

    $date1 = $from;// = "2011-12-1";
    $date2 = $until;// = "2011-12-31";

    if(empty($date1)) { //Date start
        echo "Enter \"From\" filed";
    }elseif(empty($date2)){ //date end
        echo "Enter \"To\" filed";
    }else{ 
        $nbOpenDays = new ExtractOpenDays($date1, $date2);
        $nbOpenDays->arr_bank_holidays = array(
            //'mois-jour' Ne pas mettre l'année
            //Easter, Ascencion and Panquotes sont calculé automatiquement
            '01-01', // Jour de l'an
            '05-01', // Fete du travail
            '08-01', // Fete nationale
            '08-15', // Assomption
            '12-25', // Noel                
            '12-26'
        );
        $nbOpenDays->Calculate();
        return $nbOpenDays->resultat;

    }
}
if(isset($_GET'start']) and isset($_GET'end'])){
    echo CalculateNbOfWorkingDay($_GET'start'], $_GET'end']);
}
?>

3 réponses


Ch0c4
Réponse acceptée

Salut, il faut que tu mettes ta class dans app/lib ensuite tu l'appelle dans le controller ou le model que tu veux en écrivant

App::uses('NomDeTonFichierQuiContientLaClasseSansLExtension', 'Lib');

Je ne suis pas sûre mais c'est surement sa.

Ok super, je vais regardé dans ce côté, plus tard.
Merci

Vraiment, cakePHP c'est génial!!

App::uses('workingDays', 'Lib');
$from="2013-01-01";
$until="2013-01-15";
$workingDays = new workingDays($from,$until);
debug($workingDays->resultat);

et ca marche
Y a 3 mois, je connaissais rien de CakePHP, et je fonce!!
:o)