-
- // 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.
- }
-
- // 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 = $record['client_id'] ? 'cl'.$record['client_id'] : '';
- // Add billable flag.
- if (!empty($record_identifier)) $record_identifier .= ',';
- $record_identifier .= 'bl:'.$record['billable'];
- // Add project.
- $record_identifier .= $record['project_id'] ? ',pr:'.$record['project_id'] : '';
- // Add task.
- $record_identifier .= $record['task_id'] ? ',ts:'.$record['task_id'] : '';
- // Add custom field 1. This requires modifying the query to get the data we need.
- if ($user->isPluginEnabled('cf')) {
- if ($record['cf_1_id'])
- $record_identifier .= ',cf_1:'.$record['cf_1_id'];
- else if ($record['cf_1_value'])
- $record_identifier .= ',cf_1:'.$record['cf_1_value'];
- }
-
- return $record_identifier;
- }
-
- // makeRecordLabel - builds a human readable label for a row in week view,
- // which is a combination ot record properties.
- // Client - Project - Task - Custom field 1.
- // Note that billable property is not part of the label. Instead, we intend to
- // identify such records with a different color in week view.
- static function makeRecordLabel($record) {
- global $user;
- // Start with client.
- if ($user->isPluginEnabled('cl'))
- $label = $record['client'];
-
- // Add project.
- if (!empty($label) && !empty($record['project'])) $label .= ' - ';
- $label .= $record['project'];
-
- // Add task.
- if (!empty($label) && !empty($record['task'])) $label .= ' - ';
- $label .= $record['task'];
-
- // Add custom field 1.
- if ($user->isPluginEnabled('cf')) {
- if (!empty($label) && !empty($record['cf_1_value'])) $label .= ' - ';
- $label .= $record['cf_1_value'];
- }
-
- return $label;
- }
-
- // getDayHeadersForWeek - obtains day column headers for week view, which are simply day numbers in month.
- static function getDayHeadersForWeek($start_date) {
- $dayHeaders = array();
- $objDate = new DateAndTime(DB_DATEFORMAT, $start_date);
- $dayHeaders[] = (string) $objDate->getDate(); // It returns an int on first call.
- if (strlen($dayHeaders[0]) == 1) // Which is an implementation detail of DateAndTime class.
- $dayHeaders[0] = '0'.$dayHeaders[0]; // Add a 0 for single digit day.
- $objDate->incDay();
- $dayHeaders[] = $objDate->getDate(); // After incDay it returns a string with leading 0, when necessary.
- $objDate->incDay();
- $dayHeaders[] = $objDate->getDate();
- $objDate->incDay();
- $dayHeaders[] = $objDate->getDate();
- $objDate->incDay();
- $dayHeaders[] = $objDate->getDate();
- $objDate->incDay();
- $dayHeaders[] = $objDate->getDate();
- $objDate->incDay();
- $dayHeaders[] = $objDate->getDate();
- unset($objDate);
- return $dayHeaders;
- }
-
- // getLockedDaysForWeek - builds an arrays of locked days in week.
- static function getLockedDaysForWeek($start_date) {
- global $user;
- $lockedDays = array();
- $objDate = new DateAndTime(DB_DATEFORMAT, $start_date);
- $lockedDays[] = $user->isDateLocked($objDate);
- $objDate->incDay();
- $lockedDays[] = $user->isDateLocked($objDate);
- $objDate->incDay();
- $lockedDays[] = $user->isDateLocked($objDate);
- $objDate->incDay();
- $lockedDays[] = $user->isDateLocked($objDate);
- $objDate->incDay();
- $lockedDays[] = $user->isDateLocked($objDate);
- $objDate->incDay();
- $lockedDays[] = $user->isDateLocked($objDate);
- $objDate->incDay();
- $lockedDays[] = $user->isDateLocked($objDate);
- unset($objDate);
- return $lockedDays;
- }
-
- // 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.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;
- }
-
- // insertDurationFromWeekView - inserts a new record in log tables from a week view post.
- static function insertDurationFromWeekView($fields, $err) {
- $err->add("Week view is work in progress. Inserting records is not yet implemented. Try again later.");
- // $row_id, $day_header, $posted_duration, $start_date) { // TODO: potential fields?
-
- return false; // Not implemented.
- }
-
-
- // modifyFromWeekView - modifies a duration of an existing record from a week view post.
- static function modifyDurationFromWeekView($fields, $err) {
- $err->add("Week view is work in progress. Editing records is not yet implemented. Try again later.");
- return false;
-
- // static function modifyDurationFromWeekView($tt_log_id, $new_duration, $user_id) {
-
- // TODO: handle overlaps and potential other error conditions such as going beyond 24 hr mark. Other errors?
- // If the entry has start time, check if new duration goes beyond the existing day.
-
- // Future entries. Possibly do this check out of this function.
- /*
- * // Prohibit creating entries in future.
- if (defined('FUTURE_ENTRIES') && !isTrue(FUTURE_ENTRIES)) {
- $browser_today = new DateAndTime(DB_DATEFORMAT, $request->getParameter('browser_today', null));
- if ($selected_date->after($browser_today))
- $err->add($i18n->getKey('error.future_date'));
- }
- */
-
- /*
- * // Prohibit creating an overlapping record.
- if ($err->no()) {
- if (ttTimeHelper::overlaps($user->getActiveUser(), $cl_date, $cl_start, $cl_finish))
- $err->add($i18n->getKey('error.overlap'));
- }
- */
-
- $mdb2 = getConnection();
-
- $sql = "update tt_log set duration = '$new_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;
- }