A fix for column span for user reports.
[timetracker.git] / WEB-INF / lib / ttReportHelper.class.php
index 7d2e40c..4de5a48 100644 (file)
@@ -107,12 +107,6 @@ class ttReportHelper {
     $group_id = $user->getGroup();
     $org_id = $user->org_id;
 
-    // A shortcut for timesheets.
-    if ($options['timesheet_id']) {
-      $where = " where ei.timesheet_id = ".$options['timesheet_id']." and ei.group_id = $group_id and ei.org_id = $org_id";
-      return $where;
-    }
-
     // Prepare dropdown parts.
     $dropdown_parts = '';
     if ($options['client_id'])
@@ -122,8 +116,9 @@ class ttReportHelper {
     if ($options['project_id']) $dropdown_parts .= ' and ei.project_id = '.$options['project_id'];
     if ($options['invoice']=='1') $dropdown_parts .= ' and ei.invoice_id is not null';
     if ($options['invoice']=='2') $dropdown_parts .= ' and ei.invoice_id is null';
-    if ($options['timesheet']==TIMESHEET_NOT_ASSIGNED) $dropdown_parts .= ' and ei.timesheet_id is null';
-    if ($options['timesheet']==TIMESHEET_ASSIGNED) $dropdown_parts .= ' and ei.timesheet_id is not null';
+    if (isset($options['timesheet']) && ($options['timesheet']!=TIMESHEET_ALL && $options['timesheet']!=TIMESHEET_NOT_ASSIGNED)) {
+        $dropdown_parts .= ' and 0 = 1'; // Expense items do not have a timesheet_id.
+    }
     if ($options['approved']=='1') $dropdown_parts .= ' and ei.approved = 1';
     if ($options['approved']=='2') $dropdown_parts .= ' and ei.approved = 0';
     if ($options['paid_status']=='1') $dropdown_parts .= ' and ei.paid = 1';
@@ -353,7 +348,7 @@ class ttReportHelper {
       if (($canViewReports || $isClient) && $options['show_invoice'])
         array_push($fields, 'i.name as invoice');
       if ($options['show_timesheet'])
-        array_push($fields, 'ts.name as timesheet_name');
+        array_push($fields, 'null as timesheet_name');
 
       // Prepare sql query part for left joins.
       $left_joins = null;
@@ -366,24 +361,10 @@ class ttReportHelper {
       if (($canViewReports || $isClient) && $options['show_invoice'])
         $left_joins .= " left join tt_invoices i on (i.id = ei.invoice_id and i.status = 1)";
 
-      // Prepare sql query part for inner joins.
-      $inner_joins = null;
-      if ($user->isPluginEnabled('ts')) {
-        $timesheet_option = $options['timesheet'];
-        if ($timesheet_option == TIMESHEET_PENDING)
-          $inner_joins .= " inner join tt_timesheets ts on (ei.timesheet_id = ts.id and ts.submit_status = 1 and ts.approve_status is null)";
-        else if ($timesheet_option == TIMESHEET_APPROVED)
-          $inner_joins .= " inner join tt_timesheets ts on (ei.timesheet_id = ts.id and ts.approve_status = 1)";
-        else if ($timesheet_option == TIMESHEET_NOT_APPROVED)
-          $inner_joins .= " inner join tt_timesheets ts on (ei.timesheet_id = ts.id and ts.approve_status = 0)";
-        else if ($options['show_timesheet'])
-          $inner_joins .= " left join tt_timesheets ts on (ei.timesheet_id = ts.id)"; // Left join for timesheet name.
-      }
-
       $where = ttReportHelper::getExpenseWhere($options);
 
       // Construct sql query for expense items.
-      $sql_for_expense_items = "select ".join(', ', $fields)." from tt_expense_items ei $left_joins $inner_joins $where";
+      $sql_for_expense_items = "select ".join(', ', $fields)." from tt_expense_items ei $left_joins $where";
 
       // Construct a union.
       $sql = "($sql) union all ($sql_for_expense_items)";
@@ -577,21 +558,10 @@ class ttReportHelper {
 
     // If we have expenses, query becomes a bit more complex.
     if ($options['show_cost'] && $user->isPluginEnabled('ex')) {
-      // Prepare sql query part for inner joins.
-      $inner_joins = null;
-      if ($user->isPluginEnabled('ts') && $options['timesheet']) {
-        $timesheet_option = $options['timesheet'];
-        if ($timesheet_option == TIMESHEET_PENDING)
-          $inner_joins .= " inner join tt_timesheets ts on (ei.timesheet_id = ts.id and ts.submit_status = 1 and ts.approve_status is null)";
-        else if ($timesheet_option == TIMESHEET_APPROVED)
-          $inner_joins .= " inner join tt_timesheets ts on (ei.timesheet_id = ts.id and ts.approve_status = 1)";
-        else if ($timesheet_option == TIMESHEET_NOT_APPROVED)
-          $inner_joins .= " inner join tt_timesheets ts on (ei.timesheet_id = ts.id and ts.approve_status = 0)";
-      }
       $where = ttReportHelper::getExpenseWhere($options);
       $sql_for_expenses = "select null as time";
       if ($options['show_work_units']) $sql_for_expenses .= ", null as units";
-      $sql_for_expenses .= ", sum(cost) as cost, sum(cost) as expenses from tt_expense_items ei $inner_joins $where";
+      $sql_for_expenses .= ", sum(cost) as cost, sum(cost) as expenses from tt_expense_items ei $where";
 
       // Create a combined query.
       $combined = "select sum(time) as time";
@@ -659,6 +629,37 @@ class ttReportHelper {
     }
   }
 
+  // The assignToTimesheet assigns a set of tt_log records to a specific timesheet.
+  static function assignToTimesheet($timesheet_id, $time_log_ids) {
+    global $user;
+    $mdb2 = getConnection();
+
+    $user_id = $user->getUser();
+    $group_id = $user->getGroup();
+    $org_id = $user->org_id;
+
+    if ($time_log_ids) {
+      // Use inner join as a protection mechanism not to do anything with "acted upon" timesheets.
+      // Allow oprations only with pending timesheets.
+      if ($timesheet_id) {
+        // Assigning a timesheet to records.
+        $inner_join = " inner join tt_timesheets ts on (ts.id = $timesheet_id".
+          " and ts.user_id = $user_id and ts.approve_status is null". // Timesheet to assign to is pending.
+          // Part below: existing timesheet either not exists or is also pending.
+          " and (l.timesheet_id is null or (l.timesheet_id = ts.id and ts.approve_status is null)))";
+      } else {
+        $inner_join = " inner join tt_timesheets ts on (ts.id = l.timesheet_id".
+          " and ts.user_id = $user_id and ts.approve_status is null)"; // Do not deassign from acted-upon timesheets.
+      }
+
+      $sql = "update tt_log l $inner_join".
+        " set l.timesheet_id = ".$mdb2->quote($timesheet_id).
+        " where l.id in(".join(', ', $time_log_ids).") and l.user_id = $user_id and l.group_id = $group_id and l.org_id = $org_id";
+      $affected = $mdb2->exec($sql);
+      if (is_a($affected, 'PEAR_Error')) die($affected->getMessage());
+    }
+  }
+
   // The markApproved marks a set of records as either approved or unapproved.
   static function markApproved($time_log_ids, $expense_item_ids, $approved = true) {
     global $user;
@@ -737,6 +738,24 @@ class ttReportHelper {
     $cellLeftAlignedSubtotal = 'font-weight: bold; text-align: left; vertical-align: top;';
     $cellRightAlignedSubtotal = 'font-weight: bold; text-align: right; vertical-align: top;';
 
+    // Determine column span for note field.
+    $colspan = 1;
+    if ($user->can('view_reports') || $user->can('view_all_reports') || $user->isClient()) $colspan++;
+    if ($options['show_client']) $colspan++;
+    if ($options['show_project']) $colspan++;
+    if ($options['show_task']) $colspan++;
+    if ($options['show_custom_field_1']) $colspan++;
+    if ($options['show_start']) $colspan++;
+    if ($options['show_end']) $colspan++;
+    if ($options['show_duration']) $colspan++;
+    if ($options['show_work_units']) $colspan++;
+    if ($options['show_cost']) $colspan++;
+    if ($options['show_approved']) $colspan++;
+    if ($options['show_paid']) $colspan++;
+    if ($options['show_ip']) $colspan++;
+    if ($options['show_invoice']) $colspan++;
+    if ($options['show_timesheet']) $colspan++;
+
     // Start creating email body.
     $body = '<html>';
     $body .= '<head><meta http-equiv="content-type" content="text/html; charset='.CHARSET.'"></head>';
@@ -1658,18 +1677,6 @@ class ttReportHelper {
     if (ttReportHelper::groupingBy('project', $options)) {
       $join .= ' left join tt_projects p on (ei.project_id = p.id)';
     }
-    // Prepare inner joins.
-    $inner_joins = null;
-    if ($user->isPluginEnabled('ts') && $options['timesheet']) {
-      $timesheet_option = $options['timesheet'];
-      if ($timesheet_option == TIMESHEET_PENDING)
-        $inner_joins .= " inner join tt_timesheets ts on (ei.timesheet_id = ts.id and ts.submit_status = 1 and ts.approve_status is null)";
-      else if ($timesheet_option == TIMESHEET_APPROVED)
-        $inner_joins .= " inner join tt_timesheets ts on (ei.timesheet_id = ts.id and ts.approve_status = 1)";
-      else if ($timesheet_option == TIMESHEET_NOT_APPROVED)
-        $inner_joins .= " inner join tt_timesheets ts on (ei.timesheet_id = ts.id and ts.approve_status = 0)";
-    }
-    $join .= $inner_joins;
     return $join;
   }