/** * creates for each project a table with the following fields: * TaskName | RAF | <Jobs> * @param TimeTracking $timeTracking * @param string $myFile * @return string */ private function exportProjectActivityToCSV(TimeTracking $timeTracking, $myFile) { $sepChar = ';'; $team = TeamCache::getInstance()->getTeam($timeTracking->getTeamid()); if (!is_dir(Constants::$codevOutputDir . DIRECTORY_SEPARATOR . 'reports')) { mkdir(Constants::$codevOutputDir . DIRECTORY_SEPARATOR . 'reports', 0755); } $fh = fopen($myFile, 'w'); // $projectTracks[projectid][bugid][jobid] = duration $projectTracks = $timeTracking->getProjectTracks(); foreach ($projectTracks as $projectId => $bugList) { // write table header $project = ProjectCache::getInstance()->getProject($projectId); $stringData = $project->getName() . "\n"; $stringData .= T_("Task") . $sepChar; $stringData .= T_("BL") . $sepChar; $jobList = $project->getJobList($team->getProjectType($projectId)); foreach ($jobList as $jobName) { $stringData .= $jobName . $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} / " . $issue->getTcId() . " : " . $formatedSummary . $sepChar; $stringData .= $issue->getBacklog() . $sepChar; foreach ($jobList as $jobId => $jobName) { $stringData .= $jobs[$jobId] . $sepChar; } $stringData .= "\n"; } $stringData .= "\n"; fwrite($fh, $stringData); } fclose($fh); return $myFile; }
/** * 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; }
/** * @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; }