- // 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($user->canManageTeam() || $user->isClient())
- array_push($fields, 'u.name as user');
- // Add client name if it is selected.
- if ($bean->getAttribute('chclient') || 'client' == $group_by_option)
- array_push($fields, 'c.name as client');
- // Add project name if it is selected.
- if ($bean->getAttribute('chproject') || 'project' == $group_by_option)
- array_push($fields, 'p.name as project');
- // Add task name if it is selected.
- if ($bean->getAttribute('chtask') || 'task' == $group_by_option)
- array_push($fields, 't.name as task');
- // 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);
- $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 ($bean->getAttribute('chstart')) {
- array_push($fields, "l.start as unformatted_start");
- array_push($fields, "TIME_FORMAT(l.start, '%k:%i') as start");
- }
- // Add finish time.
- if ($bean->getAttribute('chfinish'))
- 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 ($bean->getAttribute('chduration'))
- array_push($fields, "TIME_FORMAT(l.duration, '%k:%i') as duration");
- // Add note.
- if ($bean->getAttribute('chnote'))
- array_push($fields, 'l.comment as note');
- // Handle cost.
- $includeCost = $bean->getAttribute('chcost');
- 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 invoice name if it is selected.
- if (($user->canManageTeam() || $user->isClient()) && $bean->getAttribute('chinvoice'))
- array_push($fields, 'i.name as invoice');
-
- // Prepare sql query part for left joins.
- $left_joins = null;
- if ($bean->getAttribute('chclient') || 'client' == $group_by_option)
- $left_joins .= " left join tt_clients c on (c.id = l.client_id)";
- if (($user->canManageTeam() || $user->isClient()) && $bean->getAttribute('chinvoice'))
- $left_joins .= " left join tt_invoices i on (i.id = l.invoice_id and i.status = 1)";
- if ($user->canManageTeam() || $user->isClient() || $user->isPluginEnabled('ex'))
- $left_joins .= " left join tt_users u on (u.id = l.user_id)";
- if ($bean->getAttribute('chproject') || 'project' == $group_by_option)
- $left_joins .= " left join tt_projects p on (p.id = l.project_id)";
- if ($bean->getAttribute('chtask') || '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::getWhere($bean);
-
- // 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,
- // 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.
- if ($bean->getAttribute('chcost') && $user->isPluginEnabled('ex')) { // if ex(penses) plugin is enabled
-
- $fields = array(); // An array of fields for database query.
- array_push($fields, 'ei.id');
- array_push($fields, '2 as type'); // Type 2 is for tt_expense_items entries.
- array_push($fields, 'ei.date');
- if($user->canManageTeam() || $user->isClient())
- array_push($fields, 'u.name as user');
- // Add client name if it is selected.
- if ($bean->getAttribute('chclient') || 'client' == $group_by_option)
- array_push($fields, 'c.name as client');
- // Add project name if it is selected.
- if ($bean->getAttribute('chproject') || 'project' == $group_by_option)
- array_push($fields, 'p.name as project');
- if ($bean->getAttribute('chtask') || 'task' == $group_by_option)
- array_push($fields, 'null'); // null for task name. We need to match column count for union.
- if ($bean->getAttribute('chcf_1') || 'cf_1' == $group_by_option)
- array_push($fields, 'null'); // null for cf_1.
- if ($bean->getAttribute('chstart')) {
- array_push($fields, 'null'); // null for unformatted_start.
- array_push($fields, 'null'); // null for start.
- }
- if ($bean->getAttribute('chfinish'))
- array_push($fields, 'null'); // null for finish.
- if ($bean->getAttribute('chduration'))
- array_push($fields, 'null'); // null for duration.
- // Use the note field to print item name.
- if ($bean->getAttribute('chnote'))
- array_push($fields, 'ei.name as note');
- array_push($fields, 'ei.cost as cost');
- array_push($fields, 'ei.cost as expense');
- // Add invoice name if it is selected.
- if (($user->canManageTeam() || $user->isClient()) && $bean->getAttribute('chinvoice'))
- array_push($fields, 'i.name as invoice');