X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=WEB-INF%2Flib%2FttTimeHelper.class.php;h=e1440105141c52a9772bdd5b19ada9c06bea75c9;hb=294895b702e4c5cb5bfc87292c464bed201f296b;hp=e749190430486ac88748859d60ccf0812c47f946;hpb=ee5e708bbc30bbca24d77c4e3b0e75214c1296f8;p=timetracker.git diff --git a/WEB-INF/lib/ttTimeHelper.class.php b/WEB-INF/lib/ttTimeHelper.class.php index e7491904..e1440105 100644 --- a/WEB-INF/lib/ttTimeHelper.class.php +++ b/WEB-INF/lib/ttTimeHelper.class.php @@ -370,6 +370,7 @@ class ttTimeHelper { $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']); @@ -390,10 +391,11 @@ class ttTimeHelper { } 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; @@ -402,8 +404,8 @@ class ttTimeHelper { 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; @@ -416,6 +418,7 @@ class ttTimeHelper { // update - updates a record in log table. Does not update its custom fields. static function update($fields) { + global $user; $mdb2 = getConnection(); $id = $fields['id']; @@ -428,19 +431,26 @@ class ttTimeHelper { $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; @@ -453,7 +463,7 @@ class ttTimeHelper { 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; @@ -587,56 +597,6 @@ class ttTimeHelper { return false; } - // wvCanModify (weekViewCanModify) - determines if an already existing tt_log record - // can be modified with a new user-provided duration. - static function wvCanModify($tt_log_id, $new_duration, $err) { - global $i18n; - $mdb2 = getConnection(); - - // Determine if we have start time in record, as further checking does not makes sense otherwise. - $sql = "select user_id, date, start, duration from tt_log where id = $tt_log_id"; - $res = $mdb2->query($sql); - if (!is_a($res, 'PEAR_Error')) { - if (!$res->numRows()) { - $err->add($i18n->getKey('error.db')); // This is not expected. - return false; - } - $val = $res->fetchRow(); - $oldDuration = $val['duration']; - if (!$val['start']) - return true; // There is no start time in the record, therefore safe to modify. - } - - // We do have start time. - // Quick test if new duration is less then already existing. - $newMinutes = ttTimeHelper::toMinutes($new_duration); - $oldMinutes = ttTimeHelper::toMinutes($oldDuration); - if ($newMinutes < $oldMinutes) - return true; // Safe to modify. - - // Does the new duration put the record beyond 24:00 boundary? - $startMinutes = ttTimeHelper::toMinutes($val['start']); - $newEndMinutes = $startMinutes + $newMinutes; - if ($newEndMinutes > 1440) { - // Invalid duration, as new duration puts the record beyond current day. - $err->add($i18n->getKey('error.field'), $i18n->getKey('label.duration')); - return false; - } - - // Does the new duration causes the record to overlap with others? - $user_id = $val['user_id']; - $date = $val['date']; - $startMinutes = ttTimeHelper::toMinutes($val['start']); - $start = ttTimeHelper::toAbsDuration($startMinutes); - $finish = ttTimeHelper::toAbsDuration($newEndMinutes); - if (ttTimeHelper::overlaps($user_id, $date, $start, $finish, $tt_log_id)) { - $err->add($i18n->getKey('error.overlap')); - return false; - } - - return true; // There are no conflicts, safe to modify. - } - // getRecord - retrieves a time record identified by its id. static function getRecord($id, $user_id) { global $user; @@ -649,7 +609,7 @@ class ttTimeHelper { $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) @@ -675,7 +635,7 @@ class ttTimeHelper { $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')) { @@ -724,137 +684,4 @@ class ttTimeHelper { return $result; } - - // cellExists is a helper function for getDataForWeekView() to see if a cell with a given label - // and a day header already exists. - static function cellExists($row_id, $day_header, $dataArray) { - foreach($dataArray as $row) { - if ($row['row_id'] == $row_id && !empty($row[$day_header]['duration'])) - return true; - } - return false; - } - - // findRow returns an existing row position in $dataArray, -1 otherwise. - static function findRow($row_id, $dataArray) { - $pos = 0; // Row position in array. - foreach($dataArray as $row) { - if ($row['row_id'] == $row_id) - return $pos; - $pos++; // Increment for search. - } - return -1; // Row not found. - } - - // getDayTotals calculates total durations for each day from the existing data in $dataArray. - static function getDayTotals($dataArray, $dayHeaders) { - $dayTotals = array(); - - // Insert label. - global $i18n; - $dayTotals['label'] = $i18n->getKey('label.day_total'); - - foreach ($dataArray as $row) { - foreach($dayHeaders as $dayHeader) { - if (array_key_exists($dayHeader, $row)) { - $minutes = ttTimeHelper::toMinutes($row[$dayHeader]['duration']); - $dayTotals[$dayHeader] += $minutes; - } - } - } - // Convert minutes to hh:mm for display. - foreach($dayHeaders as $dayHeader) { - $dayTotals[$dayHeader] = ttTimeHelper::toAbsDuration($dayTotals[$dayHeader]); - } - return $dayTotals; - } - - // dateFromDayHeader calculates date from start date and day header in week view. - static function dateFromDayHeader($start_date, $day_header) { - $objDate = new DateAndTime(DB_DATEFORMAT, $start_date); - $currentDayHeader = (string) $objDate->getDate(); // It returns an int on first call. - if (strlen($currentDayHeader) == 1) // Which is an implementation detail of DateAndTime class. - $currentDayHeader = '0'.$currentDayHeader; // Add a 0 for single digit day. - $i = 1; - while ($currentDayHeader != $day_header && $i < 7) { - // Iterate through remaining days to find a match. - $objDate->incDay(); - $currentDayHeader = $objDate->getDate(); // After incDay it returns a string with leading 0, when necessary. - $i++; - } - return $objDate->toString(DB_DATEFORMAT); - } - - // insertDurationFromWeekView - inserts a new record in log tables from a week view post. - static function insertDurationFromWeekView($fields, $custom_fields, $err) { - global $i18n; - global $user; - - // Determine date for a new entry. - $entry_date = ttTimeHelper::dateFromDayHeader($fields['start_date'], $fields['day_header']); - $objEntryDate = new DateAndTime(DB_DATEFORMAT, $entry_date); - - // Prohibit creating entries in future. - if (defined('FUTURE_ENTRIES') && !isTrue(FUTURE_ENTRIES) && $fields['browser_today']) { - $objBrowserToday = new DateAndTime(DB_DATEFORMAT, $fields['browser_today']); - if ($objEntryDate->after($objBrowserToday)) { - $err->add($i18n->getKey('error.future_date')); - return false; - } - } - - // Prepare an array of fields for regular insert function. - $fields4insert = array(); - $fields4insert['user_id'] = $user->getActiveUser(); - $fields4insert['date'] = $entry_date; - $fields4insert['duration'] = $fields['duration']; - $fields4insert['client'] = ttWeekViewHelper::parseFromWeekViewRow($fields['row_id'], 'cl'); - $fields4insert['billable'] = ttWeekViewHelper::parseFromWeekViewRow($fields['row_id'], 'bl'); - $fields4insert['project'] = ttWeekViewHelper::parseFromWeekViewRow($fields['row_id'], 'pr'); - $fields4insert['task'] = ttWeekViewHelper::parseFromWeekViewRow($fields['row_id'], 'ts'); - $fields4insert['note'] = $fields['note']; - - // Try to insert a record. - $id = ttTimeHelper::insert($fields4insert); - if (!$id) return false; // Something failed. - - // Insert custom field if we have it. - $result = true; - $cf_1 = ttWeekViewHelper::parseFromWeekViewRow($fields['row_id'], 'cf_1'); - if ($custom_fields && $cf_1) { - if ($custom_fields->fields[0]['type'] == CustomFields::TYPE_TEXT) - $result = $custom_fields->insert($id, $custom_fields->fields[0]['id'], null, $cf_1); - elseif ($custom_fields->fields[0]['type'] == CustomFields::TYPE_DROPDOWN) - $result = $custom_fields->insert($id, $custom_fields->fields[0]['id'], $cf_1, null); - } - - return $result; - } - - - // modifyFromWeekView - modifies a duration of an existing record from a week view post. - static function modifyDurationFromWeekView($fields, $err) { - global $i18n; - global $user; - - // Possible errors: 1) Overlap if the existing record has start time. 2) Going beyond 24 hour boundary. - // TODO: rename this function. - // Handle different errors with specific error messages. - if (!ttTimeHelper::wvCanModify($fields['tt_log_id'], $fields['duration'], $err)) { - // $err->add($i18n->getKey('error.overlap')); - return false; - } - - $mdb2 = getConnection(); - $duration = $fields['duration']; - $tt_log_id = $fields['tt_log_id']; - $user_id = $user->getActiveUser(); - $sql = "update tt_log set duration = '$duration' where id = $tt_log_id and user_id = $user_id"; - $affected = $mdb2->exec($sql); - if (is_a($affected, 'PEAR_Error')) - return false; - - return true; - } } -