diff --git a/module/upgrade/control.php b/module/upgrade/control.php index e056eedcfb..146f6fa595 100644 --- a/module/upgrade/control.php +++ b/module/upgrade/control.php @@ -185,12 +185,11 @@ class upgrade extends control if(isset($_POST['newProgram']) or !isset($_POST['programs'])) { - $programName = $this->post->programName; - if(empty($programName)) die(js::alert(sprintf($this->lang->error->notempty, $this->lang->upgrade->program))); if(empty($_POST['pgmAdmin'])) die(js::alert(sprintf($this->lang->error->notempty, $this->lang->upgrade->pgmAdmin))); /* Create Program. */ - $programID = $this->upgrade->createProgram($programName, $linkedProducts, $linkedProjects, $this->post->pgmAdmin); + $programID = $this->upgrade->createProgram($linkedProducts, $linkedProjects, $this->post->pgmAdmin); + if(dao::isError()) die(js::error(dao::getError())); } else { @@ -231,12 +230,11 @@ class upgrade extends control if(isset($_POST['newProgram']) or !isset($_POST['programs'])) { - $programName = $this->post->programName; - if(empty($programName)) die(js::alert(sprintf($this->lang->error->notempty, $this->lang->upgrade->program))); if(empty($_POST['pgmAdmin'])) die(js::alert(sprintf($this->lang->error->notempty, $this->lang->upgrade->pgmAdmin))); /* Create Program. */ - $programID = $this->upgrade->createProgram($programName, $linkedProducts, $linkedProjects, $this->post->pgmAdmin); + $programID = $this->upgrade->createProgram($linkedProducts, $linkedProjects, $this->post->pgmAdmin); + if(dao::isError()) die(js::error(dao::getError())); } else { @@ -259,12 +257,11 @@ class upgrade extends control $linkedProjects = $this->post->projects; if(isset($_POST['newProgram']) or !isset($_POST['programs'])) { - $programName = $this->post->programName; - if(empty($programName)) die(js::alert(sprintf($this->lang->error->notempty, $this->lang->upgrade->program))); if(empty($_POST['pgmAdmin'])) die(js::alert(sprintf($this->lang->error->notempty, $this->lang->upgrade->pgmAdmin))); /* Create Program. */ - $programID = $this->upgrade->createProgram($programName, array(), $linkedProjects, $this->post->pgmAdmin); + $programID = $this->upgrade->createProgram(array(), $linkedProjects, $this->post->pgmAdmin); + if(dao::isError()) die(js::error(dao::getError())); } else { @@ -307,6 +304,8 @@ class upgrade extends control $this->view->noMergedProductCount = $noMergedProductCount; $this->view->noMergedProjectCount = $noMergedProjectCount; + $this->app->loadLang('program'); + $this->loadModel('project'); $this->view->type = $type; if($type == 'productline') { @@ -420,6 +419,7 @@ class upgrade extends control $this->view->programs = $this->dao->select('*')->from(TABLE_PROJECT)->where('program')->eq(0)->andWhere('deleted')->eq(0)->andWhere('template')->eq('scrum')->fetchPairs('id', 'name'); $this->view->users = $this->loadModel('user')->getPairs('noclosed'); + $this->view->groups = $this->loadModel('group')->getPairs(); $this->display(); } diff --git a/module/upgrade/css/mergeprogram.css b/module/upgrade/css/mergeprogram.css index 21c1e57b4f..2a54fab2ad 100644 --- a/module/upgrade/css/mergeprogram.css +++ b/module/upgrade/css/mergeprogram.css @@ -1,3 +1,6 @@ .modal-dialog{width:100%;} -#programName {border-left-color:#dcdcdc !important;} .checkbox-primary{overflow:hidden;} +.pgmWidth{width:450px !important;} +#whitelistBox .checkbox-inline {display: inline-block !important; padding-left: 0px !important;} +#whitelistBox .checkbox-inline:first-child {margin-left: 10px !important;} +#budget {border-right:0px;} diff --git a/module/upgrade/js/mergeprogram.js b/module/upgrade/js/mergeprogram.js index eb911b02f7..97f77ba5e5 100644 --- a/module/upgrade/js/mergeprogram.js +++ b/module/upgrade/js/mergeprogram.js @@ -1,5 +1,8 @@ $(function() { + pgmBegin = $('.pgmParams #begin').val(); + setPgmBegin(pgmBegin); + $('[name^=lines]').change(function() { value = $(this).val(); @@ -11,6 +14,7 @@ $(function() { $('[data-line=' + value + ']').prop('checked', false) } + setPgmBegin(pgmBegin); }) $('[name^=products]').change(function() @@ -27,6 +31,7 @@ $(function() { $('[data-product=' + value + ']').prop('checked', false) } + setPgmBegin(pgmBegin); }) $('[name^=projects]').change(function() @@ -39,6 +44,7 @@ $(function() var productID = $(this).attr('data-product'); if(productID && $('[data-productid=' + productID + ']').length > 0 && !$('[data-productid=' + productID + ']').prop('checked')) $('[data-productid=' + productID + ']').prop('checked', true); } + setPgmBegin(pgmBegin); }) toggleProgram($('form #newProgram0')); @@ -46,17 +52,131 @@ $(function() function toggleProgram(obj) { - $obj = $(obj); - $programs = $obj.closest('.input-group').find('[id^=programs]'); - $programName = $obj.closest('.input-group').find('[id^=programName]'); + $obj = $(obj); + $programs = $obj.closest('table').find('#programs'); + $pgmParams = $obj.closest('table').find('.pgmParams'); if($obj.prop('checked')) { - $programs.addClass('hidden'); - $programName.removeClass('hidden'); + $programs.attr('disabled', 'disabled'); + $pgmParams.removeClass('hidden'); } else { - $programs.removeClass('hidden'); - $programName.addClass('hidden'); + $programs.removeAttr('disabled'); + $pgmParams.addClass('hidden'); } } + +function setPgmBegin(pgmBegin) +{ + $(':checkbox:checked[data-begin]').each(function() + { + begin = $(this).attr('data-begin').substr(0, 10); + if(begin == '0000-00-00') return true; + + if(begin < pgmBegin) + { + pgmBegin = begin; + $('.pgmParams #begin').val(pgmBegin); + } + }); +} + +function setWhite(acl) +{ + acl == 'custom' ? $('#whitelistBox').removeClass('hidden') : $('#whitelistBox').addClass('hidden'); +} + +function convertStringToDate(dateString) +{ + dateString = dateString.split('-'); + return new Date(dateString[0], dateString[1] - 1, dateString[2]); +} + +/** + * Compute delta of two days. + * + * @param string $date1 + * @param string $date1 + * @access public + * @return int + */ +function computeDaysDelta(date1, date2) +{ + date1 = convertStringToDate(date1); + date2 = convertStringToDate(date2); + delta = (date2 - date1) / (1000 * 60 * 60 * 24) + 1; + + weekEnds = 0; + for(i = 0; i < delta; i++) + { + if((weekend == 2 && date1.getDay() == 6) || date1.getDay() == 0) weekEnds ++; + date1 = date1.valueOf(); + date1 += 1000 * 60 * 60 * 24; + date1 = new Date(date1); + } + return delta - weekEnds; +} + +/** + * Compute work days. + * + * @access public + * @return void + */ +function computeWorkDays(currentID) +{ + isBactchEdit = false; + if(currentID) + { + index = currentID.replace('begins[', ''); + index = index.replace('ends[', ''); + index = index.replace(']', ''); + if(!isNaN(index)) isBactchEdit = true; + } + + if(isBactchEdit) + { + beginDate = $('#begins\\[' + index + '\\]').val(); + endDate = $('#ends\\[' + index + '\\]').val(); + } + else + { + beginDate = $('#begin').val(); + endDate = $('#end').val(); + } + + if(beginDate && endDate) + { + if(isBactchEdit) $('#dayses\\[' + index + '\\]').val(computeDaysDelta(beginDate, endDate)); + if(!isBactchEdit) $('#days').val(computeDaysDelta(beginDate, endDate)); + } + else if($('input[checked="true"]').val()) + { + computeEndDate(); + } +} + +/** + * Compute the end date for project. + * + * @param int $delta + * @access public + * @return void + */ +function computeEndDate(delta) +{ + beginDate = $('#begin').val(); + if(!beginDate) return; + + delta = parseInt(delta); + beginDate = convertStringToDate(beginDate); + if((delta == 7 || delta == 14) && (beginDate.getDay() == 1)) + { + delta = (weekend == 2) ? (delta - 2) : (delta - 1); + } + + endDate = beginDate.addDays(delta - 1).toString('yyyy-MM-dd'); + $('#end').val(endDate).datetimepicker('update'); + computeWorkDays(); +} diff --git a/module/upgrade/lang/zh-cn.php b/module/upgrade/lang/zh-cn.php index d7a1272302..08995b4c83 100644 --- a/module/upgrade/lang/zh-cn.php +++ b/module/upgrade/lang/zh-cn.php @@ -75,7 +75,8 @@ $lang->upgrade->to15Desc = <<upgrade->line = '产品线'; -$lang->upgrade->program = '项目名称'; +$lang->upgrade->program = '归并项目'; +$lang->upgrade->existPGM = '已有项目'; $lang->upgrade->pgmAdmin = '项目管理员'; $lang->upgrade->product = $lang->productCommon; $lang->upgrade->project = $lang->projectCommon; diff --git a/module/upgrade/model.php b/module/upgrade/model.php index bf30a31849..6e93b88002 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -3754,53 +3754,48 @@ class upgradeModel extends model /** * Create program. * - * @param string $programName * @param array $productIdList * @param array $projectIdList * @access public * @return int */ - public function createProgram($programName, $productIdList = array(), $projectIdList = array(), $pgmAdmin = '') + public function createProgram($productIdList = array(), $projectIdList = array(), $pgmAdmin = '') { + $data = fixer::input('post')->get(); $program = new stdclass(); - $program->name = $programName; - $program->template = 'scrum'; - $program->category = count($productIdList) > 1 ? 'multiple' : 'single'; - $program->status = 'wait'; - $program->openedBy = $this->app->user->account; - $program->openedDate = helper::now(); - $program->acl = 'open'; - $program->privway = 'extend'; + $program->name = $data->name; + $program->code = $data->code; + $program->template = 'scrum'; + $program->category = count($productIdList) > 1 ? 'multiple' : 'single'; + $program->status = 'wait'; + $program->begin = $data->begin; + $program->end = $data->end; + $program->days = $data->days; + $program->budget = $data->budget; + $program->budgetUnit = $data->budgetUnit; + $program->PM = $data->PM; + $program->privway = 'extend'; + $program->openedBy = $this->app->user->account; + $program->openedDate = helper::now(); + $program->openedVersion = $this->config->version; + $program->acl = $data->acl; + if(!empty($data->whitelist)) $program->whitelist = join(',', $data->whitelist); - $begin = helper::today(); - $end = helper::today(); - if($productIdList) - { - $products = $this->dao->select('*')->from(TABLE_PRODUCT)->where('id')->in($productIdList)->fetchAll('id'); - foreach($products as $product) - { - if(empty($begin)) $begin = $product->createdDate; - if($product->createdDate < $begin) $begin = $product->createdDate; - } - } + $this->app->loadLang('project'); + $this->lang->upgrade->name = $this->lang->project->name; + $this->lang->upgrade->code = $this->lang->project->code; + $this->lang->upgrade->begin = $this->lang->project->begin; + $this->lang->upgrade->end = $this->lang->project->end; - if($projectIdList) - { - $projects = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->in($projectIdList)->fetchAll('id'); - foreach($projects as $project) - { - if($begin > $project->begin) $begin = $project->begin; - if($end < $project->end) $end = $project->end; - } - } - if(empty($projectIdList)) $end = date('Y-m-d', '+1 year'); - - $program->begin = $begin; - $program->end = $end; - $this->dao->insert(TABLE_PROJECT)->data($program)->exec(); + $this->dao->insert(TABLE_PROJECT)->data($program) + ->batchcheck('name,code,begin,end', 'notempty') + ->checkIF($program->end != '', 'end', 'gt', $program->begin) + ->check('name', 'unique', "deleted='0'") + ->check('code', 'unique', "deleted='0'") + ->exec(); + if(dao::isError()) return false; $programID = $this->dao->lastInsertId(); - $this->dao->update(TABLE_PROJECT)->set('code')->eq('pgm' . $programID)->where('id')->eq($programID)->exec(); if($pgmAdmin) { diff --git a/module/upgrade/view/mergebyline.html.php b/module/upgrade/view/mergebyline.html.php index 8baa278bc4..bf6484aee5 100644 --- a/module/upgrade/view/mergebyline.html.php +++ b/module/upgrade/view/mergebyline.html.php @@ -4,8 +4,7 @@ upgrade->line;?> upgrade->product;?> upgrade->project;?> - upgrade->program;?> - upgrade->pgmAdmin;?> + upgrade->program;?> @@ -19,33 +18,91 @@ id] as $productID => $product):?> - id]", array($productID => "{$lang->productCommon} #{$product->id} {$product->name}"), $i == 0 ? $product->id : 0, "data-productid='{$product->id}' data-line='{$line->id}'");?> + id]", array($productID => "{$lang->productCommon} #{$product->id} {$product->name}"), $i == 0 ? $product->id : 0, "data-productid='{$product->id}' data-line='{$line->id}' data-begin='{$product->createdDate}'");?> id][$productID]", $productID);?> - id][$productID]", array($project->id => "{$lang->projectCommon} #{$project->id} {$project->name}"), $i == 0 ? $project->id : 0, "data-product='{$product->id}' data-line='{$line->id}'");?> + id][$productID]", array($project->id => "{$lang->projectCommon} #{$project->id} {$project->name}"), $i == 0 ? $project->id : 0, "data-product='{$product->id}' data-line='{$line->id}' data-begin='{$project->begin}'");?> id][$productID][$project->id]", $project->id);?> - + -
- - name, "class='form-control'");?> + - -
- - -
-
+ + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
upgrade->existPGM;?> +
+ + +
+ + +
+
+
+
program->name;?>name, "class='form-control'");?>
program->code;?>
upgrade->pgmAdmin;?>
program->PM;?>
program->budget;?> +
+ + + program->unitList, 'yuan', "class='form-control'");?> +
+
program->dateRange;?> +
+ program->begin . "' required");?> + program->to;?> + program->end . "' required");?> +
+
project->days;?> +
+ + project->day;?> +
+
project->acl;?>program->aclList, 'open', "onclick='setWhite(this.value);'", 'block'));?>
- diff --git a/module/upgrade/view/mergebyproduct.html.php b/module/upgrade/view/mergebyproduct.html.php index e4210f74da..b89141c646 100644 --- a/module/upgrade/view/mergebyproduct.html.php +++ b/module/upgrade/view/mergebyproduct.html.php @@ -3,39 +3,96 @@ upgrade->product;?> upgrade->project;?> - upgrade->program;?> - upgrade->pgmAdmin;?> + upgrade->program;?> $product):?> - id => "{$lang->productCommon} #{$product->id} {$product->name}"), $product->id, "data-productid='{$product->id}'");?> - + id => "{$lang->productCommon} #{$product->id} {$product->name}"), $product->id, "data-productid='{$product->id}' data-begin='{$product->createdDate}'");?> + - id => "{$lang->projectCommon} #{$project->id} {$project->name}"), $project->id, "data-product='{$productID}'");?> + id => "{$lang->projectCommon} #{$project->id} {$project->name}"), $project->id, "data-product='{$productID}' data-begin='{$project->begin}'");?> id]", $project->id);?> -
- - + - -
- - -
-
+ + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
upgrade->existPGM;?> +
+ + +
+ + +
+
+
+
program->name;?>
program->code;?>
upgrade->pgmAdmin;?>
program->PM;?>
program->budget;?> +
+ + + program->unitList, 'yuan', "class='form-control'");?> +
+
program->dateRange;?> +
+ program->begin . "' required");?> + program->to;?> + program->end . "' required");?> +
+
project->days;?> +
+ + project->day;?> +
+
project->acl;?>program->aclList, 'open', "onclick='setWhite(this.value);'", 'block'));?>
- diff --git a/module/upgrade/view/mergebyproject.html.php b/module/upgrade/view/mergebyproject.html.php index 989ff8e631..8e1883ead8 100644 --- a/module/upgrade/view/mergebyproject.html.php +++ b/module/upgrade/view/mergebyproject.html.php @@ -2,32 +2,89 @@ upgrade->project;?> - upgrade->program;?> - upgrade->pgmAdmin;?> + upgrade->program;?> $project):?> + id => "{$lang->projectCommon} #{$project->id} {$project->name}"), $project->id);?> -
- - + - -
- - -
-
+ + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
upgrade->existPGM;?> +
+ + +
+ + +
+
+
+
program->name;?>
program->code;?>
upgrade->pgmAdmin;?>
program->PM;?>
program->budget;?> +
+ + + program->unitList, 'yuan', "class='form-control'");?> +
+
program->dateRange;?> +
+ program->begin . "' required");?> + program->to;?> + program->end . "' required");?> +
+
project->days;?> +
+ + project->day;?> +
+
project->acl;?>program->aclList, 'open', "onclick='setWhite(this.value);'", 'block'));?>
- - id => "{$lang->projectCommon} #{$project->id} {$project->name}"), $project->id);?> diff --git a/module/upgrade/view/mergeprogram.html.php b/module/upgrade/view/mergeprogram.html.php index fddb27f156..a94aa345d6 100644 --- a/module/upgrade/view/mergeprogram.html.php +++ b/module/upgrade/view/mergeprogram.html.php @@ -11,6 +11,7 @@ */ ?> +project->weekend);?>