/** * @brief Permet de générer le code HTML d'un emploi du temps depuis une date de départ pour un praticien en particulier * @param DateTime $dateStart Date de départ * @param Doctor $doctor Praticien * @return String Code HTML */ public function getDoctorCalendar($dateStart, $doctor) { //var générales $dateStart->setTime($doctor->getStartHour("h"), 0, 0); $fromDate = $dateStart->getTimestamp(); $toDate = $dateStart->getTimestamp() + $this->nbrDays * 24 * 3600; $roundStart = true; //on commence à une heure PILE $roundEnd = true; //on fini à une heure PILE if ($doctor->getStartHour("m") > 0) { $roundStart = false; } if ($doctor->getEndHour("m") > 0) { $roundEnd = false; } //init $days = $this->getInterval($dateStart, $this->nbrDays); //tableau de DateTime $rdv = SchedulesManager::instance()->getSchedule($doctor->getIdMember(), $fromDate, $toDate); $rdv2 = SchedulesManager::instance()->getBlockSchedule($doctor->getIdMember(), $fromDate, $toDate); $rdv = array_merge($rdv, $rdv2); //vars de boucle $hours = ""; $result = ""; $nbrHours = ceil($doctor->getWorkTime() / 60.0); $hoursToHTML = $doctor->getWorkTime() * 60; //on corrige si endHour Minute < start hour ! if ($doctor->getStartHour('m') > 0) { if ($doctor->getEndHour('m') <= $doctor->getStartHour('m')) { $nbrHours++; } } $firstHourOfFirstDay = 0; // heure du premier jour de la quinzaine stocké en INT $hourWidth = floor(($this->width - $nbrHours) / $nbrHours); //px (on retire le border qui ajoute 1px) $d = 0; //début du draw $result .= "<div class='calendar-info-hours'>\n\t\t\t\t\t\t<div class='calendar-info-hour calendar-info-hour-first'></div>"; for ($i = 0; $i < $nbrHours; $i++) { $result .= "<div class='calendar-info-hour' style='width: " . $hourWidth . "px'>" . ($doctor->getStartHour('h') + $i) . "h</div>"; } $result .= "</div>"; foreach ($days as $day) { //chaque jours de la quinzaine récupérée if ($firstHourOfFirstDay == 0) { $firstHourOfFirstDay = $day->getTimestamp(); } $dayName = $this->days[$day->format('w')]; $dayNbr = $day->format('d'); $result .= "<div class='calendar-item'>\n\t\t\t\t\t\t\t<div class='calendar-day'>\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t" . $dayName . " " . $dayNbr . "\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class='calendar-hours' data-calendar-startHour='" . ($firstHourOfFirstDay + $doctor->getStartHour('m') * 60 + $d * 3600 * 24) . "' data-calendar-endHour='" . ($firstHourOfFirstDay + $doctor->getStartHour('m') * 60 + $d * 3600 * 24 + $hoursToHTML) . "'>"; for ($i = 0; $i < $nbrHours; $i++) { $cur = $firstHourOfFirstDay + $i * 3600 + $d * 3600 * 24; $result .= "<div class='calendar-hour' style='width: " . $hourWidth . "px' data-calendar-day='" . $cur . "' data-calendar-hour='" . ($doctor->getStartHour('h') + $i) . "'>"; $baseCalcul = $hourWidth / 3600; $left = 0; $width = 0; if ($i == 0 && $roundStart == false) { //on a un départ décalé $width = round($baseCalcul * ($doctor->getStartHour('m') * 60)); $result .= "<div class='calendar-rdv calendar-block' style='left: " . $left . "px; width: " . $width . "px'></div>"; } if ($i == $nbrHours - 1 && $roundEnd == false) { //on a un départ décalé $left = round($baseCalcul * ($doctor->getEndHour('m') * 60)); $width = $hourWidth - $left; $result .= "<div class='calendar-rdv calendar-block' style='left: " . $left . "px; width: " . $width . "px'></div>"; } foreach ($rdv as $sched) { $left = 0; $width = 0; if ($sched->getDateStart() >= $cur and $sched->getDateStart() <= $cur + 3600) { //le start est dans l'heure if ($sched->getDateStop() >= $cur and $sched->getDateStop() <= $cur + 3600) { //stop dans l'heure AUSSI $left = round($baseCalcul * ($sched->getDateStart() - $cur)); $width = round($baseCalcul * ($sched->getDateStop() - $sched->getDateStart())); } else { //stop pas dans l'heure $left = round($baseCalcul * ($sched->getDateStart() - $cur)); $width = $hourWidth - $left; } } else { if ($sched->getDateStop() >= $cur and $sched->getDateStop() <= $cur + 3600) { // le stop est dans l'heure mais pas le start $width = round($baseCalcul * ($sched->getDateStop() - $cur)); } else { if ($sched->getDateStop() >= $cur + 3600 and $sched->getDateStart() <= $cur) { //le stop et le start ne sont pas dans l'heure mais ils sont au delà et avant ! $width = $hourWidth; } } } if ($width != 0) { //si on doit dessiner un rdv/bloquage $class = "calendar-reserved"; $tmp = $sched->getIdMember(); if (!isset($tmp)) { $class = "calendar-block"; } $result .= "<div class='calendar-rdv " . $class . "' style='left: " . $left . "px; width: " . $width . "px'></div>"; } } $result .= "</div>"; } $result .= "</div></div>"; $d++; } return $result; }