X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=WEB-INF%2Flib%2FttReportHelper.class.php;h=280b70dbeda161e46bc511671cdf2a278020d1d6;hb=b027028b5322fcbfb6de53e7a74529cbac7931de;hp=4d510bbb2962f99670158708f217a65b2a499dca;hpb=a58bca2afc5d6457d07c886c7c20fb10c941752a;p=timetracker.git diff --git a/WEB-INF/lib/ttReportHelper.class.php b/WEB-INF/lib/ttReportHelper.class.php index 4d510bbb..280b70db 100644 --- a/WEB-INF/lib/ttReportHelper.class.php +++ b/WEB-INF/lib/ttReportHelper.class.php @@ -127,7 +127,17 @@ class ttReportHelper { $canViewReports = $user->can('view_reports') || $user->can('view_all_reports'); $isClient = $user->isClient(); - $group_by_option = $options['group_by']; + $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_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'); + $grouping_by_task = ($options['group_by1'] == 'task'|| $options['group_by2'] == 'task' || $options['group_by3'] == 'task'); + $grouping_by_user = ($options['group_by1'] == 'user'|| $options['group_by2'] == 'user' || $options['group_by3'] == 'user'); + $grouping_by_cf_1 = ($options['group_by1'] == 'cf_1'|| $options['group_by2'] == 'cf_1' || $options['group_by3'] == 'cf_1'); + + $group_by_option = $options['group_by1']; $convertTo12Hour = ('%I:%M %p' == $user->time_format) && ($options['show_start'] || $options['show_end']); // Prepare a query for time items in tt_log table. @@ -138,16 +148,16 @@ class ttReportHelper { if($canViewReports || $isClient) array_push($fields, 'u.name as user'); // Add client name if it is selected. - if ($options['show_client'] || 'client' == $group_by_option) + if ($options['show_client'] || $grouping_by_client) array_push($fields, 'c.name as client'); // Add project name if it is selected. - if ($options['show_project'] || 'project' == $group_by_option) + if ($options['show_project'] || $grouping_by_project) array_push($fields, 'p.name as project'); // Add task name if it is selected. - if ($options['show_task'] || 'task' == $group_by_option) + if ($options['show_task'] || $grouping_by_task) array_push($fields, 't.name as task'); // Add custom field. - $include_cf_1 = $options['show_custom_field_1'] || 'cf_1' == $group_by_option; + $include_cf_1 = $options['show_custom_field_1'] || $grouping_by_cf_1; if ($include_cf_1) { $custom_fields = new CustomFields($user->group_id); $cf_1_type = $custom_fields->fields[0]['type']; @@ -203,15 +213,15 @@ class ttReportHelper { // Prepare sql query part for left joins. $left_joins = null; - if ($options['show_client'] || 'client' == $group_by_option) + if ($options['show_client'] || $grouping_by_client) $left_joins .= " left join tt_clients c on (c.id = l.client_id)"; if (($canViewReports || $isClient) && $options['show_invoice']) $left_joins .= " left join tt_invoices i on (i.id = l.invoice_id and i.status = 1)"; if ($canViewReports || $isClient || $user->isPluginEnabled('ex')) $left_joins .= " left join tt_users u on (u.id = l.user_id)"; - if ($options['show_project'] || 'project' == $group_by_option) + if ($options['show_project'] || $grouping_by_project) $left_joins .= " left join tt_projects p on (p.id = l.project_id)"; - if ($options['show_task'] || 'task' == $group_by_option) + if ($options['show_task'] || $grouping_by_task) $left_joins .= " left join tt_tasks t on (t.id = l.task_id)"; if ($include_cf_1) { if ($cf_1_type == CustomFields::TYPE_TEXT) @@ -228,7 +238,7 @@ class ttReportHelper { // Construct sql query for tt_log items. $sql = "select ".join(', ', $fields)." from tt_log l $left_joins $where"; - // If we don't have expense items (such as when the Expenses plugin is desabled), the above is all sql we need, + // If we don't have expense items (such as when the Expenses plugin is disabled), the above is all sql we need, // with an exception of sorting part, that is added in the end. // However, when we have expenses, we need to do a union with a separate query for expense items from tt_expense_items table. @@ -241,14 +251,14 @@ class ttReportHelper { if($canViewReports || $isClient) array_push($fields, 'u.name as user'); // Add client name if it is selected. - if ($options['show_client'] || 'client' == $group_by_option) + if ($options['show_client'] || $grouping_by_client) array_push($fields, 'c.name as client'); // Add project name if it is selected. - if ($options['show_project'] || 'project' == $group_by_option) + if ($options['show_project'] || $grouping_by_project) array_push($fields, 'p.name as project'); - if ($options['show_task'] || 'task' == $group_by_option) + if ($options['show_task'] || $grouping_by_task) array_push($fields, 'null'); // null for task name. We need to match column count for union. - if ($options['show_custom_field_1'] || 'cf_1' == $group_by_option) + if ($options['show_custom_field_1'] || $grouping_by_cf_1) array_push($fields, 'null'); // null for cf_1. if ($options['show_start']) { array_push($fields, 'null'); // null for unformatted_start. @@ -283,9 +293,9 @@ class ttReportHelper { $left_joins = null; if ($canViewReports || $isClient) $left_joins .= " left join tt_users u on (u.id = ei.user_id)"; - if ($options['show_client'] || 'client' == $group_by_option) + if ($options['show_client'] || $grouping_by_client) $left_joins .= " left join tt_clients c on (c.id = ei.client_id)"; - if ($options['show_project'] || 'project' == $group_by_option) + if ($options['show_project'] || $grouping_by_project) $left_joins .= " left join tt_projects p on (p.id = ei.project_id)"; if (($canViewReports || $isClient) && $options['show_invoice']) $left_joins .= " left join tt_invoices i on (i.id = ei.invoice_id and i.status = 1)"; @@ -301,11 +311,16 @@ class ttReportHelper { // Determine sort part. $sort_part = ' order by '; - if ($group_by_option == null || 'no_grouping' == $group_by_option || 'date' == $group_by_option) + if ($no_grouping) $sort_part .= 'date'; - else - $sort_part .= $group_by_option.', date'; - if (($canViewReports || $isClient) && $options['users'] && 'user' != $group_by_option) + else { + $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. + } + if (($canViewReports || $isClient) && $options['users'] && !$grouping_by_user) $sort_part .= ', user, type'; if ($options['show_start']) $sort_part .= ', unformatted_start'; @@ -333,13 +348,16 @@ class ttReportHelper { if ('.' != $user->decimal_mark) $val['expense'] = str_replace('.', $user->decimal_mark, $val['expense']); } +// CODING STOPPED RIGHT HERE replace with a combined key... if ('no_grouping' != $group_by_option) { $val['grouped_by'] = $val[$group_by_option]; if ('date' == $group_by_option) { // This is needed to get the date in user date format. - $o_date = new DateAndTime(DB_DATEFORMAT, $val['grouped_by']); - $val['grouped_by'] = $o_date->toString($user->date_format); - unset($o_date); + //$o_date = new DateAndTime(DB_DATEFORMAT, $val['grouped_by']); + //$val['grouped_by'] = $o_date->toString($user->date_format); + //unset($o_date); + + $val['grouped_by'] = ttDateToUserFormat($val['grouped_by']); } } @@ -394,7 +412,7 @@ class ttReportHelper { static function getSubtotals($options) { global $user; - $group_by_option = $options['group_by']; + $group_by_option = $options['group_by1']; if ('no_grouping' == $group_by_option) return null; $mdb2 = getConnection(); @@ -657,7 +675,7 @@ class ttReportHelper { } // prepareReportBody - prepares an email body for report. - static function prepareReportBody($bean, $comment) + static function prepareReportBody($options, $comment = null) { global $user; global $i18n; @@ -665,10 +683,9 @@ class ttReportHelper { // Determine these once as they are used in multiple places in this function. $canViewReports = $user->can('view_reports') || $user->can('view_all_reports'); $isClient = $user->isClient(); - $options = ttReportHelper::getReportOptions($bean); $items = ttReportHelper::getItems($options); - $group_by = $bean->getAttribute('group_by'); + $group_by = $options['group_by1']; if ($group_by && 'no_grouping' != $group_by) $subtotals = ttReportHelper::getSubtotals($options); $totals = ttReportHelper::getTotals($options); @@ -700,321 +717,6 @@ class ttReportHelper { // Output comment. if ($comment) $body .= '

'.htmlspecialchars($comment).'

'; - if ($bean->getAttribute('chtotalsonly')) { - // Totals only report. Output subtotals. - - // Determine group_by header. - if ('cf_1' == $group_by) - $group_by_header = htmlspecialchars($custom_fields->fields[0]['label']); - else { - $key = 'label.'.$group_by; - $group_by_header = $i18n->get($key); - } - - $body .= ''; - $body .= ''; - $body .= ''; - if ($bean->getAttribute('chduration')) - $body .= ''; - if ($bean->getAttribute('chunits')) - $body .= ''; - if ($bean->getAttribute('chcost')) - $body .= ''; - $body .= ''; - foreach($subtotals as $subtotal) { - $body .= ''; - $body .= ''; - if ($bean->getAttribute('chduration')) { - $body .= ''; - } - if ($bean->getAttribute('chunits')) { - $body .= ''; - } - if ($bean->getAttribute('chcost')) { - $body .= ''; - } - $body .= ''; - } - - // Print totals. - $body .= ''; - $body .= ''; - $body .= ''; - if ($bean->getAttribute('chduration')) { - $body .= ''; - } - if ($bean->getAttribute('chunits')) { - $body .= ''; - } - if ($bean->getAttribute('chcost')) { - $body .= ''; - } - $body .= ''; - - $body .= '
'.$group_by_header.''.$i18n->get('label.duration').''.$i18n->get('label.work_units_short').''.$i18n->get('label.cost').'
'.($subtotal['name'] ? htmlspecialchars($subtotal['name']) : ' ').''; - if ($subtotal['time'] <> '0:00') $body .= $subtotal['time']; - $body .= ''; - $body .= $subtotal['units']; - $body .= ''; - $body .= ($canViewReports || $isClient) ? $subtotal['cost'] : $subtotal['expenses']; - $body .= '
 
'.$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']; - $body .= '
'; - } else { - // Regular report. - - // Print table header. - $body .= ''; - $body .= ''; - $body .= ''; - if ($canViewReports || $isClient) - $body .= ''; - if ($bean->getAttribute('chclient')) - $body .= ''; - if ($bean->getAttribute('chproject')) - $body .= ''; - if ($bean->getAttribute('chtask')) - $body .= ''; - if ($bean->getAttribute('chcf_1')) - $body .= ''; - 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('chpaid')) - $body .= ''; - if ($bean->getAttribute('chip')) - $body .= ''; - if ($bean->getAttribute('chinvoice')) - $body .= ''; - $body .= ''; - - // Initialize variables to print subtotals. - if ($items && 'no_grouping' != $group_by) { - $print_subtotals = true; - $first_pass = true; - $prev_grouped_by = ''; - $cur_grouped_by = ''; - } - // Initialize variables to alternate color of rows for different dates. - $prev_date = ''; - $cur_date = ''; - $row_style = $rowItem; - - // Print report items. - if (is_array($items)) { - foreach ($items as $record) { - $cur_date = $record['date']; - // Print a subtotal row after a block of grouped items. - if ($print_subtotals) { - $cur_grouped_by = $record['grouped_by']; - if ($cur_grouped_by != $prev_grouped_by && !$first_pass) { - $body .= ''; - $body .= ''; - $subtotal_name = htmlspecialchars($subtotals[$prev_grouped_by]['name']); - if ($canViewReports || $isClient) $body .= ''; - if ($bean->getAttribute('chclient')) $body .= ''; - if ($bean->getAttribute('chproject')) $body .= ''; - if ($bean->getAttribute('chtask')) $body .= ''; - if ($bean->getAttribute('chcf_1')) $body .= ''; - 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('chpaid')) $body .= ''; - if ($bean->getAttribute('chip')) $body .= ''; - if ($bean->getAttribute('chinvoice')) $body .= ''; - $body .= ''; - $body .= ''; - } - $first_pass = false; - } - - // Print a regular row. - if ($cur_date != $prev_date) - $row_style = ($row_style == $rowItem) ? $rowItemAlt : $rowItem; - $body .= ''; - $body .= ''; - if ($canViewReports || $isClient) - $body .= ''; - if ($bean->getAttribute('chclient')) - $body .= ''; - if ($bean->getAttribute('chproject')) - $body .= ''; - if ($bean->getAttribute('chtask')) - $body .= ''; - if ($bean->getAttribute('chcf_1')) - $body .= ''; - 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('chpaid')) { - $body .= ''; - } - if ($bean->getAttribute('chip')) { - $body .= ''; - } - if ($bean->getAttribute('chinvoice')) - $body .= ''; - $body .= ''; - - $prev_date = $record['date']; - if ($print_subtotals) - $prev_grouped_by = $record['grouped_by']; - } - } - - // Print a terminating subtotal. - if ($print_subtotals) { - $body .= ''; - $body .= ''; - $subtotal_name = htmlspecialchars($subtotals[$cur_grouped_by]['name']); - if ($canViewReports || $isClient) $body .= ''; - if ($bean->getAttribute('chclient')) $body .= ''; - if ($bean->getAttribute('chproject')) $body .= ''; - if ($bean->getAttribute('chtask')) $body .= ''; - if ($bean->getAttribute('chcf_1')) $body .= ''; - 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('chpaid')) $body .= ''; - if ($bean->getAttribute('chip')) $body .= ''; - if ($bean->getAttribute('chinvoice')) $body .= ''; - $body .= ''; - } - - // Print totals. - $body .= ''; - $body .= ''; - $body .= ''; - if ($canViewReports || $isClient) $body .= ''; - if ($bean->getAttribute('chclient')) $body .= ''; - if ($bean->getAttribute('chproject')) $body .= ''; - if ($bean->getAttribute('chtask')) $body .= ''; - if ($bean->getAttribute('chcf_1')) $body .= ''; - 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('chpaid')) $body .= ''; - if ($bean->getAttribute('chip')) $body .= ''; - if ($bean->getAttribute('chinvoice')) $body .= ''; - $body .= ''; - - $body .= '
'.$i18n->get('label.date').''.$i18n->get('label.user').''.$i18n->get('label.client').''.$i18n->get('label.project').''.$i18n->get('label.task').''.htmlspecialchars($custom_fields->fields[0]['label']).''.$i18n->get('label.start').''.$i18n->get('label.finish').''.$i18n->get('label.duration').''.$i18n->get('label.work_units_short').''.$i18n->get('label.note').''.$i18n->get('label.cost').''.$i18n->get('label.paid').''.$i18n->get('label.ip').''.$i18n->get('label.invoice').'
'.$i18n->get('label.subtotal').''.($group_by == 'user' ? $subtotal_name : '').''.($group_by == 'client' ? $subtotal_name : '').''.($group_by == 'project' ? $subtotal_name : '').''.($group_by == 'task' ? $subtotal_name : '').''.($group_by == 'cf_1' ? $subtotal_name : '').''.$subtotals[$prev_grouped_by]['time'].''.$subtotals[$prev_grouped_by]['units'].''; - $body .= ($canViewReports || $isClient) ? $subtotals[$prev_grouped_by]['cost'] : $subtotals[$prev_grouped_by]['expenses']; - $body .= '
 
