- // Determine these once as they are used in multiple places in this function.
- $canViewReports = $user->can('view_reports');
- $isClient = $user->isClient();
-
- $group_by_option = $report['group_by'];
- $convertTo12Hour = ('%I:%M %p' == $user->time_format) && ($report['show_start'] || $report['show_end']);
-
- // Prepare a query for time items in tt_log table.
- $fields = array(); // An array of fields for database query.
- array_push($fields, 'l.id as id');
- array_push($fields, '1 as type'); // Type 1 is for tt_log entries.
- array_push($fields, 'l.date as date');
- if($canViewReports || $isClient)
- array_push($fields, 'u.name as user');
- // Add client name if it is selected.
- if ($report['show_client'] || 'client' == $group_by_option)
- array_push($fields, 'c.name as client');
- // Add project name if it is selected.
- if ($report['show_project'] || 'project' == $group_by_option)
- array_push($fields, 'p.name as project');
- // Add task name if it is selected.
- if ($report['show_task'] || 'task' == $group_by_option)
- array_push($fields, 't.name as task');
- // 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);
- $cf_1_type = $custom_fields->fields[0]['type'];
- if ($cf_1_type == CustomFields::TYPE_TEXT) {
- array_push($fields, 'cfl.value as cf_1');
- } elseif ($cf_1_type == CustomFields::TYPE_DROPDOWN) {
- array_push($fields, 'cfo.value as cf_1');
- }
- }
- // Add start time.
- if ($report['show_start']) {
- array_push($fields, "l.start as unformatted_start");
- array_push($fields, "TIME_FORMAT(l.start, '%k:%i') as start");
- }
- // Add finish time.
- if ($report['show_end'])
- array_push($fields, "TIME_FORMAT(sec_to_time(time_to_sec(l.start) + time_to_sec(l.duration)), '%k:%i') as finish");
- // Add duration.
- if ($report['show_duration'])
- array_push($fields, "TIME_FORMAT(l.duration, '%k:%i') as duration");
- // Add note.
- if ($report['show_note'])
- array_push($fields, 'l.comment as note');
- // Handle cost.
- $includeCost = $report['show_cost'];
- if ($includeCost) {
- if (MODE_TIME == $user->tracking_mode)
- array_push($fields, "cast(l.billable * coalesce(u.rate, 0) * time_to_sec(l.duration)/3600 as decimal(10,2)) as cost"); // Use default user rate.
- else
- array_push($fields, "cast(l.billable * coalesce(upb.rate, 0) * time_to_sec(l.duration)/3600 as decimal(10,2)) as cost"); // Use project rate for user.
- array_push($fields, "null as expense");
- }
- // Add paid status.
- if ($canViewReports && $report['show_paid'])
- array_push($fields, 'l.paid as paid');
- // Add IP address.
- if ($canViewReports && $report['show_ip']) {
- array_push($fields, 'l.created as created');
- array_push($fields, 'l.created_ip as created_ip');
- array_push($fields, 'l.modified as modified');
- array_push($fields, 'l.modified_ip as modified_ip');
- }
- // Add invoice name if it is selected.
- if (($canViewReports || $isClient) && $report['show_invoice'])
- array_push($fields, 'i.name as invoice');
-
- // Prepare sql query part for left joins.
- $left_joins = null;
- if ($report['show_client'] || 'client' == $group_by_option)
- $left_joins .= " left join tt_clients c on (c.id = l.client_id)";
- if (($canViewReports || $isClient) && $report['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 ($report['show_project'] || 'project' == $group_by_option)
- $left_joins .= " left join tt_projects p on (p.id = l.project_id)";
- if ($report['show_task'] || 'task' == $group_by_option)
- $left_joins .= " left join tt_tasks t on (t.id = l.task_id)";
- if ($include_cf_1) {
- if ($cf_1_type == CustomFields::TYPE_TEXT)
- $left_joins .= " left join tt_custom_field_log cfl on (l.id = cfl.log_id and cfl.status = 1)";
- elseif ($cf_1_type == CustomFields::TYPE_DROPDOWN) {
- $left_joins .= " 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.option_id = cfo.id)";
- }
- }
- if ($includeCost && MODE_TIME != $user->tracking_mode)
- $left_joins .= " left join tt_user_project_binds upb on (l.user_id = upb.user_id and l.project_id = upb.project_id)";
-
- $where = ttReportHelper::getFavWhere($report);