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;?> -
-
hours->progress;?>
+
+
hours->progress);?>
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])):?> -
-
id];?>
+
+
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;?>