diff --git a/src/Dashboard.php b/src/Dashboard.php index 5d353ca..a90dc50 100644 --- a/src/Dashboard.php +++ b/src/Dashboard.php @@ -537,9 +537,9 @@ public function showActivityGraph($input) } } if (!empty($datat["begin"]) && !empty($datat["end"])) { - $values = $report->timeRepartition($datat['actiontime'] / $AllDay, $datat["begin"], $values, Report::$WORK, $mtitle, $holiday->getHolidays()); + $values = $report->timeRepartition($datat['actiontime'], $datat["begin"], $values, Report::$WORK, $mtitle, $holiday->getHolidays(), [], $AllDay); } else { - $values = $report->timeRepartition($datat['actiontime'] / $AllDay, $datat["date"], $values, Report::$WORK, $mtitle, $holiday->getHolidays()); + $values = $report->timeRepartition($datat['actiontime'], $datat["date"], $values, Report::$WORK, $mtitle, $holiday->getHolidays(), [], $AllDay); } } $intern = $values[0]; @@ -640,7 +640,7 @@ public function getActivities($users_id, $activities_id = 0) $values = []; if (count($result)) { foreach ($result as $data) { - $values = $report->timeRepartition($data['actiontime'] / $AllDay, $data["begin"], $values, Report::$WORK, $data['id'], $holiday->getHolidays(), ['real_hour' => true]); + $values = $report->timeRepartition($data['actiontime'], $data["begin"], $values, Report::$WORK, $data['id'], $holiday->getHolidays(), ['real_hour' => true], $AllDay); } $currentime = date("Y-m-d H:i:s"); @@ -703,7 +703,7 @@ public function getActivities($users_id, $activities_id = 0) // $isallday = true; //} - $values = $report->timeRepartition($datah['actiontime'] / $AllDay, $datah["begin"], $values, Report::$WORK, $datah["id"], $holiday->getHolidays()); + $values = $report->timeRepartition($datah['actiontime'], $datah["begin"], $values, Report::$WORK, $datah["id"], $holiday->getHolidays(), [], $AllDay); //if (empty($datah["type"])) { // $holidaytypes[$datah["id"]] = $datah["entity"]." > ".__('No defined type', 'activity'); @@ -768,9 +768,9 @@ public function getActivities($users_id, $activities_id = 0) if ($use_timerepartition > 0) { if (!empty($datat["begin"]) && !empty($datat["end"])) { - $alltickets = $report->timeRepartition($datat['actiontime'] / $AllDay, $datat["begin"], $alltickets, Report::$WORK, $mtitle, $holiday->getHolidays()); + $alltickets = $report->timeRepartition($datat['actiontime'], $datat["begin"], $alltickets, Report::$WORK, $mtitle, $holiday->getHolidays(), [], $AllDay); } else { - $alltickets = $report->timeRepartition($datat['actiontime'] / $AllDay, $datat["date"], $alltickets, Report::$WORK, $mtitle, $holiday->getHolidays()); + $alltickets = $report->timeRepartition($datat['actiontime'], $datat["date"], $alltickets, Report::$WORK, $mtitle, $holiday->getHolidays(), [], $AllDay); } } else { if (!empty($datat["begin"]) && !empty($datat["end"])) { diff --git a/src/Holiday.php b/src/Holiday.php index 8bbafca..657186e 100644 --- a/src/Holiday.php +++ b/src/Holiday.php @@ -230,7 +230,7 @@ function prepareInputForAdd($input) if (isset($input["actiontime"])) { $values = []; $report = new Report(); - $values = $report->timeRepartition($input['actiontime'] / $AllDay, $input["begin"], $values, Report::$WORK, $input['plugin_activity_holidaytypes_id'], $this->getHolidays()); + $values = $report->timeRepartition($input['actiontime'], $input["begin"], $values, Report::$WORK, $input['plugin_activity_holidaytypes_id'], $this->getHolidays(), [], $AllDay); foreach ($values as $k => $v) { foreach ($v as $key => $val) { diff --git a/src/PlanningExternalEvent.php b/src/PlanningExternalEvent.php index 82d76ac..94637a9 100644 --- a/src/PlanningExternalEvent.php +++ b/src/PlanningExternalEvent.php @@ -1234,7 +1234,7 @@ public static function getExternalEventWithActivityOnPeriod(string $begin, strin } $yearRegex .= ")"; - $table = PlanningExternalEvent::getTable(); + $table = \PlanningExternalEvent::getTable(); $entityTable = \Entity::getTable(); $categoryTable = PlanningEventCategory::getTable(); $subQueryCrit = [ diff --git a/src/Report.php b/src/Report.php index 232b550..2bcac00 100644 --- a/src/Report.php +++ b/src/Report.php @@ -461,7 +461,8 @@ function showCRA($input, $output_type, CraPDF $PDF, $pdfMode = false) $options = [ 'use_hours' => $use_hour_on_cra, - 'use_planning_activity_hours' => $use_planning_activity_hours + 'use_planning_activity_hours' => $use_planning_activity_hours, + 'arrondir_heure' => $use_hour_on_cra, ]; $holiday = new Holiday(); @@ -721,13 +722,14 @@ function showCRA($input, $output_type, CraPDF $PDF, $pdfMode = false) //End All Day planning Case // Repartition of the time $values = $this->timeRepartition( - $data2['actiontime'] / $AllDay, + $data2['actiontime'], $data2["begin"], $values, $opt_act, $type, $holiday->getHolidays(), - $options + $options, + $AllDay ); @@ -799,13 +801,14 @@ function showCRA($input, $output_type, CraPDF $PDF, $pdfMode = false) //End All Day planning Case // Repartition of the time $values = $this->timeRepartition( - $data2['actiontime'] / $AllDay, + $data2['actiontime'], $data2["begin"], $values, $opt_act, $type, $holiday->getHolidays(), - $options + $options, + $AllDay ); $this->item_search[$type]['PlanningExternalEvent'][date( @@ -884,7 +887,7 @@ function showCRA($input, $output_type, CraPDF $PDF, $pdfMode = false) $opt_act = self::$HOLIDAY; // Repartition of the time - $values = $this->timeRepartition($datah['actiontime'] / $AllDay, $datah["begin"], $values, $opt_act, $type, $holiday->getHolidays(), $options); + $values = $this->timeRepartition($datah['actiontime'], $datah["begin"], $values, $opt_act, $type, $holiday->getHolidays(), $options, $AllDay); if (!isset($this->holiday_type[$type])) { $this->holiday_type[$type]['is_holiday'] = $datah['is_holiday']; $this->holiday_type[$type]['is_sickness'] = $datah['is_sickness']; @@ -907,10 +910,10 @@ function showCRA($input, $output_type, CraPDF $PDF, $pdfMode = false) } } if (!empty($datat["begin"]) && !empty($datat["end"])) { - $values = $this->timeRepartition($datat['actiontime'] / $AllDay, $datat["begin"], $values, self::$WORK, $mtitle, $holiday->getHolidays(), $options); + $values = $this->timeRepartition($datat['actiontime'], $datat["begin"], $values, self::$WORK, $mtitle, $holiday->getHolidays(), $options, $AllDay); $this->item_search[$mtitle]['Ticket'][date('Y-m-d', strtotime($datat["begin"]))][] = $datat['tickets_id']; } else { - $values = $this->timeRepartition($datat['actiontime'] / $AllDay, $datat["date"], $values, self::$WORK, $mtitle, $holiday->getHolidays(), $options); + $values = $this->timeRepartition($datat['actiontime'], $datat["date"], $values, self::$WORK, $mtitle, $holiday->getHolidays(), $options, $AllDay); $this->item_search[$mtitle]['Ticket'][date('Y-m-d', strtotime($datat["date"]))][] = $datat['tickets_id']; } } @@ -983,7 +986,7 @@ function showCRA($input, $output_type, CraPDF $PDF, $pdfMode = false) $title[$mtitle][] = $dataTask["begin"]; // Repartition of the time - $values = $this->timeRepartition($dataTask['actiontime'] / $AllDay, $dataTask["begin"], $values, self::$WORK, $mtitle, $holiday->getHolidays(), $options); + $values = $this->timeRepartition($dataTask['actiontime'], $dataTask["begin"], $values, self::$WORK, $mtitle, $holiday->getHolidays(), $options, $AllDay); $this->item_search[$mtitle]['Ticket'][date('Y-m-d', strtotime($dataTask["begin"]))][] = $datam['tickets_id']; } @@ -1041,13 +1044,14 @@ function showCRA($input, $output_type, CraPDF $PDF, $pdfMode = false) (strtotime(self::$PM_BEGIN) - strtotime(self::$AM_END)); $values = $this->timeRepartition( - $planned_duration / $AllDay, + $planned_duration, $timestart->format('Y-m-d H:i:s'), $values, self::$WORK, $mtitle, $holiday->getHolidays(), - $options + $options, + $AllDay ); } $timestart->modify('+1 day'); @@ -1060,23 +1064,25 @@ function showCRA($input, $output_type, CraPDF $PDF, $pdfMode = false) $planned_duration = (strtotime($timeendFinal->format('Y-m-d H:i:s')) - strtotime($timestart->format('Y-m-d H:i:s')) - ($midi)); $values = $this->timeRepartition( - $planned_duration / $AllDay, + $planned_duration, $timestart->format('Y-m-d H:i:s'), $values, self::$WORK, $mtitle, $holiday->getHolidays(), - $options + $options, + $AllDay ); } else { $values = $this->timeRepartition( - $datapt['planned_duration'] / $AllDay, + $datapt['planned_duration'], $datapt["plan_start_date"], $values, self::$WORK, $mtitle, $holiday->getHolidays(), - $options + $options, + $AllDay ); } $this->item_search[$mtitle]['ProjectTask'][date('Y-m-d', strtotime($datapt["plan_start_date"]))][] = $datapt['projects_id']; @@ -1381,11 +1387,11 @@ function showCRA($input, $output_type, CraPDF $PDF, $pdfMode = false) if (count($iteratort)) { foreach ($iteratort as $datat) { $comment .= RichText::getTextFromHtml($datat["text"]) - . " (" . self::TotalTpsPassesArrondis($datat["actiontime"] / $AllDay, $options) . ")
"; + . " (" . self::TotalTpsPassesArrondis($use_hour_on_cra ? $datat["actiontime"] : ($datat["actiontime"] / $AllDay), $options) . ")
"; } } - $total_ouvres = self::TotalTpsPassesArrondis($data["total_actiontime"] / $AllDay, $options); + $total_ouvres = self::TotalTpsPassesArrondis($use_hour_on_cra ?$data["total_actiontime"] : ($data["total_actiontime"] / $AllDay), $options); $entry = [ 'category' => htmlspecialchars($data["name"], ENT_QUOTES), 'comment' => $comment, @@ -1406,10 +1412,10 @@ function showCRA($input, $output_type, CraPDF $PDF, $pdfMode = false) $comment = ""; foreach ($data['events'] as $datat) { $comment .= RichText::getTextFromHtml($datat["text"]) - . " (" . self::TotalTpsPassesArrondis($datat["actiontime"] / $AllDay, $options) . ")
"; + . " (" . self::TotalTpsPassesArrondis($use_hour_on_cra ? $datat["actiontime"] : ($datat["actiontime"] / $AllDay), $options) . ")
"; } - $total_ouvres = self::TotalTpsPassesArrondis($data["total_actiontime"] / $AllDay, $options); + $total_ouvres = self::TotalTpsPassesArrondis($use_hour_on_cra ?$data["total_actiontime"] : ($data["total_actiontime"] / $AllDay), $options); $entry = [ 'category' => htmlspecialchars($data["category_name"], ENT_QUOTES), 'comment' => $comment, @@ -1474,7 +1480,7 @@ function showCRA($input, $output_type, CraPDF $PDF, $pdfMode = false) * * @return array */ - function timeRepartition($time, $begin, $values, $type, $activity, $holidays = [], $options = []) + function timeRepartition($time, $begin, $values, $type, $activity, $holidays = [], $options = [], $allDay = 86400) { $opt = [ 'real_hour' => false, @@ -1484,9 +1490,12 @@ function timeRepartition($time, $begin, $values, $type, $activity, $holidays = [ foreach ($options as $key => $value) { $opt[$key] = $value; } - if ($time > 1) { + + $timejour = $time / $allDay; + + if ($timejour > 1) { if ($opt['use_hours']) { - for ($i = 0; $i < $time; $i++) { + for ($i = 0; $i < $timejour; $i++) { $date_add = date('Y-m-d', strtotime($begin . ' + ' . $i . ' DAY')); $h = date("H:i:s", strtotime($begin)); @@ -1496,14 +1505,16 @@ function timeRepartition($time, $begin, $values, $type, $activity, $holidays = [ $hour = self::$PM_BEGIN; } - if ($time >= ($i + 1)) { + if ($timejour >= ($i + 1)) { // more than one day remaining => add a full day to $date_add $toAdd = 1; } else { // add the remaining percentage to $date_add - $toAdd = $time - $i; + $toAdd = $timejour - $i; } + $toAdd = $toAdd * $allDay; + $values = self::setTimes( $toAdd, $opt['real_hour'] ? $h : $hour, @@ -1511,11 +1522,14 @@ function timeRepartition($time, $begin, $values, $type, $activity, $holidays = [ $values, $type, $activity, - $holidays + $holidays, + $timejour, + $allDay, + $options ); } } else { - $tot = $time * 100; + $tot = $timejour * 100; $add = 0; for ($i = 0; $i < $tot; $i = $i + 25) { $mod = $i % 4; @@ -1533,22 +1547,22 @@ function timeRepartition($time, $begin, $values, $type, $activity, $holidays = [ $hour = self::$PM_BEGIN; } - $values = self::setTimes(0.25, $opt['real_hour'] ? $h : $hour, $date_add, $values, $type, $activity, $holidays); + $values = self::setTimes(0.25, $opt['real_hour'] ? $h : $hour, $date_add, $values, $type, $activity, $holidays, $timejour, $allDay, $options); } } - } elseif ($time == 1) { + } elseif ($timejour == 1) { $date_add = date('Y-m-d', strtotime($begin)); $h = date("H:i:s", strtotime($begin)); if ($h > self::$AM_END) { $hour = self::$PM_BEGIN; - $values = self::setTimes(0.5, $opt['real_hour'] ? $h : $hour, $date_add, $values, $type, $activity, $holidays); + $values = self::setTimes($opt['use_hours'] ? $allDay / 2 : 0.5, $opt['real_hour'] ? $h : $hour, $date_add, $values, $type, $activity, $holidays, $timejour, $allDay, $options); $date_add = date('Y-m-d', strtotime($begin . ' + 1 DAY')); $hour = self::getAmBegin(); - $values = self::setTimes(0.5, $opt['real_hour'] ? $h : $hour, $date_add, $values, $type, $activity, $holidays); + $values = self::setTimes($opt['use_hours'] ? $allDay / 2 : 0.5, $opt['real_hour'] ? $h : $hour, $date_add, $values, $type, $activity, $holidays, $timejour, $allDay, $options); } else { $hour = self::getAmBegin(); - $values = self::setTimes(1, $opt['real_hour'] ? $h : $hour, $date_add, $values, $type, $activity, $holidays); + $values = self::setTimes($opt['use_hours'] ? $allDay : 1, $opt['real_hour'] ? $h : $hour, $date_add, $values, $type, $activity, $holidays, $timejour, $allDay, $options); } } else { $date_add = date('Y-m-d', strtotime($begin)); @@ -1559,7 +1573,7 @@ function timeRepartition($time, $begin, $values, $type, $activity, $holidays = [ $hour = self::$PM_BEGIN; } - $values = self::setTimes($time, $opt['real_hour'] ? $h : $hour, $date_add, $values, $type, $activity, $holidays); + $values = self::setTimes($opt['use_hours'] ? $time : $timejour, $opt['real_hour'] ? $h : $hour, $date_add, $values, $type, $activity, $holidays, $timejour, $allDay, $options); } return $values; @@ -1638,7 +1652,7 @@ function getActionTime($begin, $end, $values, $actiontime, $type) * * @return array */ - static function setTimes($time, $hour, $date_add, $values, $type, $activity, $holidays = []) + static function setTimes($time, $hour, $date_add, $values, $type, $activity, $holidays = [], $timejour, $allDay, $options) { $holiday = new Holiday(); $isWe = $holiday->countWe($date_add, $date_add, $holidays); @@ -1681,23 +1695,31 @@ static function setTimes($time, $hour, $date_add, $values, $type, $activity, $ho $exeedingDay = 0; $exeedingAM = 0; $exeedingPM = 0; - if ($countAll + $time > 1) { + if (($options['use_hours'] && (($countAll / $allDay) + $timejour) > 1)) { + $exeedingDay = 1; + } elseif (! $options['use_hours'] && ($countAll + $timejour) > 1) { $exeedingDay = 1; } - if ($hour <= self::$AM_END && $countAM + $time > 0.5 && $countAM > 0) { + + if ($hour <= self::$AM_END && $countAM > 0 && + (($options['use_hours'] && (($countAM / $allDay) + $timejour > 0.5)) || + (!$options['use_hours'] && ($countAM + $timejour > 0.5)))) { $exeedingAM = 1; } - if ($hour >= self::$PM_BEGIN && $countPM + $time > 0.5) { + + if ($hour >= self::$PM_BEGIN && + (($options['use_hours'] && (($countPM/ $allDay) + $timejour > 0.5)) || + (!$options['use_hours'] && ($countPM + $timejour > 0.5)))){ $exeedingPM = 1; } // Is AM+PM exceeding ? if ($exeedingDay || $exeedingPM) { - if ($countAll - $time < 0) { + if (($options['use_hours'] && ($countAll / $allDay) - $timejour < 0) || (!$options['use_hours'] && ($countAll - $timejour < 0))) { $values[$type][$activity][$date_add . ' ' . self::getAmBegin()] = $time; - $values = self::setTimes($countAll, self::getAmBegin(), date('Y-m-d', strtotime($date_add . ' + 1 DAY')), $values, $type, $activity, $holidays); + $values = self::setTimes($countAll, self::getAmBegin(), date('Y-m-d', strtotime($date_add . ' + 1 DAY')), $values, $type, $activity, $holidays, $options['use_hours'] ? ($countAll / $allDay) : $countAll, $allDay, $options); } else { - $values = self::setTimes($time, self::getAmBegin(), date('Y-m-d', strtotime($date_add . ' + 1 DAY')), $values, $type, $activity, $holidays); + $values = self::setTimes($time, self::getAmBegin(), date('Y-m-d', strtotime($date_add . ' + 1 DAY')), $values, $type, $activity, $holidays, $options['use_hours'] ? ($time / $allDay) : $time, $allDay, $options); } // Appending/adding time @@ -1718,7 +1740,7 @@ static function setTimes($time, $hour, $date_add, $values, $type, $activity, $ho // No addition weekend, trying next day } else { - $values = self::setTimes($time, self::getAmBegin(), date('Y-m-d', strtotime($date_add . ' + 1 DAY')), $values, $type, $activity, $holidays); + $values = self::setTimes($time, self::getAmBegin(), date('Y-m-d', strtotime($date_add . ' + 1 DAY')), $values, $type, $activity, $holidays, $options['use_hours'] ? ($time / $allDay) : $time, $allDay, $options); } return $values; } @@ -2139,8 +2161,17 @@ static function TotalTpsPassesArrondis($a_arrondir, $options = []) $allday = 3600*24; } - $hour = ((float) $a_arrondir)* (float)$allday; - $a_arrondir = $hour / 3600; + $optconf = new Option(); + $optconf->getFromDB(1); + + + if ($optconf->fields['use_hour_on_cra']) { + $a_arrondir = ((float)$a_arrondir) / 3600; + } else { + $hour = ((float) $a_arrondir)* (float)$allday; + $a_arrondir = $hour / 3600; + } + $tranches_arrondi = [0,0.25,0.5,0.75,1]; } @@ -2236,6 +2267,8 @@ private function addEventToValues(array &$values, DateTime $begin, DateTime $end { $dateBegin = $begin->format('Y-m-d'); $dateEnd = $end->format('Y-m-d'); + $opt = new Option(); + $opt->getFromDB(1); if ($dateBegin != $dateEnd) { $loopDate = $dateBegin; while ($loopDate <= $dateEnd) { @@ -2247,7 +2280,11 @@ private function addEventToValues(array &$values, DateTime $begin, DateTime $end $dateTimeLoop->format('Y-m-d').' 00:00:00', $event ); - $dayLength = round($actionTime / (60 * 60 * 24), 4,PHP_ROUND_HALF_UP); + if ($opt->fields['use_hour_on_cra']) { + $dayLength = $event['actiontime']; + } else { + $dayLength = round($actionTime / (60 * 60 * 24), 4, PHP_ROUND_HALF_UP); + } if (isset($values[$part][$title][$loopDate . ' 00:00:00'])) { $values[$part][$title][$loopDate . ' 00:00:00'] += $dayLength; } else { @@ -2260,7 +2297,11 @@ private function addEventToValues(array &$values, DateTime $begin, DateTime $end $loopDate = $dateTimeLoop->format('Y-m-d'); } } else { - $dayLength = round($event['actiontime'] / (60 * 60 * 24), 4, PHP_ROUND_HALF_UP); + if ($opt->fields['use_hour_on_cra']) { + $dayLength = $event['actiontime']; + } else { + $dayLength = round($event['actiontime'] / (60 * 60 * 24), 4, PHP_ROUND_HALF_UP); + } if (isset($values[$part][$title][$dateBegin . ' 00:00:00'])) { $values[$part][$title][$dateBegin . ' 00:00:00'] += $dayLength; } else { diff --git a/src/TicketTask.php b/src/TicketTask.php index 4f8d6ec..5da7e7b 100644 --- a/src/TicketTask.php +++ b/src/TicketTask.php @@ -313,12 +313,12 @@ static function populatePlanning($options = []) if (!$datat['is_private']) { if ($opt->fields['use_timerepartition']) { $allTickets = $report->timeRepartition( - $datat['actiontime'] / $AllDay, + $datat['actiontime'], $begin, $allTickets, Report::$WORK, $mtitle, - $holiday->getHolidays() + $holiday->getHolidays(), [], $AllDay ); } else { $allTickets[0][$mtitle][$begin] = $datat['actiontime'] / $AllDay; @@ -326,12 +326,12 @@ static function populatePlanning($options = []) } else { if ($opt->fields['use_timerepartition']) { $privateTickets = $report->timeRepartition( - $datat['actiontime'] / $AllDay, + $datat['actiontime'], $begin, $privateTickets, Report::$WORK, $mtitle, - $holiday->getHolidays() + $holiday->getHolidays(), [], $AllDay ); } else { $privateTickets[0][$mtitle][$begin] = $datat['actiontime'] / $AllDay;