// +----------------------------------------------------------------------+
import('Period');
+import('ttTimeHelper');
// Definitions for chart types.
define('CHART_PROJECTS', 1);
class ttChartHelper {
// getTotals - returns total times by project or task for a given user in a specified period.
- static function getTotals($user_id, $ch_type, $cl_date, $cl_period = null) {
+ static function getTotals($user_id, $chart_type, $selected_date, $interval_type) {
$period = null;
- if (isset($cl_period) && isset($cl_date)) {
- switch ($cl_period) {
- case INTERVAL_THIS_DAY:
- $period = new Period(INTERVAL_THIS_DAY, new DateAndTime(DB_DATEFORMAT, $cl_date));
- break;
+ switch ($interval_type) {
+ case INTERVAL_THIS_DAY:
+ $period = new Period(INTERVAL_THIS_DAY, new DateAndTime(DB_DATEFORMAT, $selected_date));
+ break;
- case INTERVAL_THIS_WEEK:
- $period = new Period(INTERVAL_THIS_WEEK, new DateAndTime(DB_DATEFORMAT, $cl_date));
- break;
+ case INTERVAL_THIS_WEEK:
+ $period = new Period(INTERVAL_THIS_WEEK, new DateAndTime(DB_DATEFORMAT, $selected_date));
+ break;
- case INTERVAL_THIS_MONTH:
- $period = new Period(INTERVAL_THIS_MONTH, new DateAndTime(DB_DATEFORMAT, $cl_date));
- break;
+ case INTERVAL_THIS_MONTH:
+ $period = new Period(INTERVAL_THIS_MONTH, new DateAndTime(DB_DATEFORMAT, $selected_date));
+ break;
- case INTERVAL_THIS_YEAR:
- $period = new Period(INTERVAL_THIS_YEAR, new DateAndTime(DB_DATEFORMAT, $cl_date));
- break;
- }
+ case INTERVAL_THIS_YEAR:
+ $period = new Period(INTERVAL_THIS_YEAR, new DateAndTime(DB_DATEFORMAT, $selected_date));
+ break;
}
$result = array();
$q_period = '';
if ($period != null) {
- $q_period = " and date >= '".$period->getBeginDate(DB_DATEFORMAT)."' and date <= '".$period->getEndDate(DB_DATEFORMAT)."'";
+ $q_period = " and date >= '".$period->getStartDate(DB_DATEFORMAT)."' and date <= '".$period->getEndDate(DB_DATEFORMAT)."'";
}
- if (CHART_PROJECTS == $ch_type) {
+ if (CHART_PROJECTS == $chart_type) {
// Data for projects.
$sql = "select p.name as name, sum(time_to_sec(l.duration)) as time from tt_log l
left join tt_projects p on (p.id = l.project_id)
- where l.status = 1 and l.duration > 0 and l.user_id = $user_id $q_period group by l.project_id";
- } elseif (CHART_TASKS == $ch_type) {
+ where l.status = 1 and l.user_id = $user_id $q_period group by l.project_id";
+ } elseif (CHART_TASKS == $chart_type) {
// Data for tasks.
$sql = "select t.name as name, sum(time_to_sec(l.duration)) as time from tt_log l
left join tt_tasks t on (t.id = l.task_id)
- where l.status = 1 and l.duration > 0 and l.user_id = $user_id $q_period group by l.task_id";
- } elseif (CHART_CLIENTS == $ch_type) {
+ where l.status = 1 and l.user_id = $user_id $q_period group by l.task_id";
+ } elseif (CHART_CLIENTS == $chart_type) {
// Data for clients.
- $sql = "select coalesce(c.name, 'NULL') as name, sum(time_to_sec(l.duration)) as time from tt_log l
+ $sql = "select c.name as name, sum(time_to_sec(l.duration)) as time from tt_log l
left join tt_clients c on (c.id = l.client_id)
- where l.status = 1 and l.duration > 0 and l.user_id = $user_id $q_period group by l.client_id";
+ where l.status = 1 and l.user_id = $user_id $q_period group by l.client_id";
}
$res = $mdb2->query($sql);
if (!is_a($res, 'PEAR_Error')) {
while ($val = $res->fetchRow()) {
- $result[] = array('name'=>$val['name'],'time'=>$val['time']); // name - project name, time - total for project in seconds.
+ if ($val['time'] >= 0) // Only positive totals make sense in pie charts. Skip negatives entirely.
+ $result[] = array('name'=>$val['name'],'time'=>$val['time']); // name - project name, time - total for project in seconds.
}
}
// Add a string representation of time + percentage to names. Example: "Time Tracker (1:15 - 6%)".
foreach ($result as &$one_val) {
$percent = round(100*$one_val['time']/$total).'%';
- $one_val['name'] .= ' ('.sec_to_time_fmt_hm($one_val['time']).' - '.$percent.')';
+ $one_val['name'] .= ' ('.ttTimeHelper::minutesToDuration($one_val['time'] / 60).' - '.$percent.')';
}
// Note: the remaining code here is needed to display labels on the side of the diagram.
return $result;
}
+
+ // adjustType - adjust chart type to something that is available for a group.
+ static function adjustType($requested_type) {
+ global $user;
+ $tracking_mode = $user->getTrackingMode();
+ $client_option = $user->isPluginEnabled('cl');
+
+ // We have 3 possible options for chart type: projects, tasks, or clients.
+ // Deal with each one individually.
+
+ if ($requested_type == CHART_PROJECTS) {
+ if ($tracking_mode == MODE_PROJECTS || $tracking_mode == MODE_PROJECTS_AND_TASKS)
+ return CHART_PROJECTS;
+ else if ($client_option)
+ return CHART_CLIENTS;
+ }
+
+ if ($requested_type == CHART_TASKS) {
+ if ($tracking_mode == MODE_PROJECTS_AND_TASKS)
+ return CHART_TASKS;
+ if ($tracking_mode == MODE_PROJECTS)
+ return CHART_PROJECTS;
+ else if ($client_option)
+ return CHART_CLIENTS;
+ }
+
+ if ($requested_type == CHART_CLIENTS) {
+ if ($client_option)
+ return CHART_CLIENTS;
+ else if ($tracking_mode == MODE_PROJECTS || ($tracking_mode == MODE_PROJECTS_AND_TASKS))
+ return CHART_PROJECTS;
+ }
+
+ return CHART_PROJECTS;
+ }
}