2 // +----------------------------------------------------------------------+
 
   3 // | Anuko Time Tracker
 
   4 // +----------------------------------------------------------------------+
 
   5 // | Copyright (c) Anuko International Ltd. (https://www.anuko.com)
 
   6 // +----------------------------------------------------------------------+
 
   7 // | LIBERAL FREEWARE LICENSE: This source code document may be used
 
   8 // | by anyone for any purpose, and freely redistributed alone or in
 
   9 // | combination with other software, provided that the license is obeyed.
 
  11 // | There are only two ways to violate the license:
 
  13 // | 1. To redistribute this code in source form, with the copyright
 
  14 // |    notice or license removed or altered. (Distributing in compiled
 
  15 // |    forms without embedded copyright notices is permitted).
 
  17 // | 2. To redistribute modified versions of this code in *any* form
 
  18 // |    that bears insufficient indications that the modifications are
 
  19 // |    not the work of the original author(s).
 
  21 // | This license applies to this document only, not any other software
 
  22 // | that it may be combined with.
 
  24 // +----------------------------------------------------------------------+
 
  26 // | https://www.anuko.com/time_tracker/credits.htm
 
  27 // +----------------------------------------------------------------------+
 
  29 // MontlyQuota class implements handling of work hour quotas.
 
  32   var $db;       // Database connection.
 
  33   var $team_id;  // Team id.
 
  35   // 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.
 
  36   function __construct() {
 
  37     $this->db = getConnection();
 
  39     $this->team_id = $user->team_id;
 
  42   // update - deletes a quota, then inserts a new one.
 
  43   public function update($year, $month, $quota) {
 
  44     $teamId = $this->team_id;
 
  45     $deleteSql = "DELETE FROM tt_monthly_quotas WHERE year = $year AND month = $month AND team_id = $teamId";
 
  46     $this->db->exec($deleteSql);
 
  48       $insertSql = "INSERT INTO tt_monthly_quotas (team_id, year, month, quota) values ($teamId, $year, $month, $quota)";
 
  49       $affected = $this->db->exec($insertSql);
 
  50       return (!is_a($affected, 'PEAR_Error'));
 
  55   // get - obtains either a single month quota or an array of quotas for an entire year.
 
  56   public function get($year, $month) {
 
  58       return $this->getMany($year);
 
  60     return $this->getSingle($year, $month);
 
  63   // getSingle - obtains a quota for a single month.
 
  64   private function getSingle($year, $month) {
 
  65     $teamId = $this->team_id;
 
  66     $sql = "SELECT quota FROM tt_monthly_quotas WHERE year = $year AND month = $month AND team_id = $teamId";
 
  67     $reader = $this->db->query($sql);
 
  68     if (is_a($reader, 'PEAR_Error')) {
 
  72     $row = $reader->fetchRow();
 
  76     // If we did not find a record, return a calculated monthly quota.
 
  77     $numWorkdays = $this->getNumWorkdays($month, $year);
 
  79     return $numWorkdays * $user->workday_hours;
 
  82   // getMany - returns an array of quotas for a given year for team.
 
  83   private function getMany($year){
 
  84     $teamId = $this->team_id;
 
  85     $sql = "SELECT month, quota FROM tt_monthly_quotas WHERE year = $year AND team_id = $teamId";
 
  87     $res = $this->db->query($sql);
 
  88     if (is_a($res, 'PEAR_Error')) {
 
  92     while ($val = $res->fetchRow()) {
 
  93       $result[$val['month']] = $val['quota'];
 
  99   // getNumWorkdays returns a number of work days in a given month.
 
 100   private function getNumWorkdays($month, $year) {
 
 102     $daysInMonth = cal_days_in_month(CAL_GREGORIAN, $month, $year); // Number of calendar days in month.
 
 104     $workdaysInMonth = 0;
 
 105     // Iterate through the entire month.
 
 106     for ($i = 1; $i <= $daysInMonth; $i++) {
 
 107       $date = "$year-$month-$i";
 
 108       if (!ttTimeHelper::isWeekend($date) && !ttTimeHelper::isHoliday($date)) {
 
 112     return $workdaysInMonth;