| public $summary_precond = array('IDF_Precondition::accessIssues');␊ | 
| public function summary($request, $match)␊ | 
| {␊ | 
| $tagStatistics = array();␊ | 
| $ownerStatistics = array();␊ | 
| $status = array();␊ | 
| $isTrackerEmpty = false;␊ | 
| ␊ | 
| $prj = $request->project;␊ | 
| $opened = $prj->getIssueCountByStatus('open');␊ | 
| $closed = $prj->getIssueCountByStatus('closed');␊ | 
| $otags = implode(',', $prj->getTagIdsByStatus('open'));␊ | 
| ␊ | 
| // Issue status statistics␊ | 
| $status = array();␊ | 
| $status['Open'] = array($opened, (int)(100 * $opened / ($opened + $closed)));␊ | 
| $status['Closed'] = array($closed, (int)(100 * $closed / ($opened + $closed)));␊ | 
| ␊ | 
| // Issue owner statistics␊ | 
| $sqlIssueTable = Pluf::factory('IDF_Issue')->getSqlTable();␊ | 
| $sqlUsersTable = Pluf::factory('Pluf_User')->getSqlTable();␊ | 
| $query = <<<"QUERY"␊ | 
| // Check if the tracker is empty␊ | 
| if ($opened === 0 && $closed === 0) {␊ | 
| $isTrackerEmpty = true;␊ | 
| } else {␊ | 
| if ($opened > 0 || $closed > 0) {␊ | 
| // Issue status statistics␊ | 
| $status['Open'] = array($opened, (int)(100 * $opened / ($opened + $closed)));␊ | 
| $status['Closed'] = array($closed, (int)(100 * $closed / ($opened + $closed)));␊ | 
| }␊ | 
| ␊ | 
| if ($opened > 0) {␊ | 
| // Issue owner statistics␊ | 
| $sqlIssueTable = Pluf::factory('IDF_Issue')->getSqlTable();␊ | 
| $sqlUsersTable = Pluf::factory('Pluf_User')->getSqlTable();␊ | 
| $otags = implode(',', $prj->getTagIdsByStatus('open'));␊ | 
| $query = <<<"QUERY"␊ | 
| SELECT CONCAT(first_name, " ", last_name) as name, nb FROM (SELECT uid as id,count(uid) as nb FROM (SELECT ifnull(owner, -1) as uid FROM $sqlIssueTable WHERE status IN ($otags)) as ff group by uid) AS ff LEFT JOIN $sqlUsersTable using(id)␊ | 
| QUERY;␊ | 
| $db = Pluf::db();␊ | 
| $dbData = $db->select($query);␊ | 
| $ownerStatistics = array();␊ | 
| foreach ($dbData as $k => $v) {␊ | 
| $key = ($v['name'] === null) ? __('Not assigned') : $v['name'];␊ | 
| $ownerStatistics[$key] = array($v['nb'], (int)(100 * $v['nb'] / $opened));␊ | 
| }␊ | 
| $db = Pluf::db();␊ | 
| $dbData = $db->select($query);␊ | 
| foreach ($dbData as $k => $v) {␊ | 
| $key = ($v['name'] === null) ? __('Not assigned') : $v['name'];␊ | 
| $ownerStatistics[$key] = array($v['nb'], (int)(100 * $v['nb'] / $opened));␊ | 
| }␊ | 
| ␊ | 
| // Issue class tag statistics␊ | 
| $tags = $prj->getTagCloud();␊ | 
| $tagStatistics = array();␊ | 
| foreach ($tags as $t) {␊ | 
| $tagStatistics[$t->class][$t->name] = array($t->nb_use, $t->id);␊ | 
| }␊ | 
| foreach($tagStatistics as $k => $v) {␊ | 
| $nbIssueInClass = 0;␊ | 
| foreach ($v as $val) {␊ | 
| $nbIssueInClass += $val[0];␊ | 
| }␊ | 
| foreach ($v as $kk => $vv) {␊ | 
| $tagStatistics[$k][$kk] = array($vv[0], (int)(100 * $vv[0] / $nbIssueInClass), $vv[1]);␊ | 
| // Issue class tag statistics␊ | 
| $tags = $prj->getTagCloud();␊ | 
| foreach ($tags as $t) {␊ | 
| $tagStatistics[$t->class][$t->name] = array($t->nb_use, $t->id);␊ | 
| }␊ | 
| foreach($tagStatistics as $k => $v) {␊ | 
| $nbIssueInClass = 0;␊ | 
| foreach ($v as $val) {␊ | 
| $nbIssueInClass += $val[0];␊ | 
| }␊ | 
| foreach ($v as $kk => $vv) {␊ | 
| $tagStatistics[$k][$kk] = array($vv[0], (int)(100 * $vv[0] / $nbIssueInClass), $vv[1]);␊ | 
| }␊ | 
| }␊ | 
| ␊ | 
| // Sort␊ | 
| krsort($tagStatistics);␊ | 
| arsort($ownerStatistics);␊ | 
| }␊ | 
| }␊ | 
| ␊ | 
| // Sort␊ | 
| krsort($tagStatistics);␊ | 
| arsort($ownerStatistics);␊ | 
| ␊ | 
| $title = sprintf(__('Summary of tracked issues in %s.'), (string) $prj);␊ | 
| ␊ | 
| return Pluf_Shortcuts_RenderToResponse('idf/issues/summary.html',␊ | 
| array('page_title' => $title,␊ | 
| 'trackerEmpty' => $isTrackerEmpty,␊ | 
| 'project' => $prj,␊ | 
| 'tagStatistics' => $tagStatistics,␊ | 
| 'ownerStatistics' => $ownerStatistics,␊ |