diff --git a/module/task/control.php b/module/task/control.php index 2c360a27e5..88d0f6b940 100644 --- a/module/task/control.php +++ b/module/task/control.php @@ -562,7 +562,7 @@ class task extends control if($this->post->names) { $allChanges = $this->task->batchUpdate(); - if(dao::isError()) return print(js::error(dao::getError())); + if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); if(!empty($allChanges)) { diff --git a/module/task/lang/en.php b/module/task/lang/en.php index c0cf60ed5b..b6eacee3be 100644 --- a/module/task/lang/en.php +++ b/module/task/lang/en.php @@ -246,6 +246,8 @@ $lang->task->error->finishedDateEmpty = '"Finished Date" should not be empty.'; $lang->task->error->finishedDateSmall = '"Finished Date" should be > "Real Started"'; $lang->task->error->alreadyConsumed = 'The currently selected parent task has been consumed.'; $lang->task->error->date = 'The date should be >= today.'; +$lang->task->error->leftEmptyAB = 'When the task status is %s, "Hours Left" cannot be 0'; +$lang->task->error->leftEmpty = 'Task#%sWhen the task status is %s, "Left" cannot be 0'; /* Report. */ $lang->task->report = new stdclass(); diff --git a/module/task/lang/zh-cn.php b/module/task/lang/zh-cn.php index 8f7f05cecd..f1a9a910b1 100644 --- a/module/task/lang/zh-cn.php +++ b/module/task/lang/zh-cn.php @@ -246,6 +246,8 @@ $lang->task->error->finishedDateEmpty = '实际完成不能为空'; $lang->task->error->finishedDateSmall = '实际完成不能小于实际开始'; $lang->task->error->alreadyConsumed = '当前选中的父任务已有消耗。'; $lang->task->error->date = '日期不能大于今天'; +$lang->task->error->leftEmptyAB = '任务状态为%s时,预计剩余不能为0'; +$lang->task->error->leftEmpty = 'Task#%s任务状态为%s时,剩余不能为0'; /* Report. */ $lang->task->report = new stdclass(); diff --git a/module/task/model.php b/module/task/model.php index f524c69262..93ed0af681 100644 --- a/module/task/model.php +++ b/module/task/model.php @@ -998,6 +998,12 @@ class taskModel extends model $requiredFields = str_replace(',estimate,', ',', $requiredFields); } + if(strpos(',doing,pause,', $task->status) && empty($teams) && empty($task->left)) + { + dao::$errors[] = sprintf($this->lang->task->error->leftEmptyAB, $this->lang->task->statusList[$task->status]); + return false; + } + $requiredFields = trim($requiredFields, ','); $this->dao->update(TABLE_TASK)->data($task) @@ -1008,7 +1014,6 @@ class taskModel extends model ->checkIF($task->estimate != false, 'estimate', 'float') ->checkIF($task->left != false, 'left', 'float') ->checkIF($task->consumed != false, 'consumed', 'float') - ->checkIF($task->status != 'wait' and empty($teams) and $task->left == 0 and $task->status != 'cancel' and $task->status != 'closed', 'status', 'equal', 'done') ->batchCheckIF($task->status == 'wait' or $task->status == 'doing', 'finishedBy, finishedDate,canceledBy, canceledDate, closedBy, closedDate, closedReason', 'empty') @@ -1113,7 +1118,6 @@ class taskModel extends model { if(isset($data->modules[$taskID]) and ($data->modules[$taskID] == 'ditto')) $data->modules[$taskID] = isset($prev['module']) ? $prev['module'] : 0; if($data->types[$taskID] == 'ditto') $data->types[$taskID] = isset($prev['type']) ? $prev['type'] : ''; - if($data->statuses[$taskID] == 'ditto') $data->statuses[$taskID] = isset($prev['status']) ? $prev['status'] : ''; if($data->assignedTos[$taskID] == 'ditto') $data->assignedTos[$taskID] = isset($prev['assignedTo']) ? $prev['assignedTo'] : ''; if($data->pris[$taskID] == 'ditto') $data->pris[$taskID] = isset($prev['pri']) ? $prev['pri'] : 0; if($data->finishedBys[$taskID] == 'ditto') $data->finishedBys[$taskID] = isset($prev['finishedBy']) ? $prev['finishedBy'] : ''; @@ -1124,7 +1128,6 @@ class taskModel extends model $prev['module'] = $data->modules[$taskID]; $prev['type'] = $data->types[$taskID]; - $prev['status'] = $data->statuses[$taskID]; $prev['assignedTo'] = $data->assignedTos[$taskID]; $prev['pri'] = $data->pris[$taskID]; $prev['finishedBy'] = $data->finishedBys[$taskID]; @@ -1145,7 +1148,7 @@ class taskModel extends model $task->name = $data->names[$taskID]; $task->module = isset($data->modules[$taskID]) ? $data->modules[$taskID] : 0; $task->type = $data->types[$taskID]; - $task->status = $data->statuses[$taskID]; + $task->status = isset($data->statuses[$taskID]) ? $data->statuses[$taskID] : $oldTask->status; $task->assignedTo = $task->status == 'closed' ? 'closed' : $data->assignedTos[$taskID]; $task->pri = $data->pris[$taskID]; $task->estimate = isset($data->estimates[$taskID]) ? $data->estimates[$taskID] : $oldTask->estimate; @@ -1180,11 +1183,12 @@ class taskModel extends model if($message) return print(js::alert($message)); } - if($data->consumeds[$taskID]) + if(isset($data->consumeds[$taskID])) { if($data->consumeds[$taskID] < 0) { - echo js::alert(sprintf($this->lang->task->error->consumed, $taskID)); + dao::$errors[] = sprintf($this->lang->task->error->consumed, $taskID); + return false; } else { @@ -1256,9 +1260,19 @@ class taskModel extends model /* Check field not empty. */ foreach($tasks as $taskID => $task) { - if($task->status == 'done' and $task->consumed == false) return print(js::error('task#' . $taskID . sprintf($this->lang->error->notempty, $this->lang->task->consumedThisTime))); if($task->status == 'cancel') continue; - if(!empty($task->deadline) and $task->estStarted > $task->deadline) return print(js::error('task#' . $taskID . $this->lang->task->error->deadlineSmall)); + if($task->status == 'done' and $task->consumed == false) + { + dao::$errors[] = 'Task#' . $taskID . sprintf($this->lang->error->notempty, $this->lang->task->consumedThisTime); + return false; + } + + if(!empty($task->deadline) and $task->estStarted > $task->deadline) + { + dao::$errors[] = 'Task#' . $taskID . $this->lang->task->error->deadlineSmall; + return false; + } + foreach(explode(',', $this->config->task->edit->requiredFields) as $field) { $field = trim($field); @@ -1275,6 +1289,12 @@ class taskModel extends model foreach($tasks as $taskID => $task) { + if(strpos(',doing,pause,', $task->status) && empty($teams) && $task->parent >= 0 && empty($task->left)) + { + dao::$errors[] = sprintf($this->lang->task->error->leftEmpty, $taskID, $this->lang->task->statusList[$task->status]); + return false; + } + $oldTask = $oldTasks[$taskID]; $this->dao->update(TABLE_TASK)->data($task) ->autoCheck() @@ -1282,7 +1302,6 @@ class taskModel extends model ->checkIF($task->estimate != false, 'estimate', 'float') ->checkIF($task->consumed != false, 'consumed', 'float') ->checkIF($task->left != false, 'left', 'float') - ->checkIF($task->parent > 0 and $task->left == 0 and $task->status != 'cancel' and $task->status != 'closed' and $task->status != 'wait' and $task->consumed != 0, 'status', 'equal', 'done') ->batchCheckIF($task->status == 'wait' or $task->status == 'doing', 'finishedBy, finishedDate,canceledBy, canceledDate, closedBy, closedDate, closedReason', 'empty') @@ -1294,6 +1313,11 @@ class taskModel extends model ->batchCheckIF($task->closedReason == 'cancel', 'finishedBy, finishedDate', 'empty') ->where('id')->eq((int)$taskID) ->exec(); + if(dao::isError()) + { + dao::$errors[] = 'Task#' . $taskID . dao::getError(true); + return false; + } if($task->status == 'done' and $task->closedReason) $this->dao->update(TABLE_TASK)->set('status')->eq('closed')->where('id')->eq($taskID)->exec(); @@ -1324,10 +1348,6 @@ class taskModel extends model if($task->status != $oldTask->status) $this->loadModel('kanban')->updateLane($oldTask->execution, 'task', $oldTask->id); $allChanges[$taskID] = common::createChanges($oldTask, $task); } - else - { - return print(js::error('task#' . $taskID . dao::getError(true))); - } } if(!dao::isError()) $this->loadModel('score')->create('ajax', 'batchEdit'); return $allChanges; diff --git a/module/task/view/batchedit.html.php b/module/task/view/batchedit.html.php index 2c1de060e9..ecfdc202fa 100755 --- a/module/task/view/batchedit.html.php +++ b/module/task/view/batchedit.html.php @@ -127,7 +127,7 @@ js::set('dittoNotice', $dittoNotice); ' style='overflow:visible'>module, "class='form-control chosen'")?> ' style='overflow:visible'>assignedTo, "class='form-control chosen' {$disableAssignedTo}");?> type, "class='form-control'");?> - >status, "class='form-control'");?> + >status, "class='form-control' {$disableHour}");?> >estStarted) ? '' : $tasks[$taskID]->estStarted, "class='form-control text-center form-date'");?> >deadline) ? '' : $tasks[$taskID]->deadline, "class='form-control text-center form-date'");?> >pri, "class='form-control'");?>