}
// normalizeDuration - converts a valid time duration string to format 00:00.
- static function normalizeDuration($value) {
+ static function normalizeDuration($value, $leadingZero = true) {
$time_value = $value;
// If we have a decimal format - convert to time format 00:00.
$mins = round($val * 60);
$hours = (string)((int)($mins / 60));
$mins = (string)($mins % 60);
- if (strlen($hours) == 1)
+ if ($leadingZero && strlen($hours) == 1)
$hours = '0'.$hours;
if (strlen($mins) == 1)
$mins = '0' . $mins;
// 0-99
if ((strlen($time_value) >= 1) && (strlen($time_value) <= 2) && !isset($time_a[1])) {
$hours = $time_a[0];
- if (strlen($hours) == 1)
+ if ($leadingZero && strlen($hours) == 1)
$hours = '0'.$hours;
return $hours.':00';
}
if ((strlen($time_value) >= 3) && (strlen($time_value) <= 4) && !isset($time_a[1])) {
if (strlen($time_value)==3) $time_value = '0'.$time_value;
$hours = substr($time_value,0,2);
- if (strlen($hours) == 1)
+ if ($leadingZero && strlen($hours) == 1)
$hours = '0'.$hours;
return $hours.':'.substr($time_value,2,2);
}
// 0:00-23:59 (24:00)
if ((strlen($time_value) >= 4) && (strlen($time_value) <= 5) && isset($time_a[1])) {
$hours = $time_a[0];
- if (strlen($hours) == 1)
+ if ($leadingZero && strlen($hours) == 1)
$hours = '0'.$hours;
return $hours.':'.$time_a[1];
}
return (int)@$time_a[1] + ((int)@$time_a[0]) * 60;
}
- // toAbsDuration - converts a number of minutes to format 00:00
+ // toAbsDuration - converts a number of minutes to format 0:00
// even if $minutes is negative.
static function toAbsDuration($minutes){
$hours = (string)((int)abs($minutes / 60));
$mins = (string)(abs($minutes % 60));
- if (strlen($hours) == 1)
- $hours = '0'.$hours;
if (strlen($mins) == 1)
$mins = '0' . $mins;
return $hours.':'.$mins;
$invoice = $fields['invoice'];
$note = $fields['note'];
$billable = $fields['billable'];
+ $paid = $fields['paid'];
if (array_key_exists('status', $fields)) { // Key exists and may be NULL during migration of data.
$status_f = ', status';
$status_v = ', '.$mdb2->quote($fields['status']);
}
if (!$billable) $billable = 0;
+ if (!$paid) $paid = 0;
if ($duration) {
- $sql = "insert into tt_log (timestamp, user_id, date, duration, client_id, project_id, task_id, invoice_id, comment, billable $status_f) ".
- "values ('$timestamp', $user_id, ".$mdb2->quote($date).", '$duration', ".$mdb2->quote($client).", ".$mdb2->quote($project).", ".$mdb2->quote($task).", ".$mdb2->quote($invoice).", ".$mdb2->quote($note).", $billable $status_v)";
+ $sql = "insert into tt_log (timestamp, user_id, date, duration, client_id, project_id, task_id, invoice_id, comment, billable, paid $status_f) ".
+ "values ('$timestamp', $user_id, ".$mdb2->quote($date).", '$duration', ".$mdb2->quote($client).", ".$mdb2->quote($project).", ".$mdb2->quote($task).", ".$mdb2->quote($invoice).", ".$mdb2->quote($note).", $billable, $paid $status_v)";
$affected = $mdb2->exec($sql);
if (is_a($affected, 'PEAR_Error'))
return false;
if ($duration === false) $duration = 0;
if (!$duration && ttTimeHelper::getUncompleted($user_id)) return false;
- $sql = "insert into tt_log (timestamp, user_id, date, start, duration, client_id, project_id, task_id, invoice_id, comment, billable $status_f) ".
- "values ('$timestamp', $user_id, ".$mdb2->quote($date).", '$start', '$duration', ".$mdb2->quote($client).", ".$mdb2->quote($project).", ".$mdb2->quote($task).", ".$mdb2->quote($invoice).", ".$mdb2->quote($note).", $billable $status_v)";
+ $sql = "insert into tt_log (timestamp, user_id, date, start, duration, client_id, project_id, task_id, invoice_id, comment, billable, paid $status_f) ".
+ "values ('$timestamp', $user_id, ".$mdb2->quote($date).", '$start', '$duration', ".$mdb2->quote($client).", ".$mdb2->quote($project).", ".$mdb2->quote($task).", ".$mdb2->quote($invoice).", ".$mdb2->quote($note).", $billable, $paid $status_v)";
$affected = $mdb2->exec($sql);
if (is_a($affected, 'PEAR_Error'))
return false;
// update - updates a record in log table. Does not update its custom fields.
static function update($fields)
{
+ global $user;
$mdb2 = getConnection();
$id = $fields['id'];
$finish = $fields['finish'];
$duration = $fields['duration'];
$note = $fields['note'];
- $billable = $fields['billable'];
+
+ $billable_part = '';
+ if ($user->isPluginEnabled('iv')) {
+ $billable_part = $fields['billable'] ? ', billable = 1' : ', billable = 0';
+ }
+ $paid_part = '';
+ if ($user->canManageTeam() && $user->isPluginEnabled('ps')) {
+ $paid_part = $fields['paid'] ? ', paid = 1' : ', paid = 0';
+ }
$start = ttTimeHelper::to24HourFormat($start);
$finish = ttTimeHelper::to24HourFormat($finish);
if ('00:00' == $finish) $finish = '24:00';
$duration = ttTimeHelper::normalizeDuration($duration);
- if (!$billable) $billable = 0;
if ($start) $duration = '';
if ($duration) {
$sql = "UPDATE tt_log set start = NULL, duration = '$duration', client_id = ".$mdb2->quote($client).", project_id = ".$mdb2->quote($project).", task_id = ".$mdb2->quote($task).", ".
- "comment = ".$mdb2->quote($note).", billable = $billable, date = '$date' WHERE id = $id";
+ "comment = ".$mdb2->quote($note)."$billable_part $paid_part, date = '$date' WHERE id = $id";
$affected = $mdb2->exec($sql);
if (is_a($affected, 'PEAR_Error'))
return false;
return false;
$sql = "UPDATE tt_log SET start = '$start', duration = '$duration', client_id = ".$mdb2->quote($client).", project_id = ".$mdb2->quote($project).", task_id = ".$mdb2->quote($task).", ".
- "comment = ".$mdb2->quote($note).", billable = $billable, date = '$date' WHERE id = $id";
+ "comment = ".$mdb2->quote($note)."$billable_part $paid_part, date = '$date' WHERE id = $id";
$affected = $mdb2->exec($sql);
if (is_a($affected, 'PEAR_Error'))
return false;
$sql = "select l.id as id, l.timestamp as timestamp, TIME_FORMAT(l.start, $sql_time_format) as start,
TIME_FORMAT(sec_to_time(time_to_sec(l.start) + time_to_sec(l.duration)), $sql_time_format) as finish,
TIME_FORMAT(l.duration, '%k:%i') as duration,
- p.name as project_name, t.name as task_name, l.comment, l.client_id, l.project_id, l.task_id, l.invoice_id, l.billable, l.date
+ p.name as project_name, t.name as task_name, l.comment, l.client_id, l.project_id, l.task_id, l.invoice_id, l.billable, l.paid, l.date
from tt_log l
left join tt_projects p on (p.id = l.project_id)
left join tt_tasks t on (t.id = l.task_id)
$sql = "select l.id, l.timestamp, l.user_id, l.date, TIME_FORMAT(l.start, '%k:%i') as start,
TIME_FORMAT(sec_to_time(time_to_sec(l.start) + time_to_sec(l.duration)), '%k:%i') as finish,
TIME_FORMAT(l.duration, '%k:%i') as duration,
- l.client_id, l.project_id, l.task_id, l.invoice_id, l.comment, l.billable, l.status
+ l.client_id, l.project_id, l.task_id, l.invoice_id, l.comment, l.billable, l.paid, l.status
from tt_log l where l.user_id = $user_id order by l.id";
$res = $mdb2->query($sql);
if (!is_a($res, 'PEAR_Error')) {
return $result;
}
-
- // getRecordsForInterval - returns time records for a user for a given interval of dates.
- static function getRecordsForInterval($user_id, $start_date, $end_date) {
- global $user;
- $sql_time_format = "'%k:%i'"; // 24 hour format.
- if ('%I:%M %p' == $user->time_format)
- $sql_time_format = "'%h:%i %p'"; // 12 hour format for MySQL TIME_FORMAT function.
-
- $result = array();
- $mdb2 = getConnection();
-
- $client_field = null;
- if ($user->isPluginEnabled('cl'))
- $client_field = ", c.id as client_id, c.name as client";
-
- $left_joins = " left join tt_projects p on (l.project_id = p.id)".
- " left join tt_tasks t on (l.task_id = t.id)";
- if ($user->isPluginEnabled('cl'))
- $left_joins .= " left join tt_clients c on (l.client_id = c.id)";
-
- $sql = "select l.id as id, l.date as date, TIME_FORMAT(l.start, $sql_time_format) as start,
- TIME_FORMAT(sec_to_time(time_to_sec(l.start) + time_to_sec(l.duration)), $sql_time_format) as finish,
- TIME_FORMAT(l.duration, '%k:%i') as duration, p.id as project_id, p.name as project,
- t.id as task_id, t.name as task, l.comment, l.billable, l.invoice_id $client_field
- from tt_log l
- $left_joins
- where l.date >= '$start_date' and l.date <= '$end_date' and l.user_id = $user_id and l.status = 1
- order by p.name, t.name, l.date, l.start, l.id";
- $res = $mdb2->query($sql);
- if (!is_a($res, 'PEAR_Error')) {
- while ($val = $res->fetchRow()) {
- if($val['duration']=='0:00')
- $val['finish'] = '';
- $result[] = $val;
- }
- } else return false;
-
- return $result;
- }
-
- // getGroupedRecordsForInterval - returns time records for a user for a given interval of dates grouped in an array of dates.
- // Example: for a week view we want one row representing the same attributes to have 7 values for each day of week.
- // We identify simlar records by a combination of client, billable, project, task, and custom field values.
- //
- // "cl:546,bl:0,pr:23456,ts:27464,cf_1:example text"
- // The above means client 546, billable, project 23456, task 27464, custom field value: example text.
- //
- // "cl:546,bl:1,pr:23456,ts:27464,cf_1:7623"
- // The above means client 546, not billable, project 23456, task 27464, custom field option value 7623.
- // This will allow us to extend the feature when more custom fields are added.
- static function getGroupedRecordsForInterval($user_id, $start_date, $end_date) {
- // Start by obtaining all records in interval.
- // Then, iterate through them to build an array.
- $records = ttTimeHelper::getRecordsForInterval($user_id, $start_date, $end_date);
- foreach ($records as $record) {
- $record_identifier = ttTimeHelper::makeRecordIdentifier($record);
- }
-
- return null; // Work in progress, not implemented.
- }
-
- // makeRecordIdentifier - builds a string identifying a record for a grouped display (such as a week view).
- // For example:
- // "cl:546,bl:0,pr:23456,ts:27464,cf_1:example text"
- // "cl:546,bl:1,pr:23456,ts:27464,cf_1:7623"
- // See comment for getGroupedRecordsForInterval.
- static function makeRecordIdentifier($record) {
- global $user;
- // Start with client.
- if ($user->isPluginEnabled('cl')) {
- $record_identifier = 'cl:';
- $record_identifier .= $record['client_id'] ? $record['client_id'] : '0';
- }
- // Add billable flag.
- if (!empty($record_identifier)) $record_identifier .= ',';
- $record_identifier .= 'bl:'.$record['billable'];
- // Add project.
- $record_identifier .= ',pr:';
- $record_identifier .= $record['project_id'] ? $record['project_id'] : '0';
- // Add task.
- $record_identifier .= ',ts:';
- $record_identifier .= $record['task_id'] ? $record['task_id'] : '0';
- // Add custom field 1. This requires modifying the query to get the data we need.
-
- return $record_identifier;
- }
}