2023-05-16 10:50:42 +08:00

211 lines
6.5 KiB
PHP

<?php
/**
* Sync story status.
*
* @param int $storyID
* @access public
* @return void
*/
public function close($storyID)
{
$changes = parent::close($storyID);
$this->syncClose($storyID);
return $changes;
}
/**
* Sync story status.
*
* @access public
* @return void
*/
public function batchClose()
{
$allChanges = parent::batchClose();
foreach($allChanges as $storyID => $changes) $this->syncClose($storyID);
return $allChanges;
}
/**
* Sync story status.
*
* @param int $storyID
* @access public
* @return void
*/
public function syncClose($storyID)
{
$story = $this->getById($storyID);
if($story->type == 'requirement') return false;
/* Get all linked requirements.*/
$relations = $this->getRelation($storyID, $story->type);
if(empty($relations)) return false;
/* Get requirement all related stories.*/
foreach($relations as $id => $title)
{
$stories = $this->getRelation($id, 'requirement');
$storiesStatus = $this->dao->select('status')->from(TABLE_STORY)
->where('id')->in(array_keys($stories))
->fetchPairs();
$allClosed = true;
foreach($storiesStatus as $status)
{
if($status != 'closed') $allClosed = false;
}
if($allClosed)
{
$data = new stdclass();
$data->assignedTo = 'closed';
$data->status = 'closed';
$data->lastEditedBy = $this->app->user->account;
$data->lastEditedDate = helper::now();
$data->assignedDate = helper::now();
$data->closedDate = helper::now();
$data->closedBy = $this->app->user->account;
$this->dao->update(TABLE_STORY)->data($data)
->autoCheck()
->where('id')->eq($id)->exec();
}
}
}
/**
* Print cell data
*
* @param object $col
* @param object $story
* @param array $users
* @param array $branches
* @param array $storyStages
* @param array $modulePairs
* @param array $storyTasks
* @param array $storyBugs
* @param array $storyCases
* @access public
* @return void
*/
public function printCell($col, $story, $users, $branches, $storyStages, $modulePairs = array(), $storyTasks = array(), $storyBugs = array(), $storyCases = array(), $mode = 'datatable', $storyType = 'story', $execution = '', $isShowBranch = '')
{
if($col->id == 'SRS' && $col->show)
{
$link = helper::createLink('story', 'relation', "storyID=$story->id&storyType=$story->type");
$storySR = $this->getStoryRelationCounts($story->id, $story->type);
echo $storySR > 0 ? '<td class="datatable-cell c-SRS text-center">' . html::a($link, $storySR, '', 'class="iframe"') . '</td>' : '<td class="datatable-cell c-SRS text-center">0</td>';
}
elseif($col->id == 'URS' && $col->show)
{
$link = helper::createLink('story', 'relation', "storyID=$story->id&storyType=$story->type");
$storySR = $this->getStoryRelationCounts($story->id, $story->type);
echo $storySR > 0 ? '<td class="datatable-cell c-URS text-center">' . html::a($link, $storySR, '', 'class="iframe"') . '</td>' : '<td class="datatable-cell c-URS text-center">0</td>';
}
else
{
parent::printCell($col, $story, $users, $branches, $storyStages, $modulePairs, $storyTasks, $storyBugs, $storyCases, $mode, $storyType, $execution, $isShowBranch);
}
}
/**
* Import story to asset lib.
*
* @param int|array|string $storyIDList
* @access public
* @return bool
*/
public function importToLib($storyIDList = 0)
{
$data = fixer::input('post')->get();
if(empty($data->lib))
{
dao::$errors[] = sprintf($this->lang->error->notempty, $this->lang->story->lib);
return false;
}
$stories = $this->getByList($storyIDList);
$importedStories = $this->dao->select('fromStory,fromVersion')->from(TABLE_STORY)
->where('lib')->eq($data->lib)
->andWhere('fromStory')->in($storyIDList)
->fetchGroup('fromStory');
if(is_numeric($storyIDList) and isset($importedStories[$storyIDList]))
{
dao::$errors[] = $this->lang->story->isExist;
return false;
}
/* Remove duplicate story. */
foreach($stories as $story)
{
if(isset($importedStories[$story->id]))
{
foreach($importedStories[$story->id] as $improtedStory)
{
if($improtedStory->fromVersion == $story->version) unset($stories[$story->id]);
}
}
}
$now = helper::now();
$today = helper::today();
$hasApprovePiv = common::hasPriv('assetlib', 'approveStory') or common::hasPriv('assetlib', 'batchApproveStory');
$this->loadModel('action');
/* Create story to asset lib. */
foreach($stories as $story)
{
$assetStory = new stdclass();
$assetStory->title = $story->title;
$assetStory->keywords = $story->keywords;
$assetStory->pri = $story->pri;
$assetStory->estimate = $story->estimate;
$assetStory->status = $hasApprovePiv ? 'active' : 'draft';
$assetStory->category = $story->category;
$assetStory->lib = $data->lib;
$assetStory->fromStory = $story->id;
$assetStory->fromVersion = $story->version;
$assetStory->openedBy = $this->app->user->account;
$assetStory->openedDate = $now;
if(!empty($data->assignedTo)) $assetStory->assignedTo = $data->assignedTo;
if($hasApprovePiv)
{
$assetStory->assignedTo = $this->app->user->account;
$assetStory->approvedDate = $today;
}
$this->dao->insert(TABLE_STORY)->data($assetStory)->exec();
$assetStoryID = $this->dao->lastInsertID();
$storySpec = new stdclass();
$storySpec->story = $assetStoryID;
$storySpec->version = 1;
$storySpec->title = $story->title;
$storySpec->spec = $story->spec;
$storySpec->verify = $story->verify;
$this->dao->insert(TABLE_STORYSPEC)->data($storySpec)->exec();
if(!dao::isError()) $this->action->create('story', $assetStoryID, 'import2StoryLib');
}
return true;
}
/**
* Replace story lang to requirement.
*
* @param string $type
* @access public
* @return void
*/
public function replaceURLang($type)
{
if($type == 'story') unset($this->lang->story->sourceList['researchreport']);
parent::replaceURLang($type);
}