Merge branch 'sprint/168_zhengrunyu_45148' into sprint/168
This commit is contained in:
@@ -280,5 +280,5 @@ $config->newFeatures = array('introduction', 'tutorial', 'youngBlueTheme');
|
||||
|
||||
/* Program privs.*/
|
||||
$config->programPriv = new stdclass();
|
||||
$config->programPriv->scrum = array('projectstory', 'projectrelease', 'project', 'build', 'bug', 'testcase', 'testreport', 'caselib', 'doc', 'repo', 'meeting');
|
||||
$config->programPriv->scrum = array('projectstory', 'projectrelease', 'project', 'build', 'bug', 'testcase', 'testreport', 'caselib', 'doc', 'repo', 'meeting', 'stakeholder');
|
||||
$config->programPriv->waterfall = array_merge($config->programPriv->scrum, array('workestimation', 'durationestimation', 'budget', 'programplan', 'review', 'reviewissue', 'weekly', 'milestone', 'design', 'issue', 'risk', 'opportunity', 'measrecord', 'auditplan', 'trainplan', 'gapanalysis', 'pssp'));
|
||||
|
||||
@@ -498,7 +498,7 @@ $lang->action->label->testtask = 'Request|testtask|view|caseID=%s';
|
||||
$lang->action->label->testsuite = 'Test Suite|testsuite|view|suiteID=%s';
|
||||
$lang->action->label->caselib = 'Case Library|caselib|view|libID=%s';
|
||||
$lang->action->label->todo = 'Todo|todo|view|todoID=%s';
|
||||
$lang->action->label->doclib = 'Doc Library|doc|objectLibs|type=%s&objectID=%s&libID=%s&docID=&version=&appendLib=%s';
|
||||
$lang->action->label->doclib = 'Doc Library|doc|objectLibs|type=%s&objectID=%s&libID=%s';
|
||||
$lang->action->label->doc = 'Doc|doc|view|docID=%s';
|
||||
$lang->action->label->user = 'User|user|view|account=%s';
|
||||
$lang->action->label->testreport = 'Report|testreport|view|report=%s';
|
||||
|
||||
+13
-2
@@ -1424,10 +1424,11 @@ class actionModel extends model
|
||||
* @param array $actions
|
||||
* @param string $direction
|
||||
* @param string $type all|today|yesterday|thisweek|lastweek|thismonth|lastmonth
|
||||
* @param string $orderBy date_desc|date_asc
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function buildDateGroup($actions, $direction = 'next', $type = 'today')
|
||||
public function buildDateGroup($actions, $direction = 'next', $type = 'today', $orderBy = 'date_desc')
|
||||
{
|
||||
$dateGroup = array();
|
||||
foreach($actions as $action)
|
||||
@@ -1455,7 +1456,17 @@ class actionModel extends model
|
||||
}
|
||||
}
|
||||
|
||||
if($direction != 'next') $dateGroup = array_reverse($dateGroup);
|
||||
/* Modify date to the corrret order. */
|
||||
if($this->app->rawModule != 'company' and $direction != 'next')
|
||||
{
|
||||
$dateGroup = array_reverse($dateGroup);
|
||||
}
|
||||
elseif($this->app->rawModule == 'company' and (($direction == 'next' and $orderBy == 'date_asc') or ($direction == 'pre' and $orderBy == 'date_desc')))
|
||||
{
|
||||
$dateGroup = array_reverse($dateGroup);
|
||||
foreach($dateGroup as $key => $dateItem) $dateGroup[$key] = array_reverse($dateItem);
|
||||
}
|
||||
|
||||
return $dateGroup;
|
||||
}
|
||||
|
||||
|
||||
@@ -8,14 +8,14 @@ $lang->backup->restore = 'Restore';
|
||||
$lang->backup->change = 'Edit Expiration';
|
||||
$lang->backup->changeAB = 'Edit';
|
||||
$lang->backup->rmPHPHeader = 'Remove PHP header';
|
||||
$lang->backup->setting = 'Setting';
|
||||
$lang->backup->setting = 'Settings';
|
||||
|
||||
$lang->backup->settingAction = 'Backup Setting';
|
||||
$lang->backup->settingAction = 'Backup Settings';
|
||||
|
||||
$lang->backup->time = 'Date';
|
||||
$lang->backup->files = 'Files';
|
||||
$lang->backup->allCount = 'All Count';
|
||||
$lang->backup->count = 'Backup Count';
|
||||
$lang->backup->allCount = 'All Files';
|
||||
$lang->backup->count = 'Backup Files';
|
||||
$lang->backup->size = 'Size';
|
||||
$lang->backup->status = 'Status';
|
||||
|
||||
|
||||
@@ -173,7 +173,7 @@ class blockModel extends model
|
||||
->andWhere('t2.status')->ne('suspended')
|
||||
->andWhere('t3.status')->ne('suspended')
|
||||
->andWhere('t2.type')->eq('project')
|
||||
->andWhere('t3.type')->eq('sprint')
|
||||
->andWhere('t3.type')->in('sprint,stage')
|
||||
->andWhere('t1.deleted')->eq(0)
|
||||
->andWhere('t2.deleted')->eq(0)
|
||||
->andWhere('t3.deleted')->eq(0)
|
||||
|
||||
@@ -167,7 +167,7 @@ class company extends control
|
||||
* @param int $productID
|
||||
* @param int $projectID
|
||||
* @param int $executionID
|
||||
* @param string $orderBy
|
||||
* @param string $orderBy date_deac|date_asc
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
@@ -204,7 +204,8 @@ class company extends control
|
||||
$pager = new pager($recTotal, $recPerPage = 50, $pageID = 1);
|
||||
|
||||
/* Append id for secend sort. */
|
||||
$sort = $this->loadModel('common')->appendOrder($orderBy);
|
||||
$order = $direction == 'next' ? 'date_desc' : 'date_asc';
|
||||
$sort = $this->loadModel('common')->appendOrder($order);
|
||||
|
||||
$queryID = ($browseType == 'bysearch') ? (int)$param : 0;
|
||||
$date = empty($date) ? '' : date('Y-m-d', $date);
|
||||
@@ -289,7 +290,7 @@ class company extends control
|
||||
$this->view->userID = $userID;
|
||||
$this->view->param = $param;
|
||||
$this->view->browseType = $browseType;
|
||||
$this->view->dateGroups = $this->action->buildDateGroup($actions, $direction, $browseType);
|
||||
$this->view->dateGroups = $this->action->buildDateGroup($actions, $direction, $browseType, $orderBy);
|
||||
$this->view->direction = $direction;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -96,8 +96,8 @@ $firstDate = date('Y-m-d', strtotime($firstAction->originalDate) + 24 * 3600);
|
||||
$lastDate = substr($action->originalDate, 0, 10);
|
||||
$hasPre = $this->action->hasPreOrNext($firstDate, 'pre');
|
||||
$hasNext = $this->action->hasPreOrNext($lastDate, 'next');
|
||||
$preLink = $hasPre ? inlink('dynamic', "browseType=$browseType¶m=$param&recTotal={$pager->recTotal}&date=" . strtotime($firstDate) . '&direction=pre') : 'javascript:;';
|
||||
$nextLink = $hasNext ? inlink('dynamic', "browseType=$browseType¶m=$param&recTotal={$pager->recTotal}&date=" . strtotime($lastDate) . '&direction=next') : 'javascript:;';
|
||||
$preLink = $hasPre ? inlink('dynamic', "browseType=$browseType¶m=$param&recTotal={$pager->recTotal}&date=" . strtotime($firstDate) . "&direction=pre&userID=$userID&productID=$productID&projectID=$projectID&executionID=$executionID&orderBy=$orderBy") : 'javascript:;';
|
||||
$nextLink = $hasNext ? inlink('dynamic', "browseType=$browseType¶m=$param&recTotal={$pager->recTotal}&date=" . strtotime($lastDate) . "&direction=next&userID=$userID&productID=$productID&projectID=$projectID&executionID=$executionID&orderBy=$orderBy") : 'javascript:;';
|
||||
?>
|
||||
<?php if($hasPre or $hasNext):?>
|
||||
<div id="mainActions" class='main-actions'>
|
||||
|
||||
@@ -31,15 +31,17 @@ $lang->execution->canceledDate = 'CanceledDate';
|
||||
$lang->execution->begin = 'Begin';
|
||||
$lang->execution->end = 'End';
|
||||
$lang->execution->dateRange = 'Duration';
|
||||
$lang->execution->realBegan = 'Actual start';
|
||||
$lang->execution->realEnd = 'Actual end';
|
||||
$lang->execution->realBeganAB = 'Actual Begin';
|
||||
$lang->execution->realEndAB = 'Actual End';
|
||||
$lang->execution->realBegan = 'Actual Begin';
|
||||
$lang->execution->realEnd = 'Actual End';
|
||||
$lang->execution->to = 'To';
|
||||
$lang->execution->days = 'Available Days';
|
||||
$lang->execution->days = ' Days';
|
||||
$lang->execution->day = ' Days';
|
||||
$lang->execution->workHour = ' Hours';
|
||||
$lang->execution->workHourUnit = 'H';
|
||||
$lang->execution->totalHours = 'Available Hours';
|
||||
$lang->execution->totalDays = 'Available Days';
|
||||
$lang->execution->totalHours = ' Hours';
|
||||
$lang->execution->totalDays = ' Days';
|
||||
$lang->execution->status = $lang->executionCommon . 'Status';
|
||||
$lang->execution->execStatus = 'Status';
|
||||
$lang->execution->subStatus = 'Sub Status';
|
||||
@@ -351,6 +353,10 @@ $lang->execution->unfinishedExecution = "This {$lang->executionCommon} h
|
||||
$lang->execution->unfinishedTask = "[%s] unfinished tasks. ";
|
||||
$lang->execution->unresolvedBug = "[%s] unresolved bugs. ";
|
||||
$lang->execution->projectNotEmpty = 'Project cannot be empty.';
|
||||
$lang->execution->realBeganNotEmpty = 'Actual Begin should not be empty.';
|
||||
$lang->execution->realBeganNotFuture = 'Actual Begin should be < = today.';
|
||||
$lang->execution->realEndNotEmpty = 'Actual End should not be empty.';
|
||||
$lang->execution->realEndNotFuture = 'Actual End should be < = today.';
|
||||
|
||||
/* Statistics. */
|
||||
$lang->execution->charts = new stdclass();
|
||||
|
||||
@@ -31,8 +31,10 @@ $lang->execution->canceledDate = '取消日期';
|
||||
$lang->execution->begin = '计划开始';
|
||||
$lang->execution->end = '计划完成';
|
||||
$lang->execution->dateRange = '起始日期';
|
||||
$lang->execution->realBegan = '实际开始';
|
||||
$lang->execution->realEnd = '实际完成';
|
||||
$lang->execution->realBeganAB = '实际开始';
|
||||
$lang->execution->realEndAB = '实际完成';
|
||||
$lang->execution->realBegan = '实际开始日期';
|
||||
$lang->execution->realEnd = '实际完成日期';
|
||||
$lang->execution->to = '至';
|
||||
$lang->execution->days = '可用工作日';
|
||||
$lang->execution->day = '天';
|
||||
@@ -351,6 +353,11 @@ $lang->execution->unfinishedExecution = "该{$lang->executionCommon}下
|
||||
$lang->execution->unfinishedTask = "[%s]个未完成的任务,";
|
||||
$lang->execution->unresolvedBug = "[%s]个未解决的bug,";
|
||||
$lang->execution->projectNotEmpty = '所属项目不能为空。';
|
||||
$lang->execution->realBeganNotEmpty = "实际开始不能为空。";
|
||||
$lang->execution->realBeganNotFuture = "实际开始不能大于当前日期。";
|
||||
$lang->execution->realEndNotEmpty = "实际完成不能为空。";
|
||||
$lang->execution->realEndNotFuture = "实际完成不能大于当前日期。";
|
||||
|
||||
|
||||
/* 统计。*/
|
||||
$lang->execution->charts = new stdclass();
|
||||
|
||||
@@ -700,14 +700,24 @@ class executionModel extends model
|
||||
$now = helper::now();
|
||||
|
||||
$execution = fixer::input('post')
|
||||
->add('realBegan', helper::today())
|
||||
->setDefault('status', 'doing')
|
||||
->setDefault('lastEditedBy', $this->app->user->account)
|
||||
->setDefault('lastEditedDate', $now)
|
||||
->remove('comment')->get();
|
||||
|
||||
if($execution->realBegan == '')
|
||||
{
|
||||
dao::$errors['realBegan'] = $this->lang->execution->realBeganNotEmpty;
|
||||
return false;
|
||||
}
|
||||
if($execution->realBegan > helper::today())
|
||||
{
|
||||
dao::$errors['realBegan'] = $this->lang->execution->realBeganNotFuture;
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->dao->update(TABLE_EXECUTION)->data($execution)->autoCheck()->where('id')->eq((int)$executionID)->exec();
|
||||
|
||||
|
||||
if(!dao::isError()) return common::createChanges($oldExecution, $execution);
|
||||
}
|
||||
|
||||
@@ -779,6 +789,7 @@ class executionModel extends model
|
||||
$now = helper::now();
|
||||
|
||||
$execution = fixer::input('post')
|
||||
->setDefault('realEnd', '')
|
||||
->setDefault('status', 'doing')
|
||||
->setDefault('lastEditedBy', $this->app->user->account)
|
||||
->setDefault('lastEditedDate', $now)
|
||||
@@ -848,18 +859,30 @@ class executionModel extends model
|
||||
|
||||
$execution = fixer::input('post')
|
||||
->setDefault('status', 'closed')
|
||||
->setDefault('realEnd', helper::today())
|
||||
->setDefault('closedBy', $this->app->user->account)
|
||||
->setDefault('closedDate', $now)
|
||||
->setDefault('lastEditedBy', $this->app->user->account)
|
||||
->setDefault('lastEditedDate', $now)
|
||||
->remove('comment')
|
||||
->get();
|
||||
|
||||
if($execution->realEnd == '')
|
||||
{
|
||||
dao::$errors['realEnd'] = $this->lang->execution->realEndNotEmpty;
|
||||
return false;
|
||||
}
|
||||
|
||||
if($execution->realEnd > helper::today())
|
||||
{
|
||||
dao::$errors['realEnd'] = $this->lang->execution->realEndNotFuture;
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->dao->update(TABLE_EXECUTION)->data($execution)
|
||||
->autoCheck()
|
||||
->where('id')->eq((int)$executionID)
|
||||
->exec();
|
||||
|
||||
if(!dao::isError())
|
||||
{
|
||||
$this->loadModel('score')->create('execution', 'close', $oldExecution);
|
||||
|
||||
@@ -30,6 +30,14 @@
|
||||
<td><?php echo html::hidden('status', 'closed');?></td>
|
||||
</tr>
|
||||
<?php $this->printExtendFields($execution, 'table');?>
|
||||
<tr>
|
||||
<th><?php echo $lang->execution->realEnd;?></th>
|
||||
<td>
|
||||
<div class='w-150px'>
|
||||
<?php echo html::input('realEnd',(!empty($execution->realEnd) && $execution->realEnd != '0000-00-00' ? $execution->realEnd : date('Y-m-d')), "class='form-control form-date' required");?>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='w-50px'><?php echo $lang->comment;?></th>
|
||||
<td><?php echo html::textarea('comment', '', "rows='6' class='form-control kindeditor' hidefocus='true'");?></td>
|
||||
|
||||
@@ -26,6 +26,14 @@
|
||||
<table class='table table-form'>
|
||||
<tbody>
|
||||
<?php $this->printExtendFields($execution, 'table', 'columns=2');?>
|
||||
<tr>
|
||||
<th><?php echo $lang->execution->realBegan;?></th>
|
||||
<td>
|
||||
<div class = 'w-150px'>
|
||||
<?php echo html::input('realBegan',(!empty($execution->realBeganDate) && $execution->realBegan != '0000-00-00' ? $execution->realBegan : date('Y-m-d')), "class='form-control form-date' required");?>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='w-40px'><?php echo $lang->comment;?></th>
|
||||
<td><?php echo html::textarea('comment', '', "rows='6' class='form-control kindeditor' hidefocus='true'");?></td>
|
||||
|
||||
@@ -238,13 +238,13 @@
|
||||
<tr>
|
||||
<th><?php echo $lang->execution->begin;?></th>
|
||||
<td><?php echo $execution->begin;?></td>
|
||||
<th><?php echo $lang->execution->realBegan;?></th>
|
||||
<th><?php echo $lang->execution->realBeganAB;?></th>
|
||||
<td><?php echo $execution->realBegan == '0000-00-00' ? '' : $execution->realBegan;?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->execution->end;?></th>
|
||||
<td><?php echo $execution->end;?></td>
|
||||
<th><?php echo $lang->execution->realEnd;?></th>
|
||||
<th><?php echo $lang->execution->realEndAB;?></th>
|
||||
<td><?php echo $execution->realEnd == '0000-00-00' ? '' : $execution->realEnd;?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
@@ -292,9 +292,10 @@ class mailModel extends model
|
||||
}
|
||||
|
||||
/* Remove deleted users. */
|
||||
$users = $this->loadModel('user')->getPairs('nodeleted|all');
|
||||
foreach($toList as $key => $to) if(!isset($users[trim($to)])) unset($toList[$key]);
|
||||
foreach($ccList as $key => $cc) if(!isset($users[trim($cc)])) unset($ccList[$key]);
|
||||
$users = $this->loadModel('user')->getPairs('nodeleted|all');
|
||||
$blockUsers = isset($this->config->message->blockUser) ? explode(',', $this->config->message->blockUser) : array();
|
||||
foreach($toList as $key => $to) if(!isset($users[trim($to)]) or in_array(trim($to), $blockUsers)) unset($toList[$key]);
|
||||
foreach($ccList as $key => $cc) if(!isset($users[trim($cc)]) or in_array(trim($cc), $blockUsers)) unset($ccList[$key]);
|
||||
|
||||
if(!$toList and !$ccList) return;
|
||||
if(!$toList and $ccList) $toList = array(array_shift($ccList));
|
||||
|
||||
@@ -84,7 +84,9 @@ class message extends control
|
||||
{
|
||||
$data = fixer::input('post')->get();
|
||||
$data->messageSetting = !empty($data->messageSetting) ? json_encode($data->messageSetting) : '';
|
||||
$data->blockUser = !empty($data->blockUser) ? implode(',', $data->blockUser) : '';
|
||||
$this->loadModel('setting')->setItem('system.message.setting', $data->messageSetting);
|
||||
$this->loadModel('setting')->setItem('system.message.blockUser', $data->blockUser);
|
||||
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => 'reload'));
|
||||
}
|
||||
|
||||
@@ -95,7 +97,7 @@ class message extends control
|
||||
$this->view->position[] = $this->lang->message->common;
|
||||
$this->view->position[] = $this->lang->message->setting;
|
||||
|
||||
$users = $this->loadModel('user')->getPairs('noletter');
|
||||
$users = $this->loadModel('user')->getPairs('noletter,noclosed');
|
||||
unset($users['']);
|
||||
|
||||
$this->view->users = $users;
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
<?php
|
||||
$lang->message->common = 'Notification';
|
||||
$lang->message->index = 'Home';
|
||||
$lang->message->setting = 'Settings';
|
||||
$lang->message->browser = 'Browser Notification';
|
||||
$lang->message->common = 'Notification';
|
||||
$lang->message->index = 'Home';
|
||||
$lang->message->setting = 'Settings';
|
||||
$lang->message->browser = 'Browser Notification';
|
||||
$lang->message->blockUser = 'Block User';
|
||||
|
||||
$lang->message->typeList['mail'] = 'Email';
|
||||
$lang->message->typeList['message'] = 'Browser Notifications';
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
<?php
|
||||
$lang->message->common = '消息';
|
||||
$lang->message->index = '首页';
|
||||
$lang->message->setting = '设置';
|
||||
$lang->message->browser = '浏览器通知';
|
||||
$lang->message->common = '消息';
|
||||
$lang->message->index = '首页';
|
||||
$lang->message->setting = '设置';
|
||||
$lang->message->browser = '浏览器通知';
|
||||
$lang->message->blockUser = '不通知人员';
|
||||
|
||||
$lang->message->typeList['mail'] = '邮件';
|
||||
$lang->message->typeList['message'] = '浏览器通知';
|
||||
|
||||
@@ -74,6 +74,10 @@
|
||||
<?php endforeach;?>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
<tr>
|
||||
<td><?php echo $lang->message->blockUser;?></td>
|
||||
<td><?php echo html::select('blockUser[]', $users, isset($config->message->blockUser) ? $config->message->blockUser: '', "class='form-control chosen' multiple");?></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
<?php $tab = '';?>
|
||||
<?php if($action->objectType == 'meeting') $tab = $action->project ? "data-app='project'" : "data-app='my'";?>
|
||||
<?php
|
||||
if((isset($config->maxVersion) and strpos($config->action->assetType, $action->objectType) !== false) or empty($action->objectName))
|
||||
if((isset($config->maxVersion) and strpos($config->action->assetType, $action->objectType) !== false) and empty($action->objectName))
|
||||
{
|
||||
echo '#' . $action->objectID;
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ $lang->program->canceledBy = 'CanceledBy';
|
||||
$lang->program->canceledDate = 'CanceledDate';
|
||||
$lang->program->team = 'Team';
|
||||
$lang->program->order = 'Rank';
|
||||
$lang->program->days = 'Available Days';
|
||||
$lang->program->days = 'Days';
|
||||
$lang->program->acl = 'Access Control';
|
||||
$lang->program->whitelist = 'WhiteList';
|
||||
$lang->program->deleted = 'Deleted';
|
||||
|
||||
@@ -23,17 +23,17 @@ $lang->programplan->emptyParent = 'N/A';
|
||||
$lang->programplan->name = 'Stage Name';
|
||||
$lang->programplan->subStageName = 'Sub Stage Name';
|
||||
$lang->programplan->percent = 'Workload Ratio';
|
||||
$lang->programplan->percentAB = 'Workload Ratio';
|
||||
$lang->programplan->percentAB = 'Ratio';
|
||||
$lang->programplan->planPercent = 'Workload';
|
||||
$lang->programplan->attribute = 'Stage Type';
|
||||
$lang->programplan->attribute = 'Type';
|
||||
$lang->programplan->milestone = 'Milestone';
|
||||
$lang->programplan->taskProgress = 'Task Progress';
|
||||
$lang->programplan->task = 'Task';
|
||||
$lang->programplan->begin = 'Begin';
|
||||
$lang->programplan->end = 'End';
|
||||
$lang->programplan->realBegan = 'Actual Started';
|
||||
$lang->programplan->realBegan = 'Actual Start';
|
||||
$lang->programplan->realEnd = 'Actual End';
|
||||
$lang->programplan->ac = 'Actual cost';
|
||||
$lang->programplan->ac = 'Actual Cost';
|
||||
$lang->programplan->sv = 'Schedule Variance';
|
||||
$lang->programplan->cv = 'Cost Variance';
|
||||
$lang->programplan->planDateRange = 'Planned Start';
|
||||
@@ -48,7 +48,7 @@ $lang->programplan->version = 'Version';
|
||||
$lang->programplan->full = 'Full Screen';
|
||||
$lang->programplan->today = 'Today';
|
||||
$lang->programplan->exporting = 'Exporting';
|
||||
$lang->programplan->exportFail = 'Export failed';
|
||||
$lang->programplan->exportFail = 'Failed';
|
||||
$lang->programplan->hideCriticalPath = 'Hide Critical Path';
|
||||
$lang->programplan->showCriticalPath = 'Show Critical Path';
|
||||
$lang->programplan->errorEnd = "Project end date: %s, end date should be <= project end date.";
|
||||
@@ -61,7 +61,7 @@ $lang->programplan->noData = 'No Data';
|
||||
$lang->programplan->children = 'Sub Plan';
|
||||
$lang->programplan->childrenAB = 'Child';
|
||||
$lang->programplan->confirmDelete = 'Do you want to delete the current plan?';
|
||||
$lang->programplan->workloadTips = 'The proportion of the sub stage workload is divided by 100%.';
|
||||
$lang->programplan->workloadTips = 'The workload of the sub stage is divided by 100%.';
|
||||
|
||||
$lang->programplan->stageCustom = new stdClass();
|
||||
$lang->programplan->stageCustom->date = 'Show Date';
|
||||
@@ -71,5 +71,5 @@ $lang->programplan->error = new stdclass();
|
||||
$lang->programplan->error->percentNumber = '"Workload %" must be digits.';
|
||||
$lang->programplan->error->planFinishSmall = 'The "End" date must be > the "Begin" date.';
|
||||
$lang->programplan->error->percentOver = 'The sum of "Workload %" cannot exceed 100%.';
|
||||
$lang->programplan->error->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->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.';
|
||||
|
||||
@@ -112,4 +112,5 @@ $config->project->datatable->fieldList['actions']['required'] = 'yes';
|
||||
$config->project->datatable->fieldList['actions']['pri'] = '1';
|
||||
|
||||
$config->project->removePriv['project'] = array('browse', 'kanban', 'create', 'batchEdit', 'qa', 'updateOrder', 'createGuide', 'programTitle');
|
||||
$config->project->removePriv['bug'] = array('batchChangePlan');
|
||||
$config->project->removePriv['doc'] = array('catalog', 'index');
|
||||
|
||||
@@ -108,8 +108,10 @@ $lang->project->surplus = 'Left';
|
||||
$lang->project->progress = 'Progress';
|
||||
$lang->project->dateRange = 'Duration';
|
||||
$lang->project->to = ' to ';
|
||||
$lang->project->realBeganAB = 'Actual Begin';
|
||||
$lang->project->realEndAB = 'Actual End';
|
||||
$lang->project->realBegan = 'Actual Begin';
|
||||
$lang->project->realEnd = 'Actual End';
|
||||
$lang->project->realBegan = 'Actual Began';
|
||||
$lang->project->bygrid = 'Kanban';
|
||||
$lang->project->bylist = 'List';
|
||||
$lang->project->bycard = 'Card';
|
||||
@@ -146,7 +148,7 @@ $lang->project->teamSumCount = '%s people in total';
|
||||
$lang->project->longTime = 'Long-Term Program';
|
||||
$lang->project->future = 'TBD';
|
||||
$lang->project->moreProject = 'More Project';
|
||||
$lang->project->days = 'Available Days';
|
||||
$lang->project->days = 'Days';
|
||||
$lang->project->mailto = 'Mailto';
|
||||
$lang->project->etc = " , etc";
|
||||
$lang->project->product = 'Product';
|
||||
@@ -177,6 +179,9 @@ $lang->project->createExecution = "There is no {$lang->executionCommon} u
|
||||
$lang->project->unlinkExecutionMember = "The user participated in %s executions such as %s%s. Do you want to remove the user from those executions as well? (The data related to this user will not be deleted.)";
|
||||
$lang->project->unlinkExecutionMembers = "The team members you are removing are also in the execution team of this project. Do you want to remove them from the execution team too?";
|
||||
|
||||
$lang->project->realEndNotEmpty = 'Actual End should not be empty.';
|
||||
$lang->project->realEndNotFuture = 'Actual End should be < = today.';
|
||||
|
||||
$lang->project->tenThousand = '';
|
||||
|
||||
$lang->project->unitList['CNY'] = 'RMB';
|
||||
|
||||
@@ -108,8 +108,10 @@ $lang->project->surplus = '剩余';
|
||||
$lang->project->progress = '进度';
|
||||
$lang->project->dateRange = '起止日期';
|
||||
$lang->project->to = '至';
|
||||
$lang->project->realEnd = '实际完成日期';
|
||||
$lang->project->realBeganAB = '实际开始';
|
||||
$lang->project->realEndAB = '实际完成';
|
||||
$lang->project->realBegan = '实际开始日期';
|
||||
$lang->project->realEnd = '实际完成日期';
|
||||
$lang->project->bygrid = '看板';
|
||||
$lang->project->bylist = '列表';
|
||||
$lang->project->bycard = '卡片';
|
||||
@@ -177,6 +179,9 @@ $lang->project->createExecution = "该项目下没有{$lang->executionCom
|
||||
$lang->project->unlinkExecutionMember = "该用户参与了%s%s%s个{$lang->execution->common},是否同时将其移除?(该用户所产生的数据不会受影响。)";
|
||||
$lang->project->unlinkExecutionMembers = "移除的团队成员还参与了项目下的执行,是否同步从执行团队中移除?";
|
||||
|
||||
$lang->project->realEndNotEmpty = "实际完成不能为空。";
|
||||
$lang->project->realEndNotFuture = "实际完成不能大于当前日期。";
|
||||
|
||||
$lang->project->tenThousand = '万';
|
||||
|
||||
$lang->project->unitList['CNY'] = '人民币';
|
||||
|
||||
@@ -1206,6 +1206,7 @@ class projectModel extends model
|
||||
$now = helper::now();
|
||||
|
||||
$project = fixer::input('post')
|
||||
->setDefault('realEnd','')
|
||||
->setDefault('status', 'doing')
|
||||
->setDefault('lastEditedBy', $this->app->user->account)
|
||||
->setDefault('lastEditedDate', $now)
|
||||
@@ -1282,10 +1283,22 @@ class projectModel extends model
|
||||
->remove('comment')
|
||||
->get();
|
||||
|
||||
if($project->realEnd == '')
|
||||
{
|
||||
dao::$errors['realEnd'] = $this->lang->project->realEndNotEmpty;
|
||||
return false;
|
||||
}
|
||||
if($project->realEnd > helper::today())
|
||||
{
|
||||
dao::$errors['realEnd'] = $this->lang->project->realEndNotFuture;
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->dao->update(TABLE_PROJECT)->data($project)
|
||||
->autoCheck()
|
||||
->where('id')->eq((int)$projectID)
|
||||
->exec();
|
||||
|
||||
if(!dao::isError())
|
||||
{
|
||||
$this->loadModel('score')->create('project', 'close', $oldProject);
|
||||
|
||||
@@ -30,6 +30,14 @@
|
||||
<td><?php echo html::hidden('status', 'closed');?></td>
|
||||
</tr>
|
||||
<?php $this->printExtendFields($project, 'table');?>
|
||||
<tr>
|
||||
<th><?php echo $lang->project->realEnd;?></th>
|
||||
<td>
|
||||
<div class='w-150px'>
|
||||
<?php echo html::input('realEnd',(!empty($project->realEnd) && $project->realEnd != '0000-00-00' ? $project->realEnd : date('Y-m-d')), "class='form-control form-date' required");?>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='w-50px'><?php echo $lang->comment;?></th>
|
||||
<td><?php echo html::textarea('comment', '', "rows='6' class='form-control kindeditor' hidefocus='true'");?></td>
|
||||
|
||||
@@ -178,25 +178,31 @@
|
||||
<tr>
|
||||
<th><?php echo $lang->project->begin;?></th>
|
||||
<td><?php echo $project->begin;?></td>
|
||||
<th><?php echo $lang->execution->totalEstimate;?></th>
|
||||
<td><?php echo (float)$workhour->totalEstimate . $lang->execution->workHour;?></td>
|
||||
<th><?php echo $lang->project->realBeganAB;?></th>
|
||||
<td><?php echo $project->realBegan == '0000-00-00' ? '' : $project->realBegan;?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->project->end;?></th>
|
||||
<td><?php echo $project->end;?></td>
|
||||
<th><?php echo $lang->execution->totalConsumed;?></th>
|
||||
<td><?php echo (float)$workhour->totalConsumed . $lang->execution->workHour;?></td>
|
||||
<th><?php echo $lang->project->realEndAB;?></th>
|
||||
<td><?php echo $project->realEnd == '0000-00-00' ? '' : $project->realEnd;?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->execution->totalEstimate;?></th>
|
||||
<td><?php echo (float)$workhour->totalEstimate . $lang->execution->workHour;?></td>
|
||||
<th><?php echo $lang->execution->totalDays;?></th>
|
||||
<td><?php echo $project->days;?></td>
|
||||
<th><?php echo $lang->execution->totalLeft;?></th>
|
||||
<td><?php echo (float)$workhour->totalLeft . $lang->execution->workHour;?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->execution->totalConsumed;?></th>
|
||||
<td><?php echo (float)$workhour->totalConsumed . $lang->execution->workHour;?></td>
|
||||
<th><?php echo $lang->execution->totalHours;?></th>
|
||||
<td><?php echo (float)$workhour->totalHours . $lang->execution->workHour;?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->execution->totalLeft;?></th>
|
||||
<td><?php echo (float)$workhour->totalLeft . $lang->execution->workHour;?></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
@@ -133,7 +133,7 @@ $lang->repo->scmList['Subversion'] = 'SVN';
|
||||
|
||||
$lang->repo->gitlabHost = 'Gitlab Host';
|
||||
$lang->repo->gitlabToken = 'Gitlab Token';
|
||||
$lang->repo->gitlabProject = 'Projects';
|
||||
$lang->repo->gitlabProject = 'Project';
|
||||
|
||||
$lang->repo->placeholder = new stdclass;
|
||||
$lang->repo->placeholder->gitlabHost = 'Input url of gitlab';
|
||||
|
||||
@@ -29,7 +29,7 @@ $lang->tree->updateOrder = 'Rank Module';
|
||||
$lang->tree->manageChild = 'Manage Child Modules';
|
||||
$lang->tree->manageStoryChild = 'Manage Child Modules';
|
||||
$lang->tree->manageLineChild = "Manage {$lang->productCommon} Line";
|
||||
$lang->tree->manageBugChild = 'Manage Child Bugs';
|
||||
$lang->tree->manageBugChild = 'Manage Child Modules of Bugs';
|
||||
$lang->tree->manageCaseChild = 'Manage Child Cases';
|
||||
$lang->tree->manageCaselibChild = 'Manage Child Libraries';
|
||||
$lang->tree->manageTaskChild = "Manage Child {$lang->executionCommon} Modules";
|
||||
|
||||
Reference in New Issue
Block a user