- // getFavItems retrieves all items associated with a favorite report.
- // It combines tt_log and tt_expense_items in one array for presentation in one table using mysql union all.
- // Expense items use the "note" field for item name.
- static function getFavItems($report) {
- global $user;
- $mdb2 = getConnection();
-
- $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($user->canManageTeam() || $user->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 invoice name if it is selected.
- if (($user->canManageTeam() || $user->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 (($user->canManageTeam() || $user->isClient()) && $report['show_invoice'])
- $left_joins .= " left join tt_invoices i on (i.id = l.invoice_id and i.status = 1)";
- if ($user->canManageTeam() || $user->isClient() || ttPluginEnabled('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);
-
- // 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 ($report['show_cost'] && in_array('ex', explode(',', $user->plugins))) { // 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 ($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');
- if ($report['show_task'] || 'task' == $group_by_option)
- array_push($fields, 'null'); // null for task name. We need to match column count for union.
- if ($report['show_custom_field_1'] || 'cf_1' == $group_by_option)
- array_push($fields, 'null'); // null for cf_1.
- if ($report['show_start']) {
- array_push($fields, 'null'); // null for unformatted_start.
- array_push($fields, 'null'); // null for start.
- }
- if ($report['show_end'])
- array_push($fields, 'null'); // null for finish.
- if ($report['show_duration'])
- array_push($fields, 'null'); // null for duration.
- // Use the note field to print item name.
- if ($report['show_note'])
- 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()) && $report['show_invoice'])
- array_push($fields, 'i.name as invoice');
-
- // Prepare sql query part for left joins.
- $left_joins = null;
- if ($user->canManageTeam() || $user->isClient())
- $left_joins .= " left join tt_users u on (u.id = ei.user_id)";
- if ($report['show_client'] || 'client' == $group_by_option)
- $left_joins .= " left join tt_clients c on (c.id = ei.client_id)";
- if ($report['show_project'] || 'project' == $group_by_option)
- $left_joins .= " left join tt_projects p on (p.id = ei.project_id)";
- if (($user->canManageTeam() || $user->isClient()) && $report['show_invoice'])
- $left_joins .= " left join tt_invoices i on (i.id = ei.invoice_id and i.status = 1)";
-
- $where = ttReportHelper::getFavExpenseWhere($report);
-
- // Construct sql query for expense items.
- $sql_for_expense_items = "select ".join(', ', $fields)." from tt_expense_items ei $left_joins $where";
-
- // Construct a union.
- $sql = "($sql) union all ($sql_for_expense_items)";