Fixed date format in Totals only reports.
authorNik Okuntseff <support@anuko.com>
Wed, 31 Oct 2018 17:08:48 +0000 (17:08 +0000)
committerNik Okuntseff <support@anuko.com>
Wed, 31 Oct 2018 17:08:48 +0000 (17:08 +0000)
WEB-INF/lib/ttReportHelper.class.php
WEB-INF/templates/footer.tpl
topdf.php

index 3940a51..7a4ba26 100644 (file)
@@ -127,9 +127,7 @@ class ttReportHelper {
     $canViewReports = $user->can('view_reports') || $user->can('view_all_reports');
     $isClient = $user->isClient();
 
-    $no_grouping = ($options['group_by1'] == null || $options['group_by1'] == 'no_grouping') &&
-                   ($options['group_by2'] == null || $options['group_by2'] == 'no_grouping') &&
-                   ($options['group_by3'] == null || $options['group_by3'] == 'no_grouping');
+    $grouping = ttReportHelper::grouping($options);
     $grouping_by_date = ($options['group_by1'] == 'date'|| $options['group_by2'] == 'date' || $options['group_by3'] == 'date');
     $grouping_by_client = ($options['group_by1'] == 'client'|| $options['group_by2'] == 'client' || $options['group_by3'] == 'client');
     $grouping_by_project = ($options['group_by1'] == 'project'|| $options['group_by2'] == 'project' || $options['group_by3'] == 'project');
@@ -311,14 +309,14 @@ class ttReportHelper {
 
     // Determine sort part.
     $sort_part = ' order by ';
-    if ($no_grouping)
-      $sort_part .= 'date';
-    else {
+    if ($grouping) {
       $sort_part2 .= ($options['group_by1'] != null && $options['group_by1'] != 'no_grouping') ? ', '.$options['group_by1'] : '';
       $sort_part2 .= ($options['group_by2'] != null && $options['group_by2'] != 'no_grouping') ? ', '.$options['group_by2'] : '';
       $sort_part2 .= ($options['group_by3'] != null && $options['group_by3'] != 'no_grouping') ? ', '.$options['group_by3'] : '';
       if (!$grouping_by_date) $sort_part2 .= ', date';
       $sort_part .= ltrim($sort_part2, ', '); // Remove leading comma and space.
+    } else {
+      $sort_part .= 'date';
     }
     if (($canViewReports || $isClient) && $options['users'] && !$grouping_by_user)
       $sort_part .= ', user, type';
@@ -349,7 +347,7 @@ class ttReportHelper {
           $val['expense'] = str_replace('.', $user->decimal_mark, $val['expense']);
       }
 
-      if (!$no_grouping) $val['grouped_by'] = ttReportHelper::makeGroupByKey($options, $val);
+      if ($grouping) $val['grouped_by'] = ttReportHelper::makeGroupByKey($options, $val);
       $val['date'] = ttDateToUserFormat($val['date']);
 
       $report_items[] = $val;
@@ -476,14 +474,15 @@ class ttReportHelper {
 //        $val['group_field'] = ttDateToUserFormat($val['group_field']);
 //      }
       $time = $val['time'] ? sec_to_time_fmt_hm($val['time']) : null;
+      $rowLabel = ttReportHelper::makeGroupByLabel($val['group_field'], $options);
       if ($options['show_cost']) {
         if ('.' != $user->decimal_mark) {
           $val['cost'] = str_replace('.', $user->decimal_mark, $val['cost']);
           $val['expenses'] = str_replace('.', $user->decimal_mark, $val['expenses']);
         }
-        $subtotals[$val['group_field']] = array('name'=>$val['group_field'],'time'=>$time, 'units'=> $val['units'], 'cost'=>$val['cost'],'expenses'=>$val['expenses']);
+        $subtotals[$val['group_field']] = array('name'=>$rowLabel,'time'=>$time, 'units'=> $val['units'], 'cost'=>$val['cost'],'expenses'=>$val['expenses']);
       } else
-        $subtotals[$val['group_field']] = array('name'=>$val['group_field'],'time'=>$time, 'units'=> $val['units']);
+        $subtotals[$val['group_field']] = array('name'=>$rowLabel,'time'=>$time, 'units'=> $val['units']);
     }
 
     return $subtotals;
@@ -1074,10 +1073,7 @@ class ttReportHelper {
   // makeGroupByPart builds a combined group by part for sql query for time items using group_by1,
   // group_by2, and group_by3 values passed in $options.
   static function makeGroupByPart($options) {
-    $no_grouping = ($options['group_by1'] == null || $options['group_by1'] == 'no_grouping') &&
-      ($options['group_by2'] == null || $options['group_by2'] == 'no_grouping') &&
-      ($options['group_by3'] == null || $options['group_by3'] == 'no_grouping');
-    if ($no_grouping) return null;
+    if (!ttReportHelper::grouping($options)) return null;
 
     $group_by1 = $options['group_by1'];
     $group_by2 = $options['group_by2'];
@@ -1411,7 +1407,7 @@ class ttReportHelper {
     return $group_by_fields;
   }
 
-  // grouping determines if we are grooping the project by either group_by1,
+  // grouping determines if we are grouping the report by either group_by1,
   // group_by2, or group_by3 values passed in $options.
   static function grouping($options) {
     $grouping = ($options['group_by1'] != null && $options['group_by1'] != 'no_grouping') ||
@@ -1426,6 +1422,16 @@ class ttReportHelper {
 
     return false;
   }
+  
+  // groupingBy determines if we are grouping a report by a value of $what
+  // ('user', 'project', etc.) by checking group_by1, group_by2, and group_by3
+  // values passed in $options.
+  static function groupingBy($what, $options) {
+    $grouping = ($options['group_by1'] != null && $options['group_by1'] != $what) ||
+      ($options['group_by2'] != null && $options['group_by2'] != $what) ||
+      ($options['group_by3'] != null && $options['group_by3'] != $what);
+    return $grouping;
+  }
 
   // makeGroupByHeader builds a column header for a totals-only report using group_by1,
   // group_by2, and group_by3 values passed in $options.
@@ -1471,4 +1477,24 @@ class ttReportHelper {
     $group_by_header = ltrim($group_by_header, ' -');
     return $group_by_header;
   }
+
+  // makeGroupByLabel builds a label for one row in a "Totals only" report of grouped by items.
+  // It does one thing: if we are grouping by date, the date format is converted for user.
+  static function makeGroupByLabel($key, $options) {
+    if (!ttReportHelper::groupingBy('date', $options))
+      return $key; // No need to format.
+
+    global $user;
+    if ($user->date_format == DB_DATEFORMAT)
+      return $key; // No need to format.
+
+    $label = $key;
+    if (preg_match('/\d\d\d\d-\d\d-\d\d/', $key, $matches)) {
+      // Replace the first found match of a date in DB_DATEFORMAT.
+      // This is not entirely clean but better than nothing for a label in a row.
+      $userDate = ttDateToUserFormat($matches[0]);
+      $label = str_replace($matches[0], $userDate, $key);
+    }
+    return $label;
+  }
 }
index bc3b468..d8a4447 100644 (file)
@@ -12,7 +12,7 @@
       <br>
       <table cellspacing="0" cellpadding="4" width="100%" border="0">
         <tr>
-          <td align="center">&nbsp;Anuko Time Tracker 1.18.03.4337 | Copyright &copy; <a href="https://www.anuko.com/lp/tt_3.htm" target="_blank">Anuko</a> |
+          <td align="center">&nbsp;Anuko Time Tracker 1.18.04.4338 | Copyright &copy; <a href="https://www.anuko.com/lp/tt_3.htm" target="_blank">Anuko</a> |
             <a href="https://www.anuko.com/lp/tt_4.htm" target="_blank">{$i18n.footer.credits}</a> |
             <a href="https://www.anuko.com/lp/tt_5.htm" target="_blank">{$i18n.footer.license}</a> |
             <a href="https://www.anuko.com/lp/tt_7.htm" target="_blank">{$i18n.footer.improve}</a>
index 0040c7b..23f29d5 100644 (file)
--- a/topdf.php
+++ b/topdf.php
@@ -66,7 +66,7 @@ $totals_only = ($bean->getAttribute('chtotalsonly') == '1');
 $options = ttReportHelper::getReportOptions($bean);
 if (!$totals_only)
   $items = ttReportHelper::getItems($options); // Individual entries.
-if ($totals_only || 'no_grouping' != $group_by1)
+if ($totals_only || ttReportHelper::grouping($options))
   $subtotals = ttReportHelper::getSubtotals($options); // Subtotals for groups of items.
 $totals = ttReportHelper::getTotals($options); // Totals for the entire report.