Refactoring - mostly white space.
[timetracker.git] / plugins / MonthlyQuota.class.php
1 <?php
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.
10 // |
11 // | There are only two ways to violate the license:
12 // |
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).
16 // |
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).
20 // |
21 // | This license applies to this document only, not any other software
22 // | that it may be combined with.
23 // |
24 // +----------------------------------------------------------------------+
25 // | Contributors:
26 // | https://www.anuko.com/time_tracker/credits.htm
27 // +----------------------------------------------------------------------+
28
29 // MontlyQuota class implements handling of work hour quotas.
30 class MonthlyQuota {
31
32   var $db;       // Database connection.
33   var $team_id;  // Team id.
34
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();
38     global $user;
39     $this->team_id = $user->team_id;
40   }
41
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);
47     if ($quota){
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'));
51     }
52     return true;
53   }
54
55   // get - obtains either a single month quota or an array of quotas for an entire year.
56   public function get($year, $month) {
57     if (is_null($month)){
58       return $this->getMany($year);
59     }
60     return $this->getSingle($year, $month);
61   }
62
63   // getWorkdayHours - obtains workday_hours value for a team from the database.
64   public function getWorkdayHours(){
65     $teamId = $this->team_id;
66     $sql = "SELECT workday_hours FROM tt_teams where id = $teamId";
67     $reader = $this->db->query($sql);
68     if (is_a($reader, 'PEAR_Error')) {
69       return false;
70     }
71
72     $row = $reader->fetchRow();
73     return $row['workday_hours'];
74   }
75
76   // getSingle - obtains a quota for a single month.
77   private function getSingle($year, $month) {
78     $teamId = $this->team_id;
79     $sql = "SELECT quota FROM tt_monthly_quotas WHERE year = $year AND month = $month AND team_id = $teamId";
80     $reader = $this->db->query($sql);
81     if (is_a($reader, 'PEAR_Error')) {
82       return false;
83     }
84
85     $row = $reader->fetchRow();
86     if ($row)
87       return $row['quota'];
88
89     // If we did not find a record, return a calculated monthly quota.
90     $numWorkdays = $this->getNumWorkdays($month, $year);
91     return $numWorkdays * $this->getWorkdayHours();
92   }
93
94   // getMany - returns an array of quotas for a given year for team.
95   private function getMany($year){
96     $teamId = $this->team_id;
97     $sql = "SELECT month, quota FROM tt_monthly_quotas WHERE year = $year AND team_id = $teamId";
98     $result = array();
99     $res = $this->db->query($sql);
100     if (is_a($res, 'PEAR_Error')) {
101       return false;
102     }
103
104     while ($val = $res->fetchRow()) {
105       $result[$val['month']] = $val['quota'];
106     }
107
108     return $result;
109   }
110
111   // getNumWorkdays returns a number of work days in a given month.
112   private function getNumWorkdays($month, $year) {
113
114     $daysInMonth = cal_days_in_month(CAL_GREGORIAN, $month, $year); // Number of calendar days in month.
115
116     $workdaysInMonth = 0;
117     // Iterate through the entire month.
118     for ($i = 1; $i <= $daysInMonth; $i++) {
119       $date = "$year-$month-$i";
120       if (!ttTimeHelper::isWeekend($date) && !ttTimeHelper::isHoliday($date)) {
121         $workdaysInMonth++;
122       }
123     }
124     return $workdaysInMonth;
125   }
126 }