diff --git a/module/upgrade/control.php b/module/upgrade/control.php index faa4c90522..42f57fe697 100644 --- a/module/upgrade/control.php +++ b/module/upgrade/control.php @@ -439,11 +439,12 @@ class upgrade extends control } $programs = $this->upgrade->getProgramPairs(); + $currentProgramID = $programID ? $programID : key($programs); $this->view->title = $this->lang->upgrade->mergeProgram; $this->view->programs = $programs; $this->view->programID = $programID; - $this->view->projects = array('' => '') + $this->upgrade->getProjectPairsByProgram(key($programs)); + $this->view->projects = array('' => '') + $this->upgrade->getProjectPairsByProgram($currentProgramID); $this->view->users = $this->loadModel('user')->getPairs('noclosed|noempty'); $this->view->groups = $this->loadModel('group')->getPairs(); $this->display(); diff --git a/module/upgrade/js/mergeprogram.js b/module/upgrade/js/mergeprogram.js index 99afcd4b66..196266b8cc 100644 --- a/module/upgrade/js/mergeprogram.js +++ b/module/upgrade/js/mergeprogram.js @@ -126,7 +126,7 @@ function getProjectByProgram(obj) function toggleProgram(obj) { - var $obj = $(obj); + var $obj = $(obj); if($obj.length == 0) return false; var $programs = $obj.closest('table').find('#programs'); @@ -135,6 +135,7 @@ function toggleProgram(obj) $('form .pgm-no-exist').removeClass('hidden'); $('form .pgm-exist').addClass('hidden'); $programs.attr('disabled', 'disabled'); + $('#PGMStatus').closest('.PGMParams').show(); $('form #newProject0').prop('checked', true); toggleProject($('form #newProject0')); @@ -143,6 +144,7 @@ function toggleProgram(obj) { $('form .pgm-exist').removeClass('hidden'); $('form .pgm-no-exist').addClass('hidden'); + $('#PGMStatus').closest('.PGMParams').hide(); $programs.removeAttr('disabled'); } } @@ -176,6 +178,38 @@ function toggleProject(obj) } } +function setPRJStatus() +{ + var PRJStatus = 'closed'; + $(':checkbox:checked[data-status]').each(function() + { + var status = $(this).attr('data-status'); + if(status == 'doing' || status == 'suspended') + { + PRJStatus = 'doing'; + return false; + } + + if(status == 'wait') PRJStatus = 'wait'; + }); + if($(':checkbox:checked[data-status]').length == 0) PRJStatus = 'wait'; + + $('#PRJStatus').val(PRJStatus); + $('#PRJStatus').trigger('chosen:updated'); + + setPGMStatus(PRJStatus); +} + +function setPGMStatus(PRJStatus) +{ + var PGMStatus = 'wait'; + if(PRJStatus != 'wait') PGMStatus = 'doing'; + if(PRJStatus == 'closed') PGMStatus = 'closed'; + + $('#PGMStatus').val(PGMStatus); + $('#PGMStatus').trigger('chosen:updated'); +} + function setPGMBegin(PGMBegin) { $(':checkbox:checked[data-begin]').each(function() @@ -189,6 +223,8 @@ function setPGMBegin(PGMBegin) $('.PGMParams #begin').val(PGMBegin); } }); + + setPRJStatus(); } function setPGMEnd(PGMEnd) diff --git a/module/upgrade/model.php b/module/upgrade/model.php index aa1eb8a8e4..b620ed568b 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -3998,7 +3998,7 @@ class upgradeModel extends model $program = new stdclass(); $program->name = $data->PGMName; $program->type = 'program'; - $program->status = 'wait'; + $program->status = $data->PGMStatus; $program->begin = $data->begin; $program->end = isset($data->end) ? $data->end : ''; $program->openedBy = $account; @@ -4042,7 +4042,7 @@ class upgradeModel extends model $project->type = 'project'; $project->model = 'scrum'; $project->parent = $programID; - $project->status = 'wait'; + $project->status = $data->PRJStatus; $project->begin = $data->begin; $project->end = isset($data->end) ? $data->end : ''; $project->PM = $data->PM; @@ -4115,29 +4115,9 @@ class upgradeModel extends model { $projectStory = $sprintStory; $projectStory->project = $projectID; - $this->dao->insert(TABLE_PROJECTSTORY)->data($projectStory)->exec(); + $this->dao->replace(TABLE_PROJECTSTORY)->data($projectStory)->exec(); } - /* Compute project date. */ - $linkedSprintIdList = $this->dao->select('id')->from(TABLE_PROJECT)->where('project')->eq($projectID)->fetchPairs(); - $linkedSprintIdList += $sprintIdList; - $undoneSprints = $this->dao->select("count('*') as count")->from(TABLE_PROJECT)->where('id')->in($linkedSprintIdList)->andWhere('status')->ne('closed')->fetch('count'); - $minRealBegan = $this->dao->select('date')->from(TABLE_ACTION)->where('objectID')->in($linkedSprintIdList)->andWhere('objectType')->eq('project')->andWhere('action')->eq('started')->orderBy('date_asc')->fetch('date'); - $maxRealEnd = $this->dao->select('date')->from(TABLE_ACTION)->where('objectID')->in($linkedSprintIdList)->andWhere('objectType')->eq('project')->andWhere('action')->eq('closed')->orderBy('date_desc')->fetch('date'); - - $data = new stdClass(); - $data->realBegan = $minRealBegan ? substr($minRealBegan, 0, 10) : '0000-00-00'; - if($maxRealEnd and !$undoneSprints) - { - $data->realEnd = substr($maxRealEnd, 0, 10); - $data->closedDate = $maxRealEnd; - $data->status = 'closed'; - } - - $this->dao->update(TABLE_PROJECT)->data($data)->where('id')->eq($projectID)->exec(); - - if($maxRealEnd and !$undoneSprints) $this->loadModel('action')->create('project', $projectID, 'closedbysystem'); - /* Compute product acl. */ $products = $this->dao->select('id,program,acl')->from(TABLE_PRODUCT)->where('id')->in($productIdList)->fetchAll(); foreach($products as $product) @@ -4167,7 +4147,32 @@ class upgradeModel extends model $this->dao->update(TABLE_PROJECT)->data($data)->where('id')->eq($sprint->id)->exec(); } - /* Set product and project relation. */ + /* Compute project date and status. */ + $linkedSprintIdList = $this->dao->select('id')->from(TABLE_PROJECT)->where('project')->eq($projectID)->fetchPairs(); + $linkedSprintIdList += $sprintIdList; + $minRealBegan = $this->dao->select('date')->from(TABLE_ACTION)->where('objectID')->in($linkedSprintIdList)->andWhere('objectType')->eq('project')->andWhere('action')->eq('started')->orderBy('date_asc')->fetch('date'); + $maxRealEnd = $this->dao->select('date')->from(TABLE_ACTION)->where('objectID')->in($linkedSprintIdList)->andWhere('objectType')->eq('project')->andWhere('action')->eq('closed')->orderBy('date_desc')->fetch('date'); + + $PRJStatus = $this->computeStatus($projectID); + + $data = new stdClass(); + $data->realBegan = $minRealBegan ? substr($minRealBegan, 0, 10) : '0000-00-00'; + $data->status = $PRJStatus; + if($PRJStatus == 'closed') + { + $data->realEnd = substr($maxRealEnd, 0, 10); + $data->closedDate = $maxRealEnd; + } + + $this->dao->update(TABLE_PROJECT)->data($data)->where('id')->eq($projectID)->exec(); + if($PRJStatus == 'closed') $this->loadModel('action')->create('project', $projectID, 'closedbysystem'); + + /* Compute program status. */ + $PGMStatus = $this->computeStatus($programID); + $this->dao->update(TABLE_PROJECT)->set('status')->eq($PGMStatus)->where('id')->eq($programID)->exec(); + if($PGMStatus == 'closed') $this->loadModel('action')->create('program', $programID, 'closedbysystem'); + + /* Set product and project relation. */ foreach($productIdList as $productID) { $data = new stdclass(); @@ -4180,9 +4185,34 @@ class upgradeModel extends model $this->computeObjectMembers($programID, $projectID, $productIdList, $sprintIdList); } - /** - * Compute program and project members. - * + /** + * Compute project or program status. + * + * @param int $objectID + * @access public + * @return string + */ + public function computeStatus($objectID) + { + $objects = $this->dao->select('id, status')->from(TABLE_PROJECT)->where('parent')->eq($objectID)->fetchPairs(); + $objectStatus = empty($objects) ? 'wait' : 'closed'; + foreach($objects as $status) + { + if($status == 'doing' || $status == 'suspended') + { + $objectStatus = 'doing'; + break; + } + + if($status == 'wait') $objectStatus = 'wait'; + } + + return $objectStatus; + } + + /** + * Compute program and project members. + * * @param int $programID * @param int $projectID * @param array $productIdList diff --git a/module/upgrade/view/createprogram.html.php b/module/upgrade/view/createprogram.html.php index 129acc044f..2e77127326 100644 --- a/module/upgrade/view/createprogram.html.php +++ b/module/upgrade/view/createprogram.html.php @@ -20,6 +20,10 @@ +