X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=WEB-INF%2Flib%2FttReportHelper.class.php;h=0900f7f9d0e440717d5bbcfc8886b689e3373503;hb=8ec1dac1bcf71ce282ab116413d335f582b5e8f3;hp=1f797ace4580068bd21bbaede3dd291f12c64650;hpb=09a0f5eb840d00b4dca766ed24c42f50546c0e39;p=timetracker.git diff --git a/WEB-INF/lib/ttReportHelper.class.php b/WEB-INF/lib/ttReportHelper.class.php index 1f797ace..0900f7f9 100644 --- a/WEB-INF/lib/ttReportHelper.class.php +++ b/WEB-INF/lib/ttReportHelper.class.php @@ -257,7 +257,7 @@ class ttReportHelper { // Add custom field. $include_cf_1 = $bean->getAttribute('chcf_1') || 'cf_1' == $group_by_option; if ($include_cf_1) { - $custom_fields = new CustomFields($user->team_id); + $custom_fields = new CustomFields($user->group_id); $cf_1_type = $custom_fields->fields[0]['type']; if ($cf_1_type == CustomFields::TYPE_TEXT) { array_push($fields, 'cfl.value as cf_1'); @@ -276,6 +276,9 @@ class ttReportHelper { // Add duration. if ($bean->getAttribute('chduration')) array_push($fields, "TIME_FORMAT(l.duration, '%k:%i') as duration"); + // Add work units. + if ($bean->getAttribute('chunits')) + array_push($fields, "if(l.billable = 0 or time_to_sec(l.duration)/60 < $user->first_unit_threshold, 0, ceil(time_to_sec(l.duration)/60/$user->minutes_in_unit)) as units"); // Add note. if ($bean->getAttribute('chnote')) array_push($fields, 'l.comment as note'); @@ -380,6 +383,10 @@ class ttReportHelper { if (($canViewReports || $isClient) && $bean->getAttribute('chinvoice')) array_push($fields, 'i.name as invoice'); + // Add work units. + if ($bean->getAttribute('chunits')) + array_push($fields, 'null'); // null for work units. + // Prepare sql query part for left joins. $left_joins = null; if ($canViewReports || $isClient) @@ -522,7 +529,7 @@ class ttReportHelper { // Add custom field. $include_cf_1 = $report['show_custom_field_1'] || 'cf_1' == $group_by_option; if ($include_cf_1) { - $custom_fields = new CustomFields($user->team_id); + $custom_fields = new CustomFields($user->group_id); $cf_1_type = $custom_fields->fields[0]['type']; if ($cf_1_type == CustomFields::TYPE_TEXT) { array_push($fields, 'cfl.value as cf_1'); @@ -541,6 +548,10 @@ class ttReportHelper { // Add duration. if ($report['show_duration']) array_push($fields, "TIME_FORMAT(l.duration, '%k:%i') as duration"); + // Add work units. + if ($report['show_work_units']) + array_push($fields, "if(l.billable = 0 or time_to_sec(l.duration)/60 < $user->first_unit_threshold, 0, ceil(time_to_sec(l.duration)/60/$user->minutes_in_unit)) as units"); + // Add note. if ($report['show_note']) array_push($fields, 'l.comment as note'); @@ -624,6 +635,8 @@ class ttReportHelper { array_push($fields, 'null'); // null for finish. if ($report['show_duration']) array_push($fields, 'null'); // null for duration. + if ($report['show_work_units']) + array_push($fields, 'null'); // null for work units. // Use the note field to print item name. if ($report['show_note']) array_push($fields, 'ei.name as note'); @@ -756,7 +769,7 @@ class ttReportHelper { break; case 'cf_1': $group_field = 'cfo.value'; - $custom_fields = new CustomFields($user->team_id); + $custom_fields = new CustomFields($user->group_id); if ($custom_fields->fields[0]['type'] == CustomFields::TYPE_TEXT) $group_join = 'left join tt_custom_field_log cfl on (l.id = cfl.log_id and cfl.status = 1) left join tt_custom_field_options cfo on (cfl.value = cfo.id) '; elseif ($custom_fields->fields[0]['type'] == CustomFields::TYPE_DROPDOWN) @@ -769,21 +782,25 @@ class ttReportHelper { if (MODE_TIME == $user->tracking_mode) { if ($group_by_option != 'user') $left_join = 'left join tt_users u on (l.user_id = u.id)'; - $sql = "select $group_field as group_field, sum(time_to_sec(l.duration)) as time, + $sql = "select $group_field as group_field, sum(time_to_sec(l.duration)) as time, + sum(if(l.billable = 0 or time_to_sec(l.duration)/60 < $user->first_unit_threshold, 0, ceil(time_to_sec(l.duration)/60/$user->minutes_in_unit))) as units, sum(cast(l.billable * coalesce(u.rate, 0) * time_to_sec(l.duration)/3600 as decimal(10, 2))) as cost, null as expenses from tt_log l $group_join $left_join $where group by $group_field"; } else { // If we are including cost and tracking projects, our query (the same as above) needs to join the tt_user_project_binds table. - $sql = "select $group_field as group_field, sum(time_to_sec(l.duration)) as time, + $sql = "select $group_field as group_field, sum(time_to_sec(l.duration)) as time, + sum(if(l.billable = 0 or time_to_sec(l.duration)/60 < $user->first_unit_threshold, 0, ceil(time_to_sec(l.duration)/60/$user->minutes_in_unit))) as units, sum(cast(l.billable * coalesce(upb.rate, 0) * time_to_sec(l.duration)/3600 as decimal(10,2))) as cost, null as expenses from tt_log l $group_join left join tt_user_project_binds upb on (l.user_id = upb.user_id and l.project_id = upb.project_id) $where group by $group_field"; } } else { - $sql = "select $group_field as group_field, sum(time_to_sec(l.duration)) as time, null as expenses from tt_log l - $group_join $where group by $group_field"; + $sql = "select $group_field as group_field, sum(time_to_sec(l.duration)) as time, + sum(if(l.billable = 0 or time_to_sec(l.duration)/60 < $user->first_unit_threshold, 0, ceil(time_to_sec(l.duration)/60/$user->minutes_in_unit))) as units, + null as expenses from tt_log l + $group_join $where group by $group_field"; } // By now we have sql for time items. @@ -813,13 +830,13 @@ class ttReportHelper { } $where = ttReportHelper::getExpenseWhere($bean); - $sql_for_expenses = "select $group_field as group_field, null as time, sum(ei.cost) as cost, sum(ei.cost) as expenses from tt_expense_items ei + $sql_for_expenses = "select $group_field as group_field, null as time, null as units, sum(ei.cost) as cost, sum(ei.cost) as expenses from tt_expense_items ei $group_join $where"; // Add a "group by" clause if we are grouping. if ('null' != $group_field) $sql_for_expenses .= " group by $group_field"; // Create a combined query. - $sql = "select group_field, sum(time) as time, sum(cost) as cost, sum(expenses) as expenses from (($sql) union all ($sql_for_expenses)) t group by group_field"; + $sql = "select group_field, sum(time) as time, sum(units) as units, sum(cost) as cost, sum(expenses) as expenses from (($sql) union all ($sql_for_expenses)) t group by group_field"; } // Execute query. @@ -839,9 +856,9 @@ class ttReportHelper { $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,'cost'=>$val['cost'],'expenses'=>$val['expenses']); + $subtotals[$val['group_field']] = array('name'=>$val['group_field'],'time'=>$time, 'units'=> $val['units'],'cost'=>$val['cost'],'expenses'=>$val['expenses']); } else - $subtotals[$val['group_field']] = array('name'=>$val['group_field'],'time'=>$time); + $subtotals[$val['group_field']] = array('name'=>$val['group_field'],'time'=>$time, 'units'=> $val['units']); } return $subtotals; @@ -884,7 +901,7 @@ class ttReportHelper { break; case 'cf_1': $group_field = 'cfo.value'; - $custom_fields = new CustomFields($user->team_id); + $custom_fields = new CustomFields($user->group_id); if ($custom_fields->fields[0]['type'] == CustomFields::TYPE_TEXT) $group_join = 'left join tt_custom_field_log cfl on (l.id = cfl.log_id and cfl.status = 1) left join tt_custom_field_options cfo on (cfl.value = cfo.id) '; elseif ($custom_fields->fields[0]['type'] == CustomFields::TYPE_DROPDOWN) @@ -897,21 +914,25 @@ class ttReportHelper { if (MODE_TIME == $user->tracking_mode) { if ($group_by_option != 'user') $left_join = 'left join tt_users u on (l.user_id = u.id)'; - $sql = "select $group_field as group_field, sum(time_to_sec(l.duration)) as time, + $sql = "select $group_field as group_field, sum(time_to_sec(l.duration)) as time, + sum(if(l.billable = 0 or time_to_sec(l.duration)/60 < $user->first_unit_threshold, 0, ceil(time_to_sec(l.duration)/60/$user->minutes_in_unit))) as units, sum(cast(l.billable * coalesce(u.rate, 0) * time_to_sec(l.duration)/3600 as decimal(10, 2))) as cost, null as expenses from tt_log l $group_join $left_join $where group by $group_field"; } else { // If we are including cost and tracking projects, our query (the same as above) needs to join the tt_user_project_binds table. - $sql = "select $group_field as group_field, sum(time_to_sec(l.duration)) as time, + $sql = "select $group_field as group_field, sum(time_to_sec(l.duration)) as time, + sum(if(l.billable = 0 or time_to_sec(l.duration)/60 < $user->first_unit_threshold, 0, ceil(time_to_sec(l.duration)/60/$user->minutes_in_unit))) as units, sum(cast(l.billable * coalesce(upb.rate, 0) * time_to_sec(l.duration)/3600 as decimal(10,2))) as cost, null as expenses from tt_log l $group_join left join tt_user_project_binds upb on (l.user_id = upb.user_id and l.project_id = upb.project_id) $where group by $group_field"; } } else { - $sql = "select $group_field as group_field, sum(time_to_sec(l.duration)) as time, null as expenses from tt_log l - $group_join $where group by $group_field"; + $sql = "select $group_field as group_field, sum(time_to_sec(l.duration)) as time, + sum(if(l.billable = 0 or time_to_sec(l.duration)/60 < $user->first_unit_threshold, 0, ceil(time_to_sec(l.duration)/60/$user->minutes_in_unit))) as units, + null as expenses from tt_log l + $group_join $where group by $group_field"; } // By now we have sql for time items. @@ -941,13 +962,13 @@ class ttReportHelper { } $where = ttReportHelper::getFavExpenseWhere($report); - $sql_for_expenses = "select $group_field as group_field, null as time, sum(ei.cost) as cost, sum(ei.cost) as expenses from tt_expense_items ei + $sql_for_expenses = "select $group_field as group_field, null as time, null as units, sum(ei.cost) as cost, sum(ei.cost) as expenses from tt_expense_items ei $group_join $where"; // Add a "group by" clause if we are grouping. if ('null' != $group_field) $sql_for_expenses .= " group by $group_field"; // Create a combined query. - $sql = "select group_field, sum(time) as time, sum(cost) as cost, sum(expenses) as expenses from (($sql) union all ($sql_for_expenses)) t group by group_field"; + $sql = "select group_field, sum(time) as time, sum(units) as units, sum(cost) as cost, sum(expenses) as expenses from (($sql) union all ($sql_for_expenses)) t group by group_field"; } // Execute query. @@ -967,9 +988,9 @@ class ttReportHelper { $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,'cost'=>$val['cost'],'expenses'=>$val['expenses']); + $subtotals[$val['group_field']] = array('name'=>$val['group_field'],'time'=>$time, 'units'=> $val['units'], 'cost'=>$val['cost'],'expenses'=>$val['expenses']); } else - $subtotals[$val['group_field']] = array('name'=>$val['group_field'],'time'=>$time); + $subtotals[$val['group_field']] = array('name'=>$val['group_field'],'time'=>$time, 'units'=> $val['units']); } return $subtotals; @@ -984,30 +1005,37 @@ class ttReportHelper { $where = ttReportHelper::getWhere($bean); + // TODO: build query in parts so the work units inclusion is conditional. + // Start with a query for time items. if ($bean->getAttribute('chcost')) { if (MODE_TIME == $user->tracking_mode) { $sql = "select sum(time_to_sec(l.duration)) as time, + sum(if(l.billable = 0 or time_to_sec(l.duration)/60 < $user->first_unit_threshold, 0, ceil(time_to_sec(l.duration)/60/$user->minutes_in_unit))) as units, sum(cast(l.billable * coalesce(u.rate, 0) * time_to_sec(l.duration)/3600 as decimal(10,2))) as cost, null as expenses from tt_log l left join tt_users u on (l.user_id = u.id) $where"; } else { $sql = "select sum(time_to_sec(l.duration)) as time, + sum(if(l.billable = 0 or time_to_sec(l.duration)/60 < $user->first_unit_threshold, 0, ceil(time_to_sec(l.duration)/60/$user->minutes_in_unit))) as units, sum(cast(l.billable * coalesce(upb.rate, 0) * time_to_sec(l.duration)/3600 as decimal(10,2))) as cost, null as expenses from tt_log l left join tt_user_project_binds upb on (l.user_id = upb.user_id and l.project_id = upb.project_id) $where"; } } else - $sql = "select sum(time_to_sec(l.duration)) as time, null as cost, null as expenses from tt_log l $where"; + $sql = "select sum(time_to_sec(l.duration)) as time," + ." sum(if(l.billable = 0 or time_to_sec(l.duration)/60 < $user->first_unit_threshold, 0, ceil(time_to_sec(l.duration)/60/$user->minutes_in_unit))) as units," + ." null as cost, null as expenses from tt_log l $where"; // If we have expenses, query becomes a bit more complex. if ($bean->getAttribute('chcost') && $user->isPluginEnabled('ex')) { $where = ttReportHelper::getExpenseWhere($bean); - $sql_for_expenses = "select null as time, sum(cost) as cost, sum(cost) as expenses from tt_expense_items ei $where"; + $sql_for_expenses = "select null as time, null as units, sum(cost) as cost, sum(cost) as expenses from tt_expense_items ei $where"; + // Create a combined query. - $sql = "select sum(time) as time, sum(cost) as cost, sum(expenses) as expenses from (($sql) union all ($sql_for_expenses)) t"; + $sql = "select sum(time) as time, sum(units) as units, sum(cost) as cost, sum(expenses) as expenses from (($sql) union all ($sql_for_expenses)) t"; } // Execute query. @@ -1039,6 +1067,7 @@ class ttReportHelper { $totals['start_date'] = $period->getStartDate(); $totals['end_date'] = $period->getEndDate(); $totals['time'] = $total_time; + $totals['units'] = $val['units']; $totals['cost'] = $total_cost; $totals['expenses'] = $total_expenses; @@ -1058,26 +1087,30 @@ class ttReportHelper { if ($report['show_cost']) { if (MODE_TIME == $user->tracking_mode) { $sql = "select sum(time_to_sec(l.duration)) as time, + sum(if(l.billable = 0 or time_to_sec(l.duration)/60 < $user->first_unit_threshold, 0, ceil(time_to_sec(l.duration)/60/$user->minutes_in_unit))) as units, sum(cast(l.billable * coalesce(u.rate, 0) * time_to_sec(l.duration)/3600 as decimal(10,2))) as cost, null as expenses from tt_log l left join tt_users u on (l.user_id = u.id) $where"; } else { $sql = "select sum(time_to_sec(l.duration)) as time, + sum(if(l.billable = 0 or time_to_sec(l.duration)/60 < $user->first_unit_threshold, 0, ceil(time_to_sec(l.duration)/60/$user->minutes_in_unit))) as units, sum(cast(l.billable * coalesce(upb.rate, 0) * time_to_sec(l.duration)/3600 as decimal(10,2))) as cost, null as expenses from tt_log l left join tt_user_project_binds upb on (l.user_id = upb.user_id and l.project_id = upb.project_id) $where"; } } else - $sql = "select sum(time_to_sec(l.duration)) as time, null as cost, null as expenses from tt_log l $where"; + $sql = "select sum(time_to_sec(l.duration)) as time, + sum(if(l.billable = 0 or time_to_sec(l.duration)/60 < $user->first_unit_threshold, 0, ceil(time_to_sec(l.duration)/60/$user->minutes_in_unit))) as units, + null as cost, null as expenses from tt_log l $where"; // If we have expenses, query becomes a bit more complex. if ($report['show_cost'] && $user->isPluginEnabled('ex')) { $where = ttReportHelper::getFavExpenseWhere($report); - $sql_for_expenses = "select null as time, sum(cost) as cost, sum(cost) as expenses from tt_expense_items ei $where"; + $sql_for_expenses = "select null as time, null as units, sum(cost) as cost, sum(cost) as expenses from tt_expense_items ei $where"; // Create a combined query. - $sql = "select sum(time) as time, sum(cost) as cost, sum(expenses) as expenses from (($sql) union all ($sql_for_expenses)) t"; + $sql = "select sum(time) as time, sum(units) as units, sum(cost) as cost, sum(expenses) as expenses from (($sql) union all ($sql_for_expenses)) t"; } // Execute query. @@ -1109,6 +1142,7 @@ class ttReportHelper { $totals['start_date'] = $period->getStartDate(); $totals['end_date'] = $period->getEndDate(); $totals['time'] = $total_time; + $totals['units'] = $val['units']; $totals['cost'] = $total_cost; $totals['expenses'] = $total_expenses; @@ -1168,7 +1202,7 @@ class ttReportHelper { // Use custom fields plugin if it is enabled. if ($user->isPluginEnabled('cf')) - $custom_fields = new CustomFields($user->team_id); + $custom_fields = new CustomFields($user->group_id); // Define some styles to use in email. $style_title = 'text-align: center; font-size: 15pt; font-family: Arial, Helvetica, sans-serif;'; @@ -1188,7 +1222,7 @@ class ttReportHelper { $body .= ''; // Output title. - $body .= '

'.$i18n->getKey('form.mail.report_subject').': '.$totals['start_date'].' - '.$totals['end_date'].'

'; + $body .= '

'.$i18n->get('form.mail.report_subject').': '.$totals['start_date'].' - '.$totals['end_date'].'

'; // Output comment. if ($comment) $body .= '

'.htmlspecialchars($comment).'

'; @@ -1201,16 +1235,18 @@ class ttReportHelper { $group_by_header = htmlspecialchars($custom_fields->fields[0]['label']); else { $key = 'label.'.$group_by; - $group_by_header = $i18n->getKey($key); + $group_by_header = $i18n->get($key); } $body .= ''; $body .= ''; $body .= ''; if ($bean->getAttribute('chduration')) - $body .= ''; + $body .= ''; + if ($bean->getAttribute('chunits')) + $body .= ''; if ($bean->getAttribute('chcost')) - $body .= ''; + $body .= ''; $body .= ''; foreach($subtotals as $subtotal) { $body .= ''; @@ -1220,6 +1256,11 @@ class ttReportHelper { if ($subtotal['time'] <> '0:00') $body .= $subtotal['time']; $body .= ''; } + if ($bean->getAttribute('chunits')) { + $body .= ''; + } if ($bean->getAttribute('chcost')) { $body .= ''; $body .= ''; - $body .= ''; + $body .= ''; if ($bean->getAttribute('chduration')) { $body .= ''; } + if ($bean->getAttribute('chunits')) { + $body .= ''; + } if ($bean->getAttribute('chcost')) { $body .= '
'.$group_by_header.''.$i18n->getKey('label.duration').''.$i18n->get('label.duration').''.$i18n->get('label.work_units_short').''.$i18n->getKey('label.cost').''.$i18n->get('label.cost').'
'; + $body .= $subtotal['units']; + $body .= ''; $body .= ($canViewReports || $isClient) ? $subtotal['cost'] : $subtotal['expenses']; @@ -1231,12 +1272,17 @@ class ttReportHelper { // Print totals. $body .= '
 
'.$i18n->getKey('label.total').''.$i18n->get('label.total').''; if ($totals['time'] <> '0:00') $body .= $totals['time']; $body .= ''; + $body .= $totals['units']; + $body .= ''.htmlspecialchars($user->currency).' '; $body .= ($canViewReports || $isClient) ? $totals['cost'] : $totals['expenses']; @@ -1251,33 +1297,35 @@ class ttReportHelper { // Print table header. $body .= ''; $body .= ''; - $body .= ''; + $body .= ''; if ($canViewReports || $isClient) - $body .= ''; + $body .= ''; if ($bean->getAttribute('chclient')) - $body .= ''; + $body .= ''; if ($bean->getAttribute('chproject')) - $body .= ''; + $body .= ''; if ($bean->getAttribute('chtask')) - $body .= ''; + $body .= ''; if ($bean->getAttribute('chcf_1')) $body .= ''; if ($bean->getAttribute('chstart')) - $body .= ''; + $body .= ''; if ($bean->getAttribute('chfinish')) - $body .= ''; + $body .= ''; if ($bean->getAttribute('chduration')) - $body .= ''; + $body .= ''; + if ($bean->getAttribute('chunits')) + $body .= ''; if ($bean->getAttribute('chnote')) - $body .= ''; + $body .= ''; if ($bean->getAttribute('chcost')) - $body .= ''; + $body .= ''; if ($bean->getAttribute('chpaid')) - $body .= ''; + $body .= ''; if ($bean->getAttribute('chip')) - $body .= ''; + $body .= ''; if ($bean->getAttribute('chinvoice')) - $body .= ''; + $body .= ''; $body .= ''; // Initialize variables to print subtotals. @@ -1301,7 +1349,7 @@ class ttReportHelper { $cur_grouped_by = $record['grouped_by']; if ($cur_grouped_by != $prev_grouped_by && !$first_pass) { $body .= ''; - $body .= ''; + $body .= ''; $subtotal_name = htmlspecialchars($subtotals[$prev_grouped_by]['name']); if ($canViewReports || $isClient) $body .= ''; if ($bean->getAttribute('chclient')) $body .= ''; @@ -1311,6 +1359,7 @@ class ttReportHelper { if ($bean->getAttribute('chstart')) $body .= ''; if ($bean->getAttribute('chfinish')) $body .= ''; if ($bean->getAttribute('chduration')) $body .= ''; + if ($bean->getAttribute('chunits')) $body .= ''; if ($bean->getAttribute('chnote')) $body .= ''; if ($bean->getAttribute('chcost')) { $body .= ''; if ($bean->getAttribute('chduration')) $body .= ''; + if ($bean->getAttribute('chunits')) + $body .= ''; if ($bean->getAttribute('chnote')) $body .= ''; if ($bean->getAttribute('chcost')) $body .= ''; if ($bean->getAttribute('chpaid')) { $body .= ''; } if ($bean->getAttribute('chip')) { @@ -1374,7 +1425,7 @@ class ttReportHelper { // Print a terminating subtotal. if ($print_subtotals) { $body .= ''; - $body .= ''; + $body .= ''; $subtotal_name = htmlspecialchars($subtotals[$cur_grouped_by]['name']); if ($canViewReports || $isClient) $body .= ''; if ($bean->getAttribute('chclient')) $body .= ''; @@ -1384,6 +1435,7 @@ class ttReportHelper { if ($bean->getAttribute('chstart')) $body .= ''; if ($bean->getAttribute('chfinish')) $body .= ''; if ($bean->getAttribute('chduration')) $body .= ''; + if ($bean->getAttribute('chunits')) $body .= ''; if ($bean->getAttribute('chnote')) $body .= ''; if ($bean->getAttribute('chcost')) { $body .= ''; $body .= ''; - $body .= ''; + $body .= ''; if ($canViewReports || $isClient) $body .= ''; if ($bean->getAttribute('chclient')) $body .= ''; if ($bean->getAttribute('chproject')) $body .= ''; @@ -1408,6 +1460,7 @@ class ttReportHelper { if ($bean->getAttribute('chstart')) $body .= ''; if ($bean->getAttribute('chfinish')) $body .= ''; if ($bean->getAttribute('chduration')) $body .= ''; + if ($bean->getAttribute('chunits')) $body .= ''; if ($bean->getAttribute('chnote')) $body .= ''; if ($bean->getAttribute('chcost')) { $body .= '
'.$i18n->getKey('label.date').''.$i18n->get('label.date').''.$i18n->getKey('label.user').''.$i18n->get('label.user').''.$i18n->getKey('label.client').''.$i18n->get('label.client').''.$i18n->getKey('label.project').''.$i18n->get('label.project').''.$i18n->getKey('label.task').''.$i18n->get('label.task').''.htmlspecialchars($custom_fields->fields[0]['label']).''.$i18n->getKey('label.start').''.$i18n->get('label.start').''.$i18n->getKey('label.finish').''.$i18n->get('label.finish').''.$i18n->getKey('label.duration').''.$i18n->get('label.duration').''.$i18n->get('label.work_units_short').''.$i18n->getKey('label.note').''.$i18n->get('label.note').''.$i18n->getKey('label.cost').''.$i18n->get('label.cost').''.$i18n->getKey('label.paid').''.$i18n->get('label.paid').''.$i18n->getKey('label.ip').''.$i18n->get('label.ip').''.$i18n->getKey('label.invoice').''.$i18n->get('label.invoice').'
'.$i18n->getKey('label.subtotal').''.$i18n->get('label.subtotal').''.($group_by == 'user' ? $subtotal_name : '').''.($group_by == 'client' ? $subtotal_name : '').''.$subtotals[$prev_grouped_by]['time'].''.$subtotals[$prev_grouped_by]['units'].''; @@ -1347,13 +1396,15 @@ class ttReportHelper { $body .= ''.$record['finish'].''.$record['duration'].''.$record['units'].''.htmlspecialchars($record['note']).''.$record['cost'].''; - $body .= $record['paid'] == 1 ? $i18n->getKey('label.yes') : $i18n->getKey('label.no'); + $body .= $record['paid'] == 1 ? $i18n->get('label.yes') : $i18n->get('label.no'); $body .= '
'.$i18n->getKey('label.subtotal').''.$i18n->get('label.subtotal').''.($group_by == 'user' ? $subtotal_name : '').''.($group_by == 'client' ? $subtotal_name : '').''.$subtotals[$cur_grouped_by]['time'].''.$subtotals[$cur_grouped_by]['units'].''; @@ -1399,7 +1451,7 @@ class ttReportHelper { // Print totals. $body .= '
 
'.$i18n->getKey('label.total').''.$i18n->get('label.total').''.$totals['time'].''.$totals['units'].''.htmlspecialchars($user->currency).' '; @@ -1424,7 +1477,7 @@ class ttReportHelper { // Output footer. if (!defined('REPORT_FOOTER') || !(REPORT_FOOTER == false)) - $body .= '

'.$i18n->getKey('form.mail.footer').'

'; + $body .= '

'.$i18n->get('form.mail.footer').'

'; // Finish creating email body. $body .= ''; @@ -1464,7 +1517,7 @@ class ttReportHelper { // Use custom fields plugin if it is enabled. if ($user->isPluginEnabled('cf')) - $custom_fields = new CustomFields($user->team_id); + $custom_fields = new CustomFields($user->group_id); // Define some styles to use in email. $style_title = 'text-align: center; font-size: 15pt; font-family: Arial, Helvetica, sans-serif;'; @@ -1484,7 +1537,7 @@ class ttReportHelper { $body .= ''; // Output title. - $body .= '

'.$i18n->getKey('form.mail.report_subject').': '.$totals['start_date'].' - '.$totals['end_date'].'

'; + $body .= '

'.$i18n->get('form.mail.report_subject').': '.$totals['start_date'].' - '.$totals['end_date'].'

'; // Output comment. // if ($comment) $body .= '

'.htmlspecialchars($comment).'

'; // No comment for fav. reports. @@ -1497,16 +1550,18 @@ class ttReportHelper { $group_by_header = htmlspecialchars($custom_fields->fields[0]['label']); else { $key = 'label.'.$group_by; - $group_by_header = $i18n->getKey($key); + $group_by_header = $i18n->get($key); } $body .= ''; $body .= ''; $body .= ''; if ($report['show_duration']) - $body .= ''; + $body .= ''; + if ($report['show_work_units']) + $body .= ''; if ($report['show_cost']) - $body .= ''; + $body .= ''; $body .= ''; foreach($subtotals as $subtotal) { $body .= ''; @@ -1516,6 +1571,11 @@ class ttReportHelper { if ($subtotal['time'] <> '0:00') $body .= $subtotal['time']; $body .= ''; } + if ($report['show_work_units']) { + $body .= ''; + } if ($report['show_cost']) { $body .= ''; $body .= ''; - $body .= ''; + $body .= ''; if ($report['show_duration']) { $body .= ''; } + if ($report['show_work_units']) { + $body .= ''; + } if ($report['show_cost']) { $body .= '
'.$group_by_header.''.$i18n->getKey('label.duration').''.$i18n->get('label.duration').''.$i18n->get('label.work_units_short').''.$i18n->getKey('label.cost').''.$i18n->get('label.cost').'
'; + $body .= $subtotal['units']; + $body .= ''; $body .= ($canViewReports || $isClient) ? $subtotal['cost'] : $subtotal['expenses']; @@ -1527,12 +1587,17 @@ class ttReportHelper { // Print totals. $body .= '
 
'.$i18n->getKey('label.total').''.$i18n->get('label.total').''; if ($totals['time'] <> '0:00') $body .= $totals['time']; $body .= ''; + $body .= $totals['units']; + $body .= ''.htmlspecialchars($user->currency).' '; $body .= ($canViewReports || $isClient) ? $totals['cost'] : $totals['expenses']; @@ -1547,33 +1612,35 @@ class ttReportHelper { // Print table header. $body .= ''; $body .= ''; - $body .= ''; + $body .= ''; if ($canViewReports || $isClient) - $body .= ''; + $body .= ''; if ($report['show_client']) - $body .= ''; + $body .= ''; if ($report['show_project']) - $body .= ''; + $body .= ''; if ($report['show_task']) - $body .= ''; + $body .= ''; if ($report['show_custom_field_1']) $body .= ''; if ($report['show_start']) - $body .= ''; + $body .= ''; if ($report['show_end']) - $body .= ''; + $body .= ''; if ($report['show_duration']) - $body .= ''; + $body .= ''; + if ($report['show_work_units']) + $body .= ''; if ($report['show_note']) - $body .= ''; + $body .= ''; if ($report['show_cost']) - $body .= ''; + $body .= ''; if ($report['show_paid']) - $body .= ''; + $body .= ''; if ($report['show_ip']) - $body .= ''; + $body .= ''; if ($report['show_invoice']) - $body .= ''; + $body .= ''; $body .= ''; // Initialize variables to print subtotals. @@ -1597,7 +1664,7 @@ class ttReportHelper { $cur_grouped_by = $record['grouped_by']; if ($cur_grouped_by != $prev_grouped_by && !$first_pass) { $body .= ''; - $body .= ''; + $body .= ''; $subtotal_name = htmlspecialchars($subtotals[$prev_grouped_by]['name']); if ($canViewReports || $isClient) $body .= ''; if ($report['show_client']) $body .= ''; @@ -1607,6 +1674,7 @@ class ttReportHelper { if ($report['show_start']) $body .= ''; if ($report['show_end']) $body .= ''; if ($report['show_duration']) $body .= ''; + if ($report['show_work_units']) $body .= ''; if ($report['show_note']) $body .= ''; if ($report['show_cost']) { $body .= ''; if ($report['show_duration']) $body .= ''; + if ($report['show_work_units']) + $body .= ''; if ($report['show_note']) $body .= ''; if ($report['show_cost']) $body .= ''; if ($report['show_paid']) { $body .= ''; } if ($report['show_ip']) { @@ -1670,7 +1740,7 @@ class ttReportHelper { // Print a terminating subtotal. if ($print_subtotals) { $body .= ''; - $body .= ''; + $body .= ''; $subtotal_name = htmlspecialchars($subtotals[$cur_grouped_by]['name']); if ($canViewReports || $isClient) $body .= ''; if ($report['show_client']) $body .= ''; @@ -1680,6 +1750,7 @@ class ttReportHelper { if ($report['show_start']) $body .= ''; if ($report['show_end']) $body .= ''; if ($report['show_duration']) $body .= ''; + if ($report['show_work_units']) $body .= ''; if ($report['show_note']) $body .= ''; if ($report['show_cost']) { $body .= ''; $body .= ''; - $body .= ''; + $body .= ''; if ($canViewReports || $isClient) $body .= ''; if ($report['show_client']) $body .= ''; if ($report['show_project']) $body .= ''; @@ -1704,6 +1775,7 @@ class ttReportHelper { if ($report['show_start']) $body .= ''; if ($report['show_end']) $body .= ''; if ($report['show_duration']) $body .= ''; + if ($report['show_work_units']) $body .= ''; if ($report['show_note']) $body .= ''; if ($report['show_cost']) { $body .= '
'.$i18n->getKey('label.date').''.$i18n->get('label.date').''.$i18n->getKey('label.user').''.$i18n->get('label.user').''.$i18n->getKey('label.client').''.$i18n->get('label.client').''.$i18n->getKey('label.project').''.$i18n->get('label.project').''.$i18n->getKey('label.task').''.$i18n->get('label.task').''.htmlspecialchars($custom_fields->fields[0]['label']).''.$i18n->getKey('label.start').''.$i18n->get('label.start').''.$i18n->getKey('label.finish').''.$i18n->get('label.finish').''.$i18n->getKey('label.duration').''.$i18n->get('label.duration').''.$i18n->get('label.work_units_short').''.$i18n->getKey('label.note').''.$i18n->get('label.note').''.$i18n->getKey('label.cost').''.$i18n->get('label.cost').''.$i18n->getKey('label.paid').''.$i18n->get('label.paid').''.$i18n->getKey('label.ip').''.$i18n->get('label.ip').''.$i18n->getKey('label.invoice').''.$i18n->get('label.invoice').'
'.$i18n->getKey('label.subtotal').''.$i18n->get('label.subtotal').''.($group_by == 'user' ? $subtotal_name : '').''.($group_by == 'client' ? $subtotal_name : '').''.$subtotals[$prev_grouped_by]['time'].''.$subtotals[$prev_grouped_by]['units'].''; @@ -1643,13 +1711,15 @@ class ttReportHelper { $body .= ''.$record['finish'].''.$record['duration'].''.$record['units'].''.htmlspecialchars($record['note']).''.$record['cost'].''; - $body .= $record['paid'] == 1 ? $i18n->getKey('label.yes') : $i18n->getKey('label.no'); + $body .= $record['paid'] == 1 ? $i18n->get('label.yes') : $i18n->get('label.no'); $body .= '
'.$i18n->getKey('label.subtotal').''.$i18n->get('label.subtotal').''.($group_by == 'user' ? $subtotal_name : '').''.($group_by == 'client' ? $subtotal_name : '').''.$subtotals[$cur_grouped_by]['time'].''.$subtotals[$cur_grouped_by]['units'].''; @@ -1695,7 +1766,7 @@ class ttReportHelper { // Print totals. $body .= '
 
'.$i18n->getKey('label.total').''.$i18n->get('label.total').''.$totals['time'].''.$totals['units'].''.htmlspecialchars($user->currency).' '; @@ -1720,7 +1792,7 @@ class ttReportHelper { // Output footer. if (!defined('REPORT_FOOTER') || !(REPORT_FOOTER == false)) - $body .= '

'.$i18n->getKey('form.mail.footer').'

'; + $body .= '

'.$i18n->get('form.mail.footer').'

'; // Finish creating email body. $body .= '';