diff --git a/module/task/control.php b/module/task/control.php index 3c98ecdba2..cd286138b6 100644 --- a/module/task/control.php +++ b/module/task/control.php @@ -423,6 +423,32 @@ class task extends control $this->display(); } + /** + * Record consumed and estimate. + * + * @param int $taskID + * @access public + * @return void + */ + public function record($taskID, $confirm = 'no') + { + $this->commonAction($taskID); + + if(!empty($_POST)) + { + $changes = $this->task->record($taskID); + $actionID = $this->action->create('task', $taskID, 'Record', ''); + $this->action->logHistory($actionID, $changes); + die(js::locate($this->createLink('task', 'view', "taskID=$taskID"), 'parent')); + } + + $header['title'] = $this->lang->task->record; + + $this->view->header = $header; + $this->view->beforeConsumed = $this->task->getBeforeConsumed($taskID); + $this->display(); + } + /** * Finish a task. * diff --git a/module/task/lang/en.php b/module/task/lang/en.php index 899bd483a2..980bc792f4 100644 --- a/module/task/lang/en.php +++ b/module/task/lang/en.php @@ -18,6 +18,7 @@ $lang->task->edit = "Update"; $lang->task->delete = "Delete"; $lang->task->view = "Info"; $lang->task->logEfforts = "Efforts"; +$lang->task->record = "Estimate"; $lang->task->start = "Start"; $lang->task->finish = "Finish"; $lang->task->close = "Close"; @@ -46,6 +47,8 @@ $lang->task->leftAB = 'Left'; $lang->task->consumed = 'Consumed'; $lang->task->consumedAB = 'Use'; $lang->task->hour = 'Hour'; +$lang->task->beforeConsumed = 'Before consumed'; +$lang->task->consumedThisTime = 'This time consumed'; $lang->task->estStarted = 'Estimate start'; $lang->task->realStarted = 'Real start'; $lang->task->deadline = 'Deadline'; @@ -135,7 +138,8 @@ $lang->task->remindBug = "This task from Bug, update the Bug:%s or no $lang->task->confirmChangeProject = 'Change project will change module, story and assignedTo also, are you sure?'; $lang->task->error = new stdclass(); -$lang->task->error->consumed = '"Consumed" must be number'; +$lang->task->error->consumed = '"Consumed" must be number'; +$lang->task->error->newConsumed = '"Consumed" must be more than consumed before'; /* Report. */ $lang->task->report = new stdclass(); diff --git a/module/task/lang/zh-cn.php b/module/task/lang/zh-cn.php index 21ed8fddd9..bc775cd67b 100644 --- a/module/task/lang/zh-cn.php +++ b/module/task/lang/zh-cn.php @@ -18,6 +18,7 @@ $lang->task->edit = "编辑"; $lang->task->delete = "删除"; $lang->task->view = "查看任务"; $lang->task->logEfforts = "记录工时"; +$lang->task->record = "工时"; $lang->task->start = "开始"; $lang->task->finish = "完成"; $lang->task->close = "关闭"; @@ -46,6 +47,8 @@ $lang->task->leftAB = '剩'; $lang->task->consumed = '已经消耗'; $lang->task->consumedAB = '耗'; $lang->task->hour = '小时'; +$lang->task->beforeConsumed = '之前消耗'; +$lang->task->consumedThisTime = '本次消耗'; $lang->task->estStarted = '预计开始'; $lang->task->realStarted = '实际开始'; $lang->task->deadline = '截止日期'; @@ -135,7 +138,8 @@ $lang->task->remindBug = "该任务为Bug转化得到,是否更新B $lang->task->confirmChangeProject = '修改项目会导致相应的所属模块、相关需求和指派人发生变化,确定吗?'; $lang->task->error = new stdclass(); -$lang->task->error->consumed = '"已经消耗"必须为数字'; +$lang->task->error->consumed = '"已经消耗"必须为数字'; +$lang->task->error->newConsumed = '"已经消耗"必须大于之前消耗'; /* 统计报表。*/ $lang->task->report = new stdclass(); diff --git a/module/task/model.php b/module/task/model.php index d72b166edb..8cf16f6e2a 100644 --- a/module/task/model.php +++ b/module/task/model.php @@ -184,6 +184,23 @@ class taskModel extends model ->get(); $task->statusCustom = strpos(self::CUSTOM_STATUS_ORDER, $task->status) + 1; + if($task->consumed < $oldTask->consumed) + { + die(js::error($this->lang->task->error->newConsumed)); + } + else if($task->consumed != $oldTask->consumed or $task->left != $oldTask->left) + { + $estimate = new stdClass(); + $estimate->consumed = $task->consumed - $oldTask->consumed; + $estimate->left = $task->left; + $estimate->task = $taskID; + $estimate->account = $this->app->user->account; + $estimate->date = helper::now(); + + $this->dao->insert(TABLE_TASKESTIMATE)->data($estimate) + ->autoCheck() + ->exec(); + } $this->dao->update(TABLE_TASK)->data($task) ->autoCheck() ->batchCheckIF($task->status != 'cancel', $this->config->task->edit->requiredFields, 'notempty') @@ -386,6 +403,35 @@ class taskModel extends model if(!dao::isError()) return common::createChanges($oldTask, $task); } + /** + * Record estimate and left of task. + * + * @param int $taskID + * @access public + * @return void + */ + public function record($taskID) + { + $oldTask = $this->getById($taskID); + $estimate = fixer::input('post') + ->setDefault('account', $this->app->user->account) + ->setDefault('task', $taskID) + ->setDefault('date', helper::now()) + ->get(); + $this->dao->insert(TABLE_TASKESTIMATE)->data($estimate) + ->autoCheck() + ->exec(); + + $consumed = $this->getBeforeConsumed($taskID); + $this->dao->update(TABLE_TASK) + ->set('consumed')->eq($consumed) + ->set('`left`')->eq($estimate->left) + ->where('id')->eq($taskID) + ->exec(); + $task = $this->getById($taskID); + if(!dao::isError()) return common::createChanges($oldTask, $task); + } + /** * Finish a task. * @@ -729,6 +775,24 @@ class taskModel extends model return $taskCounts; } + /** + * Get before consumed. + * + * @param int $taskID + * @access public + * @return int + */ + public function getBeforeConsumed($taskID) + { + $tasks = $this->dao->select('consumed')->from(TABLE_TASKESTIMATE)->where('task')->eq($taskID)->fetchAll(); + $beforeConsumed = 0; + foreach($tasks as $task) + { + $beforeConsumed += $task->consumed; + } + return $beforeConsumed; + } + /** * Batch process tasks. * @@ -1072,6 +1136,7 @@ class taskModel extends model if($action == 'assignto') return $task->status != 'closed' and $task->status != 'cancel'; if($action == 'start') return $task->status != 'doing' and $task->status != 'closed' and $task->status != 'cancel'; + if($action == 'record') return $task->status != 'done' and $task->status != 'closed' and $task->status != 'cancel'; if($action == 'finish') return $task->status != 'done' and $task->status != 'closed' and $task->status != 'cancel'; if($action == 'close') return $task->status == 'done' or $task->status == 'cancel'; if($action == 'activate') return $task->status == 'done' or $task->status == 'closed' or $task->status == 'cancel' ; diff --git a/module/task/view/record.html.php b/module/task/view/record.html.php new file mode 100644 index 0000000000..3a771e3c16 --- /dev/null +++ b/module/task/view/record.html.php @@ -0,0 +1,35 @@ + + * @package task + * @version $Id: record.html.php 935 2013-01-08 07:49:24Z wwccss@gmail.com $ + * @link http://www.zentao.net + */ +?> + +
+ + + + + + + + + + + + + + + + + +
name;?>
task->beforeConsumed;?>task->hour;?>
task->consumedThisTime;?>task->hour;?>
task->left;?>task->hour;?>
goback, $this->session->taskList); ?>
+ +
+ diff --git a/module/task/view/view.html.php b/module/task/view/view.html.php index db8421ac54..ca7ae6731c 100644 --- a/module/task/view/view.html.php +++ b/module/task/view/view.html.php @@ -27,6 +27,7 @@ //if(!($task->status != 'closed' and $task->status != 'cancel' and common::printLink('task', 'logEfforts', "taskID=$task->id", $lang->task->buttonLogEfforts))) echo $lang->task->buttonLogEfforts . ' '; common::printIcon('task', 'assignTo', "projectID=$task->project&taskID=$task->id"); if($this->task->isClickable($task, 'start')) common::printIcon('task', 'start', "taskID=$task->id"); + if($this->task->isClickable($task, 'record')) common::printIcon('task', 'record', "taskID=$task->id"); if($this->task->isClickable($task, 'finish')) common::printIcon('task', 'finish', "taskID=$task->id"); if($this->task->isClickable($task, 'close')) common::printIcon('task', 'close', "taskID=$task->id"); if($this->task->isClickable($task, 'activate')) common::printIcon('task', 'activate', "taskID=$task->id");