+ add new fields of task table.

This commit is contained in:
wangchunsheng
2010-11-25 15:32:28 +00:00
parent da82c516b4
commit c75ffef97b
9 changed files with 211 additions and 21 deletions

View File

@@ -34,3 +34,4 @@ ADD `lastEditedDate` DATETIME NOT NULL AFTER `lastEditedBy` ;
UPDATE zt_task SET assignedTo = owner ;
ALTER TABLE `zt_task` DROP `owner`;
ALTER TABLE `zt_task` CHANGE `status` `status` ENUM( 'wait', 'doing', 'done', 'cancel', 'closed' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'wait';
ALTER TABLE `zt_task` ADD `closedReason` VARCHAR( 30 ) NOT NULL AFTER `closedDate` ;

View File

@@ -228,6 +228,7 @@ $lang->error->length = array("『%s』length should be『%s』", "『%s
$lang->error->reg = "『%s』should like『%s』";
$lang->error->unique = "『%s』has『%s』already.";
$lang->error->notempty = "『%s』can not be empty.";
$lang->error->empty = "『%s』 must be empty.";
$lang->error->equal = "『%s』must be『%s』.";
$lang->error->int = array("『%s』should be interger", "『%s』should between『%s-%s』.");
$lang->error->float = "『%s』should be a interger or float.";

View File

@@ -118,7 +118,6 @@ $lang->my->menu->project = '我的项目|my|project|';
$lang->my->menu->profile = array('link' => '我的档案|my|profile|', 'alias' => 'editprofile');
$lang->todo->menu = $lang->my->menu;
/* 产品视图设置。*/
$lang->product->menu->list = '%s';
$lang->product->menu->story = array('link' => '需求列表|product|browse|productID=%s', 'subModule' => 'story');
@@ -229,6 +228,7 @@ $lang->error->length = array("『%s』长度错误应当为『%s』"
$lang->error->reg = "『%s』不符合格式应当为:『%s』。";
$lang->error->unique = "『%s』已经有『%s』这条记录了。";
$lang->error->notempty = "『%s』不能为空。";
$lang->error->empty = "『%s』必须为空。";
$lang->error->equal = "『%s』必须为『%s』。";
$lang->error->int = array("『%s』应当是数字。", "『%s』应当介于『%s-%s』之间。");
$lang->error->float = "『%s』应当是数字可以是小数。";

View File

@@ -53,12 +53,14 @@ $lang->task->canceledBy = 'Canceled By';
$lang->task->canceledDate = 'Canceled Date';
$lang->task->closedBy = 'Closed By';
$lang->task->closedDate = 'Closed Date';
$lang->task->lasteEdited = 'Last Edited';
$lang->task->closedReason = 'Closed Reason';
$lang->task->lastEdited = 'Last Edited';
$lang->task->statusList['wait'] = 'Waiting';
$lang->task->statusList['doing'] = 'Doing';
$lang->task->statusList['done'] = 'Done';
$lang->task->statusList['cancel'] = 'Canceled';
$lang->task->statusList['closed'] = 'Closed';
$lang->task->typeList[''] = '';
$lang->task->typeList['design'] = 'Design';
@@ -76,6 +78,10 @@ $lang->task->priList[1] = '1';
$lang->task->priList[2] = '2';
$lang->task->priList[4] = '4';
$lang->task->reasonList[''] = '';
$lang->task->reasonList['done'] = 'Done';
$lang->task->reasonList['cancel'] = 'Canceled';
$lang->task->afterChoices['continueAdding'] = 'Continue add task for this story';
$lang->task->afterChoices['toTastList'] = 'To task list';
$lang->task->afterChoices['toStoryList'] = 'To story list';
@@ -92,6 +98,7 @@ $lang->task->buttonDone = 'Done';
$lang->task->legendBasic = 'Basic info';
$lang->task->legendEffort = 'Effort';
$lang->task->legendLife = 'Lifetime';
$lang->task->legendDesc = 'Desc';
$lang->task->legendAction = 'Action';

View File

@@ -53,12 +53,14 @@ $lang->task->canceledBy = '由谁取消';
$lang->task->canceledDate = '取消时间';
$lang->task->closedBy = '由谁关闭';
$lang->task->closedDate = '关闭时间';
$lang->task->lasteEdited = '最后编辑';
$lang->task->closedReason = '关闭原因';
$lang->task->lastEdited = '最后编辑';
$lang->task->statusList['wait'] = '未开始';
$lang->task->statusList['doing'] = '进行中';
$lang->task->statusList['done'] = '已完成';
$lang->task->statusList['cancel'] = '已取消';
$lang->task->statusList['closed'] = '已关闭';
$lang->task->typeList[''] = '';
$lang->task->typeList['design'] = '设计';
@@ -76,6 +78,10 @@ $lang->task->priList[1] = '1';
$lang->task->priList[2] = '2';
$lang->task->priList[4] = '4';
$lang->task->reasonList[''] = '';
$lang->task->reasonList['done'] = '已完成';
$lang->task->reasonList['cancel'] = '已取消';
$lang->task->afterChoices['continueAdding'] = '继续为该需求添加任务';
$lang->task->afterChoices['toTastList'] = '返回任务列表';
$lang->task->afterChoices['toStoryList'] = '返回需求列表';
@@ -92,6 +98,7 @@ $lang->task->buttonDone = '完成';
$lang->task->legendBasic = '基本信息';
$lang->task->legendEffort = '工时信息';
$lang->task->legendLife = '任务的一生';
$lang->task->legendDesc = '任务描述';
$lang->task->legendAction = '操作';

View File

@@ -13,7 +13,7 @@
<?php
class taskModel extends model
{
const CUSTOM_STATUS_ORDER = 'wait,doing,done,cancel';
const CUSTOM_STATUS_ORDER = 'wait,doing,done,cancel,closed';
/**
* Create a task.
@@ -66,12 +66,29 @@ class taskModel extends model
public function update($taskID)
{
$oldTask = $this->getById($taskID);
$task = fixer::input('post')
$now = helper::now();
$task = fixer::input('post')
->striptags('name')
->setDefault('story, estimate, left, consumed', 0)
->setDefault('deadline', '0000-00-00')
->setIF($this->post->story != false and $this->post->story != $oldTask->story, 'storyVersion', $this->loadModel('story')->getVersion($this->post->story))
->setIF($this->post->status == 'done', 'left', 0)
->setIF($this->post->status == 'done' and !$this->post->finishedBy, 'finishedBy', $this->app->user->account)
->setIF($this->post->status == 'done' and !$this->post->finishedDate, 'finishedDate', $now)
->setIF($this->post->status == 'cancel' and !$this->post->canceledBy, 'canceledBy', $this->app->user->account)
->setIF($this->post->status == 'cancel' and !$this->post->canceledDate, 'canceledDate', $now)
->setIF($this->post->status == 'cancel', 'closedBy', $this->post->canceledBy ? $this->post->canceledBy : $this->app->user->account)
->setIF($this->post->status == 'cancel', 'closedDate', $this->post->canceledDate? $this->post->canceledDate : $now)
->setIF($this->post->status == 'cancel', 'closedReason', 'cancel')
->setIF($this->post->status == 'closed' and !$this->post->closedBy, 'closedBy', $this->app->user->account)
->setIF($this->post->status == 'closed' and !$this->post->closedDate, 'closedDate', $now)
->setIF($this->post->consumed > 0 and $this->post->left > 0 and $this->post->status == 'wait', 'status', 'doing')
->add('lastEditedBy', $this->app->user->account)
->add('lastEditedDate', $now)
->remove('comment,files,labels')
->get();
$task->statusCustom = strpos(self::CUSTOM_STATUS_ORDER, $task->status) + 1;
@@ -79,12 +96,23 @@ class taskModel extends model
$this->dao->update(TABLE_TASK)->data($task)
->autoCheck()
->batchCheckIF($task->status != 'cancel', $this->config->task->edit->requiredFields, 'notempty')
->checkIF($task->estimate != false, 'estimate', 'float')
->checkIF($task->left != false, 'left', 'float')
->checkIF($task->consumed != false, 'consumed', 'float')
->checkIF($task->left == 0 and $task->status != 'cancel' and $task->status != 'closed', 'status', 'equal', 'done')
->batchCheckIF($task->status == 'waiting' or $task->status == 'doing', 'finishedBy, finishedDate, closedBy, closedDate, closedReason', 'empty')
->checkIF($task->status == 'done', 'consumed', 'notempty')
->checkIF($task->left == 0 and $task->status != 'cancel', 'status', 'equal', 'done')
->checkIF($task->status == 'done' and $task->closedReason, 'closedReason', 'equal', 'done')
->checkIF($task->status == 'cancel', 'finishedBy', 'empty')
->checkIF($task->status == 'cancel', 'finishedDate','empty')
->checkIF($task->status == 'closed', 'closedReason', 'notempty')
->where('id')->eq((int)$taskID)->exec();
if($this->post->story != false) $this->loadModel('story')->setStage($this->post->story);
if(!dao::isError()) return common::createChanges($oldTask, $task);
}
@@ -136,6 +164,7 @@ class taskModel extends model
->where('t1.id')->eq((int)$taskID)
->fetch();
if(!$task) return false;
foreach($task as $key => $value) if(strpos($key, 'Date') !== false and !(int)substr($value, 0, 4)) $task->$key = '';
if($task->mailto)
{
$task->mailto = ltrim(trim($task->mailto), ','); // remove the first ,

View File

@@ -116,6 +116,43 @@ $(function() {
</tr>
</table>
</fieldset>
<fieldset>
<legend><?php echo $lang->task->legendLife;?></legend>
<table class='table-1'>
<tr>
<th class='rowhead w-p20'><?php echo $lang->task->openedBy;?></th>
<td><?php echo $users[$task->openedBy];?></td>
</tr>
<tr>
<th class='rowhead'><?php echo $lang->task->finishedBy;?></th>
<td><?php echo html::select('finishedBy', $users, $task->finishedBy, 'class="select-1"');?></td>
</tr>
<tr>
<th class='rowhead'><?php echo $lang->task->finishedDate;?></th>
<td><?php echo html::input('finishedDate', $task->finishedDate, 'class="text-1"');?></td>
</tr>
<tr>
<th class='rowhead'><?php echo $lang->task->canceledBy;?></th>
<td><?php echo html::select('canceledBy', $users, $task->canceledBy, 'class="select-1"');?></td>
</tr>
<tr>
<th class='rowhead'><?php echo $lang->task->canceledDate;?></th>
<td><?php echo html::input('canceledDate', $task->canceledDate, 'class="text-1"');?></td>
</tr>
<tr>
<th class='rowhead'><?php echo $lang->task->closedBy;?></th>
<td><?php echo html::select('closedBy', $users, $task->closedBy, 'class="select-1"');?></td>
</tr>
<tr>
<th class='rowhead'><?php echo $lang->task->closedReason;?></th>
<td><?php echo html::select('closedReason', $lang->task->reasonList, $task->closedReason, 'class="select-1"');?></td>
</tr>
<tr>
<th class='rowhead'><?php echo $lang->task->closedDate;?></th>
<td><?php echo html::input('closedDate', $task->closedDate, 'class="text-1"');?></td>
</tr>
</table>
</fieldset>
</div>
</div>
</form>

View File

@@ -19,16 +19,15 @@
<div>
<?php
$browseLink = $app->session->taskList != false ? $app->session->taskList : $this->createLink('project', 'browse', "projectID=$task->project");
//if(!($task->status != 'closed' and $task->status != 'cancel' and common::printLink('task', 'logEfforts', "taskID=$task->id", $lang->task->buttonLogEfforts))) echo $lang->task->buttonLogEfforts . ' ';
//if(!($task->status != 'closed' and $task->status != 'cancel' and common::printLink('task', 'close', "taskID=$task->id", $lang->task->buttonClose))) echo $lang->task->buttonClose . ' ';
//if(!($task->status != 'closed' and $task->status != 'cancel' and common::printLink('task', 'cancel', "taskID=$task->id", $lang->task->buttonCancel))) echo $lang->task->buttonCancel . ' ';
//if(!($task->status == 'closed' or $task->status == 'cancel' and common::printLink('task', 'activate', "taskID=$task->id", $lang->task->buttonActivate))) echo $lang->task->buttonActivate . ' ';
if(!$task->deleted)
{
if(!common::printLink('task', 'edit', "taskID=$task->id", $lang->task->buttonEdit)) echo $lang->task->buttonEdit . ' ';
//if(!($task->status != 'closed' and $task->status != 'cancel' and common::printLink('task', 'logEfforts', "taskID=$task->id", $lang->task->buttonLogEfforts))) echo $lang->task->buttonLogEfforts . ' ';
if(!(($task->status == 'wait' or $task->status == 'cancel') and common::printLink('task', 'start', "taskID=$task->id", $lang->task->buttonStart))) echo $lang->task->buttonStart . ' ';
if(!(($task->status == 'wait' or $task->status == 'doing') and common::printLink('task', 'complete', "taskID=$task->id", $lang->task->buttonDone))) echo $lang->task->buttonDone . ' ';
if(!(($task->status == 'wait' or $task->status == 'doing') and common::printLink('task', 'cancel', "taskID=$task->id", $lang->task->buttonCancel))) echo $lang->task->buttonCancel . ' ';
if(!($task->status != 'closed' and $task->status != 'cancel' and common::printLink('task', 'close', "taskID=$task->id", $lang->task->buttonClose))) echo $lang->task->buttonClose . ' ';
if(!($task->status == 'closed' or $task->status == 'cancel' and common::printLink('task', 'activate', "taskID=$task->id", $lang->task->buttonActivate))) echo $lang->task->buttonActivate . ' ';
if(!common::printLink('task', 'edit', "taskID=$task->id", $lang->task->buttonEdit)) echo $lang->task->buttonEdit . ' ';
if(!common::printLink('task', 'delete',"projectID=$task->project&taskID=$task->id", $lang->task->buttonDelete, 'hiddenwin')) echo $lang->task->buttonDelete . ' ';
}
echo html::a($browseLink, $lang->goback);
@@ -48,17 +47,16 @@
<?php include '../../common/view/action.html.php';?>
<div class='a-center f-16px strong'>
<?php
//if(!($task->status != 'closed' and $task->status != 'cancel' and common::printLink('task', 'logEfforts', "taskID=$task->id", $lang->task->buttonLogEfforts))) echo $lang->task->buttonLogEfforts . ' ';
//if(!($task->status != 'closed' and $task->status != 'cancel' and common::printLink('task', 'close', "taskID=$task->id", $lang->task->buttonClose))) echo $lang->task->buttonClose . ' ';
//if(!($task->status != 'closed' and $task->status != 'cancel' and common::printLink('task', 'cancel', "taskID=$task->id", $lang->task->buttonCancel))) echo $lang->task->buttonCancel . ' ';
//if(!($task->status == 'closed' or $task->status == 'cancel' and common::printLink('task', 'activate', "taskID=$task->id", $lang->task->buttonActivate))) echo $lang->task->buttonActivate . ' ';
if(!$task->deleted)
{
if(!common::printLink('task', 'edit', "taskID=$task->id", $lang->task->buttonEdit)) echo $lang->task->buttonEdit . ' ';
if(!($task->status == 'wait' and common::printLink('task', 'start', "taskID=$task->id", $lang->task->buttonStart))) echo $lang->task->buttonStart . ' ';
if(!(($task->status == 'wait' or $task->status == 'doing') and common::printLink('task', 'complete', "taskID=$task->id", $lang->task->buttonDone))) echo $lang->task->buttonDone . ' ';
if(!(($task->status == 'wait' or $task->status == 'doing') and common::printLink('task', 'cancel', "taskID=$task->id", $lang->task->buttonCancel))) echo $lang->task->buttonCancel . ' ';
if(!(($task->status == 'wait' or $task->status == 'cancel') and common::printLink('task', 'start', "taskID=$task->id", $lang->task->buttonStart))) echo $lang->task->buttonStart . ' ';
if(!(($task->status == 'wait' or $task->status == 'doing') and common::printLink('task', 'complete', "taskID=$task->id", $lang->task->buttonDone))) echo $lang->task->buttonDone . ' ';
if(!(($task->status == 'wait' or $task->status == 'doing') and common::printLink('task', 'cancel', "taskID=$task->id", $lang->task->buttonCancel))) echo $lang->task->buttonCancel . ' ';
if(!($task->status != 'closed' and $task->status != 'cancel' and common::printLink('task', 'close', "taskID=$task->id", $lang->task->buttonClose))) echo $lang->task->buttonClose . ' ';
if(!($task->status == 'closed' or $task->status == 'cancel' and common::printLink('task', 'activate', "taskID=$task->id", $lang->task->buttonActivate))) echo $lang->task->buttonActivate . ' ';
if(!common::printLink('task', 'edit', "taskID=$task->id", $lang->task->buttonEdit)) echo $lang->task->buttonEdit . ' ';
if(!common::printLink('task', 'delete',"projectID=$task->project&taskID=$task->id", $lang->task->buttonDelete, 'hiddenwin')) echo $lang->task->buttonDelete . ' ';
}
echo html::a($browseLink, $lang->goback);
?>
@@ -89,7 +87,7 @@
</tr>
<tr>
<th class='rowhead'><?php echo $lang->task->assignedTo;?></th>
<td><?php echo $task->assignedToRealName;?>
<td><?php echo $task->assignedToRealName . $lang->at . $task->assignedDate;?>
</tr>
<tr>
<th class='rowhead'><?php echo $lang->task->type;?></th>
@@ -107,7 +105,7 @@
<td class='rowhead'><?php echo $lang->task->mailto;?></td>
<td><?php $mailto = explode(',', str_replace(' ', '', $task->mailto)); foreach($mailto as $account) echo ' ' . $users[$account]; ?></td>
</tr>
</table>
</table>
</fieldset>
<fieldset>
<legend><?php echo $lang->task->legendEffort;?></legend>
@@ -136,6 +134,35 @@
</table>
</fieldset>
<fieldset>
<legend><?php echo $lang->task->legendLife;?></legend>
<table class='table-1'>
<tr>
<th class='rowhead w-p20'><?php echo $lang->task->openedBy;?></th>
<td><?php if($task->openedBy) echo $users[$task->openedBy] . $lang->at . $task->openedDate;?></td>
</tr>
<tr>
<th class='rowhead'><?php echo $lang->task->finishedBy;?></th>
<td><?php if($task->finishedBy) echo $users[$task->finishedBy] . $lang->at . $task->finishedDate;?></td>
</tr>
<tr>
<th class='rowhead'><?php echo $lang->task->canceledBy;?></th>
<td><?php if($task->canceledBy) echo $users[$task->canceledBy] . $lang->at . $task->canceledDate;?></td>
</tr>
<tr>
<th class='rowhead'><?php echo $lang->task->closedBy;?></th>
<td><?php if($task->closedBy) echo $users[$task->closedBy] . $lang->at . $task->closedDate;?></td>
</tr>
<tr>
<th class='rowhead'><?php echo $lang->task->closedReason;?></th>
<td><?php echo $lang->task->reasonList[$task->closedReason];?></td>
</tr>
<tr>
<th class='rowhead'><?php echo $lang->task->lastEdited;?></th>
<td><?php if($task->lastEditedBy) echo $users[$task->lastEditedBy] . $lang->at . $task->lastEditedDate;?></td>
</tr>
</table>
</fieldset>
</div>
</div>
<?php include '../../common/view/footer.html.php';?>

View File

@@ -390,6 +390,7 @@ class upgradeModel extends model
{
$this->execSQL($this->getUpgradeFile('1.3'));
$this->updateNL1_3();
$this->updateTasks();
if(!$this->isError()) $this->setting->updateVersion('1.4');
}
@@ -528,6 +529,86 @@ class upgradeModel extends model
}
}
/**
* Update task fields.
*
* @access public
* @return void
*/
public function updateTasks()
{
/* Get all actions of tasks. */
$actions = $this->dao->select('*')->from(TABLE_ACTION)
->where('objectType')->eq('task')
->orderBy('id')
->fetchAll('id');
/* Get histories about status field. */
$histories = $this->dao->select()->from(TABLE_HISTORY)
->where('action')->in(array_keys($actions))
->andWhere('field')->eq('status')
->orderBy('id')
->fetchGroup('action');
$tasks = array();
foreach($actions as $action)
{
if(!isset($tasks[$action->objectID]))
{
$tasks[$action->objectID] = new stdclass;
}
$task = $tasks[$action->objectID];
$task->id = $action->objectID;
$actionType = strtolower($action->action);
/* Set the openedBy info. */
if($actionType == 'opened')
{
$task->openedBy = $action->actor;
$task->openedDate = $action->date;
}
else
{
if(!isset($histories[$action->id])) continue;
$actionHistories = $histories[$action->id];
foreach($actionHistories as $history)
{
/* Finished by. */
if($history->new == 'done')
{
$task->finishedBy = $action->actor;
$task->finishedDate = $action->date;
$action->action = 'finished';
}
/* Canceled By. */
elseif($history->new == 'cancel')
{
$task->canceledBy = $action->actor;
$task->canceledDate = $action->date;
$action->action = 'canceled';
}
}
/* Last edited by .*/
$task->lastEditedBy = $action->actor;
$task->lastEditedDate = $action->date;
/* Update action type. */
$this->dao->update(TABLE_ACTION)->set('action')->eq($action->action)->where('id')->eq($action->id)->exec(false);
}
}
/* Update db. */
foreach($tasks as $task)
{
$this->dao->update(TABLE_TASK)->data($task, false)->where('id')->eq($task->id)->exec(false);
}
/* Update action name. */
}
/**
* Get the upgrade sql file.
*