Merge branch 'master' of github.com:easysoft/zentaopms

This commit is contained in:
wangyidong
2017-11-03 13:22:52 +08:00
17 changed files with 182 additions and 42 deletions
+1
View File
@@ -19,6 +19,7 @@ $lang->my->manageContacts = 'Maintain Contact';
$lang->my->deleteContacts = 'Delete Contact';
$lang->my->limited = 'Restricted operation (editing only content related to itself)';
$lang->my->score = 'My Score';
$lang->my->scoreRule = 'Score rule';
$lang->my->taskMenu = new stdclass();
$lang->my->taskMenu->assignedToMe = 'Assigned to Me';
+1
View File
@@ -19,6 +19,7 @@ $lang->my->manageContacts = '维护联系人';
$lang->my->deleteContacts = '删除联系人';
$lang->my->limited = '受限操作(只能编辑与自己相关的内容)';
$lang->my->score = '我的积分';
$lang->my->scoreRule = '积分规则';
$lang->my->taskMenu = new stdclass();
$lang->my->taskMenu->assignedToMe = '指派给我';
+1
View File
@@ -19,6 +19,7 @@ $lang->my->manageContacts = '維護聯繫人';
$lang->my->deleteContacts = '刪除聯繫人';
$lang->my->limited = '受限操作(只能編輯與自己相關的內容)';
$lang->my->score = '我的積分';
$lang->my->scoreRule = '積分規則';
$lang->my->taskMenu = new stdclass();
$lang->my->taskMenu->assignedToMe = '指派給我';
+1
View File
@@ -15,6 +15,7 @@
<div class='actions'>
<span class='btn disabled'><label><?php echo $lang->score->current; ?>:</label><?php echo $user->score; ?></span>
<span class='btn disabled hidden'><label><?php echo $lang->score->level; ?>:</label><?php echo $user->scoreLevel; ?></span>
<?php if($this->app->user->admin == 1) echo html::a($this->createLink('score', 'rule'), $lang->my->scoreRule, '', "class='btn btn-primary'");?>
</div>
</div>
<table class='table tablesorter'>
+12
View File
@@ -23,6 +23,18 @@ class score extends control
$this->score->create('ajax', $method);
}
/**
* Show score rule.
*
* @access public
* @return void
*/
public function rule()
{
$this->view->rule = $this->config->score;
$this->display();
}
/**
* Initialize score.
*
+10 -1
View File
@@ -20,7 +20,9 @@ $lang->score->score = 'Score';
$lang->score->after = 'After';
$lang->score->time = 'Time';
$lang->score->desc = 'Description';
$lang->score->noLimit = 'No limited';
$lang->score->times = 'Times';
$lang->score->hour = 'Hour';
$lang->score->models['task'] = 'Task';
$lang->score->models['tutorial'] = 'Tutorial';
@@ -77,3 +79,10 @@ $lang->score->methods['release']['create'] = 'Create release';
$lang->score->methods['block']['set'] = 'Custom block';
$lang->score->methods['search']['saveQuery'] = 'Save search query';
$lang->score->methods['search']['saveQueryAdvanced'] = 'Advanced search';
$lang->score->extended->userchangePassword = 'Password strength,medium:add extra score : #changePassword,strength,1#; Strong:add extra score : #changePassword,strength,2#.';
$lang->score->extended->projectclose = 'Project closed,PM add extra score : #projectClose,manager,close#,Team member add extra score : #projectClose,member,close#. Completed on schedule or in advance,PM add extra score : #projectClose,manager,in#,Team member Add extra score : #projectClose,member,in#.';
$lang->score->extended->bugresolve = 'Bug resolved,Add extra severity score :s1 + #bugResolve,severity,3#, s2 + #bugResolve,severity,2#, s3 + #bugResolve,severity,1#。';
$lang->score->extended->bugconfirmBug = 'Bug confirmed,Add extra severity score :s1 + #bugConfirmBug,severity,3#, s2 + #bugConfirmBug,severity,2#, s3 + #bugConfirmBug,severity,1#。';
$lang->score->extended->taskfinish = 'Task finished, Add extra score round(consumed /10 * estimate / consumed) + severity score(p1 #taskFinish,pri,1#, p2, #taskFinish,pri,2#)。';
$lang->score->extended->storyclose = 'Add extra score for story creator : #storyClose,createID#.';
+10 -1
View File
@@ -20,7 +20,9 @@ $lang->score->score = '分值';
$lang->score->after = '之后';
$lang->score->time = '时间';
$lang->score->desc = '描述';
$lang->score->noLimit = '不限制';
$lang->score->times = '次数';
$lang->score->hour = '时间间隔';
$lang->score->models['task'] = '任务';
$lang->score->models['tutorial'] = '新手教程';
@@ -77,3 +79,10 @@ $lang->score->methods['release']['create'] = '创建发布';
$lang->score->methods['block']['set'] = '区块自定义设置';
$lang->score->methods['search']['saveQuery'] = '保存搜索条件';
$lang->score->methods['search']['saveQueryAdvanced'] = '使用高级搜索';
$lang->score->extended->userchangePassword = '密码强度中的,额外获得#changePassword,strength,1#个积分,强的,额外获得#changePassword,strength,2#个积分。';
$lang->score->extended->projectclose = '项目经理增加#projectClose,manager,close#个积分,项目成员增加#projectClose,member,close#个积分。按期或者提前完成,项目经理额外增加#projectClose,manager,in#个积分,项目成员额外增加#projectClose,member,in#个积分。';
$lang->score->extended->bugresolve = 'Bug解决后,额外增加严重程度积分:s1 + #bugResolve,severity,3#, s2 + #bugResolve,severity,2#, s3 + #bugResolve,severity,1#。';
$lang->score->extended->bugconfirmBug = 'Bug确认后,额外增加严重程度积分:s1 + #bugConfirmBug,severity,3#, s2 + #bugConfirmBug,severity,2#, s3 + #bugConfirmBug,severity,1#。';
$lang->score->extended->taskfinish = '额外增加工时积分 round(工时 /10 * 预计 / 消耗) + 优先级积分(p1 #taskFinish,pri,1#, p2, #taskFinish,pri,2#)。';
$lang->score->extended->storyclose = '需求的创建者额外增加#storyClose,createID#分';
+11 -2
View File
@@ -20,7 +20,9 @@ $lang->score->score = '分值';
$lang->score->after = '之後';
$lang->score->time = '時間';
$lang->score->desc = '描述';
$lang->score->noLimit = '不限制';
$lang->score->times = '次数';
$lang->score->hour = '时间间隔';
$lang->score->models['task'] = '任務';
$lang->score->models['tutorial'] = '新手教程';
@@ -77,4 +79,11 @@ $lang->score->methods['productplan']['create'] = '創建計劃';
$lang->score->methods['release']['create'] = '創建發布';
$lang->score->methods['block']['set'] = '區塊自定義設置';
$lang->score->methods['search']['saveQuery'] = '保存搜索條件';
$lang->score->methods['search']['saveQueryAdvanced'] = '使用高級搜索';
$lang->score->methods['search']['saveQueryAdvanced'] = '使用高級搜索';
$lang->score->extended->userchangePassword = '密碼強度中的,額外獲得#changePassword,strength,1#個積分,強的,額外獲得#changePassword,strength,2#個積分。';
$lang->score->extended->projectclose = '項目經理增加#projectClose,manager,close#個積分,項目成員增加#projectClose,member,close#個積分。按期或者提前完成,項目經理額外增加#projectClose,manager,in#個積分,項目成員額外增加#projectClose,member,in#個積分。';
$lang->score->extended->bugresolve = 'Bug解決後,額外增加嚴重程度積分:s1 + #bugResolve,severity,3#, s2 + #bugResolve,severity,2#, s3 + #bugResolve,severity,1#。';
$lang->score->extended->bugconfirmBug = 'Bug確認後,額外增加嚴重程度積分:s1 + #bugConfirmBug,severity,3#, s2 + #bugConfirmBug,severity,2#, s3 + #bugConfirmBug,severity,1#。';
$lang->score->extended->taskfinish = '額外增加工時積分 round(工時/ 10 * 預計/消耗) + 優先級積分(p1 #taskFinish,pri,1#, p2, #taskFinish,pri,2#)。';
$lang->score->extended->storyclose = '需要的創建者額外增加#storyClose,createID#分';
+58
View File
@@ -0,0 +1,58 @@
<?php
/**
* The reset view file of score module of ZenTaoPMS.
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
* @license ZPL (http://zpl.pub/page/zplv12.html)
* @author Memory <lvtao@cnezsoft.com>
* @package score
* @version $Id$
* @link http://www.zentao.net
*/
?>
<?php include '../../common/view/header.html.php'; ?>
<table class="table table-striped">
<thead>
<tr>
<th class="w-150px"><?php echo $this->lang->score->module;?></th>
<th class="w-150px"><?php echo $this->lang->score->method;?></th>
<th class="w-150px"><?php echo $this->lang->score->times;?></th>
<th class="w-150px"><?php echo $this->lang->score->hour;?></th>
<th class="w-150px"><?php echo $this->lang->score->score;?></th>
<th>备注</th>
</tr>
</thead>
<tbody>
<?php foreach($rule as $key => $value):?>
<?php if($key == 'extended') break;?>
<?php foreach($value as $oneKey => $oneValue):?>
<tr>
<td class="text-center"><?php echo $this->lang->score->models[$key];?></td>
<td class="text-center"><?php echo $this->lang->score->methods[$key][$oneKey];?></td>
<td class="text-center"><?php echo empty($oneValue['times']) ? $this->lang->score->noLimit : $oneValue['times'];?></td>
<td class="text-center"><?php echo empty($oneValue['hour']) ? $this->lang->score->noLimit : $oneValue['hour'];?></td>
<td class="text-center"><?php echo $oneValue['score'];?></td>
<td>
<?php
if(isset($this->lang->score->extended->{$key . $oneKey}))
{
$str = $this->lang->score->extended->{$key . $oneKey};
$strArray = explode('#', $str);
if(!empty($strArray)) foreach($strArray as $strKey => $strVal)
{
if($strKey % 2 == 1)
{
$ab = explode(',', $strVal);
$score = count($ab) == 3 ? $rule->extended->{$ab[0]}[$ab[1]][$ab[2]] : $rule->extended->{$ab[0]}[$ab[1]];
$str = str_replace('#' . $strVal . '#', $score, $str);
}
}
echo $str;
}
?>
</td>
</tr>
<?php endforeach;?>
<?php endforeach;?>
</tfoot>
</table>
<?php include '../../common/view/footer.html.php'; ?>
+3 -2
View File
@@ -780,8 +780,9 @@ class task extends control
if(!empty($task->team))
{
$task->openedBy = $this->task->getNextUser(array_keys($task->team), $task->assignedTo);
$members = $this->task->getMemberPairs($task);
$task->openedBy = $this->task->getNextUser(array_keys($task->team), $task->assignedTo);
$members = $this->task->getMemberPairs($task);
$task->myConsumed = $this->dao->select('consumed')->from(TABLE_TEAM)->where('task')->eq($taskID)->andWhere('account')->eq($task->assignedTo)->fetch('consumed');
}
$this->view->title = $this->view->project->name . $this->lang->colon .$this->lang->task->finish;
+1 -1
View File
@@ -107,7 +107,7 @@ $lang->task->parent = 'Parent Task';
$lang->task->unfinished = 'Unfinished';
$lang->task->lblPri = 'P';
$lang->task->lblHour = '(h)';
$lang->task->deniedNotice = 'This task only starting from <strong>% s </ strong>.';
$lang->task->deniedNotice = 'This task can only be started by the first user in the team.';
$lang->task->ditto = 'Ditto';
$lang->task->dittoNotice = "This Task does not belong to the Project as the previous one does!";
+1 -1
View File
@@ -106,7 +106,7 @@ $lang->task->childrenAB = '子';
$lang->task->parent = '父任务';
$lang->task->lblPri = 'P';
$lang->task->lblHour = '(h)';
$lang->task->deniedNotice = '此任务只允许由<strong>%s</strong>开始。';
$lang->task->deniedNotice = '此任务只允许由团队第一人开始。';
$lang->task->ditto = '同上';
$lang->task->dittoNotice = "该任务与上一任务不属于同一项目!";
+1 -1
View File
@@ -107,7 +107,7 @@ $lang->task->parent = '父任務';
$lang->task->unfinished = '未完成';
$lang->task->lblPri = 'P';
$lang->task->lblHour = '(h)';
$lang->task->deniedNotice = '此任務只允許由<strong>%s</strong>開始。';
$lang->task->deniedNotice = '此任務只允許由團隊第一人開始。';
$lang->task->ditto = '同上';
$lang->task->dittoNotice = "該任務與上一任務不屬於同一項目!";
+59 -29
View File
@@ -687,6 +687,7 @@ class taskModel extends model
->setDefault('lastEditedDate', $now)
->setIF($oldTask->assignedTo != $this->app->user->account, 'assignedDate', $now)
->remove('comment')->get();
if($this->post->left == 0)
{
$task->status = 'done';
@@ -707,6 +708,27 @@ class taskModel extends model
$estimate->consumed = $estimate->consumed - $oldTask->consumed;
$this->addTaskEstimate($estimate);
if(!empty($oldTask->team) && $task->status == 'done')
{
$teams = array_keys($oldTask->team);
if(empty($oldTask->assignedTo)) $oldTask->assignedTo = $teams[0];
$newTeamInfo = new stdClass();
$newTeamInfo->consumed = $task->consumed;
$newTeamInfo->left = 0;
$this->dao->update(TABLE_TEAM)->data($newTeamInfo)->where('task')->eq($taskID)->andWhere('account')->eq($oldTask->assignedTo)->exec();
$newTask = new stdClass();
$newTask->left = 0;
$newTask->status = 'doing';
$newTask->consumed = $task->consumed;
$newTask->assignedTo = $this->getNextUser($teams, $oldTask->assignedTo);
$newTask->assignedDate = $now;
$this->dao->update(TABLE_TASK)->data($newTask)->where('id')->eq((int)$taskID)->exec();
if($task->assignedTo != $teams[count($teams) - 1]) return common::createChanges($oldTask, $newTask);
}
$this->dao->update(TABLE_TASK)->data($task)
->autoCheck()
->check('consumed,left', 'float')
@@ -826,22 +848,31 @@ class taskModel extends model
$data->assignedDate = $now;
}
if(!empty($task->team))
{
if(in_array($this->app->user->account,array_keys($task->team)))
{
$myTeamInfo = $this->dao->select('`consumed`,`left`')->from(TABLE_TEAM)->where('task')->eq($taskID)->andWhere('account')->eq($this->app->user->account)->fetch();
if(!empty($myTeamInfo))
{
$newTeamInfo = new stdClass();
$newTeamInfo->consumed = $myTeamInfo->consumed + $consumed;
$newTeamInfo->left = $left;
$this->dao->update(TABLE_TEAM)->data($newTeamInfo)->where('task')->eq($taskID)->andWhere('account')->eq($this->app->user->account)->exec();
}
}
$teams = array_keys($task->team);
$data->left = $this->dao->select("sum(`left`) as leftTime")->from(TABLE_TEAM)->where('task')->eq((int)$taskID)->andWhere('account')->in(array_keys($task->team))->fetch('leftTime');
$myConsumed = $this->dao->select('`consumed`')->from(TABLE_TEAM)->where('task')->eq($taskID)->andWhere('account')->eq($task->assignedTo)->fetch('consumed');
$newTeamInfo = new stdClass();
$newTeamInfo->consumed = $myConsumed + $consumed;
$newTeamInfo->left = $left;
$this->dao->update(TABLE_TEAM)->data($newTeamInfo)->where('task')->eq($taskID)->andWhere('account')->eq($task->assignedTo)->exec();
$teamTime = $this->dao->select("sum(`consumed`) as consumed,sum(`left`) as leftTime")->from(TABLE_TEAM)->where('task')->eq((int)$taskID)->andWhere('account')->in($teams)->fetch();
$data->consumed = $teamTime->consumed;
$data->left = $teamTime->leftTime;
if($task->status == 'done')
{
$newTask = new stdClass();
$newTask->left = $data->left;
$newTask->consumed = $data->consumed;
$newTask->assignedTo = $this->getNextUser($teams, $task->assignedTo);
$this->dao->update(TABLE_TASK)->data($newTask)->where('id')->eq((int)$taskID)->exec();
if($task->assignedTo != $teams[count($teams) - 1]) return common::createChanges($task, $newTask);
}
}
$this->dao->update(TABLE_TASK)->data($data)->where('id')->eq($taskID)->exec();
@@ -902,26 +933,25 @@ class taskModel extends model
if(!empty($oldTask->team))
{
$teams = array_keys($oldTask->team);
if(in_array($this->app->user->account, $teams))
{
$myLeft = $this->dao->select("`left`")->from(TABLE_TEAM)->where('task')->eq((int)$taskID)->andWhere('account')->in($this->app->user->account)->fetch('left');
if($myLeft <= 0) die(js::error($this->lang->task->error->isFinish));
$data = new stdClass();
$data->left = 0;
$data->consumed = $task->consumed;
$this->dao->update(TABLE_TEAM)->data($data)->where('task')->eq((int)$taskID)->andWhere('account')->eq($this->app->user->account)->exec();
$myConsumed = $this->dao->select("`consumed`")->from(TABLE_TEAM)->where('task')->eq((int)$taskID)->andWhere('account')->eq($oldTask->assignedTo)->fetch('consumed');
if($task->consumed < $myConsumed) die(js::error($this->lang->task->error->consumedSmall));
$left = $this->dao->select("sum(`left`) as leftTime")->from(TABLE_TEAM)->where('task')->eq((int)$taskID)->andWhere('account')->in($teams)->fetch('leftTime');
$data = new stdClass();
$data->left = 0;
$data->consumed = $task->consumed;
$this->dao->update(TABLE_TEAM)->data($data)->where('task')->eq((int)$taskID)->andWhere('account')->eq($oldTask->assignedTo)->exec();
$newTask = new stdClass();
$newTask->left = $left;
$newTask->consumed = $oldTask->consumed + $task->consumed;
$newTask->assignedTo = $task->assignedTo;
$this->dao->update(TABLE_TASK)->data($newTask)->where('id')->eq((int)$taskID)->exec();
$myTime = $this->dao->select("sum(`left`) as leftTime,sum(`consumed`) as consumed")->from(TABLE_TEAM)->where('task')->eq((int)$taskID)->andWhere('account')->in($teams)->fetch();
if($this->app->user->account != $teams[count($teams)]) return common::createChanges($oldTask, $newTask);
}
$newTask = new stdClass();
$newTask->left = $myTime->leftTime;
$newTask->consumed = $myTime->consumed;
$newTask->assignedTo = $task->assignedTo;
$this->dao->update(TABLE_TASK)->data($newTask)->where('id')->eq((int)$taskID)->exec();
if($oldTask->assignedTo != $teams[count($teams) - 1]) return common::createChanges($oldTask, $newTask);
$task->consumed = $myTime->consumed;
}
if($task->finishedDate == substr($now, 0, 10)) $task->finishedDate = $now;
+7 -1
View File
@@ -23,9 +23,15 @@
<form class='form-condensed' method='post' enctype='multipart/form-data' target='hiddenwin'>
<table class='table table-form'>
<tr>
<th class='w-80px'><?php echo $lang->task->hasConsumed;?></th>
<th class='w-80px'><?php echo !empty($task->team) ? $lang->task->common.$lang->task->consumed : $lang->task->hasConsumed;?></th>
<td class='w-p25-f'> <?php echo $task->consumed;?> <?php echo $lang->workingHour;?></td><td></td>
</tr>
<?php if(!empty($task->team)):?>
<tr>
<th class='w-80px'><?php echo $lang->task->hasConsumed;?></th>
<td class='w-p25-f'> <?php echo $task->myConsumed;?> <?php echo $lang->workingHour;?></td><td></td>
</tr>
<?php endif;?>
<tr>
<th><?php echo $lang->task->consumed;?></th>
<td><div class='input-group'><?php echo html::input('consumed', $task->consumed, "class='form-control' autocomplete='off'");?> <span class='input-group-addon'><?php echo $lang->task->hour;?></span></div></td>
+3 -1
View File
@@ -54,7 +54,8 @@
</tr>
<?php endforeach;?>
<?php endif;?>
<?php if($task->status == 'wait' or $task->status =='pause' or $task->status == 'doing'):?>
<?php if(in_array($task->status, array('wait', 'pause', 'doing'))):?>
<?php if(empty($task->team) || (!empty($task->team) && $task->assignedTo == $this->app->user->account)) :?>
<thead>
<tr class='text-center'>
<th class="w-id"><?php echo $lang->idAB;?></th>
@@ -80,6 +81,7 @@
</tr>
</table>
<?php endif;?>
<?php endif;?>
</form>
</div>
<?php include '../../common/view/footer.lite.html.php';?>
+2 -2
View File
@@ -15,10 +15,10 @@
<?php include '../../common/view/datepicker.html.php';?>
<?php js::set('confirmFinish', $lang->task->confirmFinish);?>
<?php if(!empty($task->team) && array_keys($task->team)[0] != $this->app->user->account):?>
<div class="alert alert-info with-icon">
<div class="alert with-icon">
<i class="icon-info-sign"></i>
<div class="content">
<p><?php echo sprintf($lang->task->deniedNotice, array_keys($task->team)[0]);?></p>
<p><?php echo $lang->task->deniedNotice;?></p>
</div>
</div>
<?php exit;?>