1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
|
/* Données d'exemple */
$periodesLibres = array();
$periodesLibres[0] = array(
"dateDebut" => "2019-06-15",
"dateFin" => "2019-06-29"
);
$periodesLibres[1] = array(
"dateDebut" => "2019-06-15",
"dateFin" => "2019-06-29"
);
$periodesLibres[2] = array(
"dateDebut" => "2019-06-29",
"dateFin" => "2019-07-13"
);
$periodesLibres[3] = array(
"dateDebut" => "2019-07-13",
"dateFin" => "2019-07-27"
);
$periodesLibres[4] = array(
"dateDebut" => "2019-07-27",
"dateFin" => "2019-08-03"
);
$periodesLibres[5] = array(
"dateDebut" => "2019-08-03",
"dateFin" => "2019-08-17"
);
$periodesLibres[6] = array(
"dateDebut" => "2019-08-17",
"dateFin" => "2019-08-31"
);
$periodesLibres[7] = array(
"dateDebut" => "2019-08-31",
"dateFin" => "2020-06-13"
);
$periodesOccupee = array();
$periodesOccupee[0] = array(
"dateDebut" => "2018-12-29",
"dateFin" => "2019-06-15"
);
$periodesOccupee[1] = array(
"dateDebut" => "2019-09-14",
"dateFin" => "2019-12-28"
);
$periodesOccupee[2] = array(
"dateDebut" => "2019-06-22",
"dateFin" => "2019-07-20"
);
$periodesOccupee[3] = array(
"dateDebut" => "2019-08-10",
"dateFin" => "2019-08-24"
);
$periodesOccupee[4] = array(
"dateDebut" => "2019-12-28",
"dateFin" => "2020-12-31"
);
$periodesOccupee[5] = array(
"dateDebut" => "2019-07-20",
"dateFin" => "2019-08-03"
);
/* méthoded */
class DTime
{
/**
* Constructeur
*
* @return void
*/
public function __construct()
{
}
/**
* Retourne la liste des jours entre 2 dates
*
* @param string $fromDate Date de départ yyyy-mm-dd
* @param string $toDate Date d'arrivée yyyy-mm-dd
*
* @return array $lstDays Liste des jours au format SQL
*/
public static function lstDateInInterval($fromDate, $toDate)
{
if ($toDate < $fromDate) {
return false;
}
$fromDate = DateTime::createFromFormat('Y-m-d', $fromDate);
$toDate = DateTime::createFromFormat('Y-m-d', $toDate);
$objDateInterval = new DatePeriod($fromDate, new DateInterval('P1D'), $toDate->modify('+1 day'));
foreach ($objDateInterval as $date) {
$lstDays[] = $date->format('Y-m-d');
}
return $lstDays;
}
/**
* Retourne une liste de périodes (date Debut date fin) à partir d'une liste de jours.
*
* @param array $listeJours Liste de jours
*
* @return array $listePeriodes Les périodes correcpondante à la liste
*/
public static function lstIntervalFromDays($listesJours)
{
$pointeur = 1; //Compteru du nombre de passage de la boucle (sert pour la première itération)
$nombreDeJour = count($listesJours); //Pour la dernière itération (détermine la dernière date de fin)
$pointeurTableau = 1; //Pointeru du tableau de destination
$changementPeriode = true; //Pour connaitre si un changement de période à eu lieu
$jourPrecedent = DTime::subDays($listesJours[0], 1); //Init du jour précédent la veille de la premère valeurs de liste des jours
$listePeriodes = array(); //Resultat de la méthode
foreach ($listesJours as $jourLibre) {
if ($changementPeriode == true) {
//1er jour d'une période
if ($pointeur == 1) {
//1er passage de la boucle le jour courant est le 1er jour de la période
$listePeriodes[$pointeurTableau]['dateDebut'] = $jourLibre;
} else {
//Sinon le 1er jour de la période est le jour précédent
$listePeriodes[$pointeurTableau]['dateDebut'] = $jourPrecedent;
}
$changementPeriode = false;
}
if ($jourPrecedent != DTime::subDays($jourLibre, 1)) {
//Le jour en cours n'est pas le suivant du précédent -> fin de la période
$listePeriodes[$pointeurTableau]['dateFin'] = $jourPrecedent;
$pointeurTableau++;
$changementPeriode = true;
}
if ($pointeur == $nombreDeJour) {
//Fin de la liste de jour
$listePeriodes[$pointeurTableau]['dateFin'] = $jourLibre;
}
//Enregistre le jour courant en jour précédent pour la prochaine itération
$jourPrecedent = $jourLibre;
$pointeur++;
}
return $listePeriodes;
}
}
/**
* Traitement
*/
/* Listes des jours libres depuis les périodes */
$listeJoursLibres = array();
foreach ($planningLibre as $periodesLibresTemp) {
$listeJoursLibresTemp[] = DTime::lstDateInInterval($periodesLibresTemp['dateDebut'], $periodesLibresTemp['dateFin']);
}
foreach ($listeJoursLibresTemp as $key => $valueTmp) {
foreach ($valueTmp as $value) {
$listeJoursLibres[] = $value;
}
}
/* Liste des jours occupés depuis les périodes */
$listeJoursOccupes = array();
foreach ($planningOccupe as $periodesOccupeTemp) {
$listeJoursOccupesTemp[] = DTime::lstDateInInterval($periodesOccupeTemp['dateDebut'], $periodesOccupeTemp['dateFin']);
}
foreach ($listeJoursOccupesTemp as $key => $valueTmp) {
foreach ($valueTmp as $value) {
$listeJoursOccupes[] = $value;
}
}
/* Enleve les jours occupés présent dans les jours libres */
$listeJoursLibres = array_diff($listeJoursLibres, $listeJoursOccupes);
$listeJoursLibres = array_unique($listeJoursLibres);
$listeJoursLibres = array_values($listeJoursLibres);
/* Transforme les jours en période */
$planningLibre = DTime::lstIntervalFromDays($listeJoursLibres);
/* Enlève les période ayant une date de fin passée */
foreach ($planningLibre as $key => $value) {
if ($value['dateFin'] < date('Y-m-d')) {
$listeKeyToDelete[] = $key;
}
}
foreach ($listeKeyToDelete as $keyToDelete) {
unset($planningLibre[$keyToDelete]);
}
$planningLibre = array_values($planningLibre); |
Partager