Merge branch 'master' of https://gitlab.zcorp.cc/easycorp/zentaopms into zentaopms_289

This commit is contained in:
tianshujie
2023-02-21 14:13:51 +08:00
79 changed files with 715 additions and 430 deletions
+1 -1
View File
@@ -28,7 +28,7 @@ class storyChangeEntry extends entry
$this->batchSetPost($fields, $oldStory); $this->batchSetPost($fields, $oldStory);
/* If reviewer is not post, set needNotReview. */ /* If reviewer is not post, set needNotReview. */
if(empty($this->request('reviewer'))) if(!$this->request('reviewer'))
{ {
$this->setPost('reviewer', array()); $this->setPost('reviewer', array());
$this->setPost('needNotReview', 1); $this->setPost('needNotReview', 1);
+8 -6
View File
@@ -429,9 +429,11 @@ $config->maxPriValue = '256';
$config->importWhiteList = array('user', 'task', 'story', 'bug', 'testcase', 'feedback', 'ticket'); $config->importWhiteList = array('user', 'task', 'story', 'bug', 'testcase', 'feedback', 'ticket');
$config->featureGroup = new stdclass(); $config->featureGroup = new stdclass();
$config->featureGroup->my = array('score'); $config->featureGroup->my = array('score');
$config->featureGroup->product = array('roadmap', 'track', 'UR'); $config->featureGroup->product = array('roadmap', 'track', 'UR');
$config->featureGroup->scrum = array(); $config->featureGroup->scrum = array();
$config->featureGroup->waterfall = array(); $config->featureGroup->waterfall = array();
$config->featureGroup->assetlib = array(); $config->featureGroup->agileplus = array();
$config->featureGroup->other = array('devops', 'kanban'); $config->featureGroup->waterfallplus = array();
$config->featureGroup->assetlib = array();
$config->featureGroup->other = array('devops', 'kanban');
+12
View File
@@ -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`; 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'); 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');
+13 -7
View File
@@ -6391,13 +6391,19 @@ REPLACE INTO `zt_lang` (`lang`, `module`, `section`, `key`, `value`, `system`) V
('all','stage','typeList','review','总结评审','1'), ('all','stage','typeList','review','总结评审','1'),
('all','stage','typeList','other','其他','1'); ('all','stage','typeList','other','其他','1');
REPLACE INTO `zt_stage` (`name`,`percent`,`type`,`createdBy`,`createdDate`,`editedBy`,`editedDate`,`deleted`) VALUES REPLACE INTO `zt_stage` (`name`,`percent`,`type`,`projectType`,`createdBy`,`createdDate`,`editedBy`,`editedDate`,`deleted`) VALUES
('需求','10','request','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'), ('需求','10','request','waterfall','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'), ('设计','10','design','waterfall','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'), ('开发','50','dev','waterfall','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'), ('测试','15','qa','waterfall','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'), ('发布','10','release','waterfall','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'); ('总结评审','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', 'custom', '', 'hourPoint', '0');
INSERT INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system', 'common', '', 'CRProduct', '1'); INSERT INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system', 'common', '', 'CRProduct', '1');
+2 -2
View File
@@ -96,7 +96,7 @@ class helper extends baseHelper
} }
else 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; $hasFeature = false;
$canConfigFeature = false; $canConfigFeature = false;
@@ -107,7 +107,7 @@ class helper extends baseHelper
if($feature == $group or $feature == $module) if($feature == $group or $feature == $module)
{ {
$canConfigFeature = true; $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; if(helper::hasFeature("{$group}") and helper::hasFeature("{$group}_{$module}")) $hasFeature = true;
} }
+5 -3
View File
@@ -86,9 +86,11 @@ $lang->admin->setModule->opened = 'Opened';
$lang->admin->setModule->closed = 'Closed'; $lang->admin->setModule->closed = 'Closed';
$lang->admin->setModule->my = 'My'; $lang->admin->setModule->my = 'My';
$lang->admin->setModule->product = 'Product'; $lang->admin->setModule->product = $lang->productCommon;
$lang->admin->setModule->scrum = 'Scrum Project'; $lang->admin->setModule->scrum = 'Scrum ' . $lang->projectCommon;
$lang->admin->setModule->waterfall = 'Waterfall Project'; $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->assetlib = 'Assetlib';
$lang->admin->setModule->other = 'Other'; $lang->admin->setModule->other = 'Other';
+5 -3
View File
@@ -86,9 +86,11 @@ $lang->admin->setModule->opened = 'Opened';
$lang->admin->setModule->closed = 'Closed'; $lang->admin->setModule->closed = 'Closed';
$lang->admin->setModule->my = 'My'; $lang->admin->setModule->my = 'My';
$lang->admin->setModule->product = 'Product'; $lang->admin->setModule->product = $lang->productCommon;
$lang->admin->setModule->scrum = 'Scrum Project'; $lang->admin->setModule->scrum = 'Scrum ' . $lang->projectCommon;
$lang->admin->setModule->waterfall = 'Waterfall Project'; $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->assetlib = 'Assetlib';
$lang->admin->setModule->other = 'Other'; $lang->admin->setModule->other = 'Other';
+5 -3
View File
@@ -86,9 +86,11 @@ $lang->admin->setModule->opened = 'Opened';
$lang->admin->setModule->closed = 'Closed'; $lang->admin->setModule->closed = 'Closed';
$lang->admin->setModule->my = 'My'; $lang->admin->setModule->my = 'My';
$lang->admin->setModule->product = 'Product'; $lang->admin->setModule->product = $lang->productCommon;
$lang->admin->setModule->scrum = 'Scrum Project'; $lang->admin->setModule->scrum = 'Scrum ' . $lang->projectCommon;
$lang->admin->setModule->waterfall = 'Waterfall Project'; $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->assetlib = 'Assetlib';
$lang->admin->setModule->other = 'Other'; $lang->admin->setModule->other = 'Other';
+40 -18
View File
@@ -75,26 +75,34 @@ $lang->admin->menuList->switch['subMenu']['setmodule'] = array('link' => "{$lang
$lang->admin->menuList->switch['menuOrder']['5'] = 'setmodule'; $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']['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']['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']['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']['5'] = 'common';
$lang->admin->menuList->model['menuOrder']['10'] = 'scrum'; $lang->admin->menuList->model['menuOrder']['10'] = 'scrum';
$lang->admin->menuList->model['menuOrder']['15'] = 'waterfall'; $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']['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']['stage'] = array('link' => "{$lang->stage->common}|stage|settype|", 'subModule' => 'stage', 'links' => array('stage|browse|'));
$lang->admin->menuList->model['tabMenu']['common']['flow'] = array('link' => "{$lang->custom->flow}|custom|flow|", 'divider' => true); $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']['code'] = array('link' => "{$lang->code}|custom|code|"); $lang->admin->menuList->model['tabMenu']['common']['flow'] = array('link' => "{$lang->custom->flow}|custom|flow|", 'divider' => true);
$lang->admin->menuList->model['tabMenu']['common']['hours'] = array('link' => "{$lang->workingHour}|custom|hours|", 'subModule' => 'holiday', 'links' => array('holiday|browse|')); $lang->admin->menuList->model['tabMenu']['common']['code'] = array('link' => "{$lang->code}|custom|code|");
$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']['common']['hours'] = array('link' => "{$lang->workingHour}|custom|hours|", 'subModule' => 'holiday', 'links' => array('holiday|browse|'));
$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['5'] = 'project'; $lang->admin->menuList->model['tabMenu']['waterfall']['stage'] = array('link' => "{$lang->stage->common}|stage|browse|", 'subModule' => 'stage', 'exclude' => 'stage-plusbrowse');
$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['10'] = 'build'; $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']['35'] = 'flow'; $lang->admin->menuList->model['tabMenu']['menuOrder']['common']['5'] = 'project';
$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['40'] = 'code'; $lang->admin->menuList->model['tabMenu']['menuOrder']['common']['7'] = 'stage';
$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['45'] = 'hours'; $lang->admin->menuList->model['tabMenu']['menuOrder']['common']['10'] = 'build';
$lang->admin->menuList->model['tabMenu']['menuOrder']['waterfall']['5'] = 'stage'; $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']['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'); $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']['20'] = 'editor';
$lang->admin->menuList->dev['menuOrder']['25'] = 'entry'; $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')) if(!helper::hasFeature('waterfall'))
{ {
unset($lang->admin->menuList->model['subMenu']['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']['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') 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']['scrum']);
unset($lang->admin->menuList->model['subMenu']['waterfall']); 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']['10']);
unset($lang->admin->menuList->model['menuOrder']['15']); 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']['product']);
unset($lang->admin->menuList->feature['subMenu']['execution']); unset($lang->admin->menuList->feature['subMenu']['execution']);
+5 -3
View File
@@ -86,9 +86,11 @@ $lang->admin->setModule->opened = '已开启';
$lang->admin->setModule->closed = '已关闭'; $lang->admin->setModule->closed = '已关闭';
$lang->admin->setModule->my = '地盘'; $lang->admin->setModule->my = '地盘';
$lang->admin->setModule->product = '产品'; $lang->admin->setModule->product = $lang->productCommon;
$lang->admin->setModule->scrum = '敏捷项目'; $lang->admin->setModule->scrum = '敏捷' . $lang->projectCommon;
$lang->admin->setModule->waterfall = '瀑布项目'; $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->assetlib = '资产库';
$lang->admin->setModule->other = '通用功能'; $lang->admin->setModule->other = '通用功能';
+1 -1
View File
@@ -299,7 +299,7 @@ class backupModel extends model
$summaryFile = dirname($backup) . DS . 'summary'; $summaryFile = dirname($backup) . DS . 'summary';
if(!file_exists($summaryFile)) return array(); 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(); return isset($summary[basename($backup)]) ? $summary[basename($backup)] : array();
} }
+33 -5
View File
@@ -78,7 +78,25 @@ class block extends control
elseif(isset($this->lang->block->moduleList[$module])) elseif(isset($this->lang->block->moduleList[$module]))
{ {
$this->get->set('mode', 'getblocklist'); $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->blocks = $this->fetch('block', 'main', "module=$module&id=$id");
$this->view->module = $module; $this->view->module = $module;
} }
@@ -253,10 +271,20 @@ class block extends control
$shortBlocks = $longBlocks = array(); $shortBlocks = $longBlocks = array();
foreach($blocks as $key => $block) foreach($blocks as $key => $block)
{ {
if($block->block == 'waterfallrisk' and !helper::hasFeature('waterfall_risk')) continue; if(in_array($block->block, array('waterfallrisk', 'waterfallissue')))
if($block->block == 'waterfallissue' and !helper::hasFeature('waterfall_issue')) continue; {
if($block->block == 'scrumrisk' and !helper::hasFeature('scrum_risk')) continue; $model = isset($project->model) ? $project->model : 'waterfall';
if($block->block == 'scrumissue' and !helper::hasFeature('scrum_issue')) continue; 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])) if(!empty($block->source) and $block->source != 'todo' and !empty($acls['views']) and !isset($acls['views'][$block->source]))
{ {
unset($blocks[$key]); unset($blocks[$key]);
-1
View File
@@ -1,4 +1,3 @@
<?php <?php
/** /**
* The case block view file of block module of ZenTaoPMS. * The case block view file of block module of ZenTaoPMS.
+39 -37
View File
@@ -49,43 +49,44 @@ $lang->runInfo = "<div class='row'><div class='u-1 a-center' id='debugbar
$lang->agreement = "I have read and agreed to the terms and conditions of <a href='http://zpl.pub/page/zplv12.html' target='_blank'> Z PUBLIC LICENSE 1.2 </a>. <span class='text-danger'>Without authorization, I should not remove, hide or cover any logos/links of ZenTao.</span>"; $lang->agreement = "I have read and agreed to the terms and conditions of <a href='http://zpl.pub/page/zplv12.html' target='_blank'> Z PUBLIC LICENSE 1.2 </a>. <span class='text-danger'>Without authorization, I should not remove, hide or cover any logos/links of ZenTao.</span>";
$lang->designedByAIUX = "<a href='https://api.zentao.net/goto.php?item=aiux' class='link-aiux' target='_blank'><i class='icon icon-aiux'></i> AIUX</a>"; $lang->designedByAIUX = "<a href='https://api.zentao.net/goto.php?item=aiux' class='link-aiux' target='_blank'><i class='icon icon-aiux'></i> AIUX</a>";
$lang->reset = 'Zurücksetzen'; $lang->reset = 'Zurücksetzen';
$lang->cancel = 'Abbrechen'; $lang->cancel = 'Abbrechen';
$lang->refresh = 'Aktualisieren'; $lang->refresh = 'Aktualisieren';
$lang->refreshIcon = "<i title='$lang->refresh' class='icon icon-refresh'></i>"; $lang->refreshIcon = "<i title='$lang->refresh' class='icon icon-refresh'></i>";
$lang->create = 'Create'; $lang->create = 'Create';
$lang->edit = 'Bearbeiten'; $lang->edit = 'Bearbeiten';
$lang->delete = 'Löschen'; $lang->delete = 'Löschen';
$lang->activate = 'Activate'; $lang->activate = 'Activate';
$lang->close = 'Schließen'; $lang->close = 'Schließen';
$lang->unlink = 'Entfernen'; $lang->unlink = 'Entfernen';
$lang->import = 'Importieren'; $lang->import = 'Importieren';
$lang->export = 'Exportieren'; $lang->export = 'Exportieren';
$lang->setFileName = 'Dateiame'; $lang->setFileName = 'Dateiame';
$lang->submitting = 'Speichern...'; $lang->submitting = 'Speichern...';
$lang->save = 'Speichern'; $lang->save = 'Speichern';
$lang->confirm = 'Bestätigen'; $lang->confirm = 'Bestätigen';
$lang->preview = 'Ansehen'; $lang->preview = 'Ansehen';
$lang->goback = 'Zurück'; $lang->goback = 'Zurück';
$lang->goPC = 'PC'; $lang->goPC = 'PC';
$lang->more = 'Mehr'; $lang->more = 'Mehr';
$lang->moreLink = 'MORE'; $lang->moreLink = 'MORE';
$lang->day = 'Tag'; $lang->day = 'Tag';
$lang->customConfig = 'Custom Config'; $lang->customConfig = 'Custom Config';
$lang->public = 'Öffentlich'; $lang->public = 'Öffentlich';
$lang->trunk = 'Trunk'; $lang->trunk = 'Trunk';
$lang->sort = 'Sortieren'; $lang->sort = 'Sortieren';
$lang->required = 'Pflicht'; $lang->required = 'Pflicht';
$lang->noData = 'Kein Datensatz'; $lang->noData = 'Kein Datensatz';
$lang->fullscreen = 'Fullscreen'; $lang->fullscreen = 'Fullscreen';
$lang->retrack = 'Retrack'; $lang->retrack = 'Retrack';
$lang->whitelist = 'Weiße Liste'; $lang->whitelist = 'Weiße Liste';
$lang->globalSetting = 'Common'; $lang->globalSetting = 'Common';
$lang->waterfallModel = 'Waterfall'; $lang->waterfallModel = 'Waterfall';
$lang->scrumModel = 'Scrum'; $lang->scrumModel = 'Scrum';
$lang->agilePlusModel = 'Agile Plus'; $lang->agilePlusModel = 'Agile Plus';
$lang->all = 'All'; $lang->waterfallPlusModel = 'Waterfall Plus';
$lang->viewDetails = 'View Details'; $lang->all = 'All';
$lang->viewDetails = 'View Details';
$lang->actions = 'Aktionen'; $lang->actions = 'Aktionen';
$lang->restore = 'Wiederherstellen'; $lang->restore = 'Wiederherstellen';
@@ -188,6 +189,7 @@ $lang->team->common = 'Team';
$lang->user->common = 'User'; $lang->user->common = 'User';
$lang->custom->common = 'Custom'; $lang->custom->common = 'Custom';
$lang->custom->mode = 'Mode'; $lang->custom->mode = 'Mode';
$lang->custom->flow = 'Concept';
$lang->extension->common = 'Extension'; $lang->extension->common = 'Extension';
$lang->company->common = 'Company'; $lang->company->common = 'Company';
$lang->dept->common = 'Dept'; $lang->dept->common = 'Dept';
+39 -37
View File
@@ -49,43 +49,44 @@ $lang->runInfo = "<div class='row'><div class='u-1 a-center' id='debugbar
$lang->agreement = "I have read and agreed to the terms and conditions. <span class='text-danger'>Without authorization, I should not remove, hide or cover any logos/links of ZenTao.</span>"; $lang->agreement = "I have read and agreed to the terms and conditions. <span class='text-danger'>Without authorization, I should not remove, hide or cover any logos/links of ZenTao.</span>";
$lang->designedByAIUX = "<a href='https://api.zentao.net/goto.php?item=aiux' class='link-aiux' target='_blank'><i class='icon icon-aiux'></i> AIUX</a>"; $lang->designedByAIUX = "<a href='https://api.zentao.net/goto.php?item=aiux' class='link-aiux' target='_blank'><i class='icon icon-aiux'></i> AIUX</a>";
$lang->reset = 'Reset'; $lang->reset = 'Reset';
$lang->cancel = 'Cancel'; $lang->cancel = 'Cancel';
$lang->refresh = 'Refresh'; $lang->refresh = 'Refresh';
$lang->refreshIcon = "<i title='$lang->refresh' class='icon icon-refresh'></i>"; $lang->refreshIcon = "<i title='$lang->refresh' class='icon icon-refresh'></i>";
$lang->create = 'Create'; $lang->create = 'Create';
$lang->edit = 'Edit'; $lang->edit = 'Edit';
$lang->delete = 'Delete'; $lang->delete = 'Delete';
$lang->activate = 'Activate'; $lang->activate = 'Activate';
$lang->close = 'Close'; $lang->close = 'Close';
$lang->unlink = 'Unlink'; $lang->unlink = 'Unlink';
$lang->import = 'Import'; $lang->import = 'Import';
$lang->export = 'Export'; $lang->export = 'Export';
$lang->setFileName = 'File Name'; $lang->setFileName = 'File Name';
$lang->submitting = 'Saving...'; $lang->submitting = 'Saving...';
$lang->save = 'Save'; $lang->save = 'Save';
$lang->confirm = 'Confirm'; $lang->confirm = 'Confirm';
$lang->preview = 'View'; $lang->preview = 'View';
$lang->goback = 'Back'; $lang->goback = 'Back';
$lang->goPC = 'PC'; $lang->goPC = 'PC';
$lang->more = 'More'; $lang->more = 'More';
$lang->moreLink = 'MORE'; $lang->moreLink = 'MORE';
$lang->day = ' Day'; $lang->day = ' Day';
$lang->customConfig = 'Custom Config'; $lang->customConfig = 'Custom Config';
$lang->public = 'Public'; $lang->public = 'Public';
$lang->trunk = 'Trunk'; $lang->trunk = 'Trunk';
$lang->sort = 'Order'; $lang->sort = 'Order';
$lang->required = 'Required'; $lang->required = 'Required';
$lang->noData = 'No data.'; $lang->noData = 'No data.';
$lang->fullscreen = 'Fullscreen'; $lang->fullscreen = 'Fullscreen';
$lang->retrack = 'Retrack'; $lang->retrack = 'Retrack';
$lang->whitelist = 'Access whitelist'; $lang->whitelist = 'Access whitelist';
$lang->globalSetting = 'Common'; $lang->globalSetting = 'Common';
$lang->waterfallModel = 'Waterfall'; $lang->waterfallModel = 'Waterfall';
$lang->scrumModel = 'Scrum'; $lang->scrumModel = 'Scrum';
$lang->agilePlusModel = 'Agile Plus'; $lang->agilePlusModel = 'Agile Plus';
$lang->all = 'All'; $lang->waterfallPlusModel = 'Waterfall Plus';
$lang->viewDetails = 'View Details'; $lang->all = 'All';
$lang->viewDetails = 'View Details';
$lang->actions = 'Action'; $lang->actions = 'Action';
$lang->restore = 'Reset'; $lang->restore = 'Reset';
@@ -188,6 +189,7 @@ $lang->team->common = 'Team';
$lang->user->common = 'User'; $lang->user->common = 'User';
$lang->custom->common = 'Custom'; $lang->custom->common = 'Custom';
$lang->custom->mode = 'Mode'; $lang->custom->mode = 'Mode';
$lang->custom->flow = 'Concept';
$lang->extension->common = 'Extension'; $lang->extension->common = 'Extension';
$lang->company->common = 'Company'; $lang->company->common = 'Company';
$lang->dept->common = 'Dept'; $lang->dept->common = 'Dept';
+39 -37
View File
@@ -49,43 +49,44 @@ $lang->runInfo = "<div class='row'><div class='u-1 a-center' id='debugbar
$lang->agreement = "J'ai lu et j'accepte les termes et conditions de la <a href='http://zpl.pub/page/zplv12.html' target='_blank'> Z PUBLIC LICENSE 1.2 </a>. <span class='text-danger'>Sans autorisation, je ne dois pas supprimer, masquer ou couvrir les logos / liens de ZenTao.</span>"; $lang->agreement = "J'ai lu et j'accepte les termes et conditions de la <a href='http://zpl.pub/page/zplv12.html' target='_blank'> Z PUBLIC LICENSE 1.2 </a>. <span class='text-danger'>Sans autorisation, je ne dois pas supprimer, masquer ou couvrir les logos / liens de ZenTao.</span>";
$lang->designedByAIUX = "<a href='https://api.zentao.net/goto.php?item=aiux' class='link-aiux' target='_blank'><i class='icon icon-aiux'></i> AIUX</a>"; $lang->designedByAIUX = "<a href='https://api.zentao.net/goto.php?item=aiux' class='link-aiux' target='_blank'><i class='icon icon-aiux'></i> AIUX</a>";
$lang->reset = 'Réinitialiser'; $lang->reset = 'Réinitialiser';
$lang->cancel = 'Annuler'; $lang->cancel = 'Annuler';
$lang->refresh = 'Rafraichir'; $lang->refresh = 'Rafraichir';
$lang->refreshIcon = "<i title='$lang->refresh' class='icon icon-refresh'></i>"; $lang->refreshIcon = "<i title='$lang->refresh' class='icon icon-refresh'></i>";
$lang->create = 'Create'; $lang->create = 'Create';
$lang->edit = 'Editer'; $lang->edit = 'Editer';
$lang->delete = 'Supprimer'; $lang->delete = 'Supprimer';
$lang->activate = 'Activate'; $lang->activate = 'Activate';
$lang->close = 'Fermer'; $lang->close = 'Fermer';
$lang->unlink = 'Dissocier'; $lang->unlink = 'Dissocier';
$lang->import = 'Importer'; $lang->import = 'Importer';
$lang->export = 'Exporter'; $lang->export = 'Exporter';
$lang->setFileName = 'Nom du Fichier'; $lang->setFileName = 'Nom du Fichier';
$lang->submitting = 'Enregistrement...'; $lang->submitting = 'Enregistrement...';
$lang->save = 'Sauvegarde'; $lang->save = 'Sauvegarde';
$lang->confirm = 'Confirmer'; $lang->confirm = 'Confirmer';
$lang->preview = 'Consulter'; $lang->preview = 'Consulter';
$lang->goback = 'Retour'; $lang->goback = 'Retour';
$lang->goPC = 'PC'; $lang->goPC = 'PC';
$lang->more = 'Plus'; $lang->more = 'Plus';
$lang->moreLink = 'MORE'; $lang->moreLink = 'MORE';
$lang->day = 'Jour'; $lang->day = 'Jour';
$lang->customConfig = 'Personnalisation'; $lang->customConfig = 'Personnalisation';
$lang->public = 'Public'; $lang->public = 'Public';
$lang->trunk = 'Tronc'; $lang->trunk = 'Tronc';
$lang->sort = 'Ordre'; $lang->sort = 'Ordre';
$lang->required = 'Obligatoire'; $lang->required = 'Obligatoire';
$lang->noData = 'No data.'; $lang->noData = 'No data.';
$lang->fullscreen = 'Plein Ecran'; $lang->fullscreen = 'Plein Ecran';
$lang->retrack = 'Réduire'; $lang->retrack = 'Réduire';
$lang->whitelist = 'Liste blanche'; $lang->whitelist = 'Liste blanche';
$lang->globalSetting = 'Common'; $lang->globalSetting = 'Common';
$lang->waterfallModel = 'Waterfall'; $lang->waterfallModel = 'Waterfall';
$lang->scrumModel = 'Scrum'; $lang->scrumModel = 'Scrum';
$lang->agilePlusModel = 'Agile Plus'; $lang->agilePlusModel = 'Agile Plus';
$lang->all = 'All'; $lang->waterfallPlusModel = 'Waterfall Plus';
$lang->viewDetails = 'View Details'; $lang->all = 'All';
$lang->viewDetails = 'View Details';
$lang->actions = 'Action'; $lang->actions = 'Action';
$lang->restore = 'Réinitialiser'; $lang->restore = 'Réinitialiser';
@@ -188,6 +189,7 @@ $lang->team->common = 'Team';
$lang->user->common = 'User'; $lang->user->common = 'User';
$lang->custom->common = 'Custom'; $lang->custom->common = 'Custom';
$lang->custom->mode = 'Mode'; $lang->custom->mode = 'Mode';
$lang->custom->flow = 'Concept';
$lang->extension->common = 'Extension'; $lang->extension->common = 'Extension';
$lang->company->common = 'Company'; $lang->company->common = 'Company';
$lang->dept->common = 'Dept'; $lang->dept->common = 'Dept';
+39 -37
View File
@@ -49,43 +49,44 @@ $lang->runInfo = "<div class='row'><div class='u-1 a-center' id='debugbar
$lang->agreement = "已阅读并同意。<span class='text-danger'>未经许可,不得去除、隐藏或遮掩禅道软件的任何标志及链接。</span>"; $lang->agreement = "已阅读并同意。<span class='text-danger'>未经许可,不得去除、隐藏或遮掩禅道软件的任何标志及链接。</span>";
$lang->designedByAIUX = "<a href='https://api.zentao.net/goto.php?item=aiux' class='link-aiux' target='_blank'><i class='icon icon-aiux'></i> 艾体验设计</a>"; $lang->designedByAIUX = "<a href='https://api.zentao.net/goto.php?item=aiux' class='link-aiux' target='_blank'><i class='icon icon-aiux'></i> 艾体验设计</a>";
$lang->reset = '重填'; $lang->reset = '重填';
$lang->cancel = '取消'; $lang->cancel = '取消';
$lang->refresh = '刷新'; $lang->refresh = '刷新';
$lang->refreshIcon = "<i title='$lang->refresh' class='icon icon-refresh'></i>"; $lang->refreshIcon = "<i title='$lang->refresh' class='icon icon-refresh'></i>";
$lang->create = '新建'; $lang->create = '新建';
$lang->edit = '编辑'; $lang->edit = '编辑';
$lang->delete = '删除'; $lang->delete = '删除';
$lang->activate = '激活'; $lang->activate = '激活';
$lang->close = '关闭'; $lang->close = '关闭';
$lang->unlink = '移除'; $lang->unlink = '移除';
$lang->import = '导入'; $lang->import = '导入';
$lang->export = '导出'; $lang->export = '导出';
$lang->setFileName = '文件名:'; $lang->setFileName = '文件名:';
$lang->submitting = '稍候...'; $lang->submitting = '稍候...';
$lang->save = '保存'; $lang->save = '保存';
$lang->confirm = '确认'; $lang->confirm = '确认';
$lang->preview = '查看'; $lang->preview = '查看';
$lang->goback = '返回'; $lang->goback = '返回';
$lang->goPC = 'PC版'; $lang->goPC = 'PC版';
$lang->more = '更多'; $lang->more = '更多';
$lang->moreLink = 'More'; $lang->moreLink = 'More';
$lang->day = '天'; $lang->day = '天';
$lang->customConfig = '自定义'; $lang->customConfig = '自定义';
$lang->public = '公共'; $lang->public = '公共';
$lang->trunk = '主干'; $lang->trunk = '主干';
$lang->sort = '排序'; $lang->sort = '排序';
$lang->required = '必填'; $lang->required = '必填';
$lang->noData = '暂无'; $lang->noData = '暂无';
$lang->fullscreen = '全屏'; $lang->fullscreen = '全屏';
$lang->retrack = '收起'; $lang->retrack = '收起';
$lang->whitelist = '访问白名单'; $lang->whitelist = '访问白名单';
$lang->globalSetting = '通用'; $lang->globalSetting = '通用';
$lang->waterfallModel = '瀑布模型'; $lang->waterfallModel = '瀑布模型';
$lang->scrumModel = '敏捷模型'; $lang->scrumModel = '敏捷模型';
$lang->agilePlusModel = '融合敏捷模型'; $lang->agilePlusModel = '融合敏捷模型';
$lang->all = '所有'; $lang->waterfallPlusModel = '融合瀑布模型';
$lang->viewDetails = '查看详情'; $lang->all = '所有';
$lang->viewDetails = '查看详情';
$lang->actions = '操作'; $lang->actions = '操作';
$lang->restore = '恢复默认'; $lang->restore = '恢复默认';
@@ -188,6 +189,7 @@ $lang->team->common = '团队';
$lang->user->common = '用户'; $lang->user->common = '用户';
$lang->custom->common = '自定义'; $lang->custom->common = '自定义';
$lang->custom->mode = '模式'; $lang->custom->mode = '模式';
$lang->custom->flow = '流程设置';
$lang->extension->common = '插件'; $lang->extension->common = '插件';
$lang->company->common = '公司'; $lang->company->common = '公司';
$lang->dept->common = '部门'; $lang->dept->common = '部门';
+1 -1
View File
@@ -46,7 +46,7 @@ class convertModel extends model
public function dbExists($dbName = '') public function dbExists($dbName = '')
{ {
$statement = $this->dbh->prepare('SHOW DATABASES like ?'); $statement = $this->dbh->prepare('SHOW DATABASES like ?');
$statement->execute([$dbName]); $statement->execute(array($dbName));
return $statement->fetch(); return $statement->fetch();
} }
+2 -2
View File
@@ -22,8 +22,8 @@ $config->custom->requiredModules[35] = 'execution';
$config->custom->requiredModules[40] = 'task'; $config->custom->requiredModules[40] = 'task';
$config->custom->requiredModules[45] = 'build'; $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->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'); $config->custom->dataFeatures = array('productUR', 'waterfall', 'waterfallplus');
$config->custom->scrumFeatures = array(); $config->custom->scrumFeatures = array();
$config->custom->requiredModules[50] = 'bug'; $config->custom->requiredModules[50] = 'bug';
+27 -25
View File
@@ -8,7 +8,6 @@ $lang->custom->set = 'Customize';
$lang->custom->restore = 'Reset to Default'; $lang->custom->restore = 'Reset to Default';
$lang->custom->key = 'Key'; $lang->custom->key = 'Key';
$lang->custom->value = 'Value'; $lang->custom->value = 'Value';
$lang->custom->flow = 'Concept';
$lang->custom->working = 'WorkStyle'; $lang->custom->working = 'WorkStyle';
$lang->custom->select = 'Select Concept'; $lang->custom->select = 'Select Concept';
$lang->custom->branch = 'Multi Branch'; $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['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->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['program'] = 'Program';
$lang->custom->features['productRR'] = 'Product - R&D Requirements'; $lang->custom->features['productRR'] = $lang->productCommon . ' - R&D Requirements';
$lang->custom->features['productUR'] = 'Product - User Requirements'; $lang->custom->features['productUR'] = $lang->productCommon . ' - User Requirements';
$lang->custom->features['productLine'] = 'Product - Product Line'; $lang->custom->features['productLine'] = $lang->productCommon . ' - Product Line';
$lang->custom->features['projectScrum'] = 'Project - Scrum Model'; $lang->custom->features['projectScrum'] = $lang->projectCommon . ' - Scrum Model';
$lang->custom->features['projectWaterfall'] = 'Project - Waterfall Model'; $lang->custom->features['projectWaterfall'] = $lang->projectCommon . ' - Waterfall Model';
$lang->custom->features['projectKanban'] = 'Project - Kanban Model'; $lang->custom->features['projectKanban'] = $lang->projectCommon . ' - Kanban Model';
$lang->custom->features['execution'] = 'Execution'; $lang->custom->features['projectAgileplus'] = $lang->projectCommon . ' - Agile + Model';
$lang->custom->features['qa'] = 'QA'; $lang->custom->features['projectWaterfallplus'] = $lang->projectCommon . ' - Waterfall + Model';
$lang->custom->features['devops'] = 'DevOps'; $lang->custom->features['execution'] = 'Execution';
$lang->custom->features['kanban'] = 'Kanban'; $lang->custom->features['qa'] = 'QA';
$lang->custom->features['doc'] = 'Doc'; $lang->custom->features['devops'] = 'DevOps';
$lang->custom->features['report'] = 'Statistics'; $lang->custom->features['kanban'] = 'Kanban';
$lang->custom->features['system'] = 'System'; $lang->custom->features['doc'] = 'Doc';
$lang->custom->features['assetlib'] = 'Asset Lib'; $lang->custom->features['report'] = 'Statistics';
$lang->custom->features['oa'] = 'Attend'; $lang->custom->features['system'] = 'System';
$lang->custom->features['ops'] = 'Deploy'; $lang->custom->features['assetlib'] = 'Asset Lib';
$lang->custom->features['feedback'] = 'Feedback'; $lang->custom->features['oa'] = 'Attend';
$lang->custom->features['traincourse'] = 'Academy'; $lang->custom->features['ops'] = 'Deploy';
$lang->custom->features['workflow'] = 'Workflow'; $lang->custom->features['feedback'] = 'Feedback';
$lang->custom->features['admin'] = 'Admin'; $lang->custom->features['traincourse'] = 'Academy';
$lang->custom->features['vision'] = 'Full Feature Interface, Operation Management Interface'; $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['waterfall'] = 'Waterfall';
$lang->custom->needClosedFunctions['URStory'] = 'User Story'; $lang->custom->needClosedFunctions['waterfallplus'] = 'Waterfall +';
$lang->custom->needClosedFunctions['URStory'] = 'User Story';
if($config->edition == 'max') $lang->custom->needClosedFunctions['assetLib'] = 'Assetlib'; if($config->edition == 'max') $lang->custom->needClosedFunctions['assetLib'] = 'Assetlib';
$lang->custom->scoreStatus[1] = 'On'; $lang->custom->scoreStatus[1] = 'On';
+27 -25
View File
@@ -8,7 +8,6 @@ $lang->custom->set = 'Customize';
$lang->custom->restore = 'Reset'; $lang->custom->restore = 'Reset';
$lang->custom->key = 'Key'; $lang->custom->key = 'Key';
$lang->custom->value = 'Value'; $lang->custom->value = 'Value';
$lang->custom->flow = 'Concept';
$lang->custom->working = 'Mode'; $lang->custom->working = 'Mode';
$lang->custom->select = 'Select Concept'; $lang->custom->select = 'Select Concept';
$lang->custom->branch = 'Multi-Branch'; $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['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->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['program'] = 'Program';
$lang->custom->features['productRR'] = 'Product - R&D Requirements'; $lang->custom->features['productRR'] = $lang->productCommon . ' - R&D Requirements';
$lang->custom->features['productUR'] = 'Product - User Requirements'; $lang->custom->features['productUR'] = $lang->productCommon . ' - User Requirements';
$lang->custom->features['productLine'] = 'Product - Product Line'; $lang->custom->features['productLine'] = $lang->productCommon . ' - Product Line';
$lang->custom->features['projectScrum'] = 'Project - Scrum Model'; $lang->custom->features['projectScrum'] = $lang->projectCommon . ' - Scrum Model';
$lang->custom->features['projectWaterfall'] = 'Project - Waterfall Model'; $lang->custom->features['projectWaterfall'] = $lang->projectCommon . ' - Waterfall Model';
$lang->custom->features['projectKanban'] = 'Project - Kanban Model'; $lang->custom->features['projectKanban'] = $lang->projectCommon . ' - Kanban Model';
$lang->custom->features['execution'] = 'Execution'; $lang->custom->features['projectAgileplus'] = $lang->projectCommon . ' - Agile + Model';
$lang->custom->features['qa'] = 'QA'; $lang->custom->features['projectWaterfallplus'] = $lang->projectCommon . ' - Waterfall + Model';
$lang->custom->features['devops'] = 'DevOps'; $lang->custom->features['execution'] = 'Execution';
$lang->custom->features['kanban'] = 'Kanban'; $lang->custom->features['qa'] = 'QA';
$lang->custom->features['doc'] = 'Doc'; $lang->custom->features['devops'] = 'DevOps';
$lang->custom->features['report'] = 'Statistics'; $lang->custom->features['kanban'] = 'Kanban';
$lang->custom->features['system'] = 'System'; $lang->custom->features['doc'] = 'Doc';
$lang->custom->features['assetlib'] = 'Asset Lib'; $lang->custom->features['report'] = 'Statistics';
$lang->custom->features['oa'] = 'Attend'; $lang->custom->features['system'] = 'System';
$lang->custom->features['ops'] = 'Deploy'; $lang->custom->features['assetlib'] = 'Asset Lib';
$lang->custom->features['feedback'] = 'Feedback'; $lang->custom->features['oa'] = 'Attend';
$lang->custom->features['traincourse'] = 'Academy'; $lang->custom->features['ops'] = 'Deploy';
$lang->custom->features['workflow'] = 'Workflow'; $lang->custom->features['feedback'] = 'Feedback';
$lang->custom->features['admin'] = 'Admin'; $lang->custom->features['traincourse'] = 'Academy';
$lang->custom->features['vision'] = 'Full Feature Interface, Operation Management Interface'; $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['waterfall'] = 'Waterfall';
$lang->custom->needClosedFunctions['URStory'] = 'User Story'; $lang->custom->needClosedFunctions['waterfallplus'] = 'Waterfall +';
$lang->custom->needClosedFunctions['URStory'] = 'User Story';
if($config->edition == 'max') $lang->custom->needClosedFunctions['assetLib'] = 'Assetlib'; if($config->edition == 'max') $lang->custom->needClosedFunctions['assetLib'] = 'Assetlib';
$lang->custom->scoreStatus[1] = 'On'; $lang->custom->scoreStatus[1] = 'On';
+27 -25
View File
@@ -8,7 +8,6 @@ $lang->custom->set = 'Personnaliser';
$lang->custom->restore = 'Réinitialiser'; $lang->custom->restore = 'Réinitialiser';
$lang->custom->key = 'Clé'; $lang->custom->key = 'Clé';
$lang->custom->value = 'Valeur'; $lang->custom->value = 'Valeur';
$lang->custom->flow = 'Concept';
$lang->custom->working = 'Mode'; $lang->custom->working = 'Mode';
$lang->custom->select = 'Choix du Concept'; $lang->custom->select = 'Choix du Concept';
$lang->custom->branch = 'Multi-Branches'; $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['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->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['program'] = 'Program';
$lang->custom->features['productRR'] = 'Product - R&D Requirements'; $lang->custom->features['productRR'] = $lang->productCommon . ' - R&D Requirements';
$lang->custom->features['productUR'] = 'Product - User Requirements'; $lang->custom->features['productUR'] = $lang->productCommon . ' - User Requirements';
$lang->custom->features['productLine'] = 'Product - Product Line'; $lang->custom->features['productLine'] = $lang->productCommon . ' - Product Line';
$lang->custom->features['projectScrum'] = 'Project - Scrum Model'; $lang->custom->features['projectScrum'] = $lang->projectCommon . ' - Scrum Model';
$lang->custom->features['projectWaterfall'] = 'Project - Waterfall Model'; $lang->custom->features['projectWaterfall'] = $lang->projectCommon . ' - Waterfall Model';
$lang->custom->features['projectKanban'] = 'Project - Kanban Model'; $lang->custom->features['projectKanban'] = $lang->projectCommon . ' - Kanban Model';
$lang->custom->features['execution'] = 'Execution'; $lang->custom->features['projectAgileplus'] = $lang->projectCommon . ' - Agile + Model';
$lang->custom->features['qa'] = 'QA'; $lang->custom->features['projectWaterfallplus'] = $lang->projectCommon . ' - Waterfall + Model';
$lang->custom->features['devops'] = 'DevOps'; $lang->custom->features['execution'] = 'Execution';
$lang->custom->features['kanban'] = 'Kanban'; $lang->custom->features['qa'] = 'QA';
$lang->custom->features['doc'] = 'Doc'; $lang->custom->features['devops'] = 'DevOps';
$lang->custom->features['report'] = 'Statistics'; $lang->custom->features['kanban'] = 'Kanban';
$lang->custom->features['system'] = 'System'; $lang->custom->features['doc'] = 'Doc';
$lang->custom->features['assetlib'] = 'Asset Lib'; $lang->custom->features['report'] = 'Statistics';
$lang->custom->features['oa'] = 'Attend'; $lang->custom->features['system'] = 'System';
$lang->custom->features['ops'] = 'Deploy'; $lang->custom->features['assetlib'] = 'Asset Lib';
$lang->custom->features['feedback'] = 'Feedback'; $lang->custom->features['oa'] = 'Attend';
$lang->custom->features['traincourse'] = 'Academy'; $lang->custom->features['ops'] = 'Deploy';
$lang->custom->features['workflow'] = 'Workflow'; $lang->custom->features['feedback'] = 'Feedback';
$lang->custom->features['admin'] = 'Admin'; $lang->custom->features['traincourse'] = 'Academy';
$lang->custom->features['vision'] = 'Full Feature Interface, Operation Management Interface'; $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['waterfall'] = 'Waterfall';
$lang->custom->needClosedFunctions['URStory'] = 'User Story'; $lang->custom->needClosedFunctions['waterfallplus'] = 'Waterfall +';
$lang->custom->needClosedFunctions['URStory'] = 'User Story';
if($config->edition == 'max') $lang->custom->needClosedFunctions['assetLib'] = 'Assetlib'; if($config->edition == 'max') $lang->custom->needClosedFunctions['assetLib'] = 'Assetlib';
$lang->custom->scoreStatus[1] = 'On'; $lang->custom->scoreStatus[1] = 'On';
+27 -25
View File
@@ -8,7 +8,6 @@ $lang->custom->set = '自定义配置';
$lang->custom->restore = '恢复默认'; $lang->custom->restore = '恢复默认';
$lang->custom->key = '键'; $lang->custom->key = '键';
$lang->custom->value = '值'; $lang->custom->value = '值';
$lang->custom->flow = '流程设置';
$lang->custom->working = '工作方式'; $lang->custom->working = '工作方式';
$lang->custom->select = '请选择流程:'; $lang->custom->select = '请选择流程:';
$lang->custom->branch = '多分支'; $lang->custom->branch = '多分支';
@@ -252,31 +251,34 @@ $lang->custom->modeList['ALM'] = '全生命周期管理模式';
$lang->custom->modeIntroductionList['light'] = '提供了项目管理的核心功能,适用于小型研发团队'; $lang->custom->modeIntroductionList['light'] = '提供了项目管理的核心功能,适用于小型研发团队';
$lang->custom->modeIntroductionList['ALM'] = '概念更加完整、严谨,功能更加丰富,适用于中大型研发团队'; $lang->custom->modeIntroductionList['ALM'] = '概念更加完整、严谨,功能更加丰富,适用于中大型研发团队';
$lang->custom->features['program'] = '项目集'; $lang->custom->features['program'] = '项目集';
$lang->custom->features['productRR'] = '产品-研发需求'; $lang->custom->features['productRR'] = '产品-研发需求';
$lang->custom->features['productUR'] = '产品-用户需求'; $lang->custom->features['productUR'] = '产品-用户需求';
$lang->custom->features['productLine'] = '产品-产品线'; $lang->custom->features['productLine'] = '产品-产品线';
$lang->custom->features['projectScrum'] = '项目-敏捷模型'; $lang->custom->features['projectScrum'] = '项目-敏捷模型';
$lang->custom->features['projectWaterfall'] = '项目-瀑布模型'; $lang->custom->features['projectWaterfall'] = '项目-瀑布模型';
$lang->custom->features['projectKanban'] = '项目-看板模型'; $lang->custom->features['projectKanban'] = '项目-看板模型';
$lang->custom->features['execution'] = '执行'; $lang->custom->features['projectAgileplus'] = '项目-融合敏捷模型';
$lang->custom->features['qa'] = '测试'; $lang->custom->features['projectWaterfallplus'] = '项目-融合瀑布模型';
$lang->custom->features['devops'] = 'DevOps'; $lang->custom->features['execution'] = '执行';
$lang->custom->features['kanban'] = '看板'; $lang->custom->features['qa'] = '测试';
$lang->custom->features['doc'] = '文档'; $lang->custom->features['devops'] = 'DevOps';
$lang->custom->features['report'] = '统计'; $lang->custom->features['kanban'] = '看板';
$lang->custom->features['system'] = '组织'; $lang->custom->features['doc'] = '文档';
$lang->custom->features['assetlib'] = '资产库'; $lang->custom->features['report'] = '统计';
$lang->custom->features['oa'] = '办公'; $lang->custom->features['system'] = '组织';
$lang->custom->features['ops'] = '运维'; $lang->custom->features['assetlib'] = '资产库';
$lang->custom->features['feedback'] = '反馈'; $lang->custom->features['oa'] = '办公';
$lang->custom->features['traincourse'] = '学堂'; $lang->custom->features['ops'] = '运维';
$lang->custom->features['workflow'] = '工作流'; $lang->custom->features['feedback'] = '反馈';
$lang->custom->features['admin'] = '后台'; $lang->custom->features['traincourse'] = '学堂';
$lang->custom->features['vision'] = '研发综合界面、运营管理界面'; $lang->custom->features['workflow'] = '工作流';
$lang->custom->features['admin'] = '后台';
$lang->custom->features['vision'] = '研发综合界面、运营管理界面';
$lang->custom->needClosedFunctions['waterfall'] = '瀑布项目'; $lang->custom->needClosedFunctions['waterfall'] = '瀑布项目';
$lang->custom->needClosedFunctions['URStory'] = '用户需求'; $lang->custom->needClosedFunctions['waterfallplus'] = '融合瀑布项目';
$lang->custom->needClosedFunctions['URStory'] = '用户需求';
if($config->edition == 'max') $lang->custom->needClosedFunctions['assetLib'] = '资产库'; if($config->edition == 'max') $lang->custom->needClosedFunctions['assetLib'] = '资产库';
$lang->custom->scoreStatus[1] = '开启'; $lang->custom->scoreStatus[1] = '开启';
+14 -2
View File
@@ -852,7 +852,7 @@ class customModel extends model
if(!isset($disabledFeatures['scrum'])) $disabledFeatures['scrum'] = array(); if(!isset($disabledFeatures['scrum'])) $disabledFeatures['scrum'] = array();
$disabledFeatures['scrum'][] = $feature; $disabledFeatures['scrum'][] = $feature;
} }
elseif($feature == 'waterfall') elseif(in_array($feature, array('waterfall', 'waterfallplus')))
{ {
$disabledFeatures[] = 'project' . ucfirst($feature); $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(); 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. * Check for assetlib data.
* *
@@ -1136,8 +1147,9 @@ class customModel extends model
$disabledFeatures = $disabledFeatures . ',' . $closedFeatures; $disabledFeatures = $disabledFeatures . ',' . $closedFeatures;
$hasWaterfall = strpos(",{$disabledFeatures},", ',waterfall,') === false; $hasWaterfall = strpos(",{$disabledFeatures},", ',waterfall,') === false;
$hasWaterfallPlus = strpos(",{$disabledFeatures},", ',waterfallplus,') === false;
$hasScrumMeasrecord = strpos(",{$disabledFeatures},", ',scrumMeasrecord,') === false; $hasScrumMeasrecord = strpos(",{$disabledFeatures},", ',scrumMeasrecord,') === false;
$hasWaterfallMeasrecord = (strpos(",{$disabledFeatures},", ',waterfallMeasrecord,') === false and $hasWaterfall); $hasWaterfallMeasrecord = (strpos(",{$disabledFeatures},", ',waterfallMeasrecord,') === false and ($hasWaterfall or $hasWaterfallPlus));
$cronStatus = 'normal'; $cronStatus = 'normal';
if(!$hasScrumMeasrecord and !$hasWaterfallMeasrecord) $cronStatus = 'stop'; if(!$hasScrumMeasrecord and !$hasWaterfallMeasrecord) $cronStatus = 'stop';
+4 -4
View File
@@ -36,9 +36,9 @@
<td class='text-center'><?php echo $lang->custom->modeIntroductionList['ALM'];?></td> <td class='text-center'><?php echo $lang->custom->modeIntroductionList['ALM'];?></td>
</tr> </tr>
<?php foreach($disabledFeatures as $feature):?> <?php foreach($disabledFeatures as $feature):?>
<?php if(is_array($feature) && empty($disabledScrumFeatures)) continue;?> <?php if(is_array($feature) and empty($disabledScrumFeatures)) continue;?>
<tr class='text-center'> <tr class='text-center'>
<td class='text-left'><?php echo (is_array($feature) && !empty($disabledScrumFeatures)) ? sprintf($this->lang->custom->scrum->common, implode($lang->comma, $disabledScrumFeatures)) : $this->lang->custom->features[$feature];?></td> <td class='text-left'><?php echo (is_array($feature) and !empty($disabledScrumFeatures)) ? sprintf($this->lang->custom->scrum->common, implode($lang->comma, $disabledScrumFeatures)) : $this->lang->custom->features[$feature];?></td>
<td><i class='icon text-red icon-close'></i></td> <td><i class='icon text-red icon-close'></i></td>
<td><i class='icon text-success icon-check'></i></td> <td><i class='icon text-success icon-check'></i></td>
</tr> </tr>
@@ -46,9 +46,9 @@
<?php foreach($config->custom->allFeatures as $feature):?> <?php foreach($config->custom->allFeatures as $feature):?>
<?php if(in_array($feature, $disabledFeatures)) continue;?> <?php if(in_array($feature, $disabledFeatures)) continue;?>
<?php if($feature == 'scrumDetail' && empty($enabledScrumFeatures)) continue;?> <?php if($feature == 'scrumDetail' and empty($enabledScrumFeatures)) continue;?>
<tr class='text-center'> <tr class='text-center'>
<td class='text-left'><?php echo ($feature == 'scrumDetail' && !empty($enabledScrumFeatures)) ? sprintf($this->lang->custom->scrum->common, implode($lang->comma, $enabledScrumFeatures)) : $this->lang->custom->features[$feature];?></td> <td class='text-left'><?php echo ($feature == 'scrumDetail' and !empty($enabledScrumFeatures)) ? sprintf($this->lang->custom->scrum->common, implode($lang->comma, $enabledScrumFeatures)) : $this->lang->custom->features[$feature];?></td>
<td><i class='icon text-success icon-check'></i></td> <td><i class='icon text-success icon-check'></i></td>
<td><i class='icon text-success icon-check'></i></td> <td><i class='icon text-success icon-check'></i></td>
</tr> </tr>
+22 -7
View File
@@ -71,6 +71,9 @@ class design extends control
{ {
$productID = $this->commonAction($projectID, $productID); $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. */ /* Save session for design list and process product id. */
$this->session->set('designList', $this->app->getURI(true), 'project'); $this->session->set('designList', $this->app->getURI(true), 'project');
$this->session->set('reviewList', $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); $productIdList = $productID ? $productID : array_keys($products);
$stories = $this->loadModel('story')->getProductStoryPairs($productIdList, 'all', 0, 'active', 'id_desc', 0, 'full', 'story', false); $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']['story']['values'] = $stories;
$this->config->design->search['params']['type']['values'] = $typeList;
$queryID = ($type == 'bySearch') ? (int)$param : 0; $queryID = ($type == 'bySearch') ? (int)$param : 0;
$actionURL = $this->createLink('design', 'browse', "projectID=$projectID&productID=$productID&type=bySearch&queryID=myQueryID"); $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); $pager = pager::init(0, $recPerPage, $pageID);
$designs = $this->design->getList($projectID, $productID, $type, $queryID, $orderBy, $pager); $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->hiddenProduct = $project->hasProduct ? false : true;
$this->view->title = $this->lang->design->common . $this->lang->colon . $this->lang->design->browse; $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->projectID = $projectID;
$this->view->pager = $pager; $this->view->pager = $pager;
$this->view->users = $this->loadModel('user')->getPairs('noletter'); $this->view->users = $this->loadModel('user')->getPairs('noletter');
$this->view->typeList = $typeList;
$this->display(); $this->display();
} }
@@ -173,6 +177,8 @@ class design extends control
$products = $this->product->getProductPairsByProject($projectID); $products = $this->product->getProductPairsByProject($projectID);
$productIdList = $productID ? $productID : array_keys($products); $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->title = $this->lang->design->common . $this->lang->colon . $this->lang->design->create;
$this->view->position[] = $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->productID = $productID;
$this->view->projectID = $projectID; $this->view->projectID = $projectID;
$this->view->type = $type; $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(); $this->display();
} }
@@ -220,12 +226,15 @@ class design extends control
$products = $this->product->getProductPairsByProject($projectID); $products = $this->product->getProductPairsByProject($projectID);
$productIdList = $productID ? $productID : array_keys($products); $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->title = $this->lang->design->common . $this->lang->colon . $this->lang->design->batchCreate;
$this->view->position[] = $this->lang->design->batchCreate; $this->view->position[] = $this->lang->design->batchCreate;
$this->view->stories = $this->loadModel('story')->getProductStoryPairs($productIdList); $this->view->stories = $this->loadModel('story')->getProductStoryPairs($productIdList);
$this->view->users = $this->loadModel('user')->getPairs('noclosed'); $this->view->users = $this->loadModel('user')->getPairs('noclosed');
$this->view->type = $type; $this->view->type = $type;
$this->view->typeList = $project->model == 'waterfall' ? $this->lang->design->typeList : $this->lang->design->plusTypeList;
$this->display(); $this->display();
} }
@@ -248,6 +257,8 @@ class design extends control
$products = $this->product->getProductPairsByProject($design->project); $products = $this->product->getProductPairsByProject($design->project);
$productIdList = $design->product ? $design->product : array_keys($products); $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->title = $this->lang->design->common . $this->lang->colon . $this->lang->design->view;
$this->view->position[] = $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->users = $this->loadModel('user')->getPairs('noletter');
$this->view->actions = $this->loadModel('action')->getList('design', $design->id); $this->view->actions = $this->loadModel('action')->getList('design', $design->id);
$this->view->repos = $this->loadModel('repo')->getRepoPairs('project', $design->project); $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(); $this->display();
} }
@@ -300,13 +312,16 @@ class design extends control
$products = $this->product->getProductPairsByProject($design->project); $products = $this->product->getProductPairsByProject($design->project);
$productIdList = $design->product ? $design->product : array_keys($products); $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->title = $this->lang->design->common . $this->lang->colon . $this->lang->design->edit;
$this->view->position[] = $this->lang->design->edit; $this->view->position[] = $this->lang->design->edit;
$this->view->design = $design; $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->stories = $this->loadModel('story')->getProductStoryPairs($productIdList);
$this->view->users = $this->loadModel('user')->getPairs('noclosed'); $this->view->users = $this->loadModel('user')->getPairs('noclosed');
$this->view->typeList = $project->model == 'waterfall' ? $this->lang->design->typeList : $this->lang->design->plusTypeList;
$this->display(); $this->display();
} }
+2
View File
@@ -65,6 +65,8 @@ $lang->design->typeList['DDS'] = 'Detailed';
$lang->design->typeList['DBDS'] = 'Database'; $lang->design->typeList['DBDS'] = 'Database';
$lang->design->typeList['ADS'] = 'API'; $lang->design->typeList['ADS'] = 'API';
$lang->design->plusTypeList = $lang->design->typeList;
$lang->design->rangeList = array(); $lang->design->rangeList = array();
$lang->design->rangeList['all'] = 'All'; $lang->design->rangeList['all'] = 'All';
$lang->design->rangeList['assign'] = 'Selected'; $lang->design->rangeList['assign'] = 'Selected';
+2
View File
@@ -65,6 +65,8 @@ $lang->design->typeList['DDS'] = 'Detailed';
$lang->design->typeList['DBDS'] = 'Database'; $lang->design->typeList['DBDS'] = 'Database';
$lang->design->typeList['ADS'] = 'API'; $lang->design->typeList['ADS'] = 'API';
$lang->design->plusTypeList = $lang->design->typeList;
$lang->design->rangeList = array(); $lang->design->rangeList = array();
$lang->design->rangeList['all'] = 'All'; $lang->design->rangeList['all'] = 'All';
$lang->design->rangeList['assign'] = 'Selected'; $lang->design->rangeList['assign'] = 'Selected';
+2
View File
@@ -65,6 +65,8 @@ $lang->design->typeList['DDS'] = 'Detailed';
$lang->design->typeList['DBDS'] = 'Database'; $lang->design->typeList['DBDS'] = 'Database';
$lang->design->typeList['ADS'] = 'API'; $lang->design->typeList['ADS'] = 'API';
$lang->design->plusTypeList = $lang->design->typeList;
$lang->design->rangeList = array(); $lang->design->rangeList = array();
$lang->design->rangeList['all'] = 'All'; $lang->design->rangeList['all'] = 'All';
$lang->design->rangeList['assign'] = 'Selected'; $lang->design->rangeList['assign'] = 'Selected';
+2
View File
@@ -65,6 +65,8 @@ $lang->design->typeList['DDS'] = '详细设计';
$lang->design->typeList['DBDS'] = '数据库设计'; $lang->design->typeList['DBDS'] = '数据库设计';
$lang->design->typeList['ADS'] = '接口设计'; $lang->design->typeList['ADS'] = '接口设计';
$lang->design->plusTypeList = $lang->design->typeList;
$lang->design->rangeList = array(); $lang->design->rangeList = array();
$lang->design->rangeList['all'] = '全部记录'; $lang->design->rangeList['all'] = '全部记录';
$lang->design->rangeList['assign'] = '选中记录'; $lang->design->rangeList['assign'] = '选中记录';
+5 -1
View File
@@ -404,11 +404,15 @@ class designModel extends model
*/ */
public function setMenu($projectID, $products, $productID = 0) 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. */ /* Show custom design types. */
$this->lang->waterfall->menu->design['subMenu'] = new stdclass(); $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"); $this->lang->waterfall->menu->design['subMenu']->all = array('link' => "{$this->lang->all}|design|browse|projectID=%s&productID=0&browseType=all");
$count = 1; $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); $key = strtolower($key);
+1 -1
View File
@@ -30,7 +30,7 @@
<tr> <tr>
<td><?php echo $i;?></td> <td><?php echo $i;?></td>
<td><?php echo html::select("story[$i]", $stories, '', "class='form-control chosen'");?></td> <td><?php echo html::select("story[$i]", $stories, '', "class='form-control chosen'");?></td>
<td><?php echo html::select("type[$i]", $lang->design->typeList, '', "class='form-control chosen'");?></td> <td><?php echo html::select("type[$i]", $typeList, '', "class='form-control chosen'");?></td>
<td><?php echo html::input("name[$i]", '', "class='form-control'");?></td> <td><?php echo html::input("name[$i]", '', "class='form-control'");?></td>
<td><?php echo html::textarea("desc[$i]", '', "class='form-control autosize'");?></td> <td><?php echo html::textarea("desc[$i]", '', "class='form-control autosize'");?></td>
</tr> </tr>
+1 -1
View File
@@ -48,7 +48,7 @@
<td calss="c-id"> <?php printf('%03d', $design->id);?></td> <td calss="c-id"> <?php printf('%03d', $design->id);?></td>
<td class="c-name" title="<?php echo $design->name;?>"><?php echo common::hasPriv('design', 'view') ? html::a($this->createLink('design', 'view', "id={$design->id}"), $design->name) : $design->name;?></td> <td class="c-name" title="<?php echo $design->name;?>"><?php echo common::hasPriv('design', 'view') ? html::a($this->createLink('design', 'view', "id={$design->id}"), $design->name) : $design->name;?></td>
<td class="c-product <?php echo $hiddenProduct ? 'hidden' : '';?>"><?php echo zget($products, $design->product);?></td> <td class="c-product <?php echo $hiddenProduct ? 'hidden' : '';?>"><?php echo zget($products, $design->product);?></td>
<td class="c-type"> <?php echo zget($lang->design->typeList, $design->type);?></td> <td class="c-type"> <?php echo zget($typeList, $design->type);?></td>
<td class="c-assignedTo"> <?php echo $this->design->printAssignedHtml($design, $users);?></td> <td class="c-assignedTo"> <?php echo $this->design->printAssignedHtml($design, $users);?></td>
<td class="c-createdBy"> <?php echo zget($users, $design->createdBy);?></td> <td class="c-createdBy"> <?php echo zget($users, $design->createdBy);?></td>
<td class="c-createdDate"><?php echo substr($design->createdDate, 0, 11);?></td> <td class="c-createdDate"><?php echo substr($design->createdDate, 0, 11);?></td>
+1 -1
View File
@@ -34,7 +34,7 @@
</tr> </tr>
<tr> <tr>
<th><?php echo $lang->design->type;?></th> <th><?php echo $lang->design->type;?></th>
<td><?php echo html::select('type', $lang->design->typeList, '', "class='form-control chosen'");?></td> <td><?php echo html::select('type', $typeList, '', "class='form-control chosen'");?></td>
<td></td> <td></td>
</tr> </tr>
<tr> <tr>
+1 -1
View File
@@ -40,7 +40,7 @@
</tr> </tr>
<tr> <tr>
<th><?php echo $lang->design->type;?></th> <th><?php echo $lang->design->type;?></th>
<td><?php echo html::select('type', $lang->design->typeList, $design->type, "class='form-control chosen'");?></td> <td><?php echo html::select('type', $typeList, $design->type, "class='form-control chosen'");?></td>
<td></td> <td></td>
</tr> </tr>
<tr> <tr>
+1 -1
View File
@@ -66,7 +66,7 @@
<table class='table table-data'> <table class='table table-data'>
<tr> <tr>
<th><?php echo $lang->design->type;?></th> <th><?php echo $lang->design->type;?></th>
<td><?php echo zget($lang->design->typeList, $design->type);?></td> <td><?php echo zget($typeList, $design->type);?></td>
</tr> </tr>
<tr <?php if(empty($project->hasProduct)) echo "class='hide'";?>> <tr <?php if(empty($project->hasProduct)) echo "class='hide'";?>>
<th><?php echo $lang->design->product;?></th> <th><?php echo $lang->design->product;?></th>
-1
View File
@@ -9,7 +9,6 @@
<div class='modulegroup'><?php echo $groupName?></div> <div class='modulegroup'><?php echo $groupName?></div>
<?php foreach($modules[$group] as $module):?> <?php foreach($modules[$group] as $module):?>
<?php <?php
if($config->disableFeature and in_array($module, $config->disableFeature)) continue;
$active = ($module == $selectedModule) ? 'text-primary' : ''; $active = ($module == $selectedModule) ? 'text-primary' : '';
$moduleName = zget($lang->dev->tableList, $module, $module); $moduleName = zget($lang->dev->tableList, $module, $module);
?> ?>
+6 -1
View File
@@ -1862,7 +1862,12 @@ class execution extends control
$this->loadModel('product'); $this->loadModel('product');
$allProducts = $this->product->getProductPairsByProject($projectID, 'noclosed'); $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; $copyProjectID = ($projectID == 0) ? key($copyProjects) : $projectID;
if(!empty($project->hasProduct)) $allProducts = array(0 => '') + $allProducts; if(!empty($project->hasProduct)) $allProducts = array(0 => '') + $allProducts;
+2
View File
@@ -7,3 +7,5 @@
#dateRange {vertical-align: top; padding-top: 13px;} #dateRange {vertical-align: top; padding-top: 13px;}
.form-date {min-width: 90px;} .form-date {min-width: 90px;}
.productsBox div[id^='branch'].chosen-disabled {pointer-events: none;}
+5
View File
@@ -107,6 +107,11 @@ $(function()
}); });
$(document).on('change', "select[id^='branch']", disableSelectedBranch); $(document).on('change', "select[id^='branch']", disableSelectedBranch);
if($('.disabledBranch').length > 0)
{
$('.disabledBranch div[id^="branch"]').addClass('chosen-disabled');
}
}) })
var lastProjectID = $("#project").val(); var lastProjectID = $("#project").val();
+1
View File
@@ -140,6 +140,7 @@ $lang->execution->myTask = "My Task";
$lang->execution->list = "{$lang->executionCommon} List"; $lang->execution->list = "{$lang->executionCommon} List";
$lang->execution->allProject = 'All'; $lang->execution->allProject = 'All';
$lang->execution->method = 'Method'; $lang->execution->method = 'Method';
$lang->execution->sameAsParent = "Same as parent";
/* Fields of zt_team. */ /* Fields of zt_team. */
$lang->execution->root = 'Root'; $lang->execution->root = 'Root';
+1
View File
@@ -140,6 +140,7 @@ $lang->execution->myTask = "My Task";
$lang->execution->list = 'List'; $lang->execution->list = 'List';
$lang->execution->allProject = 'All'; $lang->execution->allProject = 'All';
$lang->execution->method = 'Method'; $lang->execution->method = 'Method';
$lang->execution->sameAsParent = "Same as parent";
/* Fields of zt_team. */ /* Fields of zt_team. */
$lang->execution->root = 'Root'; $lang->execution->root = 'Root';
+1
View File
@@ -140,6 +140,7 @@ $lang->execution->myTask = "My Task";
$lang->execution->list = "{$lang->executionCommon} List"; $lang->execution->list = "{$lang->executionCommon} List";
$lang->execution->allProject = 'Tous'; $lang->execution->allProject = 'Tous';
$lang->execution->method = 'Method'; $lang->execution->method = 'Method';
$lang->execution->sameAsParent = "Same as parent";
/* Fields of zt_team. */ /* Fields of zt_team. */
$lang->execution->root = 'Root'; $lang->execution->root = 'Root';
+1
View File
@@ -140,6 +140,7 @@ $lang->execution->myTask = "我的任务";
$lang->execution->list = '列表'; $lang->execution->list = '列表';
$lang->execution->allProject = '全部项目'; $lang->execution->allProject = '全部项目';
$lang->execution->method = '方法'; $lang->execution->method = '方法';
$lang->execution->sameAsParent = "同父阶段";
/* Fields of zt_team. */ /* Fields of zt_team. */
$lang->execution->root = '源ID'; $lang->execution->root = '源ID';
+32 -12
View File
@@ -243,23 +243,43 @@
<?php elseif(($execution->type == 'stage' and !in_array($execution->attribute, array('request', 'design', 'review'))) or $execution->type != 'stage'): ?> <?php elseif(($execution->type == 'stage' and !in_array($execution->attribute, array('request', 'design', 'review'))) or $execution->type != 'stage'): ?>
<?php echo html::hidden("products[]", key($linkedProducts));?> <?php echo html::hidden("products[]", key($linkedProducts));?>
<?php echo html::hidden("branch", json_encode(array_values($linkedBranches)));?> <?php echo html::hidden("branch", json_encode(array_values($linkedBranches)));?>
<?php $i = 0;?>
<?php foreach($linkedProducts as $product):?>
<tr> <tr>
<th><?php echo $lang->execution->manageProducts;?></th> <th><?php if($i == 0) echo $lang->project->manageProductPlan;?></th>
<td colspan='2'> <td class='text-left productsBox' colspan="3">
<div class="row row-grid"> <div class='row'>
<?php if($linkedProducts):?> <div class="col-sm-6">
<?php foreach($linkedProducts as $productID => $product):?> <div class='table-row'>
<?php foreach($product->branches as $branchID):?> <div class='table-col'>
<?php $branchName = isset($branchGroups[$productID][$branchID]) ? '/' . $branchGroups[$productID][$branchID] : '';?> <?php $hasBranch = $product->type != 'normal' and isset($branchGroups[$product->id]);?>
<div class="col-xs-4" title="<?php echo $product->name . $branchName;?>"> <div class='input-group <?php if($hasBranch) echo ' has-branch';?>'>
<?php echo "<i class='icon icon-product text-muted'></i> " . $product->name . $branchName;?> <span class='input-group-addon'><?php echo $lang->product->common;?></span>
<?php $disabled = $execution->type == 'stage' ? "disabled='disabled'" : '';?>
<?php echo html::select("products[$i]", $allProducts, $product->id, "class='form-control chosen' $disabled onchange='loadBranches(this)' data-last='" . $product->id . "' data-type='" . $product->type . "'");?>
<?php if($execution->type == 'stage' and !$project->division) echo html::hidden("products[$i]", $product->id);?>
</div>
</div>
<div class='table-col <?php if(!$hasBranch) echo 'hidden'; if($disabled) echo ' disabledBranch'?>'>
<div class='input-group required'>
<span class='input-group-addon fix-border'><?php echo $lang->project->branch;?></span>
<?php $branchIdList = isset($product->branches) ? join(',', $product->branches) : '';?>
<?php echo html::select("branch[$i][]", isset($branchGroups[$product->id]) ? $branchGroups[$product->id] : array(), $branchIdList, "class='form-control chosen' multiple onchange=\"loadPlans('#products{$i}', this)\"");?>
</div>
</div>
</div>
</div>
<div class="col-sm-6">
<div class='input-group' <?php echo "id='plan$i'";?>>
<span class='input-group-addon'><?php echo $lang->product->plan;?></span>
<?php echo html::select("plans[$product->id][]", isset($productPlans[$product->id]) ? $productPlans[$product->id] : array(), isset($product->plans) ? $product->plans : '', "class='form-control chosen' multiple");?>
</div>
</div> </div>
<?php endforeach;?>
<?php endforeach;?>
<?php endif;?>
</div> </div>
</td> </td>
</tr> </tr>
<?php $i ++;?>
<?php endforeach;?>
<?php else: ?> <?php else: ?>
<?php echo html::hidden("products[]", key($linkedProducts));?> <?php echo html::hidden("products[]", key($linkedProducts));?>
<?php echo html::hidden("branch", json_encode(array_values($linkedBranches)));?> <?php echo html::hidden("branch", json_encode(array_values($linkedBranches)));?>
+6 -4
View File
@@ -399,6 +399,7 @@ $lang->resource->stage->batchCreate = 'batchCreate';
$lang->resource->stage->edit = 'edit'; $lang->resource->stage->edit = 'edit';
$lang->resource->stage->setType = 'setType'; $lang->resource->stage->setType = 'setType';
$lang->resource->stage->delete = 'delete'; $lang->resource->stage->delete = 'delete';
$lang->resource->stage->plusBrowse = 'plusBrowse';
$lang->stage->methodOrder[5] = 'browse'; $lang->stage->methodOrder[5] = 'browse';
$lang->stage->methodOrder[10] = 'create'; $lang->stage->methodOrder[10] = 'create';
@@ -406,6 +407,7 @@ $lang->stage->methodOrder[15] = 'batchCreate';
$lang->stage->methodOrder[20] = 'edit'; $lang->stage->methodOrder[20] = 'edit';
$lang->stage->methodOrder[25] = 'setType'; $lang->stage->methodOrder[25] = 'setType';
$lang->stage->methodOrder[30] = 'delete'; $lang->stage->methodOrder[30] = 'delete';
$lang->stage->methodOrder[35] = 'plusBrowse';
/* Program. */ /* Program. */
$lang->resource->program = new stdclass(); $lang->resource->program = new stdclass();
@@ -2017,15 +2019,15 @@ if(!$inUpgrade)
unset($lang->resource->program); unset($lang->resource->program);
unset($lang->resource->project->programTitle); unset($lang->resource->project->programTitle);
} }
if(!helper::hasFeature('waterfall')) if(!helper::hasFeature('waterfall') and !helper::hasFeature('waterfallplus'))
{ {
unset($lang->resource->design); unset($lang->resource->design);
unset($lang->resource->programplan); unset($lang->resource->programplan);
unset($lang->resource->stage); unset($lang->resource->stage);
} }
if(!helper::hasFeature('product_track')) unset($lang->resource->product->track); if(!helper::hasFeature('product_track')) unset($lang->resource->product->track);
if(!helper::hasFeature('product_roadmap')) unset($lang->resource->product->roadmap); if(!helper::hasFeature('product_roadmap')) unset($lang->resource->product->roadmap);
if(!helper::hasFeature('waterfall_track')) unset($lang->resource->projectstory->track); if(!helper::hasFeature('waterfall_track') and !helper::hasFeature('waterfallplus_track')) unset($lang->resource->projectstory->track);
if(!helper::hasFeature('devops')) if(!helper::hasFeature('devops'))
{ {
unset($lang->resource->repo); unset($lang->resource->repo);
+1 -1
View File
@@ -51,7 +51,7 @@
<tbody> <tbody>
<?php foreach($releases2Imported as $release):?> <?php foreach($releases2Imported as $release):?>
<?php $i = 1;?> <?php $i = 1;?>
<?php $rowspan = empty(count($release->builds)) ? 1 : count($release->builds);?> <?php $rowspan = !count($release->builds) ? 1 : count($release->builds);?>
<tr> <tr>
<td rowspan="<?php echo $rowspan;?>" class='c-id'> <td rowspan="<?php echo $rowspan;?>" class='c-id'>
<div class="checkbox-primary"> <div class="checkbox-primary">
-1
View File
@@ -1,5 +1,4 @@
<?php <?php
$lang->mail->common = 'Email Einstellungen';
$lang->mail->index = 'Home'; $lang->mail->index = 'Home';
$lang->mail->detect = 'Testen'; $lang->mail->detect = 'Testen';
$lang->mail->detectAction = 'Detect By Email Address'; $lang->mail->detectAction = 'Detect By Email Address';
-1
View File
@@ -1,5 +1,4 @@
<?php <?php
$lang->mail->common = 'Email Settings';
$lang->mail->index = 'Email Home'; $lang->mail->index = 'Email Home';
$lang->mail->detect = 'Detect'; $lang->mail->detect = 'Detect';
$lang->mail->detectAction = 'Detect By Email Address'; $lang->mail->detectAction = 'Detect By Email Address';
-1
View File
@@ -1,5 +1,4 @@
<?php <?php
$lang->mail->common = 'Email Settings';
$lang->mail->index = 'Email Home'; $lang->mail->index = 'Email Home';
$lang->mail->detect = 'Detect'; $lang->mail->detect = 'Detect';
$lang->mail->detectAction = 'Detect By Email Address'; $lang->mail->detectAction = 'Detect By Email Address';
-1
View File
@@ -1,5 +1,4 @@
<?php <?php
$lang->mail->common = '发信配置';
$lang->mail->index = '首页'; $lang->mail->index = '首页';
$lang->mail->detect = '检测'; $lang->mail->detect = '检测';
$lang->mail->detectAction = '通过邮箱地址检测'; $lang->mail->detectAction = '通过邮箱地址检测';
+1 -1
View File
@@ -99,7 +99,7 @@ $lang->my->auditMenu->audit = new stdclass();
$lang->my->auditMenu->audit->all = 'All'; $lang->my->auditMenu->audit->all = 'All';
$lang->my->auditMenu->audit->story = 'Story'; $lang->my->auditMenu->audit->story = 'Story';
$lang->my->auditMenu->audit->testcase = 'Case'; $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') $lang->my->auditMenu->audit->feedback = 'Feedback';
if($config->edition != 'open' and helper::hasFeature('OA')) $lang->my->auditMenu->audit->oa = 'OA'; if($config->edition != 'open' and helper::hasFeature('OA')) $lang->my->auditMenu->audit->oa = 'OA';
+1 -1
View File
@@ -99,7 +99,7 @@ $lang->my->auditMenu->audit = new stdclass();
$lang->my->auditMenu->audit->all = 'All'; $lang->my->auditMenu->audit->all = 'All';
$lang->my->auditMenu->audit->story = 'Story'; $lang->my->auditMenu->audit->story = 'Story';
$lang->my->auditMenu->audit->testcase = 'Case'; $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') $lang->my->auditMenu->audit->feedback = 'Feedback';
if($config->edition != 'open' and helper::hasFeature('OA')) $lang->my->auditMenu->audit->oa = 'OA'; if($config->edition != 'open' and helper::hasFeature('OA')) $lang->my->auditMenu->audit->oa = 'OA';
+1 -1
View File
@@ -99,7 +99,7 @@ $lang->my->auditMenu->audit = new stdclass();
$lang->my->auditMenu->audit->all = 'All'; $lang->my->auditMenu->audit->all = 'All';
$lang->my->auditMenu->audit->story = 'Story'; $lang->my->auditMenu->audit->story = 'Story';
$lang->my->auditMenu->audit->testcase = 'Case'; $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') $lang->my->auditMenu->audit->feedback = 'Feedback';
if($config->edition != 'open' and helper::hasFeature('OA')) $lang->my->auditMenu->audit->oa = 'OA'; if($config->edition != 'open' and helper::hasFeature('OA')) $lang->my->auditMenu->audit->oa = 'OA';
+1 -1
View File
@@ -99,7 +99,7 @@ $lang->my->auditMenu->audit = new stdclass();
$lang->my->auditMenu->audit->all = '所有'; $lang->my->auditMenu->audit->all = '所有';
$lang->my->auditMenu->audit->story = '需求'; $lang->my->auditMenu->audit->story = '需求';
$lang->my->auditMenu->audit->testcase = '用例'; $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') $lang->my->auditMenu->audit->feedback = '反馈';
if($config->edition != 'open' and helper::hasFeature('OA')) $lang->my->auditMenu->audit->oa = '办公'; if($config->edition != 'open' and helper::hasFeature('OA')) $lang->my->auditMenu->audit->oa = '办公';
+1 -1
View File
@@ -211,7 +211,7 @@ class programplan extends control
$this->view->productList = $productList; $this->view->productList = $productList;
$this->view->project = $project; $this->view->project = $project;
$this->view->productID = $productID ? $productID : key($productList); $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->programPlan = $programPlan;
$this->view->plans = empty($executions) ? $plans : $executions; $this->view->plans = empty($executions) ? $plans : $executions;
$this->view->planID = $planID; $this->view->planID = $planID;
+2 -1
View File
@@ -110,7 +110,7 @@ $lang->programplan->ganttCustom['delayDays'] = 'Delay days';
$lang->programplan->error = new stdclass(); $lang->programplan->error = new stdclass();
$lang->programplan->error->percentNumber = '"Workload %" must be digits.'; $lang->programplan->error->percentNumber = '"Workload %" must be digits.';
$lang->programplan->error->planFinishSmall = 'The "End" date must be > the "Begin" date.'; $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->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->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.'; $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->taskDrag = 'The %s task cannot be dragged';
$lang->programplan->error->planDrag = 'The %s stage 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->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['gantt'] = 'Group by Stage';
$lang->programplan->ganttBrowseType['assignedTo'] = 'Group by AssignedTo'; $lang->programplan->ganttBrowseType['assignedTo'] = 'Group by AssignedTo';
+2 -1
View File
@@ -110,7 +110,7 @@ $lang->programplan->ganttCustom['delayDays'] = 'Delay days';
$lang->programplan->error = new stdclass(); $lang->programplan->error = new stdclass();
$lang->programplan->error->percentNumber = '"Workload %" must be digits.'; $lang->programplan->error->percentNumber = '"Workload %" must be digits.';
$lang->programplan->error->planFinishSmall = 'The "End" date must be > the "Begin" date.'; $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->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->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.'; $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->taskDrag = 'The %s task cannot be dragged';
$lang->programplan->error->planDrag = 'The %s stage 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->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['gantt'] = 'Group by Stage';
$lang->programplan->ganttBrowseType['assignedTo'] = 'Group by AssignedTo'; $lang->programplan->ganttBrowseType['assignedTo'] = 'Group by AssignedTo';
+2 -1
View File
@@ -110,7 +110,7 @@ $lang->programplan->ganttCustom['delayDays'] = 'Delay days';
$lang->programplan->error = new stdclass(); $lang->programplan->error = new stdclass();
$lang->programplan->error->percentNumber = '"Workload %" must be digits.'; $lang->programplan->error->percentNumber = '"Workload %" must be digits.';
$lang->programplan->error->planFinishSmall = 'The "End" date must be > the "Begin" date.'; $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->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->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.'; $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->taskDrag = 'The %s task cannot be dragged';
$lang->programplan->error->planDrag = 'The %s stage 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->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['gantt'] = 'Group by Stage';
$lang->programplan->ganttBrowseType['assignedTo'] = 'Group by AssignedTo'; $lang->programplan->ganttBrowseType['assignedTo'] = 'Group by AssignedTo';
+2 -1
View File
@@ -68,6 +68,7 @@ $lang->programplan->stageCustom->task = 'Show Task';
$lang->programplan->error = new stdclass(); $lang->programplan->error = new stdclass();
$lang->programplan->error->percentNumber = '"Workload %" must be digits.'; $lang->programplan->error->percentNumber = '"Workload %" must be digits.';
$lang->programplan->error->planFinishSmall = 'The "End" date must be > the "Begin" date.'; $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->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->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"';
+2 -1
View File
@@ -110,7 +110,7 @@ $lang->programplan->ganttCustom['delayDays'] = '延期天数';
$lang->programplan->error = new stdclass(); $lang->programplan->error = new stdclass();
$lang->programplan->error->percentNumber = '"工作量占比"必须为数字'; $lang->programplan->error->percentNumber = '"工作量占比"必须为数字';
$lang->programplan->error->planFinishSmall = '"计划完成时间"必须大于"计划开始时间"'; $lang->programplan->error->planFinishSmall = '"计划完成时间"必须大于"计划开始时间"';
$lang->programplan->error->percentOver = '工作量占比累计不应当超过100%'; $lang->programplan->error->percentOver = '相同父阶段的子阶段工作量占比之和不超过100%';
$lang->programplan->error->createdTask = '已分解任务,不可添加子阶段'; $lang->programplan->error->createdTask = '已分解任务,不可添加子阶段';
$lang->programplan->error->parentWorkload = '子阶段的工作量之和不能大于父阶段的工作量:%s'; $lang->programplan->error->parentWorkload = '子阶段的工作量之和不能大于父阶段的工作量:%s';
$lang->programplan->error->parentDuration = '子阶段计划开始、计划完成不能超过父阶段'; $lang->programplan->error->parentDuration = '子阶段计划开始、计划完成不能超过父阶段';
@@ -119,6 +119,7 @@ $lang->programplan->error->sameCode = '阶段代号不能相同!';
$lang->programplan->error->taskDrag = '%s的任务不可以拖动'; $lang->programplan->error->taskDrag = '%s的任务不可以拖动';
$lang->programplan->error->planDrag = '%s的阶段不可以拖动'; $lang->programplan->error->planDrag = '%s的阶段不可以拖动';
$lang->programplan->error->notStage = $lang->executionCommon . '/看板不支持创建子阶段'; $lang->programplan->error->notStage = $lang->executionCommon . '/看板不支持创建子阶段';
$lang->programplan->error->sameType = '父阶段类型为"%s",阶段类型需与父阶段一致';
$lang->programplan->ganttBrowseType['gantt'] = '按阶段分组'; $lang->programplan->ganttBrowseType['gantt'] = '按阶段分组';
$lang->programplan->ganttBrowseType['assignedTo'] = '按指派给分组'; $lang->programplan->ganttBrowseType['assignedTo'] = '按指派给分组';
+9 -3
View File
@@ -167,10 +167,16 @@ class project extends control
public function ajaxGetCopyProjects() public function ajaxGetCopyProjects()
{ {
$data = fixer::input('post')->get(); $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) $projectPairs = $this->dao->select('id, name')->from(TABLE_PROJECT)
->where('type')->eq('project') ->where('type')->eq('project')
->andWhere('deleted')->eq(0) ->andWhere('deleted')->eq(0)
->andWhere('vision')->eq($this->config->vision) ->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(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->projects)->fi()
->beginIF(trim($data->name))->andWhere('name')->like("%$data->name%")->fi() ->beginIF(trim($data->name))->andWhere('name')->like("%$data->name%")->fi()
->fetchPairs(); ->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 == '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 == 'product' and !empty($output['productID'])) $this->loadModel('product')->setMenu($output['productID']);
if($this->app->tab == 'doc') unset($this->lang->doc->menu->project['subMenu']); if($this->app->tab == 'doc') unset($this->lang->doc->menu->project['subMenu']);
$this->session->set('projectModel', $model); $this->session->set('projectModel', $model);
$extra = str_replace(array(',', ' '), array('&', ''), $extra);
parse_str($extra, $output);
$name = ''; $name = '';
$code = ''; $code = '';
$team = ''; $team = '';
+1 -1
View File
@@ -272,7 +272,7 @@ $lang->project->modelList['scrum'] = "Scrum";
if(helper::hasFeature('waterfall')) $lang->project->modelList['waterfall'] = "CMMI"; if(helper::hasFeature('waterfall')) $lang->project->modelList['waterfall'] = "CMMI";
$lang->project->modelList['kanban'] = "Kanban"; $lang->project->modelList['kanban'] = "Kanban";
$lang->project->modelList['agileplus'] = "Agile +"; $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']['all'] = 'All';
$lang->project->featureBar['browse']['undone'] = 'Unfinished'; $lang->project->featureBar['browse']['undone'] = 'Unfinished';
+1 -1
View File
@@ -272,7 +272,7 @@ $lang->project->modelList['scrum'] = "Scrum";
if(helper::hasFeature('waterfall')) $lang->project->modelList['waterfall'] = "CMMI"; if(helper::hasFeature('waterfall')) $lang->project->modelList['waterfall'] = "CMMI";
$lang->project->modelList['kanban'] = "Kanban"; $lang->project->modelList['kanban'] = "Kanban";
$lang->project->modelList['agileplus'] = "Agile +"; $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']['all'] = 'All';
$lang->project->featureBar['browse']['undone'] = 'Unfinished'; $lang->project->featureBar['browse']['undone'] = 'Unfinished';
+1 -1
View File
@@ -272,7 +272,7 @@ $lang->project->modelList['scrum'] = "Scrum";
if(helper::hasFeature('waterfall')) $lang->project->modelList['waterfall'] = "CMMI"; if(helper::hasFeature('waterfall')) $lang->project->modelList['waterfall'] = "CMMI";
$lang->project->modelList['kanban'] = "Kanban"; $lang->project->modelList['kanban'] = "Kanban";
$lang->project->modelList['agileplus'] = "Agile +"; $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']['all'] = 'All';
$lang->project->featureBar['browse']['undone'] = 'Non Terminées'; $lang->project->featureBar['browse']['undone'] = 'Non Terminées';
+1 -1
View File
@@ -272,7 +272,7 @@ $lang->project->modelList['scrum'] = "Scrum";
if(helper::hasFeature('waterfall')) $lang->project->modelList['waterfall'] = "瀑布"; if(helper::hasFeature('waterfall')) $lang->project->modelList['waterfall'] = "瀑布";
$lang->project->modelList['kanban'] = "看板"; $lang->project->modelList['kanban'] = "看板";
$lang->project->modelList['agileplus'] = "融合敏捷"; $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']['all'] = '全部';
$lang->project->featureBar['browse']['undone'] = '未完成'; $lang->project->featureBar['browse']['undone'] = '未完成';
+8 -8
View File
@@ -818,13 +818,13 @@ class projectModel extends model
/** /**
* Get project pairs by programID. * Get project pairs by programID.
* *
* @param int $programID * @param int $programID
* @param status $status all|wait|doing|suspended|closed|noclosed * @param status $status all|wait|doing|suspended|closed|noclosed
* @param bool $isQueryAll * @param bool $isQueryAll
* @param string $orderBy * @param string $orderBy
* @param string $excludedModel * @param string $excludedModel
* @param string $model * @param string|array $model
* @param string $param multiple|product * @param string $param multiple|product
* @access public * @access public
* @return object * @return object
*/ */
@@ -839,7 +839,7 @@ class projectModel extends model
->beginIF($programID === 0)->andWhere('parent')->eq(0)->fi() ->beginIF($programID === 0)->andWhere('parent')->eq(0)->fi()
->beginIF($status != 'all' and $status != 'noclosed')->andWhere('status')->eq($status)->fi() ->beginIF($status != 'all' and $status != 'noclosed')->andWhere('status')->eq($status)->fi()
->beginIF($excludedModel)->andWhere('model')->ne($excludedModel)->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, 'multiple') !== false)->andWhere('multiple')->eq(1)->fi()
->beginIF(strpos($param, 'product') !== false)->andWhere('hasProduct')->eq(1)->fi() ->beginIF(strpos($param, 'product') !== false)->andWhere('hasProduct')->eq(1)->fi()
->beginIF($status == 'noclosed')->andWhere('status')->ne('closed')->fi() ->beginIF($status == 'noclosed')->andWhere('status')->ne('closed')->fi()
+7 -7
View File
@@ -80,19 +80,19 @@ foreach($projects as $programID => $programProjects)
{ {
$link = $indexLink; $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 (in_array($module, array('issue', 'risk', 'meeting')) and !helper::hasFeature("{$project->model}_{$module}")) or
($module == 'report' and $method == 'projectsummary' and !helper::hasFeature("scrum_measrecord")) ($module == 'report' and $method == 'projectsummary' and !helper::hasFeature("{$project->model}_measrecord"))
)) ))
{ {
$link = $indexLink; $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 (in_array($module, array('issue', 'risk', 'opportunity', 'measrecord', 'auditplan', 'meeting')) and !helper::hasFeature("{$project->model}_{$module}")) or
($module == 'pssp' and !helper::hasFeature("waterfall_process")) or ($module == 'pssp' and !helper::hasFeature("{$project->model}_process")) or
($module == 'report' and $method == 'projectsummary' and !helper::hasFeature("scrum_measrecord")) ($module == 'report' and $method == 'projectsummary' and !helper::hasFeature("{$project->model}_measrecord"))
)) ))
{ {
$link = $indexLink; $link = $indexLink;
+4 -2
View File
@@ -29,7 +29,9 @@
<?php <?php
$tab = $from == 'global' ? 'project' : $app->tab; $tab = $from == 'global' ? 'project' : $app->tab;
if($tab == 'product') $tab = 'project'; if($tab == 'product') $tab = 'project';
$hasWaterfall = helper::hasFeature('waterfall');
$hasWaterfall = helper::hasFeature('waterfall');
$hasWaterfallPlus = helper::hasFeature('waterfallplus');
?> ?>
<div class='project-type text-center'> <div class='project-type text-center'>
<?php echo html::a($this->createLink("project", "create", "model=scrum&programID=$programID&copyProjectID=0&extra=productID=$productID,branchID=$branchID"), "<img class='project-type-img' data-type='scrum' src='{$config->webRoot}theme/default/images/main/scrum.png'>", '', "data-app='{$tab}' class='createButton'")?> <?php echo html::a($this->createLink("project", "create", "model=scrum&programID=$programID&copyProjectID=0&extra=productID=$productID,branchID=$branchID"), "<img class='project-type-img' data-type='scrum' src='{$config->webRoot}theme/default/images/main/scrum.png'>", '', "data-app='{$tab}' class='createButton'")?>
@@ -60,7 +62,7 @@
<p><?php echo $lang->project->agileplusTitle;?></p> <p><?php echo $lang->project->agileplusTitle;?></p>
</div> </div>
</div> </div>
<?php if($hasWaterfall):?> <?php if($hasWaterfallPlus):?>
<div class='col col-xs-4'> <div class='col col-xs-4'>
<div class='project-type text-center'> <div class='project-type text-center'>
<?php echo html::a($this->createLink("project", "create", "model=waterfallplus&programID=$programID&copyProjectID=0&extra=productID=$productID,branchID=$branchID"), "<img class='project-type-img' data-type='waterfallplus' src='{$config->webRoot}theme/default/images/main/waterfallplus.png'>", '', "data-app='{$tab}' class='createButton'")?> <?php echo html::a($this->createLink("project", "create", "model=waterfallplus&programID=$programID&copyProjectID=0&extra=productID=$productID,branchID=$branchID"), "<img class='project-type-img' data-type='waterfallplus' src='{$config->webRoot}theme/default/images/main/waterfallplus.png'>", '', "data-app='{$tab}' class='createButton'")?>
+44 -10
View File
@@ -15,13 +15,19 @@ class stage extends control
* Browse stages. * Browse stages.
* *
* @param string $orderBy * @param string $orderBy
* @param string $type
* @access public * @access public
* @return void * @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->orderBy = $orderBy;
$this->view->type = $type;
$this->view->title = $this->lang->stage->common . $this->lang->colon . $this->lang->stage->browse; $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->common;
$this->view->position[] = $this->lang->stage->browse; $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 * @access public
* @return void * @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) if($_POST)
{ {
$stageID = $this->stage->create(); $stageID = $this->stage->create($type);
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
$response['result'] = 'success'; $response['result'] = 'success';
@@ -52,7 +83,7 @@ class stage extends control
} }
$this->loadModel('action')->create('stage', $stageID, 'Opened'); $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); return $this->send($response);
} }
@@ -66,14 +97,16 @@ class stage extends control
/** /**
* Batch create stages. * Batch create stages.
* *
* @param string $type
* @access public * @access public
* @return void * @return void
*/ */
public function batchCreate() public function batchCreate($type = 'waterfall')
{ {
$this->stage->setMenu($type);
if($_POST) if($_POST)
{ {
$this->stage->batchCreate(); $this->stage->batchCreate($type);
$response['result'] = 'success'; $response['result'] = 'success';
$response['message'] = $this->lang->saveSuccess; $response['message'] = $this->lang->saveSuccess;
@@ -84,7 +117,7 @@ class stage extends control
return $this->send($response); return $this->send($response);
} }
$response['locate'] = inlink('browse'); $response['locate'] = inlink($type == 'waterfall' ? 'browse' : 'plusBrowse', "orderBy=id_asc&type=$type");
return $this->send($response); return $this->send($response);
} }
@@ -105,6 +138,7 @@ class stage extends control
public function edit($stageID = 0) public function edit($stageID = 0)
{ {
$stage = $this->stage->getByID($stageID); $stage = $this->stage->getByID($stageID);
$this->stage->setMenu($stage->projectType);
if($_POST) if($_POST)
{ {
$changes = $this->stage->update($stageID); $changes = $this->stage->update($stageID);
@@ -120,7 +154,7 @@ class stage extends control
$actionID = $this->loadModel('action')->create('stage', $stageID, 'Edited'); $actionID = $this->loadModel('action')->create('stage', $stageID, 'Edited');
if(!empty($changes)) $this->action->logHistory($actionID, $changes); 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); return $this->send($response);
} }
+2 -1
View File
@@ -10,12 +10,13 @@
* @link http://www.zentao.net * @link http://www.zentao.net
*/ */
/* Actions. */ /* Actions. */
$lang->stage->browse = 'Stage List'; $lang->stage->browse = 'Waterfall Stage List';
$lang->stage->create = 'Create Stage'; $lang->stage->create = 'Create Stage';
$lang->stage->batchCreate = 'Batch Create'; $lang->stage->batchCreate = 'Batch Create';
$lang->stage->edit = 'Edit'; $lang->stage->edit = 'Edit';
$lang->stage->delete = 'Delete'; $lang->stage->delete = 'Delete';
$lang->stage->view = 'Details'; $lang->stage->view = 'Details';
$lang->stage->plusBrowse = 'Waterfall Plus Stage List';
/* Fields. */ /* Fields. */
$lang->stage->id = 'ID'; $lang->stage->id = 'ID';
+2 -1
View File
@@ -10,12 +10,13 @@
* @link http://www.zentao.net * @link http://www.zentao.net
*/ */
/* Actions. */ /* Actions. */
$lang->stage->browse = 'Stage List'; $lang->stage->browse = 'Waterfall Stage List';
$lang->stage->create = 'Create Stage'; $lang->stage->create = 'Create Stage';
$lang->stage->batchCreate = 'Batch Create'; $lang->stage->batchCreate = 'Batch Create';
$lang->stage->edit = 'Edit'; $lang->stage->edit = 'Edit';
$lang->stage->delete = 'Delete'; $lang->stage->delete = 'Delete';
$lang->stage->view = 'Details'; $lang->stage->view = 'Details';
$lang->stage->plusBrowse = 'Waterfall Plus Stage List';
/* Fields. */ /* Fields. */
$lang->stage->id = 'ID'; $lang->stage->id = 'ID';
+2 -1
View File
@@ -10,12 +10,13 @@
* @link http://www.zentao.net * @link http://www.zentao.net
*/ */
/* Actions. */ /* Actions. */
$lang->stage->browse = 'Stage List'; $lang->stage->browse = 'Waterfall Stage List';
$lang->stage->create = 'Create Stage'; $lang->stage->create = 'Create Stage';
$lang->stage->batchCreate = 'Batch Create'; $lang->stage->batchCreate = 'Batch Create';
$lang->stage->edit = 'Edit'; $lang->stage->edit = 'Edit';
$lang->stage->delete = 'Delete'; $lang->stage->delete = 'Delete';
$lang->stage->view = 'Details'; $lang->stage->view = 'Details';
$lang->stage->plusBrowse = 'Waterfall Plus Stage List';
/* Fields. */ /* Fields. */
$lang->stage->id = 'ID'; $lang->stage->id = 'ID';
+2 -1
View File
@@ -10,12 +10,13 @@
* @link http://www.zentao.net * @link http://www.zentao.net
*/ */
/* Actions. */ /* Actions. */
$lang->stage->browse = '阶段列表'; $lang->stage->browse = '瀑布阶段列表';
$lang->stage->create = '新建'; $lang->stage->create = '新建';
$lang->stage->batchCreate = '批量新建'; $lang->stage->batchCreate = '批量新建';
$lang->stage->edit = '编辑'; $lang->stage->edit = '编辑';
$lang->stage->delete = '删除'; $lang->stage->delete = '删除';
$lang->stage->view = '阶段详情'; $lang->stage->view = '阶段详情';
$lang->stage->plusBrowse = '融合瀑布阶段列表';
/* Fields. */ /* Fields. */
$lang->stage->id = '编号'; $lang->stage->id = '编号';
+44 -10
View File
@@ -19,14 +19,15 @@ class stageModel extends model
* @access public * @access public
* @return int|bool * @return int|bool
*/ */
public function create() public function create($type = 'waterfall')
{ {
$stage = fixer::input('post') $stage = fixer::input('post')
->setDefault('projectType', $type)
->add('createdBy', $this->app->user->account) ->add('createdBy', $this->app->user->account)
->add('createdDate', helper::today()) ->add('createdDate', helper::today())
->get(); ->get();
$totalPercent = $this->getTotalPercent(); $totalPercent = $this->getTotalPercent($type);
if(!is_numeric($stage->percent)) return dao::$errors['message'][] = $this->lang->stage->error->notNum; 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; 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 * @access public
* @return bool * @return bool
*/ */
public function batchCreate() public function batchCreate($type = 'waterfall')
{ {
$data = fixer::input('post')->get(); $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; 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->name = $name;
$stage->percent = $data->percent[$i]; $stage->percent = $data->percent[$i];
$stage->type = $data->type[$i]; $stage->type = $data->type[$i];
$stage->projectType = $type;
$stage->createdBy = $this->app->user->account; $stage->createdBy = $this->app->user->account;
$stage->createdDate = helper::today(); $stage->createdDate = helper::today();
@@ -98,7 +100,7 @@ class stageModel extends model
->add('editedDate', helper::today()) ->add('editedDate', helper::today())
->get(); ->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; 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 string $orderBy
* @param int $projectID * @param int $projectID
* @param string $type
* @access public * @access public
* @return array * @return array
*/ */
public function getStages($orderBy = 'id_desc', $projectID = 0) public function getStages($orderBy = 'id_desc', $projectID = 0, $type = '')
{ {
if($projectID) if($projectID)
{ {
@@ -137,7 +140,7 @@ class stageModel extends model
} }
else 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 * 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']);
}
} }
} }
+6 -16
View File
@@ -17,40 +17,30 @@
<p> <p>
<span class="text-muted"><?php echo $lang->stage->noStage;?></span> <span class="text-muted"><?php echo $lang->stage->noStage;?></span>
<?php if(common::hasPriv('stage', 'create')):?> <?php if(common::hasPriv('stage', 'create')):?>
<?php echo html::a($this->createLink('stage', 'create'), "<i class='icon icon-plus'></i> " . $lang->stage->create, '', "class='btn btn-info'");?> <?php echo html::a($this->createLink('stage', 'create', "type={$type}"), "<i class='icon icon-plus'></i> " . $lang->stage->create, '', "class='btn btn-info'");?>
<?php endif;?> <?php endif;?>
</p> </p>
</div> </div>
<?php else:?> <?php else:?>
<div class='side-col'>
<div class='panel'>
<div class='panel-body'>
<div class="list-group">
<?php echo html::a(inlink('setType'), $lang->stage->setType);?>
<?php echo html::a(inlink('browse'), $lang->stage->browse, '', "class='selected'");?>
</div>
</div>
</div>
</div>
<div class='main-col main-content main-table' style='padding: 0;padding-top: 20px;'> <div class='main-col main-content main-table' style='padding: 0;padding-top: 20px;'>
<div id="mainMenu" class="clearfix" style='padding:0px 10px'> <div id="mainMenu" class="clearfix" style='padding:0px 10px'>
<div class="pull-left" style='padding-top:5px'> <div class="pull-left" style='padding-top:5px'>
<strong><?php echo $lang->stage->browse;?></strong> <strong><?php echo $lang->stage->browse;?></strong>
</div> </div>
<div class="btn-toolbar pull-right"> <div class="btn-toolbar pull-right">
<?php common::printLink('stage', 'batchCreate', "", "<i class='icon icon-plus'></i>" . $lang->stage->batchCreate, '', "class='btn btn-primary'");?> <?php common::printLink('stage', 'batchCreate', "type={$type}", "<i class='icon icon-plus'></i>" . $lang->stage->batchCreate, '', "class='btn btn-primary'");?>
<?php common::printLink('stage', 'create', "", "<i class='icon icon-plus'></i>" . $lang->stage->create, '', "class='btn btn-primary'");?> <?php common::printLink('stage', 'create', "type={$type}", "<i class='icon icon-plus'></i>" . $lang->stage->create, '', "class='btn btn-primary'");?>
</div> </div>
</div> </div>
<table class="table has-sort-head" id='stageList'> <table class="table has-sort-head" id='stageList'>
<?php $vars = "orderBy=%s";?> <?php $vars = "orderBy=%s&type={$type}";?>
<thead> <thead>
<tr> <tr>
<th class='text-left w-60px'><?php common::printOrderLink('id', $orderBy, $vars, $lang->stage->id);?></th> <th class='text-left w-60px'><?php common::printOrderLink('id', $orderBy, $vars, $lang->stage->id);?></th>
<th class='text-left'><?php common::printOrderLink('name', $orderBy, $vars, $lang->stage->name);?></th> <th class='text-left'><?php common::printOrderLink('name', $orderBy, $vars, $lang->stage->name);?></th>
<th class='w-100px'><?php common::printOrderLink('percent', $orderBy, $vars, $lang->stage->percent);?></th> <th class='w-100px'><?php common::printOrderLink('percent', $orderBy, $vars, $lang->stage->percent);?></th>
<th class='w-120px'><?php common::printOrderLink('type', $orderBy, $vars, $lang->stage->type);?></th> <th class='w-120px'><?php common::printOrderLink('type', $orderBy, $vars, $lang->stage->type);?></th>
<th class='w-120px'><?php echo $lang->actions;?></th> <th class='c-actions-2'><?php echo $lang->actions;?></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -63,7 +53,7 @@
<td class="c-actions"> <td class="c-actions">
<?php <?php
common::printIcon('stage', 'edit', "stageID=$stage->id", "", "list"); common::printIcon('stage', 'edit', "stageID=$stage->id", "", "list");
common::printIcon('stage', 'delete', "stageID=$stage->id", "", "list", '', 'hiddenwin'); common::printIcon('stage', 'delete', "stageID=$stage->id", "", "list", 'trash', 'hiddenwin');
?> ?>
</td> </td>
</tr> </tr>
-10
View File
@@ -29,16 +29,6 @@ EOT;
?> ?>
<?php js::set('itemRow', $itemRow)?> <?php js::set('itemRow', $itemRow)?>
<div id='mainContent' class='main-row'> <div id='mainContent' class='main-row'>
<div class='side-col'>
<div class='panel'>
<div class='panel-body'>
<div class="list-group">
<?php echo html::a(inlink('setType'), $lang->stage->setType, '', "class='selected'");?>
<?php echo html::a(inlink('browse'), $lang->stage->browse);?>
</div>
</div>
</div>
</div>
<div class='main-col main-content'> <div class='main-col main-content'>
<form class="load-indicator main-form form-ajax" method='post'> <form class="load-indicator main-form form-ajax" method='post'>
<table class='table table-form active-disabled table-condensed mw-600px'> <table class='table table-form active-disabled table-condensed mw-600px'>
+21
View File
@@ -334,4 +334,25 @@ class customTest
return $objects; return $objects;
} }
/**
* Check for waterfallplus project data..
*
* @param string $param deleteproject
* @access public
* @return int
*/
public function hasWaterfallplusDataTest($param = '')
{
if($param == 'deleteproject')
{
global $tester;
$tester->dao->update(TABLE_PROJECT)
->set('deleted')->eq(1)
->where('type')->eq('project')
->andWhere('model')->eq('waterfallplus')
->exec();
}
return $this->objectModel->hasWaterfallplusData();
}
} }
@@ -0,0 +1,34 @@
#!/usr/bin/env php
<?php
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
include dirname(dirname(dirname(__FILE__))) . '/class/custom.class.php';
su('admin');
zdTable('user')->gen(5);
su('admin');
$project = zdTable('project');
$project->id->range('1-3');
$project->name->range('项目集1,融合瀑布项目1,瀑布项目1');
$project->type->range('program,project{2}');
$project->parent->range('0,1{2}');
$project->status->range('wait');
$project->model->range('[],waterfallplus,waterfall');
$project->openedBy->range('admin,user1');
$project->begin->range('20220112 000000:0')->type('timestamp')->format('YY/MM/DD');
$project->end->range('20220212 000000:0')->type('timestamp')->format('YY/MM/DD');
$project->gen(3);
/**
title=测试projectModel->hasWaterfallplusData();
cid=1
pid=1
检查获取所有未删除的融合瀑布项目的数量 >> 1
检查删除所有融合瀑布模型项目后,获取融合瀑布项目的数量 >> 0
*/
$customTester = new customTest();
r($customTester->hasWaterfallplusDataTest()) && p() && e('1'); // 检查获取所有未删除的融合瀑布项目的数量
r($customTester->hasWaterfallplusDataTest('deleteproject')) && p() && e('0'); // 检查删除所有融合瀑布模型项目后,获取融合瀑布项目的数量