Recherche des jours ouvrés en PHP

calendrierIl est fréquent d’avoir besoin de calculer J+1 ou J-1 dans un logiciel mais que le résultat soit un jour ouvré.
Voici un listing permettant les calculs nécessaire. Dans ce listing, les jours ouvré sont considérés comme du Lundi au Vendredi. Il est possible de changer cela en ligne 70 sur array(0,6)

 

<?php
/*
Calcules de dates.
Ecrite par Dominique FERET le 17 Juin 2014

fonction paques(annee) => renvoi la date du dimanche de paques basé sur l'algorythme de Gauss.
fonction ferie(annee) => renvoi un tableau de tout les jours férié de l'année
fonction trouvejourouvre(date,decalage) => renvoi le prochain jour ouvré dans le sens du décalage (exprimé en jours)

exemple d'utilisation
echo trouvejourouvre("02-01-2014",-1)."<br>";
=> renverra 31-12-2013

echo trouvejourouvre("15-08-2014",1)."<br>";
=> renverra 18-08-2018 => le prochain jour ouvré après le 15 aout 2014 sera le 18 Aout.

echo trouvejourouvre("17-07-2014",-3)."<br>";
=> renverra 11-07-2014 => le jour ouvré j-3 du 17 juillet sera le 11 car j-3 = 14 (le 12 et 13 étant samedi dimanche)

*/

function paques($annee){
    $a=$annee%19;
    $b=$annee%4;
    $c=$annee%7;
    $d=(19*$a+24)%30;
    $e=(2*$b+4*$c+6*$d+5)%7;
    $j=22+$d+$e;
    $m=3;
    if($j>31){
        $m+=1;
        $j-=31;
    }
    $datepaques=sprintf("%02d-%02d-%04d",$j,$m,$annee);
    return $datepaques;
}
function ferie($annee){
    $listedate=array();
    $listedate[]=date("01-01-".$annee);
    $listedate[]=date("01-05-".$annee);
    $listedate[]=date("08-05-".$annee);
    $listedate[]=date("14-07-".$annee);
    $listedate[]=date("15-08-".$annee);
    $listedate[]=date("01-11-".$annee);
    $listedate[]=date("11-11-".$annee);
    $listedate[]=date("25-12-".$annee);
    $datepaques=strtotime(paques($annee));

    $listedate[]=date('d-m-Y',strtotime('+1 day',$datepaques));
    $listedate[]=date('d-m-Y',strtotime('+39 days',$datepaques));
    $listedate[]=date('d-m-Y',strtotime('+50 days',$datepaques));
    return $listedate;
}

// cette fonction permet de trouver le jour ouvré correspondant a une date + ou - un nombre de jour
function trouvejourouvre($dateactuelle,$decalage)
{
    $datecalculee=strtotime($dateactuelle);
    $datecalculee+=($decalage*86400);
    // a ce stade, $datecalcule contient la date demandée sans tenir compte des jours ouvrés.

    //le décalage ensuite se fera jour par jour en plus ou en moins selon le décalage initiale
    $decalage=($decalage>0)?86400:-86400;
    //boucle
    $x=0;
    do {
        $x++;
        // Si le jour suivant n'est ni un dimanche (0) ou un samedi (6), ni un jour férié, on sort, sinon on ajoute ou on retire un jour
        if (!in_array(date('w', $datecalculee), array(0, 6)) && !in_array(date('d-m-Y',$datecalculee), ferie(date("Y",$datecalculee)))) {
            break;

        } else {
            $datecalculee+=$decalage;
        }
    }  while ($x<10); // petite sécurité,certes inutile mais je déteste les boucles infinies
    return( date('d-m-Y',$datecalculee));

}

?>

Laisser un commentaire