require_once(dirname(__FILE__).'/../../plugins/CustomFields.class.php');
+// Definitions of types for timesheet dropdown.
+define('TIMESHEET_ALL', 0); // Include all records.
+define('TIMESHEET_NOT_ASSIGNED', 1); // Include records not assigned to timesheets.
+define('TIMESHEET_ASSIGNED', 2); // Include records assigned to timesheets.
+define('TIMESHEET_PENDING', 3); // Include records in submitted timesheets that are pending manager approval.
+define('TIMESHEET_APPROVED', 4); // Include records in approved timesheets.
+define('TIMESHEET_NOT_APPROVED', 5); // Include records in disapproved timesheets.
+
// Class ttReportHelper is used for help with reports.
class ttReportHelper {
if ($options['billable']=='2') $dropdown_parts .= ' and l.billable = 0';
if ($options['invoice']=='1') $dropdown_parts .= ' and l.invoice_id is not null';
if ($options['invoice']=='2') $dropdown_parts .= ' and l.invoice_id is null';
- if ($options['timesheet']=='1') $dropdown_parts .= ' and l.timesheet_id is not null';
- if ($options['timesheet']=='2') $dropdown_parts .= ' and l.timesheet_id is null';
+ if ($options['timesheet']==TIMESHEET_NOT_ASSIGNED) $dropdown_parts .= ' and l.timesheet_id is null';
+ if ($options['timesheet']==TIMESHEET_ASSIGNED) $dropdown_parts .= ' and l.timesheet_id is not null';
if ($options['paid_status']=='1') $dropdown_parts .= ' and l.paid = 1';
if ($options['paid_status']=='2') $dropdown_parts .= ' and l.paid = 0';
if ($options['project_id']) $dropdown_parts .= ' and ei.project_id = '.$options['project_id'];
if ($options['invoice']=='1') $dropdown_parts .= ' and ei.invoice_id is not null';
if ($options['invoice']=='2') $dropdown_parts .= ' and ei.invoice_id is null';
- if ($options['timesheet']=='1') $dropdown_parts .= ' and ei.timesheet_id is not null';
- if ($options['timesheet']=='2') $dropdown_parts .= ' and ei.timesheet_id is null';
+ if ($options['timesheet']==TIMESHEET_NOT_ASSIGNED) $dropdown_parts .= ' and ei.timesheet_id is null';
+ if ($options['timesheet']==TIMESHEET_ASSIGNED) $dropdown_parts .= ' and ei.timesheet_id is not null';
if ($options['paid_status']=='1') $dropdown_parts .= ' and ei.paid = 1';
if ($options['paid_status']=='2') $dropdown_parts .= ' and ei.paid = 0';
}
if ($includeCost && MODE_TIME != $trackingMode)
$left_joins .= " left join tt_user_project_binds upb on (l.user_id = upb.user_id and l.project_id = upb.project_id)";
- if ($options['show_timesheet'])
- $left_joins .= " left join tt_timesheets ts on (l.timesheet_id = ts.id)";
+
+ // Prepare sql query part for inner joins.
+ $inner_joins = null;
+ if ($user->isPluginEnabled('ts')) {
+ $timesheet_option = $options['timesheet'];
+ if ($timesheet_option == TIMESHEET_PENDING)
+ $inner_joins .= " inner join tt_timesheets ts on (l.timesheet_id = ts.id and ts.submit_status = 1 and ts.approval_status is null)";
+ else if ($timesheet_option == TIMESHEET_APPROVED)
+ $inner_joins .= " inner join tt_timesheets ts on (l.timesheet_id = ts.id and ts.approval_status = 1)";
+ else if ($timesheet_option == TIMESHEET_NOT_APPROVED)
+ $inner_joins .= " inner join tt_timesheets ts on (l.timesheet_id = ts.id and ts.approval_status = 0)";
+ else if ($options['show_timesheet'])
+ $inner_joins .= " left join tt_timesheets ts on (l.timesheet_id = ts.id)"; // Left join for timesheet nme.
+ }
$where = ttReportHelper::getWhere($options);
// Construct sql query for tt_log items.
- $sql = "select ".join(', ', $fields)." from tt_log l $left_joins $where";
+ $sql = "select ".join(', ', $fields)." from tt_log l $left_joins $inner_joins $where";
// 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.
$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)";
- if ($options['show_timesheet'])
- $left_joins .= " left join tt_timesheets ts on (ei.timesheet_id = ts.id)";
+
+ // Prepare sql query part for inner joins.
+ $inner_joins = null;
+ if ($user->isPluginEnabled('ts')) {
+ $timesheet_option = $options['timesheet'];
+ if ($timesheet_option == TIMESHEET_PENDING)
+ $inner_joins .= " inner join tt_timesheets ts on (ei.timesheet_id = ts.id and ts.submit_status = 1 and ts.approval_status is null)";
+ else if ($timesheet_option == TIMESHEET_APPROVED)
+ $inner_joins .= " inner join tt_timesheets ts on (ei.timesheet_id = ts.id and ts.approval_status = 1)";
+ else if ($timesheet_option == TIMESHEET_NOT_APPROVED)
+ $inner_joins .= " inner join tt_timesheets ts on (ei.timesheet_id = ts.id and ts.approval_status = 0)";
+ else if ($options['show_timesheet'])
+ $inner_joins .= " left join tt_timesheets ts on (ei.timesheet_id = ts.id)"; // Left join for timesheet name.
+ }
$where = ttReportHelper::getExpenseWhere($options);
// Construct sql query for expense items.
- $sql_for_expense_items = "select ".join(', ', $fields)." from tt_expense_items ei $left_joins $where";
+ $sql_for_expense_items = "select ".join(', ', $fields)." from tt_expense_items ei $left_joins $inner_joins $where";
// Construct a union.
$sql = "($sql) union all ($sql_for_expense_items)";
$left_joins = "left join tt_user_project_binds upb on (l.user_id = upb.user_id and l.project_id = upb.project_id)";
}
}
+ // Prepare sql query part for inner joins.
+ $inner_joins = null;
+ if ($user->isPluginEnabled('ts') && $options['timesheet']) {
+ $timesheet_option = $options['timesheet'];
+ if ($timesheet_option == TIMESHEET_PENDING)
+ $inner_joins .= " inner join tt_timesheets ts on (l.timesheet_id = ts.id and ts.submit_status = 1 and ts.approval_status is null)";
+ else if ($timesheet_option == TIMESHEET_APPROVED)
+ $inner_joins .= " inner join tt_timesheets ts on (l.timesheet_id = ts.id and ts.approval_status = 1)";
+ else if ($timesheet_option == TIMESHEET_NOT_APPROVED)
+ $inner_joins .= " inner join tt_timesheets ts on (l.timesheet_id = ts.id and ts.approval_status = 0)";
+ }
// Prepare a query for time items.
- $sql = "select $time_part $units_part $cost_part from tt_log l $left_joins $where";
+ $sql = "select $time_part $units_part $cost_part from tt_log l $left_joins $inner_joins $where";
// If we have expenses, query becomes a bit more complex.
if ($options['show_cost'] && $user->isPluginEnabled('ex')) {
+ // Prepare sql query part for inner joins.
+ $inner_joins = null;
+ if ($user->isPluginEnabled('ts') && $options['timesheet']) {
+ $timesheet_option = $options['timesheet'];
+ if ($timesheet_option == TIMESHEET_PENDING)
+ $inner_joins .= " inner join tt_timesheets ts on (ei.timesheet_id = ts.id and ts.submit_status = 1 and ts.approval_status is null)";
+ else if ($timesheet_option == TIMESHEET_APPROVED)
+ $inner_joins .= " inner join tt_timesheets ts on (ei.timesheet_id = ts.id and ts.approval_status = 1)";
+ else if ($timesheet_option == TIMESHEET_NOT_APPROVED)
+ $inner_joins .= " inner join tt_timesheets ts on (ei.timesheet_id = ts.id and ts.approval_status = 0)";
+ }
$where = ttReportHelper::getExpenseWhere($options);
$sql_for_expenses = "select null as time";
if ($options['show_work_units']) $sql_for_expenses .= ", null as units";
- $sql_for_expenses .= ", sum(cost) as cost, sum(cost) as expenses from tt_expense_items ei $where";
+ $sql_for_expenses .= ", sum(cost) as cost, sum(cost) as expenses from tt_expense_items ei $inner_joins $where";
// Create a combined query.
$combined = "select sum(time) as time";
// 'form.reports.include_not_invoiced' => 'not invoiced',
// 'form.reports.include_assigned' => 'assigned',
// 'form.reports.include_not_assigned' => 'not assigned',
+// 'form.reports.include_pending' => 'pending',
// 'form.reports.include_approved' => 'approved',
// 'form.reports.include_not_approved' => 'not approved',
'form.reports.select_period' => 'Seleccionar període de temps',
// 'form.reports.include_not_invoiced' => 'not invoiced',
// 'form.reports.include_assigned' => 'assigned',
// 'form.reports.include_not_assigned' => 'not assigned',
+// 'form.reports.include_pending' => 'pending',
// 'form.reports.include_approved' => 'approved',
// 'form.reports.include_not_approved' => 'not approved',
'form.reports.select_period' => 'Výberte období',
// TODO: translate the following.
// 'form.reports.include_assigned' => 'assigned',
// 'form.reports.include_not_assigned' => 'not assigned',
+// 'form.reports.include_pending' => 'pending',
// 'form.reports.include_approved' => 'approved',
// 'form.reports.include_not_approved' => 'not approved',
'form.reports.select_period' => 'Vælg en periode',
// TODO: translate the following.
// 'form.reports.include_assigned' => 'assigned',
// 'form.reports.include_not_assigned' => 'not assigned',
+// 'form.reports.include_pending' => 'pending',
// 'form.reports.include_approved' => 'approved',
// 'form.reports.include_not_approved' => 'not approved',
'form.reports.select_period' => 'Zeitraum auswählen',
'label.quota' => 'Quota',
'label.timesheet' => 'Timesheet',
'label.submitted' => 'Submitted',
-'label.form' => 'Approved',
+'label.approved' => 'Approved',
// Form titles.
'title.error' => 'Error',
'form.reports.include_not_invoiced' => 'not invoiced',
'form.reports.include_assigned' => 'assigned',
'form.reports.include_not_assigned' => 'not assigned',
+'form.reports.include_pending' => 'pending',
'form.reports.include_approved' => 'approved',
'form.reports.include_not_approved' => 'not approved',
'form.reports.select_period' => 'Select time period',
// 'form.reports.include_not_invoiced' => 'not invoiced',
// 'form.reports.include_assigned' => 'assigned',
// 'form.reports.include_not_assigned' => 'not assigned',
+// 'form.reports.include_pending' => 'pending',
// 'form.reports.include_approved' => 'approved',
// 'form.reports.include_not_approved' => 'not approved',
'form.reports.select_period' => 'Seleccionar período de tiempo',
// 'form.reports.include_not_invoiced' => 'arveldamata', // TODO: fix as per the above comment, if needed.
// 'form.reports.include_assigned' => 'assigned',
// 'form.reports.include_not_assigned' => 'not assigned',
+// 'form.reports.include_pending' => 'pending',
// 'form.reports.include_approved' => 'approved',
// 'form.reports.include_not_approved' => 'not approved',
// 'form.reports.include_not_invoiced' => 'not invoiced',
// 'form.reports.include_assigned' => 'assigned',
// 'form.reports.include_not_assigned' => 'not assigned',
+// 'form.reports.include_pending' => 'pending',
// 'form.reports.include_approved' => 'approved',
// 'form.reports.include_not_approved' => 'not approved',
'form.reports.select_period' => 'انتخاب بازه زمانی',
// TODO: translate the following.
// 'form.reports.include_assigned' => 'assigned',
// 'form.reports.include_not_assigned' => 'not assigned',
+// 'form.reports.include_pending' => 'pending',
// 'form.reports.include_approved' => 'approved',
// 'form.reports.include_not_approved' => 'not approved',
'form.reports.select_period' => 'Valitse ajanjakso',
// TODO: translate the following.
// 'form.reports.include_assigned' => 'assigned',
// 'form.reports.include_not_assigned' => 'not assigned',
+// 'form.reports.include_pending' => 'pending',
// 'form.reports.include_approved' => 'approved',
// 'form.reports.include_not_approved' => 'not approved',
'form.reports.select_period' => 'Sélectionner la période de temps',
// TODO: translate the following.
// 'form.reports.include_assigned' => 'assigned',
// 'form.reports.include_not_assigned' => 'not assigned',
+// 'form.reports.include_pending' => 'pending',
// 'form.reports.include_approved' => 'approved',
// 'form.reports.include_not_approved' => 'not approved',
'form.reports.select_period' => 'Επιλογή χρονικής περιόδου',
// 'form.reports.include_not_invoiced' => 'not invoiced',
// 'form.reports.include_assigned' => 'assigned',
// 'form.reports.include_not_assigned' => 'not assigned',
+// 'form.reports.include_pending' => 'pending',
// 'form.reports.include_approved' => 'approved',
// 'form.reports.include_not_approved' => 'not approved',
'form.reports.select_period' => 'בחר תקופת זמן',
// 'form.reports.include_not_invoiced' => 'not invoiced',
// 'form.reports.include_assigned' => 'assigned',
// 'form.reports.include_not_assigned' => 'not assigned',
+// 'form.reports.include_pending' => 'pending',
// 'form.reports.include_approved' => 'approved',
// 'form.reports.include_not_approved' => 'not approved',
'form.reports.select_period' => 'Jelölj meg egy időszakot',
// TODO: translate the following.
// 'form.reports.include_assigned' => 'assigned',
// 'form.reports.include_not_assigned' => 'not assigned',
+// 'form.reports.include_pending' => 'pending',
// 'form.reports.include_approved' => 'approved',
// 'form.reports.include_not_approved' => 'not approved',
'form.reports.select_period' => 'Seleziona il periodo di tempo',
// 'form.reports.include_not_invoiced' => 'not invoiced',
// 'form.reports.include_assigned' => 'assigned',
// 'form.reports.include_not_assigned' => 'not assigned',
+// 'form.reports.include_pending' => 'pending',
// 'form.reports.include_approved' => 'approved',
// 'form.reports.include_not_approved' => 'not approved',
'form.reports.select_period' => '時間期間の選択',
// 'form.reports.include_not_invoiced' => 'not invoiced',
// 'form.reports.include_assigned' => 'assigned',
// 'form.reports.include_not_assigned' => 'not assigned',
+// 'form.reports.include_pending' => 'pending',
// 'form.reports.include_approved' => 'approved',
// 'form.reports.include_not_approved' => 'not approved',
'form.reports.select_period' => '시간 기간을 선택',
// TODO: translate the following.
// 'form.reports.include_assigned' => 'assigned',
// 'form.reports.include_not_assigned' => 'not assigned',
+// 'form.reports.include_pending' => 'pending',
// 'form.reports.include_approved' => 'approved',
// 'form.reports.include_not_approved' => 'not approved',
'form.reports.select_period' => 'Kies periode',
// 'form.reports.include_not_invoiced' => 'not invoiced',
// 'form.reports.include_assigned' => 'assigned',
// 'form.reports.include_not_assigned' => 'not assigned',
+// 'form.reports.include_pending' => 'pending',
// 'form.reports.include_approved' => 'approved',
// 'form.reports.include_not_approved' => 'not approved',
'form.reports.select_period' => 'Velg tidsperiode',
// TODO: translate the following.
// 'form.reports.include_assigned' => 'assigned',
// 'form.reports.include_not_assigned' => 'not assigned',
+// 'form.reports.include_pending' => 'pending',
// 'form.reports.include_approved' => 'approved',
// 'form.reports.include_not_approved' => 'not approved',
'form.reports.select_period' => 'Wybierz okres',
// TODO: translate the following.
// 'form.reports.include_assigned' => 'assigned',
// 'form.reports.include_not_assigned' => 'not assigned',
+// 'form.reports.include_pending' => 'pending',
// 'form.reports.include_approved' => 'approved',
// 'form.reports.include_not_approved' => 'not approved',
'form.reports.select_period' => 'Selecione o período de tempo',
// 'form.reports.include_not_invoiced' => 'not invoiced',
// 'form.reports.include_assigned' => 'assigned',
// 'form.reports.include_not_assigned' => 'not assigned',
+// 'form.reports.include_pending' => 'pending',
// 'form.reports.include_approved' => 'approved',
// 'form.reports.include_not_approved' => 'not approved',
'form.reports.select_period' => 'Selecione o período de tempo',
// 'form.reports.include_not_invoiced' => 'not invoiced',
// 'form.reports.include_assigned' => 'assigned',
// 'form.reports.include_not_assigned' => 'not assigned',
+// 'form.reports.include_pending' => 'pending',
// 'form.reports.include_approved' => 'approved',
// 'form.reports.include_not_approved' => 'not approved',
'form.reports.select_period' => 'Alege perioada',
'form.reports.include_not_invoiced' => 'не внесённые в счёт',
'form.reports.include_assigned' => 'присвоена',
'form.reports.include_not_assigned' => 'не присвоена',
+'form.reports.include_pending' => 'в ожидании',
'form.reports.include_approved' => 'одобрена',
'form.reports.include_not_approved' => 'не одобрена',
'form.reports.select_period' => 'Выберите интервал времени',
// 'form.reports.include_not_invoiced' => 'not invoiced',
// 'form.reports.include_assigned' => 'assigned',
// 'form.reports.include_not_assigned' => 'not assigned',
+// 'form.reports.include_pending' => 'pending',
// 'form.reports.include_approved' => 'approved',
// 'form.reports.include_not_approved' => 'not approved',
'form.reports.select_period' => 'Vyberte časový rozsah',
// 'form.reports.include_not_invoiced' => 'not invoiced',
// 'form.reports.include_assigned' => 'assigned',
// 'form.reports.include_not_assigned' => 'not assigned',
+// 'form.reports.include_pending' => 'pending',
// 'form.reports.include_approved' => 'approved',
// 'form.reports.include_not_approved' => 'not approved',
// 'form.reports.select_period' => 'Select time period',
// TODO: translate the following.
// 'form.reports.include_assigned' => 'assigned',
// 'form.reports.include_not_assigned' => 'not assigned',
+// 'form.reports.include_pending' => 'pending',
// 'form.reports.include_approved' => 'approved',
// 'form.reports.include_not_approved' => 'not approved',
'form.reports.select_period' => 'Odaberi vremenski raspon',
// TODO: translate the following.
// 'form.reports.include_assigned' => 'assigned',
// 'form.reports.include_not_assigned' => 'not assigned',
+// 'form.reports.include_pending' => 'pending',
// 'form.reports.include_approved' => 'approved',
// 'form.reports.include_not_approved' => 'not approved',
'form.reports.select_period' => 'Välj intervall',
// 'form.reports.include_not_invoiced' => 'not invoiced',
// 'form.reports.include_assigned' => 'assigned',
// 'form.reports.include_not_assigned' => 'not assigned',
+// 'form.reports.include_pending' => 'pending',
// 'form.reports.include_approved' => 'approved',
// 'form.reports.include_not_approved' => 'not approved',
'form.reports.select_period' => 'Zaman aralığını seç',
// 'form.reports.include_not_invoiced' => 'not invoiced',
// 'form.reports.include_assigned' => 'assigned',
// 'form.reports.include_not_assigned' => 'not assigned',
+// 'form.reports.include_pending' => 'pending',
// 'form.reports.include_approved' => 'approved',
// 'form.reports.include_not_approved' => 'not approved',
'form.reports.select_period' => '选择时间段',
// 'form.reports.include_not_invoiced' => 'not invoiced',
// 'form.reports.include_assigned' => 'assigned',
// 'form.reports.include_not_assigned' => 'not assigned',
+// 'form.reports.include_pending' => 'pending',
// 'form.reports.include_approved' => 'approved',
// 'form.reports.include_not_approved' => 'not approved',
'form.reports.select_period' => '選擇時間段',
<br>
<table cellspacing="0" cellpadding="4" width="100%" border="0">
<tr>
- <td align="center"> Anuko Time Tracker 1.18.37.4760 | Copyright © <a href="https://www.anuko.com/lp/tt_3.htm" target="_blank">Anuko</a> |
+ <td align="center"> Anuko Time Tracker 1.18.37.4761 | Copyright © <a href="https://www.anuko.com/lp/tt_3.htm" target="_blank">Anuko</a> |
<a href="https://www.anuko.com/lp/tt_4.htm" target="_blank">{$i18n.footer.credits}</a> |
<a href="https://www.anuko.com/lp/tt_5.htm" target="_blank">{$i18n.footer.license}</a> |
<a href="https://www.anuko.com/lp/tt_7.htm" target="_blank">{$i18n.footer.improve}</a>
$form->addInput(array('type'=>'combobox',
'name'=>'timesheet',
'style'=>'width: 250px;',
- 'data'=>array('1'=>$i18n->get('form.reports.include_assigned'),'2'=>$i18n->get('form.reports.include_not_assigned')),
+ 'data'=>array(TIMESHEET_NOT_ASSIGNED=>$i18n->get('form.reports.include_not_assigned'),
+ TIMESHEET_ASSIGNED=>$i18n->get('form.reports.include_assigned'),
+ TIMESHEET_PENDING=>$i18n->get('form.reports.include_pending'),
+ TIMESHEET_APPROVED=>$i18n->get('form.reports.include_approved'),
+ TIMESHEET_NOT_APPROVED=>$i18n->get('form.reports.include_not_approved')),
'empty'=>array(''=>$i18n->get('dropdown.all'))
));
}