X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=plugins%2FMonthlyQuota.class.php;h=a42b78242f18798bbcbefe408b126363be45f563;hb=e1703495130c8ed88fe210f50a2a6b453b3c566b;hp=ed1c9f8cd17b49ba1fa4887e4d7f5582995dcb07;hpb=11441db31dcbed7b2070e800bcb1b0e6547b86bd;p=timetracker.git diff --git a/plugins/MonthlyQuota.class.php b/plugins/MonthlyQuota.class.php index ed1c9f8c..a42b7824 100644 --- a/plugins/MonthlyQuota.class.php +++ b/plugins/MonthlyQuota.class.php @@ -1,141 +1,114 @@ db = getConnection(); - $i18n = $GLOBALS['I18N']; - $this->holidays = $i18n->holidays; - } - - public function update($year, $month, $quota) { - $deleteSql = "DELETE FROM tt_monthly_quota WHERE year = $year AND month = $month"; - $this->db->exec($deleteSql); - $insertSql = "INSERT INTO tt_monthly_quota (year, month, quota) values ($year, $month, $quota)"; - $affected = $this->db->exec($insertSql); - return (!is_a($affected, 'PEAR_Error')); - } - - public function get($year, $month) { - - if (is_null($month)){ - return $this->getMany($year); - } - - return $this->getSingle($year, $month); - } - - private function getSingle($year, $month) { - - $sql = "SELECT quota FROM tt_monthly_quota WHERE year = $year AND month = $month"; - $reader = $this->db->query($sql); - if (is_a($reader, 'PEAR_Error')) { - return false; - } - - $row = $reader->fetchRow(); - - // if we don't find a record, return calculated monthly quota - if (is_null($row)){ - - $holidaysWithYear = array(); - foreach ($this->holidays as $day) { - $parts = explode("/", $day); - $holiday = "$year-$parts[0]-$parts[1]"; - array_push($holidaysWithYear, $holiday); - } - - $daysInMonth = cal_days_in_month(CAL_GREGORIAN, $month, $year); - return $this->getWorkingDays("$year-$month-01", "$year-$month-$daysInMonth", $holidaysWithYear) * 8; - } - - return $row["quota"]; + + var $db; // Database connection. + var $team_id; // Team id. + + // Old style constructors are DEPRECATED in PHP 7.0, and will be removed in a future version. You should always use __construct() in new code. + function __construct() { + $this->db = getConnection(); + global $user; + $this->team_id = $user->team_id; + } + + // update - deletes a quota, then inserts a new one. + public function update($year, $month, $quota) { + $teamId = $this->team_id; + $deleteSql = "DELETE FROM tt_monthly_quotas WHERE year = $year AND month = $month AND team_id = $teamId"; + $this->db->exec($deleteSql); + if ($quota){ + $insertSql = "INSERT INTO tt_monthly_quotas (team_id, year, month, quota) values ($teamId, $year, $month, $quota)"; + $affected = $this->db->exec($insertSql); + return (!is_a($affected, 'PEAR_Error')); } - - private function getMany($year){ - $sql = "SELECT year, month, quota FROM tt_monthly_quota WHERE year = $year"; - $result = array(); - $res = $this->db->query($sql); - if (is_a($res, 'PEAR_Error')) { - return false; - } - - while ($val = $res->fetchRow()) { - $result[$val["month"]] = $val["quota"]; - // $result[] = $val; - } - - return $result; + return true; + } + + // get - obtains either a single month quota or an array of quotas for an entire year. + public function get($year, $month) { + if (is_null($month)){ + return $this->getMany($year); } - - //The function returns the no. of business days between two dates and it skips the holidays - private function getWorkingDays($startDate, $endDate, $holidays) { - // do strtotime calculations just once - $endDate = strtotime($endDate); - $startDate = strtotime($startDate); + return $this->getSingle($year, $month); + } - //The total number of days between the two dates. We compute the no. of seconds and divide it to 60*60*24 - //We add one to inlude both dates in the interval. - $days = ($endDate - $startDate) / 86400 + 1; + // getSingle - obtains a quota for a single month. + private function getSingle($year, $month) { + $teamId = $this->team_id; + $sql = "SELECT quota FROM tt_monthly_quotas WHERE year = $year AND month = $month AND team_id = $teamId"; + $reader = $this->db->query($sql); + if (is_a($reader, 'PEAR_Error')) { + return false; + } - $noOfFullWeeks = floor($days / 7); - $noOfRemainingDays = fmod($days, 7); + $row = $reader->fetchRow(); + if ($row) + return $row['quota']; - //It will return 1 if it's Monday,.. ,7 for Sunday - $firstDayofWeek = date("N", $startDate); - $lastDayofWeek = date("N", $endDate); + // If we did not find a record, return a calculated monthly quota. + $numWorkdays = $this->getNumWorkdays($month, $year); + global $user; + return $numWorkdays * $user->workday_hours; + } - //---->The two can be equal in leap years when february has 29 days, the equal sign is added here - //In the first case the whole interval is within a week, in the second case the interval falls in two weeks. - if ($firstDayofWeek <= $lastDayofWeek) { - if ($firstDayofWeek <= 6 && 6 <= $lastDayofWeek) { - $noOfRemainingDays--; - } - - if ($firstDayofWeek <= 7 && 7 <= $lastDayofWeek) { - $noOfRemainingDays--; - } - } - else { - // (edit by Tokes to fix an edge case where the start day was a Sunday - // and the end day was NOT a Saturday) + // getMany - returns an array of quotas for a given year for team. + private function getMany($year){ + $teamId = $this->team_id; + $sql = "SELECT month, quota FROM tt_monthly_quotas WHERE year = $year AND team_id = $teamId"; + $result = array(); + $res = $this->db->query($sql); + if (is_a($res, 'PEAR_Error')) { + return false; + } - // the day of the week for start is later than the day of the week for end - if ($firstDayofWeek == 7) { - // if the start date is a Sunday, then we definitely subtract 1 day - $noOfRemainingDays--; + while ($val = $res->fetchRow()) { + $result[$val['month']] = $val['quota']; + } - if ($lastDayofWeek == 6) { - // if the end date is a Saturday, then we subtract another day - $noOfRemainingDays--; - } - } - else { - // the start date was a Saturday (or earlier), and the end date was (Mon..Fri) - // so we skip an entire weekend and subtract 2 days - $noOfRemainingDays -= 2; - } - } + return $result; + } - //T he no. of business days is: (number of weeks between the two dates) * (5 working days) + the remainder - // ---->february in none leap years gave a remainder of 0 but still calculated weekends between first and last day, this is one way to fix it - $workingDays = $noOfFullWeeks * 5; - if ($noOfRemainingDays > 0 ) { - $workingDays += $noOfRemainingDays; - } + // getNumWorkdays returns a number of work days in a given month. + private function getNumWorkdays($month, $year) { - // We subtract the holidays - foreach($holidays as $holiday){ - $timeStamp = strtotime($holiday); - // If the holiday doesn't fall in weekend - // TODO: add handling for countries where they move non working day to first working day if holiday is on weekends - if ($startDate <= $timeStamp && $timeStamp <= $endDate && date("N", $timeStamp) != 6 && date("N", $timeStamp ) != 7) - $workingDays--; - } + $daysInMonth = cal_days_in_month(CAL_GREGORIAN, $month, $year); // Number of calendar days in month. - return $workingDays; + $workdaysInMonth = 0; + // Iterate through the entire month. + for ($i = 1; $i <= $daysInMonth; $i++) { + $date = "$year-$month-$i"; + if (!ttTimeHelper::isWeekend($date) && !ttTimeHelper::isHoliday($date)) { + $workdaysInMonth++; + } } -} \ No newline at end of file + return $workdaysInMonth; + } +}