diff --git a/api/v1/entries/storychange.php b/api/v1/entries/storychange.php
index c5e1a52835..a4a87ba5d3 100644
--- a/api/v1/entries/storychange.php
+++ b/api/v1/entries/storychange.php
@@ -28,7 +28,7 @@ class storyChangeEntry extends entry
$this->batchSetPost($fields, $oldStory);
/* If reviewer is not post, set needNotReview. */
- if(empty($this->request('reviewer')))
+ if(!$this->request('reviewer'))
{
$this->setPost('reviewer', array());
$this->setPost('needNotReview', 1);
diff --git a/config/zentaopms.php b/config/zentaopms.php
index 170afc14b9..68b7f8b1b8 100644
--- a/config/zentaopms.php
+++ b/config/zentaopms.php
@@ -429,9 +429,11 @@ $config->maxPriValue = '256';
$config->importWhiteList = array('user', 'task', 'story', 'bug', 'testcase', 'feedback', 'ticket');
$config->featureGroup = new stdclass();
-$config->featureGroup->my = array('score');
-$config->featureGroup->product = array('roadmap', 'track', 'UR');
-$config->featureGroup->scrum = array();
-$config->featureGroup->waterfall = array();
-$config->featureGroup->assetlib = array();
-$config->featureGroup->other = array('devops', 'kanban');
+$config->featureGroup->my = array('score');
+$config->featureGroup->product = array('roadmap', 'track', 'UR');
+$config->featureGroup->scrum = array();
+$config->featureGroup->waterfall = array();
+$config->featureGroup->agileplus = array();
+$config->featureGroup->waterfallplus = array();
+$config->featureGroup->assetlib = array();
+$config->featureGroup->other = array('devops', 'kanban');
diff --git a/db/update18.1.sql b/db/update18.1.sql
index dea20bab4f..7a9b0d9d6a 100644
--- a/db/update18.1.sql
+++ b/db/update18.1.sql
@@ -8,3 +8,15 @@ REPLACE INTO `zt_lang` (`lang`, `module`, `section`, `key`, `value`, `system`, `
UPDATE `zt_project` AS parent INNER JOIN (select `id`,`parent`,`attribute` from `zt_project` where `parent` != 0 and `type` = 'stage') AS child ON parent.`id` = child.`parent` SET parent.`attribute`='mix' where parent.`grade`=1 and parent.`type`='stage' and parent.`attribute` != child.`attribute`;
REPLACE INTO `zt_grouppriv` (SELECT `group`,`module`,'batchChangeStatus' FROM `zt_grouppriv` WHERE `module` = 'execution' AND `method` = 'batchEdit');
+
+ALTER table `zt_stage` ADD `projectType` varchar(255) NOT NULL DEFAULT '' AFTER `type`;
+UPDATE `zt_stage` SET `projectType` = 'waterfall' WHERE `projectType` = '';
+
+REPLACE INTO `zt_stage` (`name`,`percent`,`type`, `projectType`, `createdBy`,`createdDate`,`editedBy`,`editedDate`,`deleted`) VALUES
+('需求','10','request','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('设计','10','design','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('开发','50','dev','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('测试','15','qa','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('发布','10','release','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('总结评审','5','review','waterfallplus','admin','2020-02-08 21:08:45','admin','2020-02-12 13:50:27','0');
+
diff --git a/db/zentao.sql b/db/zentao.sql
index 9d5ffb171a..b7c0f371e0 100755
--- a/db/zentao.sql
+++ b/db/zentao.sql
@@ -6391,13 +6391,19 @@ REPLACE INTO `zt_lang` (`lang`, `module`, `section`, `key`, `value`, `system`) V
('all','stage','typeList','review','总结评审','1'),
('all','stage','typeList','other','其他','1');
-REPLACE INTO `zt_stage` (`name`,`percent`,`type`,`createdBy`,`createdDate`,`editedBy`,`editedDate`,`deleted`) VALUES
-('需求','10','request','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
-('设计','10','design','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
-('开发','50','dev','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
-('测试','15','qa','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
-('发布','10','release','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
-('总结评审','5','review','admin','2020-02-08 21:08:45','admin','2020-02-12 13:50:27','0');
+REPLACE INTO `zt_stage` (`name`,`percent`,`type`,`projectType`,`createdBy`,`createdDate`,`editedBy`,`editedDate`,`deleted`) VALUES
+('需求','10','request','waterfall','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('设计','10','design','waterfall','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('开发','50','dev','waterfall','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('测试','15','qa','waterfall','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('发布','10','release','waterfall','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('总结评审','5','review','waterfall','admin','2020-02-08 21:08:45','admin','2020-02-12 13:50:27','0');
+('需求','10','request','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('设计','10','design','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('开发','50','dev','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('测试','15','qa','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('发布','10','release','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
+('总结评审','5','review','waterfallplus','admin','2020-02-08 21:08:45','admin','2020-02-12 13:50:27','0');
INSERT INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system', 'custom', '', 'hourPoint', '0');
INSERT INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system', 'common', '', 'CRProduct', '1');
diff --git a/framework/helper.class.php b/framework/helper.class.php
index 7134dde9e6..6435c7b69e 100644
--- a/framework/helper.class.php
+++ b/framework/helper.class.php
@@ -96,7 +96,7 @@ class helper extends baseHelper
}
else
{
- if($feature == 'scrum' or $feature == 'waterfall') return strpos(",$config->disabledFeatures,", ",{$feature},") === false;
+ if(in_array($feature, array('scrum', 'waterfall', 'agileplus', 'waterfallplus'))) return strpos(",$config->disabledFeatures,", ",{$feature},") === false;
$hasFeature = false;
$canConfigFeature = false;
@@ -107,7 +107,7 @@ class helper extends baseHelper
if($feature == $group or $feature == $module)
{
$canConfigFeature = true;
- if($group == 'scrum' or $group == 'waterfall')
+ if(in_array($group, array('scrum', 'waterfall', 'agileplus', 'waterfallplus')))
{
if(helper::hasFeature("{$group}") and helper::hasFeature("{$group}_{$module}")) $hasFeature = true;
}
diff --git a/module/admin/lang/de.php b/module/admin/lang/de.php
index 115ee795ec..6ba6dae130 100755
--- a/module/admin/lang/de.php
+++ b/module/admin/lang/de.php
@@ -86,9 +86,11 @@ $lang->admin->setModule->opened = 'Opened';
$lang->admin->setModule->closed = 'Closed';
$lang->admin->setModule->my = 'My';
-$lang->admin->setModule->product = 'Product';
-$lang->admin->setModule->scrum = 'Scrum Project';
-$lang->admin->setModule->waterfall = 'Waterfall Project';
+$lang->admin->setModule->product = $lang->productCommon;
+$lang->admin->setModule->scrum = 'Scrum ' . $lang->projectCommon;
+$lang->admin->setModule->waterfall = 'Waterfall ' . $lang->projectCommon;
+$lang->admin->setModule->agileplus = 'Agile + ' . $lang->projectCommon;
+$lang->admin->setModule->waterfallplus = 'Waterfall + ' . $lang->projectCommon;
$lang->admin->setModule->assetlib = 'Assetlib';
$lang->admin->setModule->other = 'Other';
diff --git a/module/admin/lang/en.php b/module/admin/lang/en.php
index f377b35bad..aba1645159 100755
--- a/module/admin/lang/en.php
+++ b/module/admin/lang/en.php
@@ -86,9 +86,11 @@ $lang->admin->setModule->opened = 'Opened';
$lang->admin->setModule->closed = 'Closed';
$lang->admin->setModule->my = 'My';
-$lang->admin->setModule->product = 'Product';
-$lang->admin->setModule->scrum = 'Scrum Project';
-$lang->admin->setModule->waterfall = 'Waterfall Project';
+$lang->admin->setModule->product = $lang->productCommon;
+$lang->admin->setModule->scrum = 'Scrum ' . $lang->projectCommon;
+$lang->admin->setModule->waterfall = 'Waterfall ' . $lang->projectCommon;
+$lang->admin->setModule->agileplus = 'Agile + ' . $lang->projectCommon;
+$lang->admin->setModule->waterfallplus = 'Waterfall + ' . $lang->projectCommon;
$lang->admin->setModule->assetlib = 'Assetlib';
$lang->admin->setModule->other = 'Other';
diff --git a/module/admin/lang/fr.php b/module/admin/lang/fr.php
index 416bdc6965..71acb72380 100755
--- a/module/admin/lang/fr.php
+++ b/module/admin/lang/fr.php
@@ -86,9 +86,11 @@ $lang->admin->setModule->opened = 'Opened';
$lang->admin->setModule->closed = 'Closed';
$lang->admin->setModule->my = 'My';
-$lang->admin->setModule->product = 'Product';
-$lang->admin->setModule->scrum = 'Scrum Project';
-$lang->admin->setModule->waterfall = 'Waterfall Project';
+$lang->admin->setModule->product = $lang->productCommon;
+$lang->admin->setModule->scrum = 'Scrum ' . $lang->projectCommon;
+$lang->admin->setModule->waterfall = 'Waterfall ' . $lang->projectCommon;
+$lang->admin->setModule->agileplus = 'Agile + ' . $lang->projectCommon;
+$lang->admin->setModule->waterfallplus = 'Waterfall + ' . $lang->projectCommon;
$lang->admin->setModule->assetlib = 'Assetlib';
$lang->admin->setModule->other = 'Other';
diff --git a/module/admin/lang/menu.php b/module/admin/lang/menu.php
index 52175bb54a..80454b8b46 100644
--- a/module/admin/lang/menu.php
+++ b/module/admin/lang/menu.php
@@ -75,26 +75,34 @@ $lang->admin->menuList->switch['subMenu']['setmodule'] = array('link' => "{$lang
$lang->admin->menuList->switch['menuOrder']['5'] = 'setmodule';
-$lang->admin->menuList->model['subMenu']['common'] = array('link' => "{$lang->globalSetting}|custom|required|module=project", 'subModule' => 'custom,subject,holiday');
-$lang->admin->menuList->model['subMenu']['scrum'] = array('link' => "{$lang->scrumModel}|auditcl|scrumbrowse|", 'subModule' => 'auditcl');
-$lang->admin->menuList->model['subMenu']['waterfall'] = array('link' => "{$lang->waterfallModel}|stage|settype|", 'subModule' => 'stage');
+$lang->admin->menuList->model['subMenu']['common'] = array('link' => "{$lang->globalSetting}|custom|required|module=project", 'subModule' => 'custom,subject,holiday,stage', 'exclude' => 'stage-browse,stage-plusbrowse,stage-create,stage-edit,stage-batchcreate');
+$lang->admin->menuList->model['subMenu']['scrum'] = array('link' => "{$lang->scrumModel}|auditcl|scrumbrowse|", 'subModule' => 'auditcl');
+$lang->admin->menuList->model['subMenu']['waterfall'] = array('link' => "{$lang->waterfallModel}|stage|browse|", 'subModule' => 'stage', 'exclude' => 'stage-settype,stage-plusbrowse');
+$lang->admin->menuList->model['subMenu']['agileplus'] = array('link' => "{$lang->agilePlusModel}|auditcl|agileplusbrowse|", 'subModule' => 'auditcl');
+$lang->admin->menuList->model['subMenu']['waterfallplus'] = array('link' => "{$lang->waterfallPlusModel}|stage|plusbrowse|", 'subModule' => 'stage', 'exclude' => 'stage-settype,stage-browse');
$lang->admin->menuList->model['menuOrder']['5'] = 'common';
$lang->admin->menuList->model['menuOrder']['10'] = 'scrum';
$lang->admin->menuList->model['menuOrder']['15'] = 'waterfall';
+$lang->admin->menuList->model['menuOrder']['20'] = 'agileplus';
+$lang->admin->menuList->model['menuOrder']['25'] = 'waterfallplus';
-$lang->admin->menuList->model['tabMenu']['common']['project'] = array('link' => "{$lang->project->common}|custom|required|module=project", 'alias' => 'set', 'exclude' => 'custom', 'links' => array('custom|set|'));
-$lang->admin->menuList->model['tabMenu']['common']['build'] = array('link' => "{$lang->build->common}|custom|required|module=build", 'alias' => 'set', 'exclude' => 'custom');
-$lang->admin->menuList->model['tabMenu']['common']['flow'] = array('link' => "{$lang->custom->flow}|custom|flow|", 'divider' => true);
-$lang->admin->menuList->model['tabMenu']['common']['code'] = array('link' => "{$lang->code}|custom|code|");
-$lang->admin->menuList->model['tabMenu']['common']['hours'] = array('link' => "{$lang->workingHour}|custom|hours|", 'subModule' => 'holiday', 'links' => array('holiday|browse|'));
-$lang->admin->menuList->model['tabMenu']['waterfall']['stage'] = array('link' => "{$lang->stage->common}|stage|settype|", 'subModule' => 'stage', 'links' => array('stage|browse|'));
-$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['5'] = 'project';
-$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['10'] = 'build';
-$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['35'] = 'flow';
-$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['40'] = 'code';
-$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['45'] = 'hours';
-$lang->admin->menuList->model['tabMenu']['menuOrder']['waterfall']['5'] = 'stage';
+$lang->admin->menuList->model['tabMenu']['common']['project'] = array('link' => "{$lang->project->common}|custom|required|module=project", 'alias' => 'set', 'exclude' => 'custom', 'links' => array('custom|set|'));
+$lang->admin->menuList->model['tabMenu']['common']['stage'] = array('link' => "{$lang->stage->common}|stage|settype|", 'subModule' => 'stage', 'links' => array('stage|browse|'));
+$lang->admin->menuList->model['tabMenu']['common']['build'] = array('link' => "{$lang->build->common}|custom|required|module=build", 'alias' => 'set', 'exclude' => 'custom');
+$lang->admin->menuList->model['tabMenu']['common']['flow'] = array('link' => "{$lang->custom->flow}|custom|flow|", 'divider' => true);
+$lang->admin->menuList->model['tabMenu']['common']['code'] = array('link' => "{$lang->code}|custom|code|");
+$lang->admin->menuList->model['tabMenu']['common']['hours'] = array('link' => "{$lang->workingHour}|custom|hours|", 'subModule' => 'holiday', 'links' => array('holiday|browse|'));
+$lang->admin->menuList->model['tabMenu']['waterfall']['stage'] = array('link' => "{$lang->stage->common}|stage|browse|", 'subModule' => 'stage', 'exclude' => 'stage-plusbrowse');
+$lang->admin->menuList->model['tabMenu']['waterfallplus']['stage'] = array('link' => "{$lang->stage->common}|stage|plusbrowse|", 'subModule' => 'stage', 'exclude' => 'stage-browse');
+$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['5'] = 'project';
+$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['7'] = 'stage';
+$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['10'] = 'build';
+$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['35'] = 'flow';
+$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['40'] = 'code';
+$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['45'] = 'hours';
+$lang->admin->menuList->model['tabMenu']['menuOrder']['waterfall']['5'] = 'stage';
+$lang->admin->menuList->model['tabMenu']['menuOrder']['waterfallplus']['5'] = 'stage';
$lang->admin->menuList->feature['subMenu']['my'] = array('link' => "{$lang->my->common}|custom|set|module=todo&field=priList", 'exclude' => 'set,required');
$lang->admin->menuList->feature['subMenu']['product'] = array('link' => "{$lang->productCommon}|custom|required|module=product", 'exclude' => 'set,required', 'alias' => 'browsestoryconcept,product');
@@ -169,15 +177,25 @@ $lang->admin->menuList->dev['menuOrder']['15'] = 'langItem';
$lang->admin->menuList->dev['menuOrder']['20'] = 'editor';
$lang->admin->menuList->dev['menuOrder']['25'] = 'entry';
-if($config->edition != 'max') unset($lang->admin->menuList->model['subMenu']['scrum'], $lang->admin->menuList->model['menuOrder']['10'], $lang->admin->menuList->template);
+if($config->edition != 'max')
+{
+ unset($lang->admin->menuList->model['subMenu']['scrum']);
+ unset($lang->admin->menuList->model['subMenu']['agileplus']);
+ unset($lang->admin->menuList->model['menuOrder']['10']);
+ unset($lang->admin->menuList->model['menuOrder']['20']);
+ unset($lang->admin->menuList->template);
+}
if(!helper::hasFeature('waterfall'))
{
unset($lang->admin->menuList->model['subMenu']['waterfall']);
+ unset($lang->admin->menuList->model['subMenu']['waterfallplus']);
unset($lang->admin->menuList->model['menuOrder']['15']);
+ unset($lang->admin->menuList->model['menuOrder']['25']);
}
-if($config->edition == 'max' and !helper::hasFeature('scrum_auditplan'))
+if($config->edition == 'max')
{
- if(!helper::hasFeature('scrum_process')) unset($lang->admin->menuList->model['subMenu']['scrum'], $lang->admin->menuList->model['menuOrder']['10']);
+ if(!helper::hasFeature('scrum_auditplan') and !helper::hasFeature('scrum_process')) unset($lang->admin->menuList->model['subMenu']['scrum'], $lang->admin->menuList->model['menuOrder']['10']);
+ if(!helper::hasFeature('agileplus_auditplan') and !helper::hasFeature('agileplus_process')) unset($lang->admin->menuList->model['subMenu']['agileplus'], $lang->admin->menuList->model['menuOrder']['20']);
}
if($config->vision == 'lite')
@@ -191,8 +209,12 @@ if($config->vision == 'lite')
unset($lang->admin->menuList->model['subMenu']['scrum']);
unset($lang->admin->menuList->model['subMenu']['waterfall']);
+ unset($lang->admin->menuList->model['subMenu']['agileplus']);
+ unset($lang->admin->menuList->model['subMenu']['waterfallplus']);
unset($lang->admin->menuList->model['menuOrder']['10']);
unset($lang->admin->menuList->model['menuOrder']['15']);
+ unset($lang->admin->menuList->model['menuOrder']['20']);
+ unset($lang->admin->menuList->model['menuOrder']['25']);
unset($lang->admin->menuList->feature['subMenu']['product']);
unset($lang->admin->menuList->feature['subMenu']['execution']);
diff --git a/module/admin/lang/zh-cn.php b/module/admin/lang/zh-cn.php
index 926dede079..ab9f757940 100755
--- a/module/admin/lang/zh-cn.php
+++ b/module/admin/lang/zh-cn.php
@@ -86,9 +86,11 @@ $lang->admin->setModule->opened = '已开启';
$lang->admin->setModule->closed = '已关闭';
$lang->admin->setModule->my = '地盘';
-$lang->admin->setModule->product = '产品';
-$lang->admin->setModule->scrum = '敏捷项目';
-$lang->admin->setModule->waterfall = '瀑布项目';
+$lang->admin->setModule->product = $lang->productCommon;
+$lang->admin->setModule->scrum = '敏捷' . $lang->projectCommon;
+$lang->admin->setModule->waterfall = '瀑布' . $lang->projectCommon;
+$lang->admin->setModule->agileplus = '融合敏捷' . $lang->projectCommon;
+$lang->admin->setModule->waterfallplus = '融合瀑布' . $lang->projectCommon;
$lang->admin->setModule->assetlib = '资产库';
$lang->admin->setModule->other = '通用功能';
diff --git a/module/backup/model.php b/module/backup/model.php
index d54d98419f..bbc9ff95ac 100644
--- a/module/backup/model.php
+++ b/module/backup/model.php
@@ -299,7 +299,7 @@ class backupModel extends model
$summaryFile = dirname($backup) . DS . 'summary';
if(!file_exists($summaryFile)) return array();
- $summary = json_decode(file_get_contents(dirname($backup) . DS . 'summary'), 'true');
+ $summary = json_decode(file_get_contents(dirname($backup) . DS . 'summary'), true);
return isset($summary[basename($backup)]) ? $summary[basename($backup)] : array();
}
diff --git a/module/block/control.php b/module/block/control.php
index b65269bc6c..78edb264b5 100755
--- a/module/block/control.php
+++ b/module/block/control.php
@@ -78,7 +78,25 @@ class block extends control
elseif(isset($this->lang->block->moduleList[$module]))
{
$this->get->set('mode', 'getblocklist');
- if($module == 'project') $this->get->set('dashboard', 'project');
+ if($module == 'project')
+ {
+ $this->get->set('dashboard', 'project');
+
+ if($this->config->edition == 'max' and $this->app->tab == 'project')
+ {
+ $project = $this->loadModel('project')->getByID($this->session->project);
+ if(isset($project->model) and !helper::hasFeature("{$project->model}_issue"))
+ {
+ unset($this->lang->block->modules['scrum']['index']->availableBlocks->scrumissue);
+ unset($this->lang->block->modules['waterfall']['index']->availableBlocks->waterfallissue);
+ }
+ if(isset($project->model) and !helper::hasFeature("{$project->model}_risk"))
+ {
+ unset($this->lang->block->modules['scrum']['index']->availableBlocks->scrumrisk);
+ unset($this->lang->block->modules['waterfall']['index']->availableBlocks->waterfallrisk);
+ }
+ }
+ }
$this->view->blocks = $this->fetch('block', 'main', "module=$module&id=$id");
$this->view->module = $module;
}
@@ -253,10 +271,20 @@ class block extends control
$shortBlocks = $longBlocks = array();
foreach($blocks as $key => $block)
{
- if($block->block == 'waterfallrisk' and !helper::hasFeature('waterfall_risk')) continue;
- if($block->block == 'waterfallissue' and !helper::hasFeature('waterfall_issue')) continue;
- if($block->block == 'scrumrisk' and !helper::hasFeature('scrum_risk')) continue;
- if($block->block == 'scrumissue' and !helper::hasFeature('scrum_issue')) continue;
+ if(in_array($block->block, array('waterfallrisk', 'waterfallissue')))
+ {
+ $model = isset($project->model) ? $project->model : 'waterfall';
+ if($block->block == 'waterfallrisk' and !helper::hasFeature("{$model}_risk")) continue;
+ if($block->block == 'waterfallissue' and !helper::hasFeature("{$model}_issue")) continue;
+ }
+
+ if(in_array($block->block, array('scrumrisk', 'scrumissue')))
+ {
+ $model = isset($project->model) ? $project->model : 'scrum';
+ if($block->block == 'scrumrisk' and !helper::hasFeature("{$model}_risk")) continue;
+ if($block->block == 'scrumissue' and !helper::hasFeature("{$model}_issue")) continue;
+ }
+
if(!empty($block->source) and $block->source != 'todo' and !empty($acls['views']) and !isset($acls['views'][$block->source]))
{
unset($blocks[$key]);
diff --git a/module/block/view/caseblock.html.php b/module/block/view/caseblock.html.php
index dc6c00cc38..02882a2306 100644
--- a/module/block/view/caseblock.html.php
+++ b/module/block/view/caseblock.html.php
@@ -1,4 +1,3 @@
-
runInfo = "
Z PUBLIC LICENSE 1.2 .
Without authorization, I should not remove, hide or cover any logos/links of ZenTao.";
$lang->designedByAIUX = "
AIUX";
-$lang->reset = 'Zurücksetzen';
-$lang->cancel = 'Abbrechen';
-$lang->refresh = 'Aktualisieren';
-$lang->refreshIcon = "
";
-$lang->create = 'Create';
-$lang->edit = 'Bearbeiten';
-$lang->delete = 'Löschen';
-$lang->activate = 'Activate';
-$lang->close = 'Schließen';
-$lang->unlink = 'Entfernen';
-$lang->import = 'Importieren';
-$lang->export = 'Exportieren';
-$lang->setFileName = 'Dateiame';
-$lang->submitting = 'Speichern...';
-$lang->save = 'Speichern';
-$lang->confirm = 'Bestätigen';
-$lang->preview = 'Ansehen';
-$lang->goback = 'Zurück';
-$lang->goPC = 'PC';
-$lang->more = 'Mehr';
-$lang->moreLink = 'MORE';
-$lang->day = 'Tag';
-$lang->customConfig = 'Custom Config';
-$lang->public = 'Öffentlich';
-$lang->trunk = 'Trunk';
-$lang->sort = 'Sortieren';
-$lang->required = 'Pflicht';
-$lang->noData = 'Kein Datensatz';
-$lang->fullscreen = 'Fullscreen';
-$lang->retrack = 'Retrack';
-$lang->whitelist = 'Weiße Liste';
-$lang->globalSetting = 'Common';
-$lang->waterfallModel = 'Waterfall';
-$lang->scrumModel = 'Scrum';
-$lang->agilePlusModel = 'Agile Plus';
-$lang->all = 'All';
-$lang->viewDetails = 'View Details';
+$lang->reset = 'Zurücksetzen';
+$lang->cancel = 'Abbrechen';
+$lang->refresh = 'Aktualisieren';
+$lang->refreshIcon = "
";
+$lang->create = 'Create';
+$lang->edit = 'Bearbeiten';
+$lang->delete = 'Löschen';
+$lang->activate = 'Activate';
+$lang->close = 'Schließen';
+$lang->unlink = 'Entfernen';
+$lang->import = 'Importieren';
+$lang->export = 'Exportieren';
+$lang->setFileName = 'Dateiame';
+$lang->submitting = 'Speichern...';
+$lang->save = 'Speichern';
+$lang->confirm = 'Bestätigen';
+$lang->preview = 'Ansehen';
+$lang->goback = 'Zurück';
+$lang->goPC = 'PC';
+$lang->more = 'Mehr';
+$lang->moreLink = 'MORE';
+$lang->day = 'Tag';
+$lang->customConfig = 'Custom Config';
+$lang->public = 'Öffentlich';
+$lang->trunk = 'Trunk';
+$lang->sort = 'Sortieren';
+$lang->required = 'Pflicht';
+$lang->noData = 'Kein Datensatz';
+$lang->fullscreen = 'Fullscreen';
+$lang->retrack = 'Retrack';
+$lang->whitelist = 'Weiße Liste';
+$lang->globalSetting = 'Common';
+$lang->waterfallModel = 'Waterfall';
+$lang->scrumModel = 'Scrum';
+$lang->agilePlusModel = 'Agile Plus';
+$lang->waterfallPlusModel = 'Waterfall Plus';
+$lang->all = 'All';
+$lang->viewDetails = 'View Details';
$lang->actions = 'Aktionen';
$lang->restore = 'Wiederherstellen';
@@ -188,6 +189,7 @@ $lang->team->common = 'Team';
$lang->user->common = 'User';
$lang->custom->common = 'Custom';
$lang->custom->mode = 'Mode';
+$lang->custom->flow = 'Concept';
$lang->extension->common = 'Extension';
$lang->company->common = 'Company';
$lang->dept->common = 'Dept';
diff --git a/module/common/lang/en.php b/module/common/lang/en.php
index cfe4c3849b..932179814c 100644
--- a/module/common/lang/en.php
+++ b/module/common/lang/en.php
@@ -49,43 +49,44 @@ $lang->runInfo = "
Without authorization, I should not remove, hide or cover any logos/links of ZenTao.";
$lang->designedByAIUX = "
AIUX";
-$lang->reset = 'Reset';
-$lang->cancel = 'Cancel';
-$lang->refresh = 'Refresh';
-$lang->refreshIcon = "
";
-$lang->create = 'Create';
-$lang->edit = 'Edit';
-$lang->delete = 'Delete';
-$lang->activate = 'Activate';
-$lang->close = 'Close';
-$lang->unlink = 'Unlink';
-$lang->import = 'Import';
-$lang->export = 'Export';
-$lang->setFileName = 'File Name';
-$lang->submitting = 'Saving...';
-$lang->save = 'Save';
-$lang->confirm = 'Confirm';
-$lang->preview = 'View';
-$lang->goback = 'Back';
-$lang->goPC = 'PC';
-$lang->more = 'More';
-$lang->moreLink = 'MORE';
-$lang->day = ' Day';
-$lang->customConfig = 'Custom Config';
-$lang->public = 'Public';
-$lang->trunk = 'Trunk';
-$lang->sort = 'Order';
-$lang->required = 'Required';
-$lang->noData = 'No data.';
-$lang->fullscreen = 'Fullscreen';
-$lang->retrack = 'Retrack';
-$lang->whitelist = 'Access whitelist';
-$lang->globalSetting = 'Common';
-$lang->waterfallModel = 'Waterfall';
-$lang->scrumModel = 'Scrum';
-$lang->agilePlusModel = 'Agile Plus';
-$lang->all = 'All';
-$lang->viewDetails = 'View Details';
+$lang->reset = 'Reset';
+$lang->cancel = 'Cancel';
+$lang->refresh = 'Refresh';
+$lang->refreshIcon = "
";
+$lang->create = 'Create';
+$lang->edit = 'Edit';
+$lang->delete = 'Delete';
+$lang->activate = 'Activate';
+$lang->close = 'Close';
+$lang->unlink = 'Unlink';
+$lang->import = 'Import';
+$lang->export = 'Export';
+$lang->setFileName = 'File Name';
+$lang->submitting = 'Saving...';
+$lang->save = 'Save';
+$lang->confirm = 'Confirm';
+$lang->preview = 'View';
+$lang->goback = 'Back';
+$lang->goPC = 'PC';
+$lang->more = 'More';
+$lang->moreLink = 'MORE';
+$lang->day = ' Day';
+$lang->customConfig = 'Custom Config';
+$lang->public = 'Public';
+$lang->trunk = 'Trunk';
+$lang->sort = 'Order';
+$lang->required = 'Required';
+$lang->noData = 'No data.';
+$lang->fullscreen = 'Fullscreen';
+$lang->retrack = 'Retrack';
+$lang->whitelist = 'Access whitelist';
+$lang->globalSetting = 'Common';
+$lang->waterfallModel = 'Waterfall';
+$lang->scrumModel = 'Scrum';
+$lang->agilePlusModel = 'Agile Plus';
+$lang->waterfallPlusModel = 'Waterfall Plus';
+$lang->all = 'All';
+$lang->viewDetails = 'View Details';
$lang->actions = 'Action';
$lang->restore = 'Reset';
@@ -188,6 +189,7 @@ $lang->team->common = 'Team';
$lang->user->common = 'User';
$lang->custom->common = 'Custom';
$lang->custom->mode = 'Mode';
+$lang->custom->flow = 'Concept';
$lang->extension->common = 'Extension';
$lang->company->common = 'Company';
$lang->dept->common = 'Dept';
diff --git a/module/common/lang/fr.php b/module/common/lang/fr.php
index 2af3f87108..1ffdc2955d 100644
--- a/module/common/lang/fr.php
+++ b/module/common/lang/fr.php
@@ -49,43 +49,44 @@ $lang->runInfo = "
Z PUBLIC LICENSE 1.2 .
Sans autorisation, je ne dois pas supprimer, masquer ou couvrir les logos / liens de ZenTao.";
$lang->designedByAIUX = "
AIUX";
-$lang->reset = 'Réinitialiser';
-$lang->cancel = 'Annuler';
-$lang->refresh = 'Rafraichir';
-$lang->refreshIcon = "
";
-$lang->create = 'Create';
-$lang->edit = 'Editer';
-$lang->delete = 'Supprimer';
-$lang->activate = 'Activate';
-$lang->close = 'Fermer';
-$lang->unlink = 'Dissocier';
-$lang->import = 'Importer';
-$lang->export = 'Exporter';
-$lang->setFileName = 'Nom du Fichier';
-$lang->submitting = 'Enregistrement...';
-$lang->save = 'Sauvegarde';
-$lang->confirm = 'Confirmer';
-$lang->preview = 'Consulter';
-$lang->goback = 'Retour';
-$lang->goPC = 'PC';
-$lang->more = 'Plus';
-$lang->moreLink = 'MORE';
-$lang->day = 'Jour';
-$lang->customConfig = 'Personnalisation';
-$lang->public = 'Public';
-$lang->trunk = 'Tronc';
-$lang->sort = 'Ordre';
-$lang->required = 'Obligatoire';
-$lang->noData = 'No data.';
-$lang->fullscreen = 'Plein Ecran';
-$lang->retrack = 'Réduire';
-$lang->whitelist = 'Liste blanche';
-$lang->globalSetting = 'Common';
-$lang->waterfallModel = 'Waterfall';
-$lang->scrumModel = 'Scrum';
-$lang->agilePlusModel = 'Agile Plus';
-$lang->all = 'All';
-$lang->viewDetails = 'View Details';
+$lang->reset = 'Réinitialiser';
+$lang->cancel = 'Annuler';
+$lang->refresh = 'Rafraichir';
+$lang->refreshIcon = "
";
+$lang->create = 'Create';
+$lang->edit = 'Editer';
+$lang->delete = 'Supprimer';
+$lang->activate = 'Activate';
+$lang->close = 'Fermer';
+$lang->unlink = 'Dissocier';
+$lang->import = 'Importer';
+$lang->export = 'Exporter';
+$lang->setFileName = 'Nom du Fichier';
+$lang->submitting = 'Enregistrement...';
+$lang->save = 'Sauvegarde';
+$lang->confirm = 'Confirmer';
+$lang->preview = 'Consulter';
+$lang->goback = 'Retour';
+$lang->goPC = 'PC';
+$lang->more = 'Plus';
+$lang->moreLink = 'MORE';
+$lang->day = 'Jour';
+$lang->customConfig = 'Personnalisation';
+$lang->public = 'Public';
+$lang->trunk = 'Tronc';
+$lang->sort = 'Ordre';
+$lang->required = 'Obligatoire';
+$lang->noData = 'No data.';
+$lang->fullscreen = 'Plein Ecran';
+$lang->retrack = 'Réduire';
+$lang->whitelist = 'Liste blanche';
+$lang->globalSetting = 'Common';
+$lang->waterfallModel = 'Waterfall';
+$lang->scrumModel = 'Scrum';
+$lang->agilePlusModel = 'Agile Plus';
+$lang->waterfallPlusModel = 'Waterfall Plus';
+$lang->all = 'All';
+$lang->viewDetails = 'View Details';
$lang->actions = 'Action';
$lang->restore = 'Réinitialiser';
@@ -188,6 +189,7 @@ $lang->team->common = 'Team';
$lang->user->common = 'User';
$lang->custom->common = 'Custom';
$lang->custom->mode = 'Mode';
+$lang->custom->flow = 'Concept';
$lang->extension->common = 'Extension';
$lang->company->common = 'Company';
$lang->dept->common = 'Dept';
diff --git a/module/common/lang/zh-cn.php b/module/common/lang/zh-cn.php
index 410da8fe83..eaa5946aaa 100644
--- a/module/common/lang/zh-cn.php
+++ b/module/common/lang/zh-cn.php
@@ -49,43 +49,44 @@ $lang->runInfo = "
未经许可,不得去除、隐藏或遮掩禅道软件的任何标志及链接。";
$lang->designedByAIUX = "
艾体验设计";
-$lang->reset = '重填';
-$lang->cancel = '取消';
-$lang->refresh = '刷新';
-$lang->refreshIcon = "
";
-$lang->create = '新建';
-$lang->edit = '编辑';
-$lang->delete = '删除';
-$lang->activate = '激活';
-$lang->close = '关闭';
-$lang->unlink = '移除';
-$lang->import = '导入';
-$lang->export = '导出';
-$lang->setFileName = '文件名:';
-$lang->submitting = '稍候...';
-$lang->save = '保存';
-$lang->confirm = '确认';
-$lang->preview = '查看';
-$lang->goback = '返回';
-$lang->goPC = 'PC版';
-$lang->more = '更多';
-$lang->moreLink = 'More';
-$lang->day = '天';
-$lang->customConfig = '自定义';
-$lang->public = '公共';
-$lang->trunk = '主干';
-$lang->sort = '排序';
-$lang->required = '必填';
-$lang->noData = '暂无';
-$lang->fullscreen = '全屏';
-$lang->retrack = '收起';
-$lang->whitelist = '访问白名单';
-$lang->globalSetting = '通用';
-$lang->waterfallModel = '瀑布模型';
-$lang->scrumModel = '敏捷模型';
-$lang->agilePlusModel = '融合敏捷模型';
-$lang->all = '所有';
-$lang->viewDetails = '查看详情';
+$lang->reset = '重填';
+$lang->cancel = '取消';
+$lang->refresh = '刷新';
+$lang->refreshIcon = "
";
+$lang->create = '新建';
+$lang->edit = '编辑';
+$lang->delete = '删除';
+$lang->activate = '激活';
+$lang->close = '关闭';
+$lang->unlink = '移除';
+$lang->import = '导入';
+$lang->export = '导出';
+$lang->setFileName = '文件名:';
+$lang->submitting = '稍候...';
+$lang->save = '保存';
+$lang->confirm = '确认';
+$lang->preview = '查看';
+$lang->goback = '返回';
+$lang->goPC = 'PC版';
+$lang->more = '更多';
+$lang->moreLink = 'More';
+$lang->day = '天';
+$lang->customConfig = '自定义';
+$lang->public = '公共';
+$lang->trunk = '主干';
+$lang->sort = '排序';
+$lang->required = '必填';
+$lang->noData = '暂无';
+$lang->fullscreen = '全屏';
+$lang->retrack = '收起';
+$lang->whitelist = '访问白名单';
+$lang->globalSetting = '通用';
+$lang->waterfallModel = '瀑布模型';
+$lang->scrumModel = '敏捷模型';
+$lang->agilePlusModel = '融合敏捷模型';
+$lang->waterfallPlusModel = '融合瀑布模型';
+$lang->all = '所有';
+$lang->viewDetails = '查看详情';
$lang->actions = '操作';
$lang->restore = '恢复默认';
@@ -188,6 +189,7 @@ $lang->team->common = '团队';
$lang->user->common = '用户';
$lang->custom->common = '自定义';
$lang->custom->mode = '模式';
+$lang->custom->flow = '流程设置';
$lang->extension->common = '插件';
$lang->company->common = '公司';
$lang->dept->common = '部门';
diff --git a/module/convert/model.php b/module/convert/model.php
index e6c2e3ce9f..02843425aa 100644
--- a/module/convert/model.php
+++ b/module/convert/model.php
@@ -46,7 +46,7 @@ class convertModel extends model
public function dbExists($dbName = '')
{
$statement = $this->dbh->prepare('SHOW DATABASES like ?');
- $statement->execute([$dbName]);
+ $statement->execute(array($dbName));
return $statement->fetch();
}
diff --git a/module/custom/config.php b/module/custom/config.php
index d13809c919..dca615e25c 100644
--- a/module/custom/config.php
+++ b/module/custom/config.php
@@ -22,8 +22,8 @@ $config->custom->requiredModules[35] = 'execution';
$config->custom->requiredModules[40] = 'task';
$config->custom->requiredModules[45] = 'build';
-$config->custom->allFeatures = array('program', 'productRR', 'productUR', 'productLine', 'projectScrum', 'projectWaterfall', 'projectKanban', 'execution', 'qa', 'devops', 'kanban', 'doc', 'report', 'system', 'admin', 'vision');
-$config->custom->dataFeatures = array('productUR', 'waterfall');
+$config->custom->allFeatures = array('program', 'productRR', 'productUR', 'productLine', 'projectScrum', 'projectWaterfall', 'projectKanban', 'projectAgileplus', 'projectWaterfallplus', 'execution', 'qa', 'devops', 'kanban', 'doc', 'report', 'system', 'admin', 'vision');
+$config->custom->dataFeatures = array('productUR', 'waterfall', 'waterfallplus');
$config->custom->scrumFeatures = array();
$config->custom->requiredModules[50] = 'bug';
diff --git a/module/custom/lang/de.php b/module/custom/lang/de.php
index a60abfa439..b3140f2c89 100644
--- a/module/custom/lang/de.php
+++ b/module/custom/lang/de.php
@@ -8,7 +8,6 @@ $lang->custom->set = 'Customize';
$lang->custom->restore = 'Reset to Default';
$lang->custom->key = 'Key';
$lang->custom->value = 'Value';
-$lang->custom->flow = 'Concept';
$lang->custom->working = 'WorkStyle';
$lang->custom->select = 'Select Concept';
$lang->custom->branch = 'Multi Branch';
@@ -252,31 +251,34 @@ $lang->custom->modeList['ALM'] = 'ALM Mode';
$lang->custom->modeIntroductionList['light'] = 'Provides the core function of project management, suitable for small R&D teams';
$lang->custom->modeIntroductionList['ALM'] = 'The concept is more complete and rigorous, and the function is more abundant. It is suitable for medium and large R&D teams';
-$lang->custom->features['program'] = 'Program';
-$lang->custom->features['productRR'] = 'Product - R&D Requirements';
-$lang->custom->features['productUR'] = 'Product - User Requirements';
-$lang->custom->features['productLine'] = 'Product - Product Line';
-$lang->custom->features['projectScrum'] = 'Project - Scrum Model';
-$lang->custom->features['projectWaterfall'] = 'Project - Waterfall Model';
-$lang->custom->features['projectKanban'] = 'Project - Kanban Model';
-$lang->custom->features['execution'] = 'Execution';
-$lang->custom->features['qa'] = 'QA';
-$lang->custom->features['devops'] = 'DevOps';
-$lang->custom->features['kanban'] = 'Kanban';
-$lang->custom->features['doc'] = 'Doc';
-$lang->custom->features['report'] = 'Statistics';
-$lang->custom->features['system'] = 'System';
-$lang->custom->features['assetlib'] = 'Asset Lib';
-$lang->custom->features['oa'] = 'Attend';
-$lang->custom->features['ops'] = 'Deploy';
-$lang->custom->features['feedback'] = 'Feedback';
-$lang->custom->features['traincourse'] = 'Academy';
-$lang->custom->features['workflow'] = 'Workflow';
-$lang->custom->features['admin'] = 'Admin';
-$lang->custom->features['vision'] = 'Full Feature Interface, Operation Management Interface';
+$lang->custom->features['program'] = 'Program';
+$lang->custom->features['productRR'] = $lang->productCommon . ' - R&D Requirements';
+$lang->custom->features['productUR'] = $lang->productCommon . ' - User Requirements';
+$lang->custom->features['productLine'] = $lang->productCommon . ' - Product Line';
+$lang->custom->features['projectScrum'] = $lang->projectCommon . ' - Scrum Model';
+$lang->custom->features['projectWaterfall'] = $lang->projectCommon . ' - Waterfall Model';
+$lang->custom->features['projectKanban'] = $lang->projectCommon . ' - Kanban Model';
+$lang->custom->features['projectAgileplus'] = $lang->projectCommon . ' - Agile + Model';
+$lang->custom->features['projectWaterfallplus'] = $lang->projectCommon . ' - Waterfall + Model';
+$lang->custom->features['execution'] = 'Execution';
+$lang->custom->features['qa'] = 'QA';
+$lang->custom->features['devops'] = 'DevOps';
+$lang->custom->features['kanban'] = 'Kanban';
+$lang->custom->features['doc'] = 'Doc';
+$lang->custom->features['report'] = 'Statistics';
+$lang->custom->features['system'] = 'System';
+$lang->custom->features['assetlib'] = 'Asset Lib';
+$lang->custom->features['oa'] = 'Attend';
+$lang->custom->features['ops'] = 'Deploy';
+$lang->custom->features['feedback'] = 'Feedback';
+$lang->custom->features['traincourse'] = 'Academy';
+$lang->custom->features['workflow'] = 'Workflow';
+$lang->custom->features['admin'] = 'Admin';
+$lang->custom->features['vision'] = 'Full Feature Interface, Operation Management Interface';
-$lang->custom->needClosedFunctions['waterfall'] = 'Waterfall';
-$lang->custom->needClosedFunctions['URStory'] = 'User Story';
+$lang->custom->needClosedFunctions['waterfall'] = 'Waterfall';
+$lang->custom->needClosedFunctions['waterfallplus'] = 'Waterfall +';
+$lang->custom->needClosedFunctions['URStory'] = 'User Story';
if($config->edition == 'max') $lang->custom->needClosedFunctions['assetLib'] = 'Assetlib';
$lang->custom->scoreStatus[1] = 'On';
diff --git a/module/custom/lang/en.php b/module/custom/lang/en.php
index 8c29df5c94..8f2e139a8d 100644
--- a/module/custom/lang/en.php
+++ b/module/custom/lang/en.php
@@ -8,7 +8,6 @@ $lang->custom->set = 'Customize';
$lang->custom->restore = 'Reset';
$lang->custom->key = 'Key';
$lang->custom->value = 'Value';
-$lang->custom->flow = 'Concept';
$lang->custom->working = 'Mode';
$lang->custom->select = 'Select Concept';
$lang->custom->branch = 'Multi-Branch';
@@ -252,31 +251,34 @@ $lang->custom->modeList['ALM'] = 'ALM Mode';
$lang->custom->modeIntroductionList['light'] = 'Provides the core function of project management, suitable for small R&D teams';
$lang->custom->modeIntroductionList['ALM'] = 'The concept is more complete and rigorous, and the function is more abundant. It is suitable for medium and large R&D teams';
-$lang->custom->features['program'] = 'Program';
-$lang->custom->features['productRR'] = 'Product - R&D Requirements';
-$lang->custom->features['productUR'] = 'Product - User Requirements';
-$lang->custom->features['productLine'] = 'Product - Product Line';
-$lang->custom->features['projectScrum'] = 'Project - Scrum Model';
-$lang->custom->features['projectWaterfall'] = 'Project - Waterfall Model';
-$lang->custom->features['projectKanban'] = 'Project - Kanban Model';
-$lang->custom->features['execution'] = 'Execution';
-$lang->custom->features['qa'] = 'QA';
-$lang->custom->features['devops'] = 'DevOps';
-$lang->custom->features['kanban'] = 'Kanban';
-$lang->custom->features['doc'] = 'Doc';
-$lang->custom->features['report'] = 'Statistics';
-$lang->custom->features['system'] = 'System';
-$lang->custom->features['assetlib'] = 'Asset Lib';
-$lang->custom->features['oa'] = 'Attend';
-$lang->custom->features['ops'] = 'Deploy';
-$lang->custom->features['feedback'] = 'Feedback';
-$lang->custom->features['traincourse'] = 'Academy';
-$lang->custom->features['workflow'] = 'Workflow';
-$lang->custom->features['admin'] = 'Admin';
-$lang->custom->features['vision'] = 'Full Feature Interface, Operation Management Interface';
+$lang->custom->features['program'] = 'Program';
+$lang->custom->features['productRR'] = $lang->productCommon . ' - R&D Requirements';
+$lang->custom->features['productUR'] = $lang->productCommon . ' - User Requirements';
+$lang->custom->features['productLine'] = $lang->productCommon . ' - Product Line';
+$lang->custom->features['projectScrum'] = $lang->projectCommon . ' - Scrum Model';
+$lang->custom->features['projectWaterfall'] = $lang->projectCommon . ' - Waterfall Model';
+$lang->custom->features['projectKanban'] = $lang->projectCommon . ' - Kanban Model';
+$lang->custom->features['projectAgileplus'] = $lang->projectCommon . ' - Agile + Model';
+$lang->custom->features['projectWaterfallplus'] = $lang->projectCommon . ' - Waterfall + Model';
+$lang->custom->features['execution'] = 'Execution';
+$lang->custom->features['qa'] = 'QA';
+$lang->custom->features['devops'] = 'DevOps';
+$lang->custom->features['kanban'] = 'Kanban';
+$lang->custom->features['doc'] = 'Doc';
+$lang->custom->features['report'] = 'Statistics';
+$lang->custom->features['system'] = 'System';
+$lang->custom->features['assetlib'] = 'Asset Lib';
+$lang->custom->features['oa'] = 'Attend';
+$lang->custom->features['ops'] = 'Deploy';
+$lang->custom->features['feedback'] = 'Feedback';
+$lang->custom->features['traincourse'] = 'Academy';
+$lang->custom->features['workflow'] = 'Workflow';
+$lang->custom->features['admin'] = 'Admin';
+$lang->custom->features['vision'] = 'Full Feature Interface, Operation Management Interface';
-$lang->custom->needClosedFunctions['waterfall'] = 'Waterfall';
-$lang->custom->needClosedFunctions['URStory'] = 'User Story';
+$lang->custom->needClosedFunctions['waterfall'] = 'Waterfall';
+$lang->custom->needClosedFunctions['waterfallplus'] = 'Waterfall +';
+$lang->custom->needClosedFunctions['URStory'] = 'User Story';
if($config->edition == 'max') $lang->custom->needClosedFunctions['assetLib'] = 'Assetlib';
$lang->custom->scoreStatus[1] = 'On';
diff --git a/module/custom/lang/fr.php b/module/custom/lang/fr.php
index 609cad69a4..2e43227781 100644
--- a/module/custom/lang/fr.php
+++ b/module/custom/lang/fr.php
@@ -8,7 +8,6 @@ $lang->custom->set = 'Personnaliser';
$lang->custom->restore = 'Réinitialiser';
$lang->custom->key = 'Clé';
$lang->custom->value = 'Valeur';
-$lang->custom->flow = 'Concept';
$lang->custom->working = 'Mode';
$lang->custom->select = 'Choix du Concept';
$lang->custom->branch = 'Multi-Branches';
@@ -252,31 +251,34 @@ $lang->custom->modeList['ALM'] = 'ALM Mode';
$lang->custom->modeIntroductionList['light'] = 'Provides the core function of project management, suitable for small R&D teams';
$lang->custom->modeIntroductionList['ALM'] = 'The concept is more complete and rigorous, and the function is more abundant. It is suitable for medium and large R&D teams';
-$lang->custom->features['program'] = 'Program';
-$lang->custom->features['productRR'] = 'Product - R&D Requirements';
-$lang->custom->features['productUR'] = 'Product - User Requirements';
-$lang->custom->features['productLine'] = 'Product - Product Line';
-$lang->custom->features['projectScrum'] = 'Project - Scrum Model';
-$lang->custom->features['projectWaterfall'] = 'Project - Waterfall Model';
-$lang->custom->features['projectKanban'] = 'Project - Kanban Model';
-$lang->custom->features['execution'] = 'Execution';
-$lang->custom->features['qa'] = 'QA';
-$lang->custom->features['devops'] = 'DevOps';
-$lang->custom->features['kanban'] = 'Kanban';
-$lang->custom->features['doc'] = 'Doc';
-$lang->custom->features['report'] = 'Statistics';
-$lang->custom->features['system'] = 'System';
-$lang->custom->features['assetlib'] = 'Asset Lib';
-$lang->custom->features['oa'] = 'Attend';
-$lang->custom->features['ops'] = 'Deploy';
-$lang->custom->features['feedback'] = 'Feedback';
-$lang->custom->features['traincourse'] = 'Academy';
-$lang->custom->features['workflow'] = 'Workflow';
-$lang->custom->features['admin'] = 'Admin';
-$lang->custom->features['vision'] = 'Full Feature Interface, Operation Management Interface';
+$lang->custom->features['program'] = 'Program';
+$lang->custom->features['productRR'] = $lang->productCommon . ' - R&D Requirements';
+$lang->custom->features['productUR'] = $lang->productCommon . ' - User Requirements';
+$lang->custom->features['productLine'] = $lang->productCommon . ' - Product Line';
+$lang->custom->features['projectScrum'] = $lang->projectCommon . ' - Scrum Model';
+$lang->custom->features['projectWaterfall'] = $lang->projectCommon . ' - Waterfall Model';
+$lang->custom->features['projectKanban'] = $lang->projectCommon . ' - Kanban Model';
+$lang->custom->features['projectAgileplus'] = $lang->projectCommon . ' - Agile + Model';
+$lang->custom->features['projectWaterfallplus'] = $lang->projectCommon . ' - Waterfall + Model';
+$lang->custom->features['execution'] = 'Execution';
+$lang->custom->features['qa'] = 'QA';
+$lang->custom->features['devops'] = 'DevOps';
+$lang->custom->features['kanban'] = 'Kanban';
+$lang->custom->features['doc'] = 'Doc';
+$lang->custom->features['report'] = 'Statistics';
+$lang->custom->features['system'] = 'System';
+$lang->custom->features['assetlib'] = 'Asset Lib';
+$lang->custom->features['oa'] = 'Attend';
+$lang->custom->features['ops'] = 'Deploy';
+$lang->custom->features['feedback'] = 'Feedback';
+$lang->custom->features['traincourse'] = 'Academy';
+$lang->custom->features['workflow'] = 'Workflow';
+$lang->custom->features['admin'] = 'Admin';
+$lang->custom->features['vision'] = 'Full Feature Interface, Operation Management Interface';
-$lang->custom->needClosedFunctions['waterfall'] = 'Waterfall';
-$lang->custom->needClosedFunctions['URStory'] = 'User Story';
+$lang->custom->needClosedFunctions['waterfall'] = 'Waterfall';
+$lang->custom->needClosedFunctions['waterfallplus'] = 'Waterfall +';
+$lang->custom->needClosedFunctions['URStory'] = 'User Story';
if($config->edition == 'max') $lang->custom->needClosedFunctions['assetLib'] = 'Assetlib';
$lang->custom->scoreStatus[1] = 'On';
diff --git a/module/custom/lang/zh-cn.php b/module/custom/lang/zh-cn.php
index ae60c824fb..8ed08ff52c 100644
--- a/module/custom/lang/zh-cn.php
+++ b/module/custom/lang/zh-cn.php
@@ -8,7 +8,6 @@ $lang->custom->set = '自定义配置';
$lang->custom->restore = '恢复默认';
$lang->custom->key = '键';
$lang->custom->value = '值';
-$lang->custom->flow = '流程设置';
$lang->custom->working = '工作方式';
$lang->custom->select = '请选择流程:';
$lang->custom->branch = '多分支';
@@ -252,31 +251,34 @@ $lang->custom->modeList['ALM'] = '全生命周期管理模式';
$lang->custom->modeIntroductionList['light'] = '提供了项目管理的核心功能,适用于小型研发团队';
$lang->custom->modeIntroductionList['ALM'] = '概念更加完整、严谨,功能更加丰富,适用于中大型研发团队';
-$lang->custom->features['program'] = '项目集';
-$lang->custom->features['productRR'] = '产品-研发需求';
-$lang->custom->features['productUR'] = '产品-用户需求';
-$lang->custom->features['productLine'] = '产品-产品线';
-$lang->custom->features['projectScrum'] = '项目-敏捷模型';
-$lang->custom->features['projectWaterfall'] = '项目-瀑布模型';
-$lang->custom->features['projectKanban'] = '项目-看板模型';
-$lang->custom->features['execution'] = '执行';
-$lang->custom->features['qa'] = '测试';
-$lang->custom->features['devops'] = 'DevOps';
-$lang->custom->features['kanban'] = '看板';
-$lang->custom->features['doc'] = '文档';
-$lang->custom->features['report'] = '统计';
-$lang->custom->features['system'] = '组织';
-$lang->custom->features['assetlib'] = '资产库';
-$lang->custom->features['oa'] = '办公';
-$lang->custom->features['ops'] = '运维';
-$lang->custom->features['feedback'] = '反馈';
-$lang->custom->features['traincourse'] = '学堂';
-$lang->custom->features['workflow'] = '工作流';
-$lang->custom->features['admin'] = '后台';
-$lang->custom->features['vision'] = '研发综合界面、运营管理界面';
+$lang->custom->features['program'] = '项目集';
+$lang->custom->features['productRR'] = '产品-研发需求';
+$lang->custom->features['productUR'] = '产品-用户需求';
+$lang->custom->features['productLine'] = '产品-产品线';
+$lang->custom->features['projectScrum'] = '项目-敏捷模型';
+$lang->custom->features['projectWaterfall'] = '项目-瀑布模型';
+$lang->custom->features['projectKanban'] = '项目-看板模型';
+$lang->custom->features['projectAgileplus'] = '项目-融合敏捷模型';
+$lang->custom->features['projectWaterfallplus'] = '项目-融合瀑布模型';
+$lang->custom->features['execution'] = '执行';
+$lang->custom->features['qa'] = '测试';
+$lang->custom->features['devops'] = 'DevOps';
+$lang->custom->features['kanban'] = '看板';
+$lang->custom->features['doc'] = '文档';
+$lang->custom->features['report'] = '统计';
+$lang->custom->features['system'] = '组织';
+$lang->custom->features['assetlib'] = '资产库';
+$lang->custom->features['oa'] = '办公';
+$lang->custom->features['ops'] = '运维';
+$lang->custom->features['feedback'] = '反馈';
+$lang->custom->features['traincourse'] = '学堂';
+$lang->custom->features['workflow'] = '工作流';
+$lang->custom->features['admin'] = '后台';
+$lang->custom->features['vision'] = '研发综合界面、运营管理界面';
-$lang->custom->needClosedFunctions['waterfall'] = '瀑布项目';
-$lang->custom->needClosedFunctions['URStory'] = '用户需求';
+$lang->custom->needClosedFunctions['waterfall'] = '瀑布项目';
+$lang->custom->needClosedFunctions['waterfallplus'] = '融合瀑布项目';
+$lang->custom->needClosedFunctions['URStory'] = '用户需求';
if($config->edition == 'max') $lang->custom->needClosedFunctions['assetLib'] = '资产库';
$lang->custom->scoreStatus[1] = '开启';
diff --git a/module/custom/model.php b/module/custom/model.php
index 0f4fed2cf1..7778cb03f3 100644
--- a/module/custom/model.php
+++ b/module/custom/model.php
@@ -852,7 +852,7 @@ class customModel extends model
if(!isset($disabledFeatures['scrum'])) $disabledFeatures['scrum'] = array();
$disabledFeatures['scrum'][] = $feature;
}
- elseif($feature == 'waterfall')
+ elseif(in_array($feature, array('waterfall', 'waterfallplus')))
{
$disabledFeatures[] = 'project' . ucfirst($feature);
}
@@ -1000,6 +1000,17 @@ class customModel extends model
return $this->dao->select('*')->from(TABLE_PROJECT)->where('model')->eq('waterfall')->andWhere('deleted')->eq('0')->count();
}
+ /**
+ * Check for waterfallplus project data.
+ *
+ * @access public
+ * @return int
+ */
+ public function hasWaterfallplusData()
+ {
+ return $this->dao->select('*')->from(TABLE_PROJECT)->where('model')->eq('waterfallplus')->andWhere('deleted')->eq('0')->count();
+ }
+
/**
* Check for assetlib data.
*
@@ -1136,8 +1147,9 @@ class customModel extends model
$disabledFeatures = $disabledFeatures . ',' . $closedFeatures;
$hasWaterfall = strpos(",{$disabledFeatures},", ',waterfall,') === false;
+ $hasWaterfallPlus = strpos(",{$disabledFeatures},", ',waterfallplus,') === false;
$hasScrumMeasrecord = strpos(",{$disabledFeatures},", ',scrumMeasrecord,') === false;
- $hasWaterfallMeasrecord = (strpos(",{$disabledFeatures},", ',waterfallMeasrecord,') === false and $hasWaterfall);
+ $hasWaterfallMeasrecord = (strpos(",{$disabledFeatures},", ',waterfallMeasrecord,') === false and ($hasWaterfall or $hasWaterfallPlus));
$cronStatus = 'normal';
if(!$hasScrumMeasrecord and !$hasWaterfallMeasrecord) $cronStatus = 'stop';
diff --git a/module/custom/view/mode.html.php b/module/custom/view/mode.html.php
index 7378168d3a..5376929d50 100644
--- a/module/custom/view/mode.html.php
+++ b/module/custom/view/mode.html.php
@@ -36,9 +36,9 @@
custom->modeIntroductionList['ALM'];?> |
-
+
- | lang->custom->scrum->common, implode($lang->comma, $disabledScrumFeatures)) : $this->lang->custom->features[$feature];?> |
+ lang->custom->scrum->common, implode($lang->comma, $disabledScrumFeatures)) : $this->lang->custom->features[$feature];?> |
|
|
@@ -46,9 +46,9 @@
custom->allFeatures as $feature):?>
-
+
- | lang->custom->scrum->common, implode($lang->comma, $enabledScrumFeatures)) : $this->lang->custom->features[$feature];?> |
+ lang->custom->scrum->common, implode($lang->comma, $enabledScrumFeatures)) : $this->lang->custom->features[$feature];?> |
|
|
diff --git a/module/design/control.php b/module/design/control.php
index fd6babe192..9964b82378 100755
--- a/module/design/control.php
+++ b/module/design/control.php
@@ -71,6 +71,9 @@ class design extends control
{
$productID = $this->commonAction($projectID, $productID);
+ $project = $this->loadModel('project')->getByID($projectID);
+ $typeList = $project->model == 'waterfall' ? $this->lang->design->typeList : $this->lang->design->plusTypeList;
+
/* Save session for design list and process product id. */
$this->session->set('designList', $this->app->getURI(true), 'project');
$this->session->set('reviewList', $this->app->getURI(true), 'project');
@@ -80,6 +83,7 @@ class design extends control
$productIdList = $productID ? $productID : array_keys($products);
$stories = $this->loadModel('story')->getProductStoryPairs($productIdList, 'all', 0, 'active', 'id_desc', 0, 'full', 'story', false);
$this->config->design->search['params']['story']['values'] = $stories;
+ $this->config->design->search['params']['type']['values'] = $typeList;
$queryID = ($type == 'bySearch') ? (int)$param : 0;
$actionURL = $this->createLink('design', 'browse', "projectID=$projectID&productID=$productID&type=bySearch&queryID=myQueryID");
@@ -120,7 +124,6 @@ class design extends control
$pager = pager::init(0, $recPerPage, $pageID);
$designs = $this->design->getList($projectID, $productID, $type, $queryID, $orderBy, $pager);
- $project = $this->loadModel('project')->getByID($projectID);
$this->view->hiddenProduct = $project->hasProduct ? false : true;
$this->view->title = $this->lang->design->common . $this->lang->colon . $this->lang->design->browse;
@@ -134,6 +137,7 @@ class design extends control
$this->view->projectID = $projectID;
$this->view->pager = $pager;
$this->view->users = $this->loadModel('user')->getPairs('noletter');
+ $this->view->typeList = $typeList;
$this->display();
}
@@ -173,6 +177,8 @@ class design extends control
$products = $this->product->getProductPairsByProject($projectID);
$productIdList = $productID ? $productID : array_keys($products);
+ $project = $this->loadModel('project')->getByID($projectID);
+
$this->view->title = $this->lang->design->common . $this->lang->colon . $this->lang->design->create;
$this->view->position[] = $this->lang->design->create;
@@ -181,7 +187,7 @@ class design extends control
$this->view->productID = $productID;
$this->view->projectID = $projectID;
$this->view->type = $type;
- $this->view->project = $this->loadModel('project')->getByID($projectID);
+ $this->view->typeList = $project->model == 'waterfall' ? $this->lang->design->typeList : $this->lang->design->plusTypeList;
$this->display();
}
@@ -220,12 +226,15 @@ class design extends control
$products = $this->product->getProductPairsByProject($projectID);
$productIdList = $productID ? $productID : array_keys($products);
+ $project = $this->loadModel('project')->getByID($projectID);
+
$this->view->title = $this->lang->design->common . $this->lang->colon . $this->lang->design->batchCreate;
$this->view->position[] = $this->lang->design->batchCreate;
- $this->view->stories = $this->loadModel('story')->getProductStoryPairs($productIdList);
- $this->view->users = $this->loadModel('user')->getPairs('noclosed');
- $this->view->type = $type;
+ $this->view->stories = $this->loadModel('story')->getProductStoryPairs($productIdList);
+ $this->view->users = $this->loadModel('user')->getPairs('noclosed');
+ $this->view->type = $type;
+ $this->view->typeList = $project->model == 'waterfall' ? $this->lang->design->typeList : $this->lang->design->plusTypeList;
$this->display();
}
@@ -248,6 +257,8 @@ class design extends control
$products = $this->product->getProductPairsByProject($design->project);
$productIdList = $design->product ? $design->product : array_keys($products);
+ $project = $this->loadModel('project')->getByID($design->project);
+
$this->view->title = $this->lang->design->common . $this->lang->colon . $this->lang->design->view;
$this->view->position[] = $this->lang->design->view;
@@ -256,7 +267,8 @@ class design extends control
$this->view->users = $this->loadModel('user')->getPairs('noletter');
$this->view->actions = $this->loadModel('action')->getList('design', $design->id);
$this->view->repos = $this->loadModel('repo')->getRepoPairs('project', $design->project);
- $this->view->project = $this->loadModel('project')->getByID($design->project);
+ $this->view->project = $project;
+ $this->view->typeList = $project->model == 'waterfall' ? $this->lang->design->typeList : $this->lang->design->plusTypeList;
$this->display();
}
@@ -300,13 +312,16 @@ class design extends control
$products = $this->product->getProductPairsByProject($design->project);
$productIdList = $design->product ? $design->product : array_keys($products);
+ $project = $this->loadModel('project')->getByID($design->project);
+
$this->view->title = $this->lang->design->common . $this->lang->colon . $this->lang->design->edit;
$this->view->position[] = $this->lang->design->edit;
$this->view->design = $design;
- $this->view->project = $this->loadModel('project')->getByID($design->project);
+ $this->view->project = $project;
$this->view->stories = $this->loadModel('story')->getProductStoryPairs($productIdList);
$this->view->users = $this->loadModel('user')->getPairs('noclosed');
+ $this->view->typeList = $project->model == 'waterfall' ? $this->lang->design->typeList : $this->lang->design->plusTypeList;
$this->display();
}
diff --git a/module/design/lang/de.php b/module/design/lang/de.php
index ac051992b9..9fe4690a63 100644
--- a/module/design/lang/de.php
+++ b/module/design/lang/de.php
@@ -65,6 +65,8 @@ $lang->design->typeList['DDS'] = 'Detailed';
$lang->design->typeList['DBDS'] = 'Database';
$lang->design->typeList['ADS'] = 'API';
+$lang->design->plusTypeList = $lang->design->typeList;
+
$lang->design->rangeList = array();
$lang->design->rangeList['all'] = 'All';
$lang->design->rangeList['assign'] = 'Selected';
diff --git a/module/design/lang/en.php b/module/design/lang/en.php
index 9b3d40e66c..166f1458f9 100644
--- a/module/design/lang/en.php
+++ b/module/design/lang/en.php
@@ -65,6 +65,8 @@ $lang->design->typeList['DDS'] = 'Detailed';
$lang->design->typeList['DBDS'] = 'Database';
$lang->design->typeList['ADS'] = 'API';
+$lang->design->plusTypeList = $lang->design->typeList;
+
$lang->design->rangeList = array();
$lang->design->rangeList['all'] = 'All';
$lang->design->rangeList['assign'] = 'Selected';
diff --git a/module/design/lang/fr.php b/module/design/lang/fr.php
index 91f8e004e5..33a0580b41 100644
--- a/module/design/lang/fr.php
+++ b/module/design/lang/fr.php
@@ -65,6 +65,8 @@ $lang->design->typeList['DDS'] = 'Detailed';
$lang->design->typeList['DBDS'] = 'Database';
$lang->design->typeList['ADS'] = 'API';
+$lang->design->plusTypeList = $lang->design->typeList;
+
$lang->design->rangeList = array();
$lang->design->rangeList['all'] = 'All';
$lang->design->rangeList['assign'] = 'Selected';
diff --git a/module/design/lang/zh-cn.php b/module/design/lang/zh-cn.php
index f500018190..372ec8dca6 100644
--- a/module/design/lang/zh-cn.php
+++ b/module/design/lang/zh-cn.php
@@ -65,6 +65,8 @@ $lang->design->typeList['DDS'] = '详细设计';
$lang->design->typeList['DBDS'] = '数据库设计';
$lang->design->typeList['ADS'] = '接口设计';
+$lang->design->plusTypeList = $lang->design->typeList;
+
$lang->design->rangeList = array();
$lang->design->rangeList['all'] = '全部记录';
$lang->design->rangeList['assign'] = '选中记录';
diff --git a/module/design/model.php b/module/design/model.php
index 7384f2755b..caa5d6ca3b 100755
--- a/module/design/model.php
+++ b/module/design/model.php
@@ -404,11 +404,15 @@ class designModel extends model
*/
public function setMenu($projectID, $products, $productID = 0)
{
+ $project = $this->loadModel('project')->getByID($projectID);
+ if(!empty($project) and $project->model == 'waterfall') $typeList = 'typeList';
+ if(!empty($project) and $project->model == 'waterfallplus') $typeList = 'plusTypeList';
+
/* Show custom design types. */
$this->lang->waterfall->menu->design['subMenu'] = new stdclass();
$this->lang->waterfall->menu->design['subMenu']->all = array('link' => "{$this->lang->all}|design|browse|projectID=%s&productID=0&browseType=all");
$count = 1;
- foreach(array_filter($this->lang->design->typeList) as $key => $value)
+ foreach(array_filter($this->lang->design->{$typeList}) as $key => $value)
{
$key = strtolower($key);
diff --git a/module/design/view/batchcreate.html.php b/module/design/view/batchcreate.html.php
index 891f37465f..955682d283 100644
--- a/module/design/view/batchcreate.html.php
+++ b/module/design/view/batchcreate.html.php
@@ -30,7 +30,7 @@
|
|
- design->typeList, '', "class='form-control chosen'");?> |
+ |
|
|
diff --git a/module/design/view/browse.html.php b/module/design/view/browse.html.php
index 59d1e8dd20..ca58918162 100644
--- a/module/design/view/browse.html.php
+++ b/module/design/view/browse.html.php
@@ -48,7 +48,7 @@
id);?> |
createLink('design', 'view', "id={$design->id}"), $design->name) : $design->name;?> |
product);?> |
-
design->typeList, $design->type);?> |
+
type);?> |
design->printAssignedHtml($design, $users);?> |
createdBy);?> |
createdDate, 0, 11);?> |
diff --git a/module/design/view/create.html.php b/module/design/view/create.html.php
index 01c69ec63e..38976d0ca5 100755
--- a/module/design/view/create.html.php
+++ b/module/design/view/create.html.php
@@ -34,7 +34,7 @@
| design->type;?> |
- design->typeList, '', "class='form-control chosen'");?> |
+ |
|
diff --git a/module/design/view/edit.html.php b/module/design/view/edit.html.php
index 78bb51cfd2..7c39073ec9 100755
--- a/module/design/view/edit.html.php
+++ b/module/design/view/edit.html.php
@@ -40,7 +40,7 @@
| design->type;?> |
- design->typeList, $design->type, "class='form-control chosen'");?> |
+ type, "class='form-control chosen'");?> |
|
diff --git a/module/design/view/view.html.php b/module/design/view/view.html.php
index ec45ab0e80..c3b9b45f80 100755
--- a/module/design/view/view.html.php
+++ b/module/design/view/view.html.php
@@ -66,7 +66,7 @@
| design->type;?> |
- design->typeList, $design->type);?> |
+ type);?> |
hasProduct)) echo "class='hide'";?>>
| design->product;?> |
diff --git a/module/dev/view/api.html.php b/module/dev/view/api.html.php
index 3bdb9b80a8..914b930f84 100644
--- a/module/dev/view/api.html.php
+++ b/module/dev/view/api.html.php
@@ -9,7 +9,6 @@
disableFeature and in_array($module, $config->disableFeature)) continue;
$active = ($module == $selectedModule) ? 'text-primary' : '';
$moduleName = zget($lang->dev->tableList, $module, $module);
?>
diff --git a/module/execution/control.php b/module/execution/control.php
index d47b66eaa6..23e12a6ecc 100644
--- a/module/execution/control.php
+++ b/module/execution/control.php
@@ -1862,7 +1862,12 @@ class execution extends control
$this->loadModel('product');
$allProducts = $this->product->getProductPairsByProject($projectID, 'noclosed');
- $copyProjects = $this->loadModel('project')->getPairsByProgram(isset($project->parent) ? $project->parent : '', 'noclosed', '', 'order_asc', '', isset($project->model) ? $project->model : '', 'multiple');
+
+ $projectModel = isset($project->model) ? $project->model : '';
+ if($projectModel == 'agileplus') $projectModel = array('scrum', 'agileplus');
+ if($projectModel == 'waterfallplus') $projectModel = array('waterfall', 'waterfallplus');
+
+ $copyProjects = $this->loadModel('project')->getPairsByProgram(isset($project->parent) ? $project->parent : '', 'noclosed', '', 'order_asc', '', $projectModel, 'multiple');
$copyProjectID = ($projectID == 0) ? key($copyProjects) : $projectID;
if(!empty($project->hasProduct)) $allProducts = array(0 => '') + $allProducts;
diff --git a/module/execution/css/edit.css b/module/execution/css/edit.css
index 1331271af3..69e41e254b 100644
--- a/module/execution/css/edit.css
+++ b/module/execution/css/edit.css
@@ -7,3 +7,5 @@
#dateRange {vertical-align: top; padding-top: 13px;}
.form-date {min-width: 90px;}
+
+.productsBox div[id^='branch'].chosen-disabled {pointer-events: none;}
diff --git a/module/execution/js/edit.js b/module/execution/js/edit.js
index 78d040216c..5527fd5b0b 100644
--- a/module/execution/js/edit.js
+++ b/module/execution/js/edit.js
@@ -107,6 +107,11 @@ $(function()
});
$(document).on('change', "select[id^='branch']", disableSelectedBranch);
+
+ if($('.disabledBranch').length > 0)
+ {
+ $('.disabledBranch div[id^="branch"]').addClass('chosen-disabled');
+ }
})
var lastProjectID = $("#project").val();
diff --git a/module/execution/lang/de.php b/module/execution/lang/de.php
index 9cd8aa1b8c..d6c506033d 100644
--- a/module/execution/lang/de.php
+++ b/module/execution/lang/de.php
@@ -140,6 +140,7 @@ $lang->execution->myTask = "My Task";
$lang->execution->list = "{$lang->executionCommon} List";
$lang->execution->allProject = 'All';
$lang->execution->method = 'Method';
+$lang->execution->sameAsParent = "Same as parent";
/* Fields of zt_team. */
$lang->execution->root = 'Root';
diff --git a/module/execution/lang/en.php b/module/execution/lang/en.php
index 5331ed2369..995e4f9d53 100644
--- a/module/execution/lang/en.php
+++ b/module/execution/lang/en.php
@@ -140,6 +140,7 @@ $lang->execution->myTask = "My Task";
$lang->execution->list = 'List';
$lang->execution->allProject = 'All';
$lang->execution->method = 'Method';
+$lang->execution->sameAsParent = "Same as parent";
/* Fields of zt_team. */
$lang->execution->root = 'Root';
diff --git a/module/execution/lang/fr.php b/module/execution/lang/fr.php
index 41520d6e0d..ac5351d360 100644
--- a/module/execution/lang/fr.php
+++ b/module/execution/lang/fr.php
@@ -140,6 +140,7 @@ $lang->execution->myTask = "My Task";
$lang->execution->list = "{$lang->executionCommon} List";
$lang->execution->allProject = 'Tous';
$lang->execution->method = 'Method';
+$lang->execution->sameAsParent = "Same as parent";
/* Fields of zt_team. */
$lang->execution->root = 'Root';
diff --git a/module/execution/lang/zh-cn.php b/module/execution/lang/zh-cn.php
index bfb7610028..a83b65dc25 100644
--- a/module/execution/lang/zh-cn.php
+++ b/module/execution/lang/zh-cn.php
@@ -140,6 +140,7 @@ $lang->execution->myTask = "我的任务";
$lang->execution->list = '列表';
$lang->execution->allProject = '全部项目';
$lang->execution->method = '方法';
+$lang->execution->sameAsParent = "同父阶段";
/* Fields of zt_team. */
$lang->execution->root = '源ID';
diff --git a/module/execution/view/edit.html.php b/module/execution/view/edit.html.php
index 299f88e233..6ade126e6e 100644
--- a/module/execution/view/edit.html.php
+++ b/module/execution/view/edit.html.php
@@ -243,23 +243,43 @@
type == 'stage' and !in_array($execution->attribute, array('request', 'design', 'review'))) or $execution->type != 'stage'): ?>
+
+
- | execution->manageProducts;?> |
-
-
-
- $product):?>
- branches as $branchID):?>
-
-
- " . $product->name . $branchName;?>
+ project->manageProductPlan;?> |
+
+
+
+
+
+ type != 'normal' and isset($branchGroups[$product->id]);?>
+ '>
+ product->common;?>
+ type == 'stage' ? "disabled='disabled'" : '';?>
+ id, "class='form-control chosen' $disabled onchange='loadBranches(this)' data-last='" . $product->id . "' data-type='" . $product->type . "'");?>
+ type == 'stage' and !$project->division) echo html::hidden("products[$i]", $product->id);?>
+
+
+ '>
+
+ project->branch;?>
+ branches) ? join(',', $product->branches) : '';?>
+ id]) ? $branchGroups[$product->id] : array(), $branchIdList, "class='form-control chosen' multiple onchange=\"loadPlans('#products{$i}', this)\"");?>
+
+
+
+
+
+ >
+ product->plan;?>
+ id][]", isset($productPlans[$product->id]) ? $productPlans[$product->id] : array(), isset($product->plans) ? $product->plans : '', "class='form-control chosen' multiple");?>
+
-
-
-
|
|
+
+
diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php
index ac6c5c578b..3e3614f5b5 100644
--- a/module/group/lang/resource.php
+++ b/module/group/lang/resource.php
@@ -399,6 +399,7 @@ $lang->resource->stage->batchCreate = 'batchCreate';
$lang->resource->stage->edit = 'edit';
$lang->resource->stage->setType = 'setType';
$lang->resource->stage->delete = 'delete';
+$lang->resource->stage->plusBrowse = 'plusBrowse';
$lang->stage->methodOrder[5] = 'browse';
$lang->stage->methodOrder[10] = 'create';
@@ -406,6 +407,7 @@ $lang->stage->methodOrder[15] = 'batchCreate';
$lang->stage->methodOrder[20] = 'edit';
$lang->stage->methodOrder[25] = 'setType';
$lang->stage->methodOrder[30] = 'delete';
+$lang->stage->methodOrder[35] = 'plusBrowse';
/* Program. */
$lang->resource->program = new stdclass();
@@ -2017,15 +2019,15 @@ if(!$inUpgrade)
unset($lang->resource->program);
unset($lang->resource->project->programTitle);
}
- if(!helper::hasFeature('waterfall'))
+ if(!helper::hasFeature('waterfall') and !helper::hasFeature('waterfallplus'))
{
unset($lang->resource->design);
unset($lang->resource->programplan);
unset($lang->resource->stage);
}
- if(!helper::hasFeature('product_track')) unset($lang->resource->product->track);
- if(!helper::hasFeature('product_roadmap')) unset($lang->resource->product->roadmap);
- if(!helper::hasFeature('waterfall_track')) unset($lang->resource->projectstory->track);
+ if(!helper::hasFeature('product_track')) unset($lang->resource->product->track);
+ if(!helper::hasFeature('product_roadmap')) unset($lang->resource->product->roadmap);
+ if(!helper::hasFeature('waterfall_track') and !helper::hasFeature('waterfallplus_track')) unset($lang->resource->projectstory->track);
if(!helper::hasFeature('devops'))
{
unset($lang->resource->repo);
diff --git a/module/kanban/view/importrelease.html.php b/module/kanban/view/importrelease.html.php
index 70faa64f91..12ad5517d9 100644
--- a/module/kanban/view/importrelease.html.php
+++ b/module/kanban/view/importrelease.html.php
@@ -51,7 +51,7 @@
- builds)) ? 1 : count($release->builds);?>
+ builds) ? 1 : count($release->builds);?>
diff --git a/module/mail/lang/de.php b/module/mail/lang/de.php
index d52845f176..572e19a838 100644
--- a/module/mail/lang/de.php
+++ b/module/mail/lang/de.php
@@ -1,5 +1,4 @@
mail->common = 'Email Einstellungen';
$lang->mail->index = 'Home';
$lang->mail->detect = 'Testen';
$lang->mail->detectAction = 'Detect By Email Address';
diff --git a/module/mail/lang/en.php b/module/mail/lang/en.php
index 8c363ee2e3..657c5e8fec 100755
--- a/module/mail/lang/en.php
+++ b/module/mail/lang/en.php
@@ -1,5 +1,4 @@
mail->common = 'Email Settings';
$lang->mail->index = 'Email Home';
$lang->mail->detect = 'Detect';
$lang->mail->detectAction = 'Detect By Email Address';
diff --git a/module/mail/lang/fr.php b/module/mail/lang/fr.php
index 8c363ee2e3..657c5e8fec 100644
--- a/module/mail/lang/fr.php
+++ b/module/mail/lang/fr.php
@@ -1,5 +1,4 @@
mail->common = 'Email Settings';
$lang->mail->index = 'Email Home';
$lang->mail->detect = 'Detect';
$lang->mail->detectAction = 'Detect By Email Address';
diff --git a/module/mail/lang/zh-cn.php b/module/mail/lang/zh-cn.php
index f90a6bf78b..5aa4390587 100755
--- a/module/mail/lang/zh-cn.php
+++ b/module/mail/lang/zh-cn.php
@@ -1,5 +1,4 @@
mail->common = '发信配置';
$lang->mail->index = '首页';
$lang->mail->detect = '检测';
$lang->mail->detectAction = '通过邮箱地址检测';
diff --git a/module/my/lang/de.php b/module/my/lang/de.php
index b508fa00cc..1d9f272c19 100644
--- a/module/my/lang/de.php
+++ b/module/my/lang/de.php
@@ -99,7 +99,7 @@ $lang->my->auditMenu->audit = new stdclass();
$lang->my->auditMenu->audit->all = 'All';
$lang->my->auditMenu->audit->story = 'Story';
$lang->my->auditMenu->audit->testcase = 'Case';
-if($config->edition == 'max' and helper::hasFeature('waterfall')) $lang->my->auditMenu->audit->project = 'Project';
+if($config->edition == 'max' and (helper::hasFeature('waterfall') or helper::hasFeature('waterfallplus'))) $lang->my->auditMenu->audit->project = $lang->projectCommon;
if($config->edition != 'open') $lang->my->auditMenu->audit->feedback = 'Feedback';
if($config->edition != 'open' and helper::hasFeature('OA')) $lang->my->auditMenu->audit->oa = 'OA';
diff --git a/module/my/lang/en.php b/module/my/lang/en.php
index b508fa00cc..1d9f272c19 100644
--- a/module/my/lang/en.php
+++ b/module/my/lang/en.php
@@ -99,7 +99,7 @@ $lang->my->auditMenu->audit = new stdclass();
$lang->my->auditMenu->audit->all = 'All';
$lang->my->auditMenu->audit->story = 'Story';
$lang->my->auditMenu->audit->testcase = 'Case';
-if($config->edition == 'max' and helper::hasFeature('waterfall')) $lang->my->auditMenu->audit->project = 'Project';
+if($config->edition == 'max' and (helper::hasFeature('waterfall') or helper::hasFeature('waterfallplus'))) $lang->my->auditMenu->audit->project = $lang->projectCommon;
if($config->edition != 'open') $lang->my->auditMenu->audit->feedback = 'Feedback';
if($config->edition != 'open' and helper::hasFeature('OA')) $lang->my->auditMenu->audit->oa = 'OA';
diff --git a/module/my/lang/fr.php b/module/my/lang/fr.php
index b508fa00cc..1d9f272c19 100644
--- a/module/my/lang/fr.php
+++ b/module/my/lang/fr.php
@@ -99,7 +99,7 @@ $lang->my->auditMenu->audit = new stdclass();
$lang->my->auditMenu->audit->all = 'All';
$lang->my->auditMenu->audit->story = 'Story';
$lang->my->auditMenu->audit->testcase = 'Case';
-if($config->edition == 'max' and helper::hasFeature('waterfall')) $lang->my->auditMenu->audit->project = 'Project';
+if($config->edition == 'max' and (helper::hasFeature('waterfall') or helper::hasFeature('waterfallplus'))) $lang->my->auditMenu->audit->project = $lang->projectCommon;
if($config->edition != 'open') $lang->my->auditMenu->audit->feedback = 'Feedback';
if($config->edition != 'open' and helper::hasFeature('OA')) $lang->my->auditMenu->audit->oa = 'OA';
diff --git a/module/my/lang/zh-cn.php b/module/my/lang/zh-cn.php
index 545768b7ea..b6e0038cf1 100644
--- a/module/my/lang/zh-cn.php
+++ b/module/my/lang/zh-cn.php
@@ -99,7 +99,7 @@ $lang->my->auditMenu->audit = new stdclass();
$lang->my->auditMenu->audit->all = '所有';
$lang->my->auditMenu->audit->story = '需求';
$lang->my->auditMenu->audit->testcase = '用例';
-if($config->edition == 'max' and helper::hasFeature('waterfall')) $lang->my->auditMenu->audit->project = '项目';
+if($config->edition == 'max' and (helper::hasFeature('waterfall') or helper::hasFeature('waterfallplus'))) $lang->my->auditMenu->audit->project = $lang->projectCommon;
if($config->edition != 'open') $lang->my->auditMenu->audit->feedback = '反馈';
if($config->edition != 'open' and helper::hasFeature('OA')) $lang->my->auditMenu->audit->oa = '办公';
diff --git a/module/programplan/control.php b/module/programplan/control.php
index 7a7783561f..ccf3baa0a5 100644
--- a/module/programplan/control.php
+++ b/module/programplan/control.php
@@ -211,7 +211,7 @@ class programplan extends control
$this->view->productList = $productList;
$this->view->project = $project;
$this->view->productID = $productID ? $productID : key($productList);
- $this->view->stages = empty($planID) ? $this->loadModel('stage')->getStages('id_asc') : array();
+ $this->view->stages = empty($planID) ? $this->loadModel('stage')->getStages('id_asc', 0, $project->model) : array();
$this->view->programPlan = $programPlan;
$this->view->plans = empty($executions) ? $plans : $executions;
$this->view->planID = $planID;
diff --git a/module/programplan/lang/de.php b/module/programplan/lang/de.php
index 7b1a58d0cf..5068fce91a 100644
--- a/module/programplan/lang/de.php
+++ b/module/programplan/lang/de.php
@@ -110,7 +110,7 @@ $lang->programplan->ganttCustom['delayDays'] = 'Delay days';
$lang->programplan->error = new stdclass();
$lang->programplan->error->percentNumber = '"Workload %" must be digits.';
$lang->programplan->error->planFinishSmall = 'The "End" date must be > the "Begin" date.';
-$lang->programplan->error->percentOver = 'The sum of "Workload %" cannot exceed 100%.';
+$lang->programplan->error->percentOver = 'The sum of "Workload %" cannot exceed 100% of one stage.';
$lang->programplan->error->createdTask = 'The task has been decomposed. Sub phases cannot be added.';
$lang->programplan->error->parentWorkload = 'The sum of the workload of the child phase cannot be greater than that of the parent phase: %s.';
$lang->programplan->error->parentDuration = 'The planned start and planned completion of the child phase cannot exceed the parent phase.';
@@ -119,6 +119,7 @@ $lang->programplan->error->sameCode = 'Stage code cannot be the same!';
$lang->programplan->error->taskDrag = 'The %s task cannot be dragged';
$lang->programplan->error->planDrag = 'The %s stage cannot be dragged';
$lang->programplan->error->notStage = $lang->executionCommon . '/Kanban cannot create a sub stage.';
+$lang->programplan->error->sameType = 'Type of the stage must be as same as parent: "%s"';
$lang->programplan->ganttBrowseType['gantt'] = 'Group by Stage';
$lang->programplan->ganttBrowseType['assignedTo'] = 'Group by AssignedTo';
diff --git a/module/programplan/lang/en.php b/module/programplan/lang/en.php
index 6d25da9d4c..689cfeb296 100644
--- a/module/programplan/lang/en.php
+++ b/module/programplan/lang/en.php
@@ -110,7 +110,7 @@ $lang->programplan->ganttCustom['delayDays'] = 'Delay days';
$lang->programplan->error = new stdclass();
$lang->programplan->error->percentNumber = '"Workload %" must be digits.';
$lang->programplan->error->planFinishSmall = 'The "End" date must be > the "Begin" date.';
-$lang->programplan->error->percentOver = 'The sum of "Workload %" cannot exceed 100%.';
+$lang->programplan->error->percentOver = 'The sum of "Workload %" cannot exceed 100% of one stage.';
$lang->programplan->error->createdTask = 'The task is decomposed. Sub stages cannot be added.';
$lang->programplan->error->parentWorkload = 'The sum of the workload in the sub stage cannot be > that in the parent stage: %s.';
$lang->programplan->error->parentDuration = 'The planned start and planned completion of the child phase cannot exceed the parent phase.';
@@ -119,6 +119,7 @@ $lang->programplan->error->sameCode = 'Stage code cannot be the same!';
$lang->programplan->error->taskDrag = 'The %s task cannot be dragged';
$lang->programplan->error->planDrag = 'The %s stage cannot be dragged';
$lang->programplan->error->notStage = $lang->executionCommon . '/Kanban cannot create a sub stage.';
+$lang->programplan->error->sameType = 'Type of the stage must be as same as parent: "%s"';
$lang->programplan->ganttBrowseType['gantt'] = 'Group by Stage';
$lang->programplan->ganttBrowseType['assignedTo'] = 'Group by AssignedTo';
diff --git a/module/programplan/lang/fr.php b/module/programplan/lang/fr.php
index 7b1a58d0cf..5068fce91a 100644
--- a/module/programplan/lang/fr.php
+++ b/module/programplan/lang/fr.php
@@ -110,7 +110,7 @@ $lang->programplan->ganttCustom['delayDays'] = 'Delay days';
$lang->programplan->error = new stdclass();
$lang->programplan->error->percentNumber = '"Workload %" must be digits.';
$lang->programplan->error->planFinishSmall = 'The "End" date must be > the "Begin" date.';
-$lang->programplan->error->percentOver = 'The sum of "Workload %" cannot exceed 100%.';
+$lang->programplan->error->percentOver = 'The sum of "Workload %" cannot exceed 100% of one stage.';
$lang->programplan->error->createdTask = 'The task has been decomposed. Sub phases cannot be added.';
$lang->programplan->error->parentWorkload = 'The sum of the workload of the child phase cannot be greater than that of the parent phase: %s.';
$lang->programplan->error->parentDuration = 'The planned start and planned completion of the child phase cannot exceed the parent phase.';
@@ -119,6 +119,7 @@ $lang->programplan->error->sameCode = 'Stage code cannot be the same!';
$lang->programplan->error->taskDrag = 'The %s task cannot be dragged';
$lang->programplan->error->planDrag = 'The %s stage cannot be dragged';
$lang->programplan->error->notStage = $lang->executionCommon . '/Kanban cannot create a sub stage.';
+$lang->programplan->error->sameType = 'Type of the stage must be as same as parent: "%s"';
$lang->programplan->ganttBrowseType['gantt'] = 'Group by Stage';
$lang->programplan->ganttBrowseType['assignedTo'] = 'Group by AssignedTo';
diff --git a/module/programplan/lang/vi.php b/module/programplan/lang/vi.php
index da516686a2..0a5cb7e8cb 100644
--- a/module/programplan/lang/vi.php
+++ b/module/programplan/lang/vi.php
@@ -68,6 +68,7 @@ $lang->programplan->stageCustom->task = 'Show Task';
$lang->programplan->error = new stdclass();
$lang->programplan->error->percentNumber = '"Workload %" must be digits.';
$lang->programplan->error->planFinishSmall = 'The "End" date must be > the "Begin" date.';
-$lang->programplan->error->percentOver = 'The sum of "Workload %" cannot exceed 100%.';
+$lang->programplan->error->percentOver = 'The sum of "Workload %" cannot exceed 100% of one stage.';
$lang->programplan->error->createdTask = 'The task has been decomposed. Sub phases cannot be added.';
$lang->programplan->error->parentWorkload = 'The sum of the workload of the child phase cannot be greater than that of the parent phase: %s.';
+$lang->programplan->error->sameType = 'Type of the stage must be as same as parent: "%s"';
diff --git a/module/programplan/lang/zh-cn.php b/module/programplan/lang/zh-cn.php
index eb55d08810..fcf4a5d0d6 100644
--- a/module/programplan/lang/zh-cn.php
+++ b/module/programplan/lang/zh-cn.php
@@ -110,7 +110,7 @@ $lang->programplan->ganttCustom['delayDays'] = '延期天数';
$lang->programplan->error = new stdclass();
$lang->programplan->error->percentNumber = '"工作量占比"必须为数字';
$lang->programplan->error->planFinishSmall = '"计划完成时间"必须大于"计划开始时间"';
-$lang->programplan->error->percentOver = '工作量占比累计不应当超过100%';
+$lang->programplan->error->percentOver = '相同父阶段的子阶段工作量占比之和不超过100%';
$lang->programplan->error->createdTask = '已分解任务,不可添加子阶段';
$lang->programplan->error->parentWorkload = '子阶段的工作量之和不能大于父阶段的工作量:%s';
$lang->programplan->error->parentDuration = '子阶段计划开始、计划完成不能超过父阶段';
@@ -119,6 +119,7 @@ $lang->programplan->error->sameCode = '阶段代号不能相同!';
$lang->programplan->error->taskDrag = '%s的任务不可以拖动';
$lang->programplan->error->planDrag = '%s的阶段不可以拖动';
$lang->programplan->error->notStage = $lang->executionCommon . '/看板不支持创建子阶段';
+$lang->programplan->error->sameType = '父阶段类型为"%s",阶段类型需与父阶段一致';
$lang->programplan->ganttBrowseType['gantt'] = '按阶段分组';
$lang->programplan->ganttBrowseType['assignedTo'] = '按指派给分组';
diff --git a/module/project/control.php b/module/project/control.php
index 617d7b6cd6..c6d9d53c0a 100755
--- a/module/project/control.php
+++ b/module/project/control.php
@@ -167,10 +167,16 @@ class project extends control
public function ajaxGetCopyProjects()
{
$data = fixer::input('post')->get();
+
+ $model = $data->model;
+ if($data->model == 'agileplus') $model = array('scrum', 'agileplus');
+ if($data->model == 'waterfallplus') $model = array('waterfall', 'waterfallplus');
+
$projectPairs = $this->dao->select('id, name')->from(TABLE_PROJECT)
->where('type')->eq('project')
->andWhere('deleted')->eq(0)
->andWhere('vision')->eq($this->config->vision)
+ ->andWhere('model')->in($model)
->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->projects)->fi()
->beginIF(trim($data->name))->andWhere('name')->like("%$data->name%")->fi()
->fetchPairs();
@@ -545,14 +551,14 @@ class project extends control
}
}
+ $extra = str_replace(array(',', ' '), array('&', ''), $extra);
+ parse_str($extra, $output);
+
if($this->app->tab == 'program' and $programID) $this->loadModel('program')->setMenu($programID);
if($this->app->tab == 'product' and !empty($output['productID'])) $this->loadModel('product')->setMenu($output['productID']);
if($this->app->tab == 'doc') unset($this->lang->doc->menu->project['subMenu']);
$this->session->set('projectModel', $model);
- $extra = str_replace(array(',', ' '), array('&', ''), $extra);
- parse_str($extra, $output);
-
$name = '';
$code = '';
$team = '';
diff --git a/module/project/lang/de.php b/module/project/lang/de.php
index dfd375a94d..91198d2690 100644
--- a/module/project/lang/de.php
+++ b/module/project/lang/de.php
@@ -272,7 +272,7 @@ $lang->project->modelList['scrum'] = "Scrum";
if(helper::hasFeature('waterfall')) $lang->project->modelList['waterfall'] = "CMMI";
$lang->project->modelList['kanban'] = "Kanban";
$lang->project->modelList['agileplus'] = "Agile +";
-if(helper::hasFeature('waterfall')) $lang->project->modelList['waterfallplus'] = "Waterfall +";
+if(helper::hasFeature('waterfallplus')) $lang->project->modelList['waterfallplus'] = "Waterfall +";
$lang->project->featureBar['browse']['all'] = 'All';
$lang->project->featureBar['browse']['undone'] = 'Unfinished';
diff --git a/module/project/lang/en.php b/module/project/lang/en.php
index d25999685f..5092070e59 100644
--- a/module/project/lang/en.php
+++ b/module/project/lang/en.php
@@ -272,7 +272,7 @@ $lang->project->modelList['scrum'] = "Scrum";
if(helper::hasFeature('waterfall')) $lang->project->modelList['waterfall'] = "CMMI";
$lang->project->modelList['kanban'] = "Kanban";
$lang->project->modelList['agileplus'] = "Agile +";
-if(helper::hasFeature('waterfall')) $lang->project->modelList['waterfallplus'] = "Waterfall +";
+if(helper::hasFeature('waterfallplus')) $lang->project->modelList['waterfallplus'] = "Waterfall +";
$lang->project->featureBar['browse']['all'] = 'All';
$lang->project->featureBar['browse']['undone'] = 'Unfinished';
diff --git a/module/project/lang/fr.php b/module/project/lang/fr.php
index 5e82bde244..73c3749268 100644
--- a/module/project/lang/fr.php
+++ b/module/project/lang/fr.php
@@ -272,7 +272,7 @@ $lang->project->modelList['scrum'] = "Scrum";
if(helper::hasFeature('waterfall')) $lang->project->modelList['waterfall'] = "CMMI";
$lang->project->modelList['kanban'] = "Kanban";
$lang->project->modelList['agileplus'] = "Agile +";
-if(helper::hasFeature('waterfall')) $lang->project->modelList['waterfallplus'] = "Waterfall +";
+if(helper::hasFeature('waterfallplus')) $lang->project->modelList['waterfallplus'] = "Waterfall +";
$lang->project->featureBar['browse']['all'] = 'All';
$lang->project->featureBar['browse']['undone'] = 'Non Terminées';
diff --git a/module/project/lang/zh-cn.php b/module/project/lang/zh-cn.php
index be8f261079..6721e62b8c 100644
--- a/module/project/lang/zh-cn.php
+++ b/module/project/lang/zh-cn.php
@@ -272,7 +272,7 @@ $lang->project->modelList['scrum'] = "Scrum";
if(helper::hasFeature('waterfall')) $lang->project->modelList['waterfall'] = "瀑布";
$lang->project->modelList['kanban'] = "看板";
$lang->project->modelList['agileplus'] = "融合敏捷";
-if(helper::hasFeature('waterfall')) $lang->project->modelList['waterfallplus'] = "融合瀑布";
+if(helper::hasFeature('waterfallplus')) $lang->project->modelList['waterfallplus'] = "融合瀑布";
$lang->project->featureBar['browse']['all'] = '全部';
$lang->project->featureBar['browse']['undone'] = '未完成';
diff --git a/module/project/model.php b/module/project/model.php
index 10892907d5..cd23ccc3d0 100644
--- a/module/project/model.php
+++ b/module/project/model.php
@@ -818,13 +818,13 @@ class projectModel extends model
/**
* Get project pairs by programID.
*
- * @param int $programID
- * @param status $status all|wait|doing|suspended|closed|noclosed
- * @param bool $isQueryAll
- * @param string $orderBy
- * @param string $excludedModel
- * @param string $model
- * @param string $param multiple|product
+ * @param int $programID
+ * @param status $status all|wait|doing|suspended|closed|noclosed
+ * @param bool $isQueryAll
+ * @param string $orderBy
+ * @param string $excludedModel
+ * @param string|array $model
+ * @param string $param multiple|product
* @access public
* @return object
*/
@@ -839,7 +839,7 @@ class projectModel extends model
->beginIF($programID === 0)->andWhere('parent')->eq(0)->fi()
->beginIF($status != 'all' and $status != 'noclosed')->andWhere('status')->eq($status)->fi()
->beginIF($excludedModel)->andWhere('model')->ne($excludedModel)->fi()
- ->beginIF($model)->andWhere('model')->eq($model)->fi()
+ ->beginIF($model)->andWhere('model')->in($model)->fi()
->beginIF(strpos($param, 'multiple') !== false)->andWhere('multiple')->eq(1)->fi()
->beginIF(strpos($param, 'product') !== false)->andWhere('hasProduct')->eq(1)->fi()
->beginIF($status == 'noclosed')->andWhere('status')->ne('closed')->fi()
diff --git a/module/project/view/ajaxgetdropmenu.html.php b/module/project/view/ajaxgetdropmenu.html.php
index 6c51b4d224..b21bb7acc5 100644
--- a/module/project/view/ajaxgetdropmenu.html.php
+++ b/module/project/view/ajaxgetdropmenu.html.php
@@ -80,19 +80,19 @@ foreach($projects as $programID => $programProjects)
{
$link = $indexLink;
}
- elseif($project->model == 'scrum' and
+ elseif((in_array($project->model, array('scrum', 'agileplus'))) and
(
- (in_array($module, array('issue', 'risk', 'meeting')) and !helper::hasFeature("scrum_{$module}")) or
- ($module == 'report' and $method == 'projectsummary' and !helper::hasFeature("scrum_measrecord"))
+ (in_array($module, array('issue', 'risk', 'meeting')) and !helper::hasFeature("{$project->model}_{$module}")) or
+ ($module == 'report' and $method == 'projectsummary' and !helper::hasFeature("{$project->model}_measrecord"))
))
{
$link = $indexLink;
}
- elseif($project->model == 'waterfall' and
+ elseif(in_array($project->model, array('waterfall', 'waterfallplus')) and
(
- (in_array($module, array('issue', 'risk', 'opportunity', 'measrecord', 'auditplan', 'meeting')) and !helper::hasFeature("waterfall_{$module}")) or
- ($module == 'pssp' and !helper::hasFeature("waterfall_process")) or
- ($module == 'report' and $method == 'projectsummary' and !helper::hasFeature("scrum_measrecord"))
+ (in_array($module, array('issue', 'risk', 'opportunity', 'measrecord', 'auditplan', 'meeting')) and !helper::hasFeature("{$project->model}_{$module}")) or
+ ($module == 'pssp' and !helper::hasFeature("{$project->model}_process")) or
+ ($module == 'report' and $method == 'projectsummary' and !helper::hasFeature("{$project->model}_measrecord"))
))
{
$link = $indexLink;
diff --git a/module/project/view/createguide.html.php b/module/project/view/createguide.html.php
index 14a5710c35..83a4e2912a 100644
--- a/module/project/view/createguide.html.php
+++ b/module/project/view/createguide.html.php
@@ -29,7 +29,9 @@
tab;
if($tab == 'product') $tab = 'project';
- $hasWaterfall = helper::hasFeature('waterfall');
+
+ $hasWaterfall = helper::hasFeature('waterfall');
+ $hasWaterfallPlus = helper::hasFeature('waterfallplus');
?>
createLink("project", "create", "model=scrum&programID=$programID©ProjectID=0&extra=productID=$productID,branchID=$branchID"), "  ", '', "data-app='{$tab}' class='createButton'")?>
@@ -60,7 +62,7 @@
project->agileplusTitle;?>
-
+
createLink("project", "create", "model=waterfallplus&programID=$programID©ProjectID=0&extra=productID=$productID,branchID=$branchID"), "  ", '', "data-app='{$tab}' class='createButton'")?>
diff --git a/module/stage/control.php b/module/stage/control.php
index 1012136791..fe00fe1b34 100644
--- a/module/stage/control.php
+++ b/module/stage/control.php
@@ -15,13 +15,19 @@ class stage extends control
* Browse stages.
*
* @param string $orderBy
+ * @param string $type
* @access public
* @return void
*/
- public function browse($orderBy = "id_asc")
+ public function browse($orderBy = "id_asc", $type = 'waterfall')
{
- $this->view->stages = $this->stage->getStages($orderBy);
+ if($type == 'waterfallplus') $this->locate($this->createLink('stage', 'plusBrowse', "orderBy=$orderBy&type=waterfallplus"));
+
+ $this->stage->setMenu($type);
+
+ $this->view->stages = $this->stage->getStages($orderBy, 0, $type);
$this->view->orderBy = $orderBy;
+ $this->view->type = $type;
$this->view->title = $this->lang->stage->common . $this->lang->colon . $this->lang->stage->browse;
$this->view->position[] = $this->lang->stage->common;
$this->view->position[] = $this->lang->stage->browse;
@@ -30,16 +36,41 @@ class stage extends control
}
/**
- * Create a stage.
+ * Browse stages.
*
+ * @param string $orderBy
* @access public
* @return void
*/
- public function create()
+ public function plusBrowse($orderBy = "id_asc", $type = 'waterfallplus')
{
+ if($type == 'waterfall') $this->locate($this->createLink('stage', 'browse', "orderBy=$orderBy&type=waterfall"));
+
+ $this->stage->setMenu($type);
+
+ $this->view->stages = $this->stage->getStages($orderBy, 0, $type);
+ $this->view->orderBy = $orderBy;
+ $this->view->type = $type;
+ $this->view->title = $this->lang->stage->common . $this->lang->colon . $this->lang->stage->browse;
+ $this->view->position[] = $this->lang->stage->common;
+ $this->view->position[] = $this->lang->stage->browse;
+
+ $this->display('stage', 'browse');
+ }
+
+ /**
+ * Create a stage.
+ *
+ * @param string $type
+ * @access public
+ * @return void
+ */
+ public function create($type = 'waterfall')
+ {
+ $this->stage->setMenu($type);
if($_POST)
{
- $stageID = $this->stage->create();
+ $stageID = $this->stage->create($type);
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
$response['result'] = 'success';
@@ -52,7 +83,7 @@ class stage extends control
}
$this->loadModel('action')->create('stage', $stageID, 'Opened');
- $response['locate'] = inlink('browse');
+ $response['locate'] = inlink($type == 'waterfall' ? 'browse' : 'plusBrowse', "orderBy=id_asc&type=$type");
return $this->send($response);
}
@@ -66,14 +97,16 @@ class stage extends control
/**
* Batch create stages.
*
+ * @param string $type
* @access public
* @return void
*/
- public function batchCreate()
+ public function batchCreate($type = 'waterfall')
{
+ $this->stage->setMenu($type);
if($_POST)
{
- $this->stage->batchCreate();
+ $this->stage->batchCreate($type);
$response['result'] = 'success';
$response['message'] = $this->lang->saveSuccess;
@@ -84,7 +117,7 @@ class stage extends control
return $this->send($response);
}
- $response['locate'] = inlink('browse');
+ $response['locate'] = inlink($type == 'waterfall' ? 'browse' : 'plusBrowse', "orderBy=id_asc&type=$type");
return $this->send($response);
}
@@ -105,6 +138,7 @@ class stage extends control
public function edit($stageID = 0)
{
$stage = $this->stage->getByID($stageID);
+ $this->stage->setMenu($stage->projectType);
if($_POST)
{
$changes = $this->stage->update($stageID);
@@ -120,7 +154,7 @@ class stage extends control
$actionID = $this->loadModel('action')->create('stage', $stageID, 'Edited');
if(!empty($changes)) $this->action->logHistory($actionID, $changes);
- $response['locate'] = inlink('browse');
+ $response['locate'] = inlink($type == 'waterfall' ? 'browse' : 'plusBrowse', "orderBy=id_asc&type=$stage->projectType");
return $this->send($response);
}
diff --git a/module/stage/lang/de.php b/module/stage/lang/de.php
index e2f736148b..7af6a877ca 100644
--- a/module/stage/lang/de.php
+++ b/module/stage/lang/de.php
@@ -10,12 +10,13 @@
* @link http://www.zentao.net
*/
/* Actions. */
-$lang->stage->browse = 'Stage List';
+$lang->stage->browse = 'Waterfall Stage List';
$lang->stage->create = 'Create Stage';
$lang->stage->batchCreate = 'Batch Create';
$lang->stage->edit = 'Edit';
$lang->stage->delete = 'Delete';
$lang->stage->view = 'Details';
+$lang->stage->plusBrowse = 'Waterfall Plus Stage List';
/* Fields. */
$lang->stage->id = 'ID';
diff --git a/module/stage/lang/en.php b/module/stage/lang/en.php
index e2f736148b..7af6a877ca 100644
--- a/module/stage/lang/en.php
+++ b/module/stage/lang/en.php
@@ -10,12 +10,13 @@
* @link http://www.zentao.net
*/
/* Actions. */
-$lang->stage->browse = 'Stage List';
+$lang->stage->browse = 'Waterfall Stage List';
$lang->stage->create = 'Create Stage';
$lang->stage->batchCreate = 'Batch Create';
$lang->stage->edit = 'Edit';
$lang->stage->delete = 'Delete';
$lang->stage->view = 'Details';
+$lang->stage->plusBrowse = 'Waterfall Plus Stage List';
/* Fields. */
$lang->stage->id = 'ID';
diff --git a/module/stage/lang/fr.php b/module/stage/lang/fr.php
index e2f736148b..7af6a877ca 100644
--- a/module/stage/lang/fr.php
+++ b/module/stage/lang/fr.php
@@ -10,12 +10,13 @@
* @link http://www.zentao.net
*/
/* Actions. */
-$lang->stage->browse = 'Stage List';
+$lang->stage->browse = 'Waterfall Stage List';
$lang->stage->create = 'Create Stage';
$lang->stage->batchCreate = 'Batch Create';
$lang->stage->edit = 'Edit';
$lang->stage->delete = 'Delete';
$lang->stage->view = 'Details';
+$lang->stage->plusBrowse = 'Waterfall Plus Stage List';
/* Fields. */
$lang->stage->id = 'ID';
diff --git a/module/stage/lang/zh-cn.php b/module/stage/lang/zh-cn.php
index 8016239070..74db4344db 100644
--- a/module/stage/lang/zh-cn.php
+++ b/module/stage/lang/zh-cn.php
@@ -10,12 +10,13 @@
* @link http://www.zentao.net
*/
/* Actions. */
-$lang->stage->browse = '阶段列表';
+$lang->stage->browse = '瀑布阶段列表';
$lang->stage->create = '新建';
$lang->stage->batchCreate = '批量新建';
$lang->stage->edit = '编辑';
$lang->stage->delete = '删除';
$lang->stage->view = '阶段详情';
+$lang->stage->plusBrowse = '融合瀑布阶段列表';
/* Fields. */
$lang->stage->id = '编号';
diff --git a/module/stage/model.php b/module/stage/model.php
index b4e616d0fe..78e1ce28c6 100644
--- a/module/stage/model.php
+++ b/module/stage/model.php
@@ -19,14 +19,15 @@ class stageModel extends model
* @access public
* @return int|bool
*/
- public function create()
+ public function create($type = 'waterfall')
{
$stage = fixer::input('post')
+ ->setDefault('projectType', $type)
->add('createdBy', $this->app->user->account)
->add('createdDate', helper::today())
->get();
- $totalPercent = $this->getTotalPercent();
+ $totalPercent = $this->getTotalPercent($type);
if(!is_numeric($stage->percent)) return dao::$errors['message'][] = $this->lang->stage->error->notNum;
if(round($totalPercent + $stage->percent) > 100) return dao::$errors['message'][] = $this->lang->stage->error->percentOver;
@@ -48,11 +49,11 @@ class stageModel extends model
* @access public
* @return bool
*/
- public function batchCreate()
+ public function batchCreate($type = 'waterfall')
{
$data = fixer::input('post')->get();
- $totalPercent = $this->getTotalPercent();
+ $totalPercent = $this->getTotalPercent($type);
if(round($totalPercent + array_sum($data->percent)) > 100) return dao::$errors['message'][] = $this->lang->stage->error->percentOver;
@@ -65,6 +66,7 @@ class stageModel extends model
$stage->name = $name;
$stage->percent = $data->percent[$i];
$stage->type = $data->type[$i];
+ $stage->projectType = $type;
$stage->createdBy = $this->app->user->account;
$stage->createdDate = helper::today();
@@ -98,7 +100,7 @@ class stageModel extends model
->add('editedDate', helper::today())
->get();
- $totalPercent = $this->getTotalPercent();
+ $totalPercent = $this->getTotalPercent($oldStage->projectType);
if(round($totalPercent + $stage->percent - $oldStage->percent) > 100) return dao::$errors['message'][] = $this->lang->stage->error->percentOver;
@@ -118,10 +120,11 @@ class stageModel extends model
*
* @param string $orderBy
* @param int $projectID
+ * @param string $type
* @access public
* @return array
*/
- public function getStages($orderBy = 'id_desc', $projectID = 0)
+ public function getStages($orderBy = 'id_desc', $projectID = 0, $type = '')
{
if($projectID)
{
@@ -137,7 +140,7 @@ class stageModel extends model
}
else
{
- return $this->dao->select('*')->from(TABLE_STAGE)->where('deleted')->eq(0)->orderBy($orderBy)->fetchAll('id');
+ return $this->dao->select('*')->from(TABLE_STAGE)->where('deleted')->eq(0)->andWhere('projectType')->eq($type)->orderBy($orderBy)->fetchAll('id');
}
}
@@ -175,10 +178,41 @@ class stageModel extends model
/**
* Get stage total percent
*
- * return string
+ * @param string $type
+ * @return string
*/
- public function getTotalPercent()
+ public function getTotalPercent($type)
{
- return $this->dao->select('sum(percent) as total')->from(TABLE_STAGE)->where('deleted')->eq('0')->fetch('total');
+ return $this->dao->select('sum(percent) as total')->from(TABLE_STAGE)->where('deleted')->eq('0')->andWhere('projectType')->eq($type)->fetch('total');
+ }
+
+ /**
+ * Set menu.
+ *
+ * @param string $type
+ * @access public
+ * @return void
+ */
+ public function setMenu($type)
+ {
+ $this->app->loadLang('admin');
+ $moduleName = $this->app->rawModule;
+ $methodName = $this->app->rawMethod;
+ if(!isset($this->lang->admin->menuList->model['subMenu']['waterfall']['exclude'])) $this->lang->admin->menuList->model['subMenu']['waterfall']['exclude'] = '';
+ if(!isset($this->lang->admin->menuList->model['subMenu']['waterfallplus']['exclude'])) $this->lang->admin->menuList->model['subMenu']['agileplus']['exclude'] = '';
+ if($type == 'waterfall')
+ {
+ $this->lang->admin->menuList->model['subMenu']['waterfallplus']['exclude'] .= ",{$moduleName}-{$methodName}";
+ unset($this->lang->admin->menuList->model['subMenu']['scrum']['subModule']);
+ unset($this->lang->admin->menuList->model['subMenu']['scrumplus']['subModule']);
+ unset($this->lang->admin->menuList->model['subMenu']['waterfallplus']['subModule']);
+ }
+ if($type == 'waterfallplus')
+ {
+ $this->lang->admin->menuList->model['subMenu']['waterfall']['exclude'] .= ",{$moduleName}-{$methodName}";
+ unset($this->lang->admin->menuList->model['subMenu']['scrum']['subModule']);
+ unset($this->lang->admin->menuList->model['subMenu']['waterfall']['subModule']);
+ unset($this->lang->admin->menuList->model['subMenu']['scrumplus']['subModule']);
+ }
}
}
diff --git a/module/stage/view/browse.html.php b/module/stage/view/browse.html.php
index 266234a805..32d8a50a9c 100644
--- a/module/stage/view/browse.html.php
+++ b/module/stage/view/browse.html.php
@@ -17,40 +17,30 @@
stage->noStage;?>
- createLink('stage', 'create'), " " . $lang->stage->create, '', "class='btn btn-info'");?>
+ createLink('stage', 'create', "type={$type}"), " " . $lang->stage->create, '', "class='btn btn-info'");?>
-
-
-
-
- stage->setType);?>
- stage->browse, '', "class='selected'");?>
-
-
-
-
stage->browse;?>
- " . $lang->stage->batchCreate, '', "class='btn btn-primary'");?>
- " . $lang->stage->create, '', "class='btn btn-primary'");?>
+ " . $lang->stage->batchCreate, '', "class='btn btn-primary'");?>
+ " . $lang->stage->create, '', "class='btn btn-primary'");?>
-
+
| stage->id);?> |
stage->name);?> |
stage->percent);?> |
stage->type);?> |
- actions;?> |
+ actions;?> |
@@ -63,7 +53,7 @@
id", "", "list");
- common::printIcon('stage', 'delete', "stageID=$stage->id", "", "list", '', 'hiddenwin');
+ common::printIcon('stage', 'delete', "stageID=$stage->id", "", "list", 'trash', 'hiddenwin');
?>
|
diff --git a/module/stage/view/settype.html.php b/module/stage/view/settype.html.php
index 4dd7d72696..86f5e6fb03 100644
--- a/module/stage/view/settype.html.php
+++ b/module/stage/view/settype.html.php
@@ -29,16 +29,6 @@ EOT;
?>
-
-
-
-
- stage->setType, '', "class='selected'");?>
- stage->browse);?>
-
-
-
-
|