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 // +----------------------------------------------------------------------+
 
  30 import('ttTimeHelper');
 
  32 // Definitions for chart types.
 
  33 define('CHART_PROJECTS', 1);
 
  34 define('CHART_TASKS', 2);
 
  35 define('CHART_CLIENTS', 3);
 
  37 // Class ttChartHelper is a helper class for charts.
 
  40   // getTotals - returns total times by project or task for a given user in a specified period.
 
  41   static function getTotals($user_id, $chart_type, $selected_date, $interval_type) {
 
  44     switch ($interval_type) {
 
  45       case INTERVAL_THIS_DAY:
 
  46         $period = new Period(INTERVAL_THIS_DAY, new DateAndTime(DB_DATEFORMAT, $selected_date));
 
  49       case INTERVAL_THIS_WEEK:
 
  50         $period = new Period(INTERVAL_THIS_WEEK, new DateAndTime(DB_DATEFORMAT, $selected_date));
 
  53       case INTERVAL_THIS_MONTH:
 
  54         $period = new Period(INTERVAL_THIS_MONTH, new DateAndTime(DB_DATEFORMAT, $selected_date));
 
  57       case INTERVAL_THIS_YEAR:
 
  58         $period = new Period(INTERVAL_THIS_YEAR, new DateAndTime(DB_DATEFORMAT, $selected_date));
 
  63     $mdb2 = getConnection();
 
  66     if ($period != null) {
 
  67       $q_period = " and date >= '".$period->getStartDate(DB_DATEFORMAT)."' and date <= '".$period->getEndDate(DB_DATEFORMAT)."'";
 
  69     if (CHART_PROJECTS == $chart_type) {
 
  71       $sql = "select p.name as name, sum(time_to_sec(l.duration)) as time from tt_log l
 
  72         left join tt_projects p on (p.id = l.project_id)
 
  73         where l.status = 1 and l.user_id = $user_id $q_period group by l.project_id";
 
  74     } elseif (CHART_TASKS == $chart_type) {
 
  76       $sql = "select t.name as name, sum(time_to_sec(l.duration)) as time from tt_log l
 
  77         left join tt_tasks t on (t.id = l.task_id)
 
  78         where l.status = 1 and l.user_id = $user_id $q_period group by l.task_id";
 
  79     } elseif (CHART_CLIENTS == $chart_type) {
 
  81       $sql = "select c.name as name, sum(time_to_sec(l.duration)) as time from tt_log l
 
  82         left join tt_clients c on (c.id = l.client_id)
 
  83         where l.status = 1 and l.user_id = $user_id $q_period group by l.client_id";
 
  86     $res = $mdb2->query($sql);
 
  87     if (!is_a($res, 'PEAR_Error')) {
 
  88       while ($val = $res->fetchRow()) {
 
  89         if ($val['time'] >= 0) // Only positive totals make sense in pie charts. Skip negatives entirely.
 
  90           $result[] = array('name'=>$val['name'],'time'=>$val['time']); // name - project name, time - total for project in seconds.
 
  94     // Get total time. We'll need it to calculate percentages (for labels to the right of diagram).
 
  96     foreach ($result as $one_val) {
 
  97       $total += $one_val['time'];
 
  99     // Add a string representation of time + percentage to names. Example: "Time Tracker (1:15 - 6%)".
 
 100     foreach ($result as &$one_val) {
 
 101       $percent = round(100*$one_val['time']/$total).'%';
 
 102       $one_val['name'] .= ' ('.ttTimeHelper::minutesToDuration($one_val['time'] / 60).' - '.$percent.')';
 
 105     // Note: the remaining code here is needed to display labels on the side of the diagram.
 
 106     // We print labels ourselves (not using libchart.php) because quality of libchart labels is not good.
 
 108     // Note: Optimize this sorting and reversing.
 
 109     $result = mu_sort($result, 'time');
 
 110     $result = array_reverse($result); // This is to assign correct colors to labels.
 
 112     // Add color to array items. This is used in labels on the side of a chart.
 
 123       array(142, 165, 250),
 
 124       array(162, 254, 239),
 
 125       array(137, 240, 166),
 
 130     for ($i = 0; $i < count($result); $i++) {
 
 131       $color = $colors[$i%count($colors)];
 
 132       $result[$i]['color_html'] = sprintf('#%02x%02x%02x', $color[0], $color[1], $color[2]);
 
 138   // adjustType - adjust chart type to something that is available for a group.
 
 139   static function adjustType($requested_type) {
 
 141     $tracking_mode = $user->getTrackingMode();
 
 142     $client_option = $user->isPluginEnabled('cl');
 
 144     // We have 3 possible options for chart type: projects, tasks, or clients.
 
 145     // Deal with each one individually.
 
 147     if ($requested_type == CHART_PROJECTS) {
 
 148       if ($tracking_mode == MODE_PROJECTS || $tracking_mode == MODE_PROJECTS_AND_TASKS)
 
 149         return CHART_PROJECTS;
 
 150       else if ($client_option)
 
 151         return CHART_CLIENTS;
 
 154     if ($requested_type == CHART_TASKS) {
 
 155       if ($tracking_mode == MODE_PROJECTS_AND_TASKS)
 
 157       if ($tracking_mode == MODE_PROJECTS)
 
 158         return CHART_PROJECTS;
 
 159       else if ($client_option)
 
 160         return CHART_CLIENTS;
 
 163     if ($requested_type == CHART_CLIENTS) {
 
 165         return CHART_CLIENTS;
 
 166       else if ($tracking_mode == MODE_PROJECTS || ($tracking_mode == MODE_PROJECTS_AND_TASKS))
 
 167         return CHART_PROJECTS;
 
 170     return  CHART_PROJECTS;