diff --git a/module/programplan/model.php b/module/programplan/model.php index 0960828a5c..2f5815d678 100755 --- a/module/programplan/model.php +++ b/module/programplan/model.php @@ -182,15 +182,17 @@ class programplanModel extends model } } - $project = $this->loadModel('project')->getByID($projectID); - $today = helper::today(); - $datas = array(); - $planIdList = array(); - $isMilestone = " "; - $stageIndex = array(); + $project = $this->loadModel('project')->getByID($projectID); + $today = helper::today(); + $datas = array(); + $planIdList = array(); + $isMilestone = " "; + $stageIndex = array(); + $reviewDeadline = array(); foreach($plans as $plan) { $planIdList[$plan->id] = $plan->id; + $reviewDeadline[$plan->id]['stageEnd'] = $plan->end; $start = helper::isZeroDate($plan->begin) ? '' : $plan->begin; $end = helper::isZeroDate($plan->end) ? '' : $plan->end; @@ -275,6 +277,16 @@ class programplanModel extends model $realBegan = helper::isZeroDate($task->realStarted) ? '' : $task->realStarted; $realEnd = (in_array($task->status, array('done', 'closed')) and !helper::isZeroDate($task->finishedDate)) ? $task->finishedDate : ''; + /* Get lastest task deadline. */ + if(isset($reviewDeadline[$task->execution]['taskEnd'])) + { + $reviewDeadline[$task->execution]['taskEnd'] = $task->deadline > $reviewDeadline[$task->execution]['taskEnd'] ? $task->deadline : $reviewDeadline[$task->execution]['taskEnd']; + } + else + { + $reviewDeadline[$task->execution]['taskEnd'] = $task->deadline; + } + $start = $realBegan ? $realBegan : $estStart; $end = $realEnd ? $realEnd : $estEnd; if(empty($start) and $execution) $start = $execution->begin; @@ -353,8 +365,9 @@ class programplanModel extends model } /* Build review points tree for ipd project. */ - if($project->model == 'ipd') + if($project->model == 'ipd' and $datas) { + $this->loadModel('review'); $reviewPoints = $this->dao->select('*')->from(TABLE_OBJECT) ->where('deleted')->eq('0') ->andWhere('project')->eq($projectID) @@ -372,6 +385,23 @@ class programplanModel extends model $categories = $this->config->stage->ipdReviewPoint->{$plan->attribute}; if(in_array($point->category, $categories)) { + $end = $reviewDeadline[$plan->id]['stageEnd']; + if(strpos($point->category, "TR") !== false) + { + if(isset($reviewDeadline[$plan->id]['taskEnd']) and !helper::isZeroDate($reviewDeadline[$plan->id]['taskEnd'])) + { + $end = $reviewDeadline[$plan->id]['taskEnd']; + } + else + { + $end = $this->getReviewDeadline($end); + } + } + elseif(strpos($point->category, "DCP") !== false) + { + $end = $this->getReviewDeadline($end, 2); + } + $data = new stdclass(); $data->id = $plan->id . '-' . $point->category . '-' . $point->id; $data->type = 'point'; @@ -380,15 +410,15 @@ class programplanModel extends model $data->attribute = ''; $data->milestone = ''; $data->owner_id = ''; - $data->status = ''; - $data->begin = helper::today(); - $data->deadline = ''; + $data->status = isset($point->status) ? zget($this->lang->review->statusList, $point->status) : $this->lang->review->wait; + $data->begin = $end; + $data->deadline = $end; $data->realBegan = $point->createdDate; $data->realEnd = '';; $data->parent = $plan->id; $data->open = true; - $data->start_date = helper::today(); - $data->endDate = helper::today(); + $data->start_date = $end; + $data->endDate = $end; $data->duration = 1; $data->color = '#FC913F'; $data->progressColor = $this->lang->execution->gantt->stage->progressColor; @@ -1746,4 +1776,34 @@ class programplanModel extends model return $siblingStages; } + + /** + * Get five days ago. + * + * @param string $date + * @access public + * @return void + */ + public function getReviewDeadline($date, $counter = 5) + { + if(helper::isZeroDate($date)) return ''; + + $weekend_days = [6, 7]; + + $timestamp = strtotime($date); + $counter = 0; + $this->loadModel('holiday'); + while($counter < 5) + { + $timestamp = strtotime('-1 day', $timestamp); + $weekday = date('N', $timestamp); + $currentDate = date('Y-m-d', $timestamp); + if(!in_array($weekday, $weekend_days) and !$this->holiday->isHoliday($currentDate)) + { + $counter ++; + } + } + + return date('Y-m-d', $timestamp); + } }