X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=WEB-INF%2Flib%2FttReportHelper.class.php;h=224d7f1777e102585788b380c834584deccd1cb5;hb=de20a2009639bd1064c8d2b61a79d449c352409c;hp=b894b037d8978f59aba61667fb40cee861582a23;hpb=5f64df1308fd641565631e6e38d282432f5e6250;p=timetracker.git diff --git a/WEB-INF/lib/ttReportHelper.class.php b/WEB-INF/lib/ttReportHelper.class.php index b894b037..224d7f17 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'); @@ -303,6 +303,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, "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"); + // Prepare sql query part for left joins. $left_joins = null; if ($bean->getAttribute('chclient') || 'client' == $group_by_option) @@ -380,6 +384,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 +530,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'); @@ -756,7 +764,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 +777,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 +825,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 +851,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 +896,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) @@ -984,30 +996,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 +1058,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 +1078,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 +1133,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 +1193,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;'; @@ -1209,6 +1234,8 @@ class ttReportHelper { $body .= ''.$group_by_header.''; if ($bean->getAttribute('chduration')) $body .= ''.$i18n->get('label.duration').''; + if ($bean->getAttribute('chunits')) + $body .= ''.$i18n->get('label.work_units_short').''; if ($bean->getAttribute('chcost')) $body .= ''.$i18n->get('label.cost').''; $body .= ''; @@ -1220,6 +1247,11 @@ class ttReportHelper { if ($subtotal['time'] <> '0:00') $body .= $subtotal['time']; $body .= ''; } + if ($bean->getAttribute('chunits')) { + $body .= ''; + $body .= $subtotal['units']; + $body .= ''; + } if ($bean->getAttribute('chcost')) { $body .= ''; $body .= ($canViewReports || $isClient) ? $subtotal['cost'] : $subtotal['expenses']; @@ -1237,6 +1269,11 @@ class ttReportHelper { if ($totals['time'] <> '0:00') $body .= $totals['time']; $body .= ''; } + if ($bean->getAttribute('chunits')) { + $body .= ''; + $body .= $totals['units']; + $body .= ''; + } if ($bean->getAttribute('chcost')) { $body .= ''.htmlspecialchars($user->currency).' '; $body .= ($canViewReports || $isClient) ? $totals['cost'] : $totals['expenses']; @@ -1268,6 +1305,8 @@ class ttReportHelper { $body .= ''.$i18n->get('label.finish').''; if ($bean->getAttribute('chduration')) $body .= ''.$i18n->get('label.duration').''; + if ($bean->getAttribute('chunits')) + $body .= ''.$i18n->get('label.work_units_short').''; if ($bean->getAttribute('chnote')) $body .= ''.$i18n->get('label.note').''; if ($bean->getAttribute('chcost')) @@ -1311,6 +1350,7 @@ class ttReportHelper { if ($bean->getAttribute('chstart')) $body .= ''; if ($bean->getAttribute('chfinish')) $body .= ''; if ($bean->getAttribute('chduration')) $body .= ''.$subtotals[$prev_grouped_by]['time'].''; + if ($bean->getAttribute('chunits')) $body .= ''.$subtotals[$prev_grouped_by]['units'].''; if ($bean->getAttribute('chnote')) $body .= ''; if ($bean->getAttribute('chcost')) { $body .= ''; @@ -1347,6 +1387,8 @@ class ttReportHelper { $body .= ''.$record['finish'].''; if ($bean->getAttribute('chduration')) $body .= ''.$record['duration'].''; + if ($bean->getAttribute('chunits')) + $body .= ''.$record['units'].''; if ($bean->getAttribute('chnote')) $body .= ''.htmlspecialchars($record['note']).''; if ($bean->getAttribute('chcost')) @@ -1384,6 +1426,7 @@ class ttReportHelper { if ($bean->getAttribute('chstart')) $body .= ''; if ($bean->getAttribute('chfinish')) $body .= ''; if ($bean->getAttribute('chduration')) $body .= ''.$subtotals[$cur_grouped_by]['time'].''; + if ($bean->getAttribute('chunits')) $body .= ''.$subtotals[$cur_grouped_by]['units'].''; if ($bean->getAttribute('chnote')) $body .= ''; if ($bean->getAttribute('chcost')) { $body .= ''; @@ -1408,6 +1451,7 @@ class ttReportHelper { if ($bean->getAttribute('chstart')) $body .= ''; if ($bean->getAttribute('chfinish')) $body .= ''; if ($bean->getAttribute('chduration')) $body .= ''.$totals['time'].''; + if ($bean->getAttribute('chunits')) $body .= ''.$totals['units'].''; if ($bean->getAttribute('chnote')) $body .= ''; if ($bean->getAttribute('chcost')) { $body .= ''.htmlspecialchars($user->currency).' '; @@ -1464,7 +1508,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;';