Merge branch 'sprint/zentaopms240_#task69256' into sprint/zentaopms240
This commit is contained in:
@@ -635,18 +635,22 @@ class upgrade extends control
|
||||
* Select the merge mode when upgrading to zentaopms 18.0.
|
||||
*
|
||||
* @param string $fromVersion
|
||||
* @param string $mode lean | new
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function selectMergeMode($fromVersion)
|
||||
public function selectMergeMode($fromVersion, $mode = 'lean')
|
||||
{
|
||||
if($_POST)
|
||||
{
|
||||
$mode = $this->post->mode;
|
||||
if($mode == 'project') echo 'execute mergeData method';
|
||||
if($mode == 'execution') echo 'execute mergeData method';
|
||||
if($mode == 'manually') $this->locate(inlink('mergeProgram'));
|
||||
$mergeMode = $this->post->projectType;
|
||||
if($mergeMode == 'manually') $this->locate(inlink('mergeProgram'));
|
||||
|
||||
$program = $this->upgrade->createDefaultProgram();
|
||||
if($mergeMode == 'project') $this->upgrade->upgradeInProjectMode($program->id);
|
||||
if($mergeMode == 'execution') $this->upgrade->upgradeInExecutionMode($program->id);
|
||||
|
||||
if(dao::isError()) return print(js::error(dao::getError()));
|
||||
$this->locate(inlink('afterExec', "fromVersion=$fromVersion"));
|
||||
}
|
||||
$this->view->title = $this->lang->upgrade->selectMergeMode;
|
||||
|
||||
@@ -102,6 +102,7 @@ $lang->upgrade->selectedModeTips['new'] = 'Switching to the program manageme
|
||||
$lang->upgrade->line = 'Product Line';
|
||||
$lang->upgrade->allLines = "All Product Lines";
|
||||
$lang->upgrade->program = 'Merge Project';
|
||||
$lang->upgrade->defaultProgram = 'Default Program';
|
||||
$lang->upgrade->existProgram = 'Existing programs';
|
||||
$lang->upgrade->existProject = 'Existing projects';
|
||||
$lang->upgrade->existLine = 'Existing' . $lang->productCommon . ' lines';
|
||||
|
||||
@@ -102,6 +102,7 @@ $lang->upgrade->selectedModeTips['new'] = 'Switching to the program manageme
|
||||
$lang->upgrade->line = 'Product Line';
|
||||
$lang->upgrade->allLines = "All Product Lines";
|
||||
$lang->upgrade->program = 'Merge Project';
|
||||
$lang->upgrade->defaultProgram = 'Default Program';
|
||||
$lang->upgrade->existProgram = 'Existing programs';
|
||||
$lang->upgrade->existProject = 'Existing projects';
|
||||
$lang->upgrade->existLine = 'Existing' . $lang->productCommon . ' lines';
|
||||
|
||||
@@ -102,6 +102,7 @@ $lang->upgrade->selectedModeTips['new'] = 'Switching to the program manageme
|
||||
$lang->upgrade->line = 'Product Line';
|
||||
$lang->upgrade->allLines = "All Product Lines";
|
||||
$lang->upgrade->program = 'Merge Project';
|
||||
$lang->upgrade->defaultProgram = 'Default Program';
|
||||
$lang->upgrade->existProgram = 'Existing programs';
|
||||
$lang->upgrade->existProject = 'Existing projects';
|
||||
$lang->upgrade->existLine = 'Existing' . $lang->productCommon . ' lines';
|
||||
|
||||
@@ -99,6 +99,7 @@ $lang->upgrade->selectedModeTips['new'] = 'Switching to the program manageme
|
||||
$lang->upgrade->line = 'Product Line';
|
||||
$lang->upgrade->allLines = "All Product Lines";
|
||||
$lang->upgrade->program = 'Merge Project';
|
||||
$lang->upgrade->defaultProgram = 'Default Program';
|
||||
$lang->upgrade->existProgram = 'Existing programs';
|
||||
$lang->upgrade->existProject = 'Existing projects';
|
||||
$lang->upgrade->existLine = 'Existing' . $lang->productCommon . ' lines';
|
||||
|
||||
@@ -102,6 +102,7 @@ $lang->upgrade->selectedModeTips['new'] = '切换为项目集管理模式需
|
||||
$lang->upgrade->line = '产品线';
|
||||
$lang->upgrade->allLines = "所有{$lang->productCommon}线";
|
||||
$lang->upgrade->program = '目标项目集和项目';
|
||||
$lang->upgrade->defaultProgram = '默认项目集';
|
||||
$lang->upgrade->existProgram = '已有项目集';
|
||||
$lang->upgrade->existProject = '已有项目';
|
||||
$lang->upgrade->existLine = '已有' . $lang->productCommon . '线';
|
||||
|
||||
+228
-1
@@ -4941,7 +4941,7 @@ class upgradeModel extends model
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function processMergedData($programID, $projectID, $lineID, $productIdList = array(), $sprintIdList = array())
|
||||
public function processMergedData($programID, $projectID, $lineID = 0, $productIdList = array(), $sprintIdList = array())
|
||||
{
|
||||
/* Product linked objects. */
|
||||
$this->dao->update(TABLE_RELEASE)->set('project')->eq($projectID)->where('product')->in($productIdList)->exec();
|
||||
@@ -7570,4 +7570,231 @@ class upgradeModel extends model
|
||||
|
||||
return !dao::isError();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a default program.
|
||||
*
|
||||
* @access public
|
||||
* @return object
|
||||
*/
|
||||
public function createDefaultProgram()
|
||||
{
|
||||
$program = $this->dao->select('*')->from(TABLE_PROGRAM)->where('name')->eq($this->lang->upgrade->defaultProgram)->fetch();
|
||||
if($program) return $program;
|
||||
|
||||
$account = isset($this->app->user->account) ? $this->app->user->account : '';
|
||||
|
||||
$program = new stdclass();
|
||||
$program->name = $this->lang->upgrade->defaultProgram;
|
||||
$program->type = 'program';
|
||||
$program->status = 'doing';
|
||||
$program->begin = helper::now();
|
||||
$program->end = LONG_TIME;
|
||||
$program->openedBy = $account;
|
||||
$program->openedDate = helper::now();
|
||||
$program->openedVersion = $this->config->version;
|
||||
$program->acl = 'open';
|
||||
$program->days = $this->computeDaysDelta($program->begin, $program->end);
|
||||
$program->grade = 1;
|
||||
$program->vision = 'rnd';
|
||||
|
||||
$this->app->loadLang('program');
|
||||
$this->app->loadLang('project');
|
||||
$this->lang->project->name = $this->lang->program->name;
|
||||
|
||||
$this->dao->insert(TABLE_PROGRAM)->data($program)->exec();
|
||||
if(dao::isError()) return false;
|
||||
|
||||
$programID = $this->dao->lastInsertId();
|
||||
|
||||
$this->dao->update(TABLE_PROGRAM)->set('path')->eq(",{$programID},")->set('`order`')->eq($programID * 5)->where('id')->eq($programID)->exec();
|
||||
$this->loadModel('action')->create('program', $programID, 'openedbysystem');
|
||||
|
||||
return $this->loadModel('program')->getByID($programID);
|
||||
}
|
||||
|
||||
/**
|
||||
* Historical projects are upgraded by project.
|
||||
*
|
||||
* @param int $programID
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function upgradeInProjectMode($programID)
|
||||
{
|
||||
$this->loadModel('action');
|
||||
$now = helper::now();
|
||||
$account = isset($this->app->user->account) ? $this->app->user->account : '';
|
||||
|
||||
$noMergedSprints = $this->getNoMergedSprints();
|
||||
if(!$noMergedSprints) return true;
|
||||
|
||||
foreach($noMergedSprints as $sprint)
|
||||
{
|
||||
$project = new stdclass();
|
||||
$project->name = $sprint->name;
|
||||
$project->type = 'project';
|
||||
$project->model = 'scrum';
|
||||
$project->parent = $programID;
|
||||
$project->status = $sprint->status;
|
||||
$project->begin = $sprint->begin;
|
||||
$project->end = isset($sprint->end) ? $sprint->end : LONG_TIME;
|
||||
$project->days = $this->computeDaysDelta($project->begin, $project->end);
|
||||
$project->PM = $sprint->PM;
|
||||
$project->auth = 'extend';
|
||||
$project->openedBy = $account;
|
||||
$project->openedDate = $now;
|
||||
$project->openedVersion = $this->config->version;
|
||||
$project->lastEditedBy = $account;
|
||||
$project->lastEditedDate = $now;
|
||||
$project->grade = 2;
|
||||
$project->acl = $sprint->acl == 'open' ? 'open' : 'private';
|
||||
|
||||
$this->dao->insert(TABLE_PROJECT)->data($project)->check('name', 'unique', "type='project' AND parent=$programID AND deleted='0'")->exec();
|
||||
if(dao::isError()) return false;
|
||||
|
||||
$projectID = $this->dao->lastInsertId();
|
||||
|
||||
$this->action->create('project', $projectID, 'openedbysystem');
|
||||
if($project->status == 'closed') $this->action->create('project', $projectID, 'closedbysystem');
|
||||
|
||||
$project->id = $projectID;
|
||||
$this->createProjectDocLib($project);
|
||||
$this->processMergedData($programID, $projectID, '', array(), array($sprint->id));
|
||||
}
|
||||
|
||||
$this->fixProjectPath($programID);
|
||||
|
||||
if(dao::isError()) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Historical projects are upgraded by execution.
|
||||
*
|
||||
* @param int $programID
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function upgradeInExecutionMode($programID)
|
||||
{
|
||||
$this->loadModel('action');
|
||||
$now = helper::now();
|
||||
$account = isset($this->app->user->account) ? $this->app->user->account : '';
|
||||
|
||||
$noMergedSprints = $this->getNoMergedSprints();
|
||||
if(!$noMergedSprints) return true;
|
||||
|
||||
$projects = array();
|
||||
foreach($noMergedSprints as $sprint)
|
||||
{
|
||||
$year = date('Y', strtotime($sprint->openedDate));
|
||||
$projects[$year][$sprint->id] = $sprint;
|
||||
}
|
||||
|
||||
foreach($projects as $year => $sprints)
|
||||
{
|
||||
$project = new stdclass();
|
||||
$project->name = $year;
|
||||
$project->type = 'project';
|
||||
$project->model = 'scrum';
|
||||
$project->parent = $programID;
|
||||
$project->auth = 'extend';
|
||||
$project->begin = '';
|
||||
$project->end = '';
|
||||
$project->openedBy = $account;
|
||||
$project->openedDate = $now;
|
||||
$project->openedVersion = $this->config->version;
|
||||
$project->lastEditedBy = $account;
|
||||
$project->lastEditedDate = $now;
|
||||
$project->grade = 2;
|
||||
$project->acl = 'open';
|
||||
|
||||
$projectStatus = 'closed';
|
||||
foreach($sprints as $sprint)
|
||||
{
|
||||
if(!$project->begin || $sprint->begin < $project->begin) $project->begin = $sprint->begin;
|
||||
if(!$project->end || $sprint->end > $project->end) $project->end = $sprint->end;
|
||||
if($sprint->status != 'closed') $projectStatus = 'doing';
|
||||
}
|
||||
$project->status = $projectStatus;
|
||||
$project->days = $this->computeDaysDelta($project->begin, $project->end);
|
||||
|
||||
$this->dao->insert(TABLE_PROJECT)->data($project)->exec();
|
||||
if(dao::isError()) return false;
|
||||
|
||||
$projectID = $this->dao->lastInsertId();
|
||||
|
||||
$this->action->create('project', $projectID, 'openedbysystem');
|
||||
if($project->status == 'closed') $this->action->create('project', $projectID, 'closedbysystem');
|
||||
|
||||
$project->id = $projectID;
|
||||
$this->createProjectDocLib($project);
|
||||
$this->processMergedData($programID, $projectID, '', array(), array_keys($sprints));
|
||||
}
|
||||
|
||||
$this->fixProjectPath($programID);
|
||||
|
||||
if(dao::isError()) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get sprints has not been merged.
|
||||
*
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getNoMergedSprints()
|
||||
{
|
||||
$noMergedSprints = $this->dao->select('*')->from(TABLE_PROJECT)
|
||||
->where('project')->eq(0)
|
||||
->andWhere('vision')->eq('rnd')
|
||||
->andWhere('type')->eq('sprint')
|
||||
->andWhere('deleted')->eq(0)
|
||||
->fetchAll('id');
|
||||
|
||||
$projectProducts = $this->dao->select('*')->from(TABLE_PROJECTPRODUCT)->where('project')->in(array_keys($noMergedSprints))->fetchGroup('project', 'product');
|
||||
foreach($projectProducts as $sprintID => $products) unset($noMergedSprints[$sprintID]);
|
||||
|
||||
if(empty($noMergedSprints)) return false;
|
||||
return $noMergedSprints;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create doc lib for project.
|
||||
*
|
||||
* @param object $project
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function createProjectDocLib($project)
|
||||
{
|
||||
$this->app->loadLang('doc');
|
||||
|
||||
$lib = new stdclass();
|
||||
$lib->project = $project->id;
|
||||
$lib->name = $this->lang->doclib->main['project'];
|
||||
$lib->type = 'project';
|
||||
$lib->main = '1';
|
||||
$lib->acl = $project->acl != 'program' ? $project->acl : 'custom';
|
||||
$this->dao->insert(TABLE_DOCLIB)->data($lib)->exec();
|
||||
}
|
||||
|
||||
/**
|
||||
* Fix the project path under the program.
|
||||
*
|
||||
* @param int $programID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function fixProjectPath($programID)
|
||||
{
|
||||
$this->dao->update(TABLE_PROJECT)
|
||||
->set("path = CONCAT(',{$programID},', id, ',')")->set("`order` = `id` * 5")
|
||||
->where('type')->eq('project')
|
||||
->andWhere('parent')->eq($programID)
|
||||
->andWhere('grade')->eq('2')
|
||||
->exec();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,9 +25,9 @@
|
||||
<th class='w-100px' valign='top'><?php echo $lang->upgrade->mergeMode;?></th>
|
||||
<td>
|
||||
<?php foreach($lang->upgrade->mergeModes as $mode => $label):?>
|
||||
<div class="radio">
|
||||
<div class='radio'>
|
||||
<label>
|
||||
<input type="radio" name="mode" value="<?php echo $mode;?>" checked="checked">
|
||||
<input type='radio' name='projectType' value='<?php echo $mode;?>' <?php if($mode == 'project') echo "checked='checked'";?>>
|
||||
<?php echo $label;?>
|
||||
<?php $tipLang = 'merge' . ucfirst($mode) . 'Tip';?>
|
||||
<div class='tips text-gray'><?php echo $lang->upgrade->{$tipLang};?></div>
|
||||
|
||||
Reference in New Issue
Block a user