diff --git a/module/product/model.php b/module/product/model.php
index 2f8350ac1d..43e1d0f115 100644
--- a/module/product/model.php
+++ b/module/product/model.php
@@ -1271,13 +1271,14 @@ class productModel extends model
}
/* Compute totalReal and progress. */
- foreach($hours as $hour)
+ $progressList = $this->loadModel('project')->getWaterfallProgress(array_keys($hours));
+ foreach($hours as $projectID => $hour)
{
$hour->totalEstimate = round($hour->totalEstimate, 1) ;
$hour->totalConsumed = round($hour->totalConsumed, 1);
$hour->totalLeft = round($hour->totalLeft, 1);
$hour->totalReal = $hour->totalConsumed + $hour->totalLeft;
- $hour->progress = $hour->totalReal ? round($hour->totalConsumed / $hour->totalReal, 2) * 100 : 0;
+ $hour->progress = $projects[$projectID]->model == 'waterfall' ? $progressList[$projectID] : ($hour->totalReal ? round($hour->totalConsumed / $hour->totalReal, 2) * 100 : 0);
}
/* Get the number of project teams. */
diff --git a/module/product/view/project.html.php b/module/product/view/project.html.php
index 32cb6a14d9..2037c8943c 100644
--- a/module/product/view/project.html.php
+++ b/module/product/view/project.html.php
@@ -96,8 +96,8 @@
hours->totalEstimate . $lang->execution->workHourUnit;?> |
hours->totalConsumed . $lang->execution->workHourUnit;?> |
- |
diff --git a/module/program/model.php b/module/program/model.php
index 47b702d040..64cce62d4a 100644
--- a/module/program/model.php
+++ b/module/program/model.php
@@ -1434,13 +1434,14 @@ class programModel extends model
}
/* Compute totalReal and progress. */
- foreach($hours as $hour)
+ $progressList = $this->loadModel('project')->getWaterfallProgress(array_keys($hours));
+ foreach($hours as $projectID => $hour)
{
$hour->totalEstimate = round($hour->totalEstimate, 1) ;
$hour->totalConsumed = round($hour->totalConsumed, 1);
$hour->totalLeft = round($hour->totalLeft, 1);
$hour->totalReal = $hour->totalConsumed + $hour->totalLeft;
- $hour->progress = $hour->totalReal ? round($hour->totalConsumed / $hour->totalReal, 2) * 100 : 0;
+ $hour->progress = $projects[$projectID]->model == 'waterfall' ? $progressList[$projectID] : ($hour->totalReal ? round($hour->totalConsumed / $hour->totalReal, 2) * 100 : 0);
}
/* Get the number of left tasks. */
diff --git a/module/program/view/browsebylist.html.php b/module/program/view/browsebylist.html.php
index faefdc1c04..44da6a7f16 100644
--- a/module/program/view/browsebylist.html.php
+++ b/module/program/view/browsebylist.html.php
@@ -85,8 +85,8 @@
end == LONG_TIME ? $lang->program->longTime : $program->end;?> |
id])):?>
- |
diff --git a/module/project/model.php b/module/project/model.php
index d77c2b2ed6..784f29d7eb 100644
--- a/module/project/model.php
+++ b/module/project/model.php
@@ -393,6 +393,53 @@ class projectModel extends model
->fetchAll('project');
}
+ /**
+ * Get waterfall project progress.
+ *
+ * @param array $projectIDList
+ * @access public
+ * @return int
+ */
+ public function getWaterfallProgress($projectIDList)
+ {
+ $projectList = $this->dao->select('t1.*')->from(TABLE_EXECUTION)->alias('t1')
+ ->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project=t2.id')
+ ->where('t1.type')->in('stage')
+ ->andWhere('t1.deleted')->eq('0')
+ ->andWhere('t1.vision')->eq($this->config->vision)
+ ->andWhere('t1.project')->in($projectIDList)
+ ->andWhere('t2.model')->eq('waterfall')
+ ->fetchGroup('project', 'id');
+
+ $totalHour = $this->dao->select('t1.project, t1.execution, ROUND(SUM(if(t1.status !="closed" && t1.status !="cancel", `left`, 0)), 2) AS totalLeft, ROUND(SUM(consumed), 1) AS totalConsumed')->from(TABLE_TASK)->alias('t1')
+ ->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.execution = t2.id')
+ ->where('t2.project')->in(array_keys($projectList))
+ ->andWhere('t1.deleted')->eq(0)
+ ->andWhere('t1.parent')->lt(1)
+ ->groupBy('t1.execution')
+ ->fetchGroup('project', 'execution');
+
+ $progressList = array();
+ foreach($projectList as $projectID => $stageList)
+ {
+ $progress = 0;
+ foreach($stageList as $stageID => $stage)
+ {
+ if($stage->project != $projectID) continue;
+
+ $stageTotalConsumed = isset($totalHour[$projectID][$stageID]) ? $totalHour[$projectID][$stageID]->totalConsumed : 0;
+ $stageTotalLeft = isset($totalHour[$projectID][$stageID]) ? round($totalHour[$projectID][$stageID]->totalLeft, 1) : 0;
+
+ $stageProgress = ($stageTotalConsumed + $stageTotalLeft) ? floor($stageTotalConsumed / ($stageTotalConsumed + $stageTotalLeft) * 1000) / 1000 * 100 : 0;
+
+ $progress += $stageProgress * ($stage->percent / 100);
+ }
+ $progressList[$projectID] = $progress;
+ }
+
+ return is_numeric($projectIDList) ? $progressList[$projectIDList] : $progressList;
+ }
+
/**
* Get project workhour info.
*
diff --git a/module/project/view/view.html.php b/module/project/view/view.html.php
index 28b98330fa..2ae7484bee 100644
--- a/module/project/view/view.html.php
+++ b/module/project/view/view.html.php
@@ -195,7 +195,7 @@
| | | |
|
- totalConsumed + $workhour->totalLeft) ? floor($workhour->totalConsumed / ($workhour->totalConsumed + $workhour->totalLeft) * 1000) / 1000 * 100 : 0;?>
+ model == 'waterfall' ? $this->project->getWaterfallProgress($project->id) : (($workhour->totalConsumed + $workhour->totalLeft) ? floor($workhour->totalConsumed / ($workhour->totalConsumed + $workhour->totalLeft) * 1000) / 1000 * 100 : 0);?>
project->progress;?> percent;?>
|