protected function display() { if (Tools::isConnectedUser()) { // only teamMembers & observers can access this page if (0 == $this->teamid || $this->session_user->isTeamCustomer($this->teamid)) { $this->smartyHelper->assign('accessDenied', TRUE); } else { $isManager = $this->session_user->isTeamManager($this->teamid); $isObserver = $this->session_user->isTeamObserver($this->teamid); if ($isManager || $isObserver) { // observers have access to the same info $this->smartyHelper->assign('isManager', true); } // dates $month = date('m'); $year = date('Y'); $startdate = Tools::getSecurePOSTStringValue("startdate", Tools::formatDate("%Y-%m-%d", mktime(0, 0, 0, $month, 1, $year))); $this->smartyHelper->assign('startDate', $startdate); $startTimestamp = Tools::date2timestamp($startdate); $nbDaysInMonth = date("t", $startTimestamp); $enddate = Tools::getSecurePOSTStringValue("enddate", Tools::formatDate("%Y-%m-%d", mktime(0, 0, 0, $month, $nbDaysInMonth, $year))); $this->smartyHelper->assign('endDate', $enddate); $endTimestamp = Tools::date2timestamp($enddate); #$isDetailed = Tools::getSecurePOSTStringValue('cb_detailed',''); #$this->smartyHelper->assign('isDetailed', $isDetailed); if ('computeMonthlyActivityReport' == $_POST['action']) { $timeTracking = new TimeTracking($startTimestamp, $endTimestamp, $this->teamid); $tracks = $timeTracking->getTimeTracks(); $this->smartyHelper->assign('monthlyActivityReport', $this->getMonthlyActivityReport($tracks)); // ConsistencyCheck $consistencyErrors = $this->getConsistencyErrors($timeTracking); if (count($consistencyErrors) > 0) { $this->smartyHelper->assign('ccheckErrList', $consistencyErrors); $this->smartyHelper->assign('ccheckButtonTitle', count($consistencyErrors) . ' ' . T_("Errors")); $this->smartyHelper->assign('ccheckBoxTitle', count($consistencyErrors) . ' ' . T_("days are incomplete or undefined")); } } } } }
protected function display() { if (Tools::isConnectedUser()) { // only teamMembers & observers can access this page if (0 == $this->teamid || $this->session_user->isTeamCustomer($this->teamid)) { $this->smartyHelper->assign('accessDenied', TRUE); } else { // dates $weekDates = Tools::week_dates(date('W'), date('Y')); $startdate = Tools::getSecurePOSTStringValue("startdate", Tools::formatDate("%Y-%m-%d", $weekDates[1])); $this->smartyHelper->assign('startDate', $startdate); $enddate = Tools::getSecurePOSTStringValue("enddate", Tools::formatDate("%Y-%m-%d", $weekDates[5])); $this->smartyHelper->assign('endDate', $enddate); $isDetailed = Tools::getSecurePOSTIntValue('withJobDetails', 0); $this->smartyHelper->assign('isJobDetails', $isDetailed); $isExtTasksPrj = Tools::getSecurePOSTIntValue('withExtTasksPrj', 0); $this->smartyHelper->assign('isExtTasksPrj', $isExtTasksPrj); $isSideTasksPrj = Tools::getSecurePOSTIntValue('withSideTasksPrj', 1); $this->smartyHelper->assign('isSideTasksPrj', $isSideTasksPrj); if ('computeProjectActivityReport' == $_POST['action']) { $startTimestamp = Tools::date2timestamp($startdate); $endTimestamp = Tools::date2timestamp($enddate); $endTimestamp = mktime(23, 59, 59, date('m', $endTimestamp), date('d', $endTimestamp), date('Y', $endTimestamp)); $timeTracking = new TimeTracking($startTimestamp, $endTimestamp, $this->teamid); $this->smartyHelper->assign('projectActivityReport', $this->getProjectActivityReport($timeTracking->getProjectTracks(true), $this->teamid, $isDetailed)); // WorkingDaysPerProjectPerUser $data = $timeTracking->getWorkingDaysPerProjectPerUser($isExtTasksPrj, true, $isSideTasksPrj); foreach ($data as $smartyKey => $smartyVariable) { $this->smartyHelper->assign($smartyKey, $smartyVariable); } $data = $this->getWorkingDaysPerProjectPerUser($startTimestamp, $endTimestamp, $isExtTasksPrj, $isSideTasksPrj); foreach ($data as $smartyKey => $smartyVariable) { $this->smartyHelper->assign($smartyKey, $smartyVariable); } } } } }
/** * for all users of the team, return incomplete/missing days in the period * * @param TimeTracking $timeTracking * @return ConsistencyError2[] */ public static function checkIncompleteDays(TimeTracking $timeTracking, $userid = NULL) { $cerrList = array(); $now = time(); if (is_null($userid)) { $mList = TeamCache::getInstance()->getTeam($timeTracking->getTeamid())->getActiveMembers(); $useridList = array_keys($mList); } else { $useridList = array($userid); } foreach ($useridList as $userid) { $incompleteDays = $timeTracking->checkCompleteDays($userid, TRUE); foreach ($incompleteDays as $date => $value) { if ($date > $now) { continue; } // skip dates in the future $label = NULL; if ($value < 1) { $label = T_("incomplete (missing ") . (1 - $value) . T_(" days") . ")"; } else { $label = T_("inconsistent") . " (" . $value . " " . T_("days") . ")"; } $cerr = new ConsistencyError2(NULL, $userid, NULL, $date, $label); $cerr->severity = ConsistencyError2::severity_error; $cerrList[] = $cerr; } $missingDays = $timeTracking->checkMissingDays($userid); foreach ($missingDays as $date) { if ($date > $now) { continue; } // skip dates in the future $cerr = new ConsistencyError2(0, $userid, NULL, $date, T_("not defined.")); $cerr->severity = ConsistencyError2::severity_error; $cerrList[] = $cerr; } } return $cerrList; }
/** * set smarty variables needed to display the WeekTaskDetails table * * @param type $smartyHelper * @param type $weekid * @param type $year * @param type $managed_userid * @param type $teamid */ function setWeekTaskDetails($smartyHelper, $weekid, $year, $managed_userid, $teamid) { $weekDates = Tools::week_dates($weekid, $year); $startTimestamp = $weekDates[1]; $endTimestamp = mktime(23, 59, 59, date('m', $weekDates[7]), date('d', $weekDates[7]), date('Y', $weekDates[7])); $timeTracking = new TimeTracking($startTimestamp, $endTimestamp, $teamid); $incompleteDays = array_keys($timeTracking->checkCompleteDays($managed_userid, TRUE)); $missingDays = $timeTracking->checkMissingDays($managed_userid); $errorDays = array_merge($incompleteDays, $missingDays); $smartyWeekDates = TimeTrackingTools::getSmartyWeekDates($weekDates, $errorDays); // UTF8 problems in smarty, date encoding needs to be done in PHP $smartyHelper->assign('weekDates', array($smartyWeekDates[1], $smartyWeekDates[2], $smartyWeekDates[3], $smartyWeekDates[4], $smartyWeekDates[5])); $smartyHelper->assign('weekEndDates', array($smartyWeekDates[6], $smartyWeekDates[7])); $weekTasks = TimeTrackingTools::getWeekTask($weekDates, $teamid, $managed_userid, $timeTracking, $errorDays); $smartyHelper->assign('weekTasks', $weekTasks["weekTasks"]); $smartyHelper->assign('dayTotalElapsed', $weekTasks["totalElapsed"]); // weekTaskDetails.html includes edit_issueNote.html & update_issueBacklog.html // these files need userid,weekid,year to be set. $smartyHelper->assign('userid', $managed_userid); $smartyHelper->assign('weekid', $weekid); $smartyHelper->assign('year', $year); }
/** * @param int $userid * @param TimeTracking $timeTracking * @param string $realname * @param resource $fh */ private function exportWeekDetailsToCSV($userid, TimeTracking $timeTracking, $realname, $fh) { $sepChar = ';'; $weekTracks = $timeTracking->getWeekDetails($userid); foreach ($weekTracks as $bugid => $jobList) { try { $issue = IssueCache::getInstance()->getIssue($bugid); // remove sepChar from summary text $formatedSummary = str_replace($sepChar, " ", $issue->getSummary()); foreach ($jobList as $jobid => $dayList) { $query = "SELECT name FROM `codev_job_table` WHERE id={$jobid}"; $result = SqlWrapper::getInstance()->sql_query($query); if (!$result) { echo "<span style='color:red'>ERROR: Query FAILED</span>"; exit; } $jobName = SqlWrapper::getInstance()->sql_result($result, 0); $stringData = $bugid . $sepChar . $jobName . $sepChar . $formatedSummary . $sepChar . $realname . $sepChar; for ($i = 1; $i <= 4; $i++) { if (array_key_exists($i, $dayList)) { $stringData .= $dayList[$i]; } $stringData .= $sepChar; } if (array_key_exists(5, $dayList)) { $stringData .= $dayList[5]; } $stringData .= "\n"; fwrite($fh, $stringData); } } catch (Exception $e) { self::$logger->error('exportWeekDetailsToCSV(): issue $bugid not found in mantis DB !'); } } }
/** * Initialize complex static variables * @static */ public static function staticInit() { self::$logger = Logger::getLogger(__CLASS__); }
/** * get tasks resolved in the period * @return Issue[] */ private function getResolvedIssues() { $tt = new TimeTracking($this->startTimestamp, $this->endTimestamp, $this->teamid); $resolvedIssuesList = $tt->getResolvedIssues(); Tools::usort($resolvedIssuesList); return $resolvedIssuesList; }
/** * @param TimeTracking $timeTracking * @param bool $isDetailed * @param int[] $weekDates * @return mixed[] */ private function getWeekDetails(TimeTracking $timeTracking, $isDetailed, $weekDates, $session_userid) { $team = TeamCache::getInstance()->getTeam($timeTracking->getTeamid()); $weekDetails = array(); $session_users = $team->getUsers(); foreach ($session_users as $session_user) { // if user was working on the project during the timestamp if ($session_user->isTeamDeveloper($timeTracking->getTeamid(), $timeTracking->getStartTimestamp(), $timeTracking->getEndTimestamp()) || $session_user->isTeamManager($timeTracking->getTeamid(), $timeTracking->getStartTimestamp(), $timeTracking->getEndTimestamp())) { // PERIOD week //$thisWeekId=date("W"); $weekTracks = $timeTracking->getWeekDetails($session_user->getId(), !$isDetailed); $holidays = Holidays::getInstance(); $weekJobDetails = array(); foreach ($weekTracks as $bugid => $jobList) { try { $issue = IssueCache::getInstance()->getIssue($bugid); } catch (Exception $e) { self::$logger->error("getWeekDetails() skip issue {$bugid} : " . $e->getMessage()); $weekJobDetails[] = array("description" => '<span class="error_font">' . $bugid . ' : ' . T_('Error: Task not found in Mantis DB !') . '</span>', "duration" => "!", "progress" => "!", "projectName" => "!", "targetVersion" => "!", "jobName" => "!", "daysDetails" => "!", "totalDuration" => "!"); continue; } $project = ProjectCache::getInstance()->getProject($issue->getProjectId()); if ($isDetailed) { $formatedJobList = implode(', ', array_keys($jobList)); $query = 'SELECT id, name FROM `codev_job_table` WHERE id IN (' . $formatedJobList . ');'; $result2 = SqlWrapper::getInstance()->sql_query($query); if (!$result2) { continue; } while ($row2 = SqlWrapper::getInstance()->sql_fetch_object($result2)) { $jobName = $row2->name; $dayList = $jobList[$row2->id]; $daysDetails = array(); $weekDuration = 0; for ($i = 1; $i <= 7; $i++) { $dayDetails = $this->getDaysDetails($i, $holidays, $weekDates, $dayList[$i]); $weekDuration += $dayDetails['duration']; $daysDetails[] = $dayDetails; } if (!$project->isSideTasksProject(array($team->getId())) && !$project->isExternalTasksProject()) { $tooltipAttr = $issue->getTooltipItems($team->getId(), $session_userid); // force some fields #$tooltipAttr[T_('Elapsed')] = $issue->getElapsed(); #$tooltipAttr[T_('Backlog')] = $issue->getDuration(); #$tooltipAttr[T_('Drift')] = $issue->getDrift(); #$tooltipAttr[T_('DriftColor')] = $issue->getDriftColor(); $infoTooltip = Tools::imgWithTooltip('images/b_info.png', $tooltipAttr); } else { $infoTooltip = NULL; } // prepare json data for the IssueNoteDialogbox $issueNoteData = $this->getIssueNoteTooltip($project, $team, $issue); $weekJobDetails[] = array('description' => SmartyTools::getIssueDescription($bugid, $issue->getTcId(), $issue->getSummary()), 'duration' => $issue->getDuration(), 'progress' => round(100 * $issue->getProgress()), 'projectName' => $issue->getProjectName(), 'targetVersion' => $issue->getTargetVersion(), 'jobName' => $jobName, 'daysDetails' => $daysDetails, 'totalDuration' => $weekDuration, 'infoTooltip' => $infoTooltip, 'issueNoteId' => $issueNoteData['id'], 'noteTooltip' => $issueNoteData['tooltip']); } } else { // for each day, concat jobs duration $daysDetails = array(); $weekDuration = 0; for ($i = 1; $i <= 7; $i++) { $duration = 0; foreach ($jobList as $dayList) { if (array_key_exists($i, $dayList)) { $duration += $dayList[$i]; } } if ($duration == 0) { $duration = ""; } $dayDetails = $this->getDaysDetails($i, $holidays, $weekDates, $duration); $weekDuration += $dayDetails['duration']; $daysDetails[] = $dayDetails; } if (!$project->isSideTasksProject(array($team->getId())) && !$project->isExternalTasksProject()) { $tooltipAttr = $issue->getTooltipItems($team->getId(), $session_userid); // force some fields #$tooltipAttr[T_('Elapsed')] = $issue->getElapsed(); #$tooltipAttr[T_('Backlog')] = $issue->getDuration(); #$tooltipAttr[T_('Drift')] = $issue->getDrift(); #$tooltipAttr[T_('DriftColor')] = $issue->getDriftColor(); $infoTooltip = Tools::imgWithTooltip('images/b_info.png', $tooltipAttr); } else { $infoTooltip = NULL; } // prepare json data for the IssueNoteDialogbox $issueNoteData = $this->getIssueNoteTooltip($project, $team, $issue); $weekJobDetails[] = array('description' => SmartyTools::getIssueDescription($bugid, $issue->getTcId(), $issue->getSummary()), 'duration' => $issue->getDuration(), 'progress' => round(100 * $issue->getProgress()), 'projectName' => $issue->getProjectName(), 'daysDetails' => $daysDetails, 'totalDuration' => $weekDuration, 'infoTooltip' => $infoTooltip, 'issueNoteId' => $issueNoteData['id'], 'noteTooltip' => $issueNoteData['tooltip']); } } if (!empty($weekJobDetails)) { $weekDetails[] = array('name' => $session_user->getName(), 'realname' => $session_user->getRealname(), 'forecastWorkload' => $session_user->getForecastWorkload(), 'weekDates' => array(Tools::formatDate("%A\n%d %b", $weekDates[1]), Tools::formatDate("%A\n%d %b", $weekDates[2]), Tools::formatDate("%A\n%d %b", $weekDates[3]), Tools::formatDate("%A\n%d %b", $weekDates[4]), Tools::formatDate("%A\n%d %b", $weekDates[5])), 'weekEndDates' => array(Tools::formatDate("%A\n%d %b", $weekDates[6]), Tools::formatDate("%A\n%d %b", $weekDates[7])), 'weekJobDetails' => $weekJobDetails); } } } return $weekDetails; }
/** * creates for each project a table with the following fields: * id | TC | startDate | endDate | status | total elapsed | elapsed + Backlog | elapsed in period | Backlog * TOTAL * @param TimeTracking $timeTracking * @param string $myFile * @return string */ public static function exportProjectMonthlyActivityToCSV(TimeTracking $timeTracking, $myFile) { $sepChar = ';'; $fh = fopen($myFile, 'w'); // returns : $projectTracks[projectid][bugid][jobid] = duration $projectTracks = $timeTracking->getProjectTracks(); foreach ($projectTracks as $projectId => $bugList) { $totalEffortEstim = 0; $totalElapsed = 0; $totalBacklog = 0; $totalElapsedPeriod = 0; // write table header $project = ProjectCache::getInstance()->getProject($projectId); $stringData = $project->getName() . "\n"; // WARNING i18n: HTML translation like french accents (eacute;) add an unwanted column sepChar (;) $stringData .= "ID" . $sepChar; $stringData .= "Task" . $sepChar; $stringData .= "Ext.ID" . $sepChar; $stringData .= "Start date" . $sepChar; $stringData .= "End date" . $sepChar; $stringData .= "Status" . $sepChar; $stringData .= "Total EffortEstim" . $sepChar; $stringData .= "Total elapsed" . $sepChar; $stringData .= "elapsed + Backlog" . $sepChar; $stringData .= "elapsed in period" . $sepChar; $stringData .= "BL" . $sepChar; $stringData .= "\n"; // write table content (by bugid) foreach ($bugList as $bugid => $jobs) { $issue = IssueCache::getInstance()->getIssue($bugid); // remove sepChar from summary text $formatedSummary = str_replace($sepChar, " ", $issue->getSummary()); $stringData .= $bugid . $sepChar; $stringData .= $formatedSummary . $sepChar; $stringData .= $issue->getTcId() . $sepChar; $stringData .= date("d/m/Y", $issue->startDate()) . $sepChar; $stringData .= date("d/m/Y", $issue->endDate()) . $sepChar; $stringData .= $issue->getCurrentStatusName() . $sepChar; $stringData .= $issue->getEffortEstim() + $issue->getEffortAdd() . $sepChar; $stringData .= $issue->getElapsed() . $sepChar; $stringData .= $issue->getElapsed() + $issue->getBacklog() . $sepChar; // sum all job durations $elapsedInPeriod = 0; foreach ($jobs as $jobId => $duration) { $elapsedInPeriod += $duration; } $stringData .= $elapsedInPeriod . $sepChar; $stringData .= $issue->getBacklog() . $sepChar; $stringData .= "\n"; $totalEffortEstim += $issue->getEffortEstim() + $issue->getEffortAdd(); $totalElapsed += $issue->getElapsed(); $totalBacklog += $issue->getBacklog(); $totalElapsedPeriod += $elapsedInPeriod; } // total per project $stringData .= "TOTAL" . $sepChar . $sepChar . $sepChar . $sepChar . $sepChar . $sepChar; $stringData .= $totalEffortEstim . $sepChar; $stringData .= $totalElapsed . $sepChar; $stringData .= $totalElapsed + $totalBacklog . $sepChar; $stringData .= $totalElapsedPeriod . $sepChar; $stringData .= $totalBacklog . $sepChar; $stringData .= "\n"; $stringData .= "\n"; fwrite($fh, $stringData); } fclose($fh); return $myFile; }
/** * @param int[] $weekDates * @param int $userid * @param TimeTracking $timeTracking * @param array $incompleteDays * @return mixed[] */ public static function getWeekTask(array $weekDates, $teamid, $userid, TimeTracking $timeTracking, array $incompleteDays) { $totalElapsed = array(); $todayAtMidnight = mktime(0, 0, 0); for ($i = 1; $i <= 7; $i++) { $weekDate = $weekDates[$i]; $totalElapsed[$weekDate] = array("elapsed" => 0, "class" => in_array($weekDate, $incompleteDays) && $weekDate < $todayAtMidnight ? "incompleteDay" : ""); } $jobs = new Jobs(); $weekTasks = NULL; $holidays = Holidays::getInstance(); $weekTracks = $timeTracking->getWeekDetails($userid); foreach ($weekTracks as $bugid => $jobList) { try { $issue = IssueCache::getInstance()->getIssue($bugid); $backlog = $issue->getBacklog(); $extRef = $issue->getTcId(); $summary = $issue->getSummary(); $description = SmartyTools::getIssueDescription($bugid, $extRef, $summary); $projectId = $issue->getProjectId(); } catch (Exception $e) { $backlog = '!'; $extRef = ''; $summary = '<span class="error_font">' . T_('Error: Task not found in Mantis DB !') . '</span>'; //$description = SmartyTools::getIssueDescription($bugid,$extRef,$summary); $description = Tools::mantisIssueURL($bugid, NULL, TRUE) . ' ' . $bugid . ' : ' . $summary; $projectId = -1; } foreach ($jobList as $jobid => $dayList) { // if no backlog set, display a '?' to allow Backlog edition if (is_numeric($backlog)) { $formattedBacklog = $backlog; // prepare json data for the BacklogDialogbox $jsonIssueInfo = self::getUpdateBacklogJsonData($bugid, $jobid, $teamid, $userid); } else { #if (($team->isSideTasksProject($issue->projectId)) || # ($team->isNoStatsProject($issue->projectId))) { // do not allow to edit sideTasks Backlog $formattedBacklog = ''; $jsonIssueInfo = ''; #} else { # $formattedBacklog = '?'; #} // } $dayTasks = ""; for ($i = 1; $i <= 7; $i++) { $title = NULL; $bgColor = NULL; if ($i <= 5) { $h = $holidays->isHoliday($weekDates[$i]); if ($h) { $bgColor = $h->color; #$bgColor = Holidays::$defaultColor; $title = $h->description; } } else { $bgColor = Holidays::$defaultColor; } $day = 0; if (array_key_exists($i, $dayList)) { $day = $dayList[$i]; } $dayTasks[] = array('bgColor' => $bgColor, 'title' => $title, 'day' => $day); $totalElapsed[$weekDates[$i]]['elapsed'] += $day; } /* $deadline = $issue->getDeadLine(); if (!is_null($deadline) || (0 != $deadline)) { $formatedDate = Tools::formatDate(T_("%Y-%m-%d"), $deadline); } */ try { $project = ProjectCache::getInstance()->getProject($projectId); } catch (Exception $e) { $project = null; } if ($project != null) { if (!$project->isSideTasksProject(array($teamid)) && !$project->isExternalTasksProject()) { // TODO does $issue belong to current team's project ? what if not ? $tooltipAttr = $issue->getTooltipItems($teamid, $userid); $infoTooltip = Tools::imgWithTooltip('images/b_info.png', $tooltipAttr); } else { $infoTooltip = ''; } } else { $infoTooltip = ''; } // prepare json data for the IssueNoteDialogbox if ($project != null) { if (!$project->isSideTasksProject(array($teamid)) && !$project->isExternalTasksProject()) { $issueNote = IssueNote::getTimesheetNote($issue->getId()); if (!is_null($issueNote)) { $issueNoteId = $issueNote->getId(); $user = UserCache::getInstance()->getUser($issueNote->getReporterId()); $rawNote = $issueNote->getText(); $note = trim(IssueNote::removeAllReadByTags($rawNote)); // used for the tooltip NOT the dialoBox $tooltipAttr = array('reporter' => $user->getRealname(), 'date' => date('Y-m-d H:i:s', $issueNote->getLastModified()), 'Note' => $note); $readByList = $issueNote->getReadByList(TRUE); if (0 != count($readByList)) { $tooltipAttr['Read by'] = implode(', ', array_keys($readByList)); } $noteTooltip = Tools::imgWithTooltip('images/b_note.png', $tooltipAttr, NULL, 'js-add-note-link', ' style="cursor: pointer;" data-bugId="' . $issueNote->getBugId() . '"'); } else { $issueNoteId = 0; $noteTooltip = Tools::imgWithTooltip('images/b_note_grey.png', T_('Click to add a note'), NULL, 'js-add-note-link', ' style="cursor: pointer;" data-bugId="' . $issue->getId() . '"'); } } else { $noteTooltip = ''; } } else { $noteTooltip = ''; } // if project not declared in current team, then // user cannot add a timetrack by clicking in the weekTasks table // Note: (this would generate an error on addTimetrack) $team = TeamCache::getInstance()->getTeam($teamid); $isTeamProject = !is_null($team->getProjectType($projectId)); $weekTasks[$bugid . "_" . $jobid] = array('bugid' => $bugid, 'description' => $description, 'formattedBacklog' => $formattedBacklog, 'jobid' => $jobid, 'jobName' => $jobs->getJobName($jobid), 'dayTasks' => $dayTasks, 'infoTooltip' => $infoTooltip, 'summary' => addslashes(htmlspecialchars($summary)), 'updateBacklogJsonData' => $jsonIssueInfo, 'issueNoteId' => $issueNoteId, 'noteTooltip' => $noteTooltip, 'isTeamProject' => $isTeamProject); } } return array("weekTasks" => $weekTasks, "totalElapsed" => $totalElapsed); }
/** * display Timetracking Tuples * @param int $userid * @param TimeTracking $timeTracking * @return mixed[] */ private function getTimetrackingTuples($userid, TimeTracking $timeTracking) { // Display previous entries $query = "SELECT id, bugid, jobid, date, duration" . " FROM `codev_timetracking_table`" . " WHERE userid = {$userid}" . " AND date >= " . $timeTracking->getStartTimestamp() . " ORDER BY date"; $result = SqlWrapper::getInstance()->sql_query($query) or die("Query failed: {$query}"); $jobs = new Jobs(); $timetrackingTuples = array(); while ($row = SqlWrapper::getInstance()->sql_fetch_object($result)) { // get information on this bug try { $issue = IssueCache::getInstance()->getIssue($row->bugid); // get general information $jobName = $jobs->getJobName($row->jobid); $formatedDate = Tools::formatDate("%Y-%m-%d", $row->date); $cosmeticDate = Tools::formatDate("%Y-%m-%d - %A", $row->date); $formatedJobName = str_replace("'", "\\'", $jobName); $formatedSummary = str_replace("'", "\\'", $issue->getSummary()); $formatedSummary = str_replace('"', "\\'", $formatedSummary); $formatedSummary = htmlspecialchars(preg_replace('![\\t\\r\\n]+!', ' ', $formatedSummary)); //$totalEstim = $issue->effortEstim + $issue->effortAdd; $timetrackingTuples[$row->id] = array('timestamp' => $row->date, 'date' => $formatedDate, 'formatedId' => $issue->getFormattedIds(), 'duration' => $row->duration, 'formatedJobName' => $formatedJobName, 'summary' => $formatedSummary, 'cosmeticDate' => $cosmeticDate, 'mantisURL' => Tools::mantisIssueURL($row->bugid, NULL, true), 'issueURL' => Tools::issueInfoURL($row->bugid), 'issueId' => $issue->getTcId(), 'projectName' => $issue->getProjectName(), 'issueSummary' => htmlspecialchars(preg_replace('![\\t\\r\\n]+!', ' ', $issue->getSummary())), 'jobName' => $jobName, 'categoryName' => $issue->getCategoryName(), 'currentStatusName' => $issue->getCurrentStatusName()); } catch (Exception $e) { $summary = T_('Error: Task not found in Mantis DB !'); $timetrackingTuples[$row->id] = array('formatedId' => $row->bugid, 'duration' => $row->duration, 'summary' => $summary, 'mantisURL' => '', 'issueURL' => $row->bugid, 'issueId' => '!', 'projectName' => '!', 'issueSummary' => '<span class="error_font">' . $summary . '</span>', 'categoryName' => '!', 'currentStatusName' => '!'); } } $currentTimeTrackingTuples = array(); $futureTimeTrackingTuples = array(); foreach ($timetrackingTuples as $trackId => $timeTrackingTuple) { if ($timeTrackingTuple['timestamp'] <= $timeTracking->getEndTimestamp()) { $currentTimeTrackingTuples[$trackId] = $timeTrackingTuple; } else { $futureTimeTrackingTuples[$trackId] = $timeTrackingTuple; } unset($timeTrackingTuple['timestamp']); } return array("current" => $currentTimeTrackingTuples, "future" => $futureTimeTrackingTuples); }