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;