diff --git a/module/block/control.php b/module/block/control.php index b14d058819..ab25884e34 100644 --- a/module/block/control.php +++ b/module/block/control.php @@ -758,6 +758,7 @@ class block extends control if(!empty($this->params->type) and preg_match('/[^a-zA-Z0-9_]/', $this->params->type)) die(); $this->loadModel('project'); + $this->loadModel('weekly'); $this->app->loadLang('task'); $this->app->loadLang('story'); @@ -772,26 +773,39 @@ class block extends control return false; } + $today = date('Y-m-d', strtotime(helper::today())); + $date = date('Ymd', strtotime($this->loadModel('weekly')->getThisMonday($today))); + $tasks = $this->dao->select("program, sum(consumed) as totalConsumed, sum(if(status != 'cancel' and status != 'closed', `left`, 0)) as totalLeft")->from(TABLE_TASK) + ->where('program')->in(array_keys($programs)) + ->andWhere('deleted')->eq(0) + ->andWhere('parent')->lt(1) + ->groupBy('program') + ->fetchAll('program'); + foreach($programs as $programID => $program) { - $program->allStories = $program->doneStories = $program->leftStories = 0; - - $stories = $this->dao->select('id, status')->from(TABLE_STORY) - ->where('deleted')->eq(0) - ->andWhere('type')->eq('story') - ->andWhere('status')->ne('draft') - ->andWhere('program')->eq($programID) - ->fetchPairs(); - foreach($stories as $id => $status) + if($program->template == 'scrum') { - $program->allStories ++; - if($status == 'closed') $program->doneStories ++; - if($status != 'closed') $program->leftStories ++; + $program->progress = $program->allStories == 0 ? 0 : round($program->doneStories / $program->allStories, 3) * 100; + $program->projects = $this->project->getProjectStats('all', 0, 0, 1, 'id_desc', null, $programID); } + else + { + $begin = $program->begin; + $weeks = $this->weekly->getWeekPairs($begin); + $current = zget($weeks, $date, ''); - $program->progress = $program->allStories == 0 ? 0 : ceil($program->doneStories / $program->allStories) * 100; + $program->pv = $this->weekly->getPV($programID, $today); + $program->ev = $this->weekly->getEV($programID, $today); + $program->ac = $this->weekly->getAC($programID, $today); + $program->sv = $this->weekly->getSV($program->ev, $program->pv); + $program->cv = $this->weekly->getCV($program->ev, $program->ac); - //$program->projects = $this->dao->select('*') + $progress = isset($tasks[$programID]) ? (($tasks[$programID]->totalConsumed + $tasks[$programID]->totalLeft)) ? round($tasks[$programID]->totalConsumed / ($tasks[$programID]->totalConsumed + $tasks[$programID]->totalLeft), 3) * 100 : 0 : 0; + + $program->current = $current; + $program->progress = $progress; + } } $this->view->programs = $programs; @@ -1030,7 +1044,7 @@ class block extends control $projects[$project->id]->releasedStories = 0; } - $projects[$project->id]->progress = ($project->totalConsumed || $project->totalLeft) ? round($project->totalConsumed / ($project->totalConsumed + $project->totalLeft), 2) * 100 : 0; + $projects[$project->id]->progress = ($project->totalConsumed || $project->totalLeft) ? round($project->totalConsumed / ($project->totalConsumed + $project->totalLeft), 3) * 100 : 0; $projects[$project->id]->taskProgress = $project->totalTasks ? round(($project->totalTasks - $project->undoneTasks) / $project->totalTasks, 2) * 100 : 0; $projects[$project->id]->storyProgress = $project->totalStories ? round(($project->totalStories - $project->unclosedStories) / $project->totalStories, 2) * 100 : 0; $projects[$project->id]->bugProgress = $project->totalBugs ? round(($project->totalBugs - $project->activeBugs) / $project->totalBugs, 2) * 100 : 0; @@ -1065,7 +1079,7 @@ class block extends control $this->view->cv = $this->weekly->getCV($this->view->ev, $this->view->ac); $this->view->current = $current; - $this->view->progress = ($task->totalConsumed + $task->totalLeft) ? round($task->totalConsumed / ($task->totalConsumed + $task->totalLeft), 2) * 100 : 0; + $this->view->progress = ($task->totalConsumed + $task->totalLeft) ? round($task->totalConsumed / ($task->totalConsumed + $task->totalLeft), 3) * 100 : 0; } /** diff --git a/module/block/view/programstatisticblock.html.php b/module/block/view/programstatisticblock.html.php index a3e9d9770d..517c477c4b 100644 --- a/module/block/view/programstatisticblock.html.php +++ b/module/block/view/programstatisticblock.html.php @@ -55,6 +55,10 @@ html[lang="en"] .product-info .type-info {color: #A6AAB8; text-align: center; po .block-statistic.block-sm .nav-secondary > li.active > a.btn-view {width: auto; left: 0; right: 0;} .block-statistic.block-sm .nav-secondary > li.active > a.btn-view > i {display: none;} .block-statistic.block-sm .nav-secondary > li.active > a.btn-view:hover {cursor: pointer; background: rgba(0,0,0,.1)} +.block-statistic .program-info .info span+span{margin-left: 15px} +.block-statistic .project-info{margin-top: 25px} +.block-statistic .project-info .col-xs-5, .block-statistic .project-info .col-xs-7{margin-top: 8px} +.block-statistic .project-info .col-xs-5{padding-left: 0px;} .status-count{margin:auto} .status-count tr:first-child td:last-child{color:#000;font-weight:bold} @@ -133,14 +137,28 @@ $(function()
-
program->allInput;?>
+

program->allInput;?>

- countMembers;?> - consumed;?> - budget;?> + teamCount;?> + estimate;?> + budget . ' ' . zget($lang->program->unitList, $program->budgetUnit);?>
+ +

program->lastIteration;?>

+ projects as $project):?> + + 3) break;?> +
name;?>
+
+
+
+ hours->progress . '%';?> +
+
+
+
diff --git a/module/block/view/welcome.html.php b/module/block/view/welcome.html.php index 8534ef07c8..7d526a0d90 100644 --- a/module/block/view/welcome.html.php +++ b/module/block/view/welcome.html.php @@ -27,7 +27,7 @@ .block-welcome .progress-group{margin-top: 20px;} .block-welcome .progress{margin-top: 10px; width: 85%} - +
diff --git a/module/program/model.php b/module/program/model.php index 4a8bfc9e15..51bb231faa 100644 --- a/module/program/model.php +++ b/module/program/model.php @@ -1,6 +1,15 @@ dao->select('*')->from(TABLE_PROJECT) @@ -20,6 +29,12 @@ class programModel extends model ->fetchAll('id'); } + /** + * Get program pairs. + * + * @access public + * @return void + */ public function getPairs() { return $this->dao->select('id, name')->from(TABLE_PROJECT) @@ -30,6 +45,13 @@ class programModel extends model ->fetchPairs(); } + /** + * Get program pairs by template. + * + * @param varchar $template + * @access public + * @return void + */ public function getPairsByTemplate($template) { return $this->dao->select('id, name')->from(TABLE_PROJECT) @@ -41,6 +63,15 @@ class programModel extends model ->fetchPairs(); } + /** + * Get user programs for block. + * + * @param varchar $status + * @param varchar $orderBy + * @param int $limit + * @access public + * @return void + */ public function getUserPrograms($status = 'all', $orderBy = 'id_desc', $limit = 15) { $programs = $this->dao->select('*')->from(TABLE_PROJECT) @@ -57,7 +88,7 @@ class programModel extends model if(empty($programs)) return array(); $programIdList = array_keys($programs); - $consumes = $this->dao->select('program, sum(consumed) as consumed')->from(TABLE_TASK) + $hours = $this->dao->select('program, sum(consumed) as consumed, sum(estimate) as estimate')->from(TABLE_TASK) ->where('program')->in($programIdList) ->andWhere('deleted')->eq(0) ->andWhere('parent')->lt(1) @@ -76,6 +107,21 @@ class programModel extends model ->groupBy('program') ->fetchAll('program'); + $allStories = $this->dao->select('program, count(*) as allStories')->from(TABLE_STORY) + ->where('program')->in($programIdList) + ->andWhere('deleted')->eq(0) + ->andWhere('status')->ne('draft') + ->groupBy('program') + ->fetchAll('program'); + + $doneStories = $this->dao->select('program, count(*) as doneStories')->from(TABLE_STORY) + ->where('program')->in($programIdList) + ->andWhere('deleted')->eq(0) + ->andWhere('status')->eq('closed') + ->andWhere('closedReason')->eq('done') + ->groupBy('program') + ->fetchAll('program'); + $leftStories = $this->dao->select('program, count(*) as leftStories')->from(TABLE_STORY) ->where('program')->in($programIdList) ->andWhere('deleted')->eq(0) @@ -93,10 +139,13 @@ class programModel extends model foreach($programs as $programID => $program) { $program->teamCount = isset($teams[$programID]) ? $teams[$programID]->count : 0; - $program->consumed = isset($consumes[$programID]) ? $consumes[$programID] : 0; - $program->leftTasks = isset($leftTasks[$programID]) ? $leftTasks[$programID] : 0; - $program->leftStories = isset($leftStories[$programID]) ? $leftStories[$programID] : 0; - $program->leftBugs = isset($leftBugs[$programID]) ? $leftBugs[$programID] : 0; + $program->consumed = isset($hours[$programID]) ? $hours[$programID]->consumed : 0; + $program->estimate = isset($hours[$programID]) ? $hours[$programID]->estimate : 0; + $program->leftTasks = isset($leftTasks[$programID]) ? $leftTasks[$programID]->leftTasks : 0; + $program->allStories = isset($allStories[$programID]) ? $allStories[$programID]->allStories : 0; + $program->doneStories = isset($doneStories[$programID]) ? $doneStories[$programID]->doneStories : 0; + $program->leftStories = isset($leftStories[$programID]) ? $leftStories[$programID]->leftStories : 0; + $program->leftBugs = isset($leftBugs[$programID]) ? $leftBugs[$programID]->leftBugs : 0; } return $programs; @@ -166,6 +215,12 @@ class programModel extends model die(js::locate('back')); } + /** + * Create a program. + * + * @access private + * @return void + */ public function create() { $this->lang->project->team = $this->lang->project->teamname; @@ -249,6 +304,17 @@ class programModel extends model } } + /** + * Get program swapper. + * + * @param object $programs + * @param int $programID + * @param varchar $currentModule + * @param varchar $currentMethod + * @param varchar $extra + * @access private + * @return void + */ public function getSwapper($programs, $programID, $currentModule, $currentMethod, $extra = '') { $this->loadModel('project'); @@ -270,24 +336,27 @@ class programModel extends model return $output; } - public static function isClickable($project, $action) + /** + * Get program swapper. + * + * @param object $program + * @param varchar $action + * @access private + * @return void + */ + public static function isClickable($program, $action) { $action = strtolower($action); - if($action == 'start') return $project->status == 'wait' or $project->status == 'suspended'; - if($action == 'finish') return $project->status == 'wait' or $project->status == 'doing'; - if($action == 'close') return $project->status != 'closed'; - if($action == 'suspend') return $project->status == 'wait' or $project->status == 'doing'; - if($action == 'activate') return $project->status == 'done'; + if($action == 'start') return $program->status == 'wait' or $program->status == 'suspended'; + if($action == 'finish') return $program->status == 'wait' or $program->status == 'doing'; + if($action == 'close') return $program->status != 'closed'; + if($action == 'suspend') return $program->status == 'wait' or $program->status == 'doing'; + if($action == 'activate') return $program->status == 'done'; return true; } - public function getProducts($program) - { - return $this->dao->select('*')->from(TABLE_PRODUCT)->where('project')->eq($program)->fetchAll('id'); - } - public function checkHasContent($programID) { $count = 0;