'.$record['date'].''.htmlspecialchars($record['user']).''.htmlspecialchars($record['client']).''.htmlspecialchars($record['project']).''.htmlspecialchars($record['task']).''.htmlspecialchars($record['cf_1']).''.$record['start'].''.$record['finish'].''.$record['duration'].''.$record['units'].''.htmlspecialchars($record['note']).''.$record['cost'].''; - $body .= $record['paid'] == 1 ? $i18n->get('label.yes') : $i18n->get('label.no'); - $body .= ''; - $body .= $record['modified'] ? $record['modified_ip'].' '.$record['modified'] : $record['created_ip'].' '.$record['created']; - $body .= ''.htmlspecialchars($record['invoice']).'
'.$i18n->get('label.subtotal').''.($group_by == 'user' ? $subtotal_name : '').''.($group_by == 'client' ? $subtotal_name : '').''.($group_by == 'project' ? $subtotal_name : '').''.($group_by == 'task' ? $subtotal_name : '').''.($group_by == 'cf_1' ? $subtotal_name : '').''.$subtotals[$cur_grouped_by]['time'].''.$subtotals[$cur_grouped_by]['units'].''; - $body .= ($canViewReports || $isClient) ? $subtotals[$cur_grouped_by]['cost'] : $subtotals[$cur_grouped_by]['expenses']; - $body .= '
 
'.$i18n->get('label.total').''.$totals['time'].''.$totals['units'].''.htmlspecialchars($user->currency).' '; - $body .= ($canViewReports || $isClient) ? $totals['cost'] : $totals['expenses']; - $body .= '
'; - } - - // Output footer. - if (!defined('REPORT_FOOTER') || !(REPORT_FOOTER == false)) - $body .= '

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

'; - - // Finish creating email body. - $body .= ''; - - return $body; - } - - // checkFavReportCondition - checks whether it is okay to send fav report. - static function checkFavReportCondition($options, $condition) - { - $items = ttReportHelper::getItems($options); - - $condition = str_replace('count', '', $condition); - $count_required = (int) trim(str_replace('>', '', $condition)); - - if (count($items) > $count_required) - return true; // Condition ok. - - return false; - } - - // prepareFavReportBody - prepares an email body for a favorite report. - static function prepareFavReportBody($options) - { - global $user; - global $i18n; - - // Determine these once as they are used in multiple places in this function. - $canViewReports = $user->can('view_reports') || $user->can('view_all_reports'); - $isClient = $user->isClient(); - - $items = ttReportHelper::getItems($options); - $group_by = $options['group_by']; - if ($group_by && 'no_grouping' != $group_by) - $subtotals = ttReportHelper::getSubtotals($options); - $totals = ttReportHelper::getTotals($options); - - // Use custom fields plugin if it is enabled. - if ($user->isPluginEnabled('cf')) - $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;'; - $tableHeader = 'font-weight: bold; background-color: #a6ccf7; text-align: left;'; - $tableHeaderCentered = 'font-weight: bold; background-color: #a6ccf7; text-align: center;'; - $rowItem = 'background-color: #ffffff;'; - $rowItemAlt = 'background-color: #f5f5f5;'; - $rowSubtotal = 'background-color: #e0e0e0;'; - $cellLeftAligned = 'text-align: left; vertical-align: top;'; - $cellRightAligned = 'text-align: right; vertical-align: top;'; - $cellLeftAlignedSubtotal = 'font-weight: bold; text-align: left; vertical-align: top;'; - $cellRightAlignedSubtotal = 'font-weight: bold; text-align: right; vertical-align: top;'; - - // Start creating email body. - $body = ''; - $body .= ''; - $body .= ''; - - // Output title. - $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. - if ($options['show_totals_only']) { // Totals only report. Output subtotals. @@ -1273,6 +975,43 @@ class ttReportHelper { return $body; } + // checkFavReportCondition - checks whether it is okay to send fav report. + static function checkFavReportCondition($options, $condition) + { + $items = ttReportHelper::getItems($options); + + $condition = trim(str_replace('count', '', $condition)); + + $greater_or_equal = ttStartsWith($condition, '>='); + if ($greater_or_equal) $condition = trim(str_replace('>=', '', $condition)); + + $less_or_equal = ttStartsWith($condition, '<='); + if ($less_or_equal) $condition = trim(str_replace('<=', '', $condition)); + + $not_equal = ttStartsWith($condition, '<>'); + if ($not_equal) $condition = trim(str_replace('<>', '', $condition)); + + $greater = ttStartsWith($condition, '>'); + if ($greater) $condition = trim(str_replace('>', '', $condition)); + + $less = ttStartsWith($condition, '<'); + if ($less) $condition = trim(str_replace('<', '', $condition)); + + $equal = ttStartsWith($condition, '='); + if ($equal) $condition = trim(str_replace('=', '', $condition)); + + $count_required = (int) $condition; + + if ($greater && count($items) > $count_required) return true; + if ($greater_or_equal && count($items) >= $count_required) return true; + if ($less && count($items) < $count_required) return true; + if ($less_or_equal && count($items) <= $count_required) return true; + if ($equal && count($items) == $count_required) return true; + if ($not_equal && count($items) <> $count_required) return true; + + return false; + } + // sendFavReport - sends a favorite report to a specified email, called from cron.php static function sendFavReport($options, $subject, $email, $cc) { // We are called from cron.php, we have no $bean in session. @@ -1281,7 +1020,7 @@ class ttReportHelper { global $i18n; // Prepare report body. - $body = ttReportHelper::prepareFavReportBody($options); + $body = ttReportHelper::prepareReportBody($options); import('mail.Mailer'); $mailer = new Mailer(); @@ -1341,7 +1080,9 @@ class ttReportHelper { $options['show_custom_field_1'] = $bean->getAttribute('chcf_1'); $options['show_work_units'] = $bean->getAttribute('chunits'); $options['show_totals_only'] = $bean->getAttribute('chtotalsonly'); - $options['group_by'] = $bean->getAttribute('group_by'); + $options['group_by1'] = $bean->getAttribute('group_by1'); + $options['group_by2'] = $bean->getAttribute('group_by2'); + $options['group_by3'] = $bean->getAttribute('group_by3'); return $options; }