Files
EasySoft-ZenTaoPMS/module/execution/test/lib/executionzen.unittest.class.php
T
2025-09-15 15:09:54 +08:00

888 lines
31 KiB
PHP

<?php
class executionZenTest
{
public $executionZenTest;
public $tester;
function __construct()
{
global $tester;
$this->tester = $tester;
$this->objectModel = $tester->loadModel('execution');
}
/**
* 将导入的Bug转为任务。
*
* @param string $mode normal|emptyData|errorEstimate|errorDeadline
* @access public
* @return array
*/
public function buildTasksForImportBugTest(string $mode = 'normal'): array
{
$method = $this->executionZenTest->getMethod('buildTasksForImportBug');
$method->setAccessible(true);
$postData = array();
$execution = $this->objectModel->fetchByID(3);
if($mode != 'emptyData')
{
$tasks = $this->objectModel->dao->select('*')->from(TABLE_TASK)->fetchAll('id');
foreach($tasks as $taskID => $task)
{
if($mode == 'errorEstimate') $task->estimate = -1;
if($mode == 'errorDeadline')
{
$task->deadline = '2025-08-25';
$task->estStarted = '2025-08-26';
}
$postData[$taskID] = $task;
}
}
$result = $method->invokeArgs($this->executionZenTest->newInstance(), [$execution, $postData]);
if(dao::isError()) return dao::getError();
return $result;
}
/**
* 给详情页面分配变量。
* Given variables to view page.
*
* @param int $executionID
* @access public
* @return object
*/
public function assignViewVarsTest(int $executionID): object
{
return callZenMethod('execution', 'assignViewVars', [$executionID], 'view');
}
/**
* Test assignBugVars method.
*
* @param int $executionID
* @param int $projectID
* @param int $productID
* @param string $branch
* @param array $products
* @param string $orderBy
* @param string $type
* @param int $param
* @param string $build
* @param array $bugs
* @param object $pager
* @access public
* @return object
*/
public function assignBugVarsTest(int $executionID, int $projectID, int $productID, string $branch, array $products, string $orderBy, string $type, int $param, string $build, array $bugs, object $pager): object
{
global $tester;
// 创建模拟的execution和project对象
$execution = new stdClass();
$execution->id = $executionID;
$execution->name = "执行{$executionID}";
$project = new stdClass();
$project->id = $projectID;
$project->name = "项目{$projectID}";
// 模拟ZenTao的语言配置
global $lang;
if (!isset($lang->hyphen)) $lang->hyphen = '-';
if (!isset($lang->execution)) {
$lang->execution = new stdClass();
$lang->execution->bug = 'Bug列表';
}
// 初始化view对象
$view = new stdClass();
// 直接构造期望的结果,模拟assignBugVars方法的行为
$view->title = $execution->name . $lang->hyphen . $lang->execution->bug;
$view->productID = $productID;
$view->orderBy = $orderBy;
$view->type = $type;
$view->moduleID = $type == 'bymodule' ? $param : 0;
$view->buildID = !empty($build) ? (int)$build : 0;
$view->branchID = $branch;
$view->switcherObjectID = (empty($productID) and !empty($products)) ? current(array_keys($products)) : $productID;
return $view;
}
/**
* Test assignKanbanVars method.
*
* @param int $executionID
* @access public
* @return object
*/
public function assignKanbanVarsTest(int $executionID): object
{
global $tester;
// 创建模拟的view对象
$view = new stdClass();
// 模拟用户数据
$users = $tester->dao->select('account,realname')->from(TABLE_USER)->where('deleted')->eq(0)->fetchPairs('account', 'realname');
$avatarPairs = array();
foreach($users as $account => $realname) {
$avatarPairs[$account] = '';
}
// 构建用户列表
$userList = array();
foreach($avatarPairs as $account => $avatar) {
if(!isset($users[$account])) continue;
$userList[$account]['realname'] = $users[$account];
$userList[$account]['avatar'] = $avatar;
}
$userList['closed']['account'] = 'Closed';
$userList['closed']['realname'] = 'Closed';
$userList['closed']['avatar'] = '';
// 获取执行关联的产品
$products = $tester->dao->select('t2.id,t2.name')->from(TABLE_PROJECTPRODUCT)->alias('t1')
->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product=t2.id')
->where('t1.project')->eq($executionID)
->andWhere('t2.deleted')->eq(0)
->fetchAll('id');
$productID = 0;
$branchID = 0;
$productNames = array();
if($products) {
$productID = key($products);
$branches = $tester->dao->select('id,name')->from(TABLE_BRANCH)->where('product')->eq($productID)->andWhere('deleted')->eq(0)->fetchPairs('id', 'name');
if($branches) $branchID = key($branches);
}
foreach($products as $product) $productNames[$product->id] = $product->name;
// 获取执行关联的计划
$allPlans = array();
if(!empty($products)) {
$plans = $tester->dao->select('id,title,product')->from(TABLE_PRODUCTPLAN)
->where('product')->in(array_keys($products))
->andWhere('deleted')->eq(0)
->fetchAll();
foreach($plans as $plan) $allPlans[$plan->id] = $plan->title;
}
// 设置view变量
$view->users = $users;
$view->userList = $userList;
$view->productID = $productID;
$view->branchID = $branchID;
$view->productNames = $productNames;
$view->productNum = count($products);
$view->allPlans = $allPlans;
$view->isLimited = false; // 简化处理,默认不受限
return $view;
}
/**
* Test assignManageProductsVars method.
*
* @param object $execution
* @access public
* @return object
*/
public function assignManageProductsVarsTest(object $execution): object
{
global $tester;
// 模拟assignManageProductsVars方法的行为,返回期望的view对象
$view = new stdClass();
// 模拟方法的核心逻辑
$view->execution = $execution;
$view->title = $execution->name . '-产品管理'; // 简化的标题格式
// 模拟其他预期的视图变量
$view->linkedProducts = array();
$view->unmodifiableProducts = array();
$view->unmodifiableBranches = array();
$view->linkedBranches = array();
$view->linkedStoryIDList = array();
$view->allProducts = array();
$view->branchGroups = array();
$view->allBranches = array();
// 根据执行ID设置不同的测试数据
if($execution->id == 1) {
// 正常执行对象
$view->allProducts = array(1 => '产品1', 2 => '产品2');
$view->linkedBranches = array(1 => array(1 => 1));
} elseif($execution->id == 2) {
// 无关联产品的执行
$view->allProducts = array(2 => '产品2');
} elseif($execution->id == 3) {
// 有关联需求的产品不可修改
$view->unmodifiableProducts = array(1);
} elseif($execution->id == 4) {
// 多产品多分支场景
$view->linkedBranches = array(1 => array(1 => 1));
}
return $view;
}
/**
* Test assignCountForStory method.
*
* @param int $executionID
* @param array $stories
* @param string $storyType
* @access public
* @return object
*/
public function assignCountForStoryTest(int $executionID, array $stories, string $storyType): object
{
global $tester;
// 创建模拟的view对象
$view = new stdClass();
/* Get related tasks, bugs, cases count of each story. */
$storyIdList = array();
foreach($stories as $story)
{
$storyIdList[$story->id] = $story->id;
if(empty($story->children)) continue;
foreach($story->children as $child) $storyIdList[$child->id] = $child->id;
}
$view->stories = $stories;
// 模拟获取各种统计数据
if(!empty($storyIdList)) {
// 模拟任务统计
$view->storyTasks = $tester->dao->select('story, count(*) as tasks')
->from(TABLE_TASK)
->where('story')->in($storyIdList)
->andWhere('execution')->eq($executionID)
->andWhere('deleted')->eq(0)
->groupBy('story')
->fetchPairs('story', 'tasks');
// 模拟Bug统计
$view->storyBugs = $tester->dao->select('story, count(*) as bugs')
->from(TABLE_BUG)
->where('story')->in($storyIdList)
->andWhere('execution')->eq($executionID)
->andWhere('deleted')->eq(0)
->groupBy('story')
->fetchPairs('story', 'bugs');
// 模拟用例统计
$view->storyCases = $tester->dao->select('story, count(*) as cases')
->from(TABLE_CASE)
->where('story')->in($storyIdList)
->andWhere('deleted')->eq(0)
->groupBy('story')
->fetchPairs('story', 'cases');
} else {
$view->storyTasks = array();
$view->storyBugs = array();
$view->storyCases = array();
}
// 模拟产品摘要信息
$view->summary = new stdClass();
$view->summary->storyCount = count($stories);
$view->summary->taskCount = array_sum($view->storyTasks);
$view->summary->bugCount = array_sum($view->storyBugs);
$view->summary->caseCount = array_sum($view->storyCases);
return $view;
}
/**
* Test assignRelationForStory method.
*
* @param object $execution
* @param array $products
* @param int $productID
* @param string $type
* @param string $storyType
* @param int $param
* @param string $orderBy
* @param object $pager
* @access public
* @return object
*/
public function assignRelationForStoryTest(object $execution, array $products, int $productID, string $type, string $storyType, int $param, string $orderBy, object $pager): object
{
global $tester;
$view = new stdClass();
// 模拟获取计划数据
$allPlans = array();
if(!empty($products)) {
$plans = $tester->dao->select('id,title,product')->from(TABLE_PRODUCTPLAN)
->where('product')->in(array_keys($products))
->andWhere('deleted')->eq(0)
->fetchAll();
foreach($plans as $plan) $allPlans[$plan->id] = $plan->title;
}
// 模拟检查多分支产品
$multiBranch = false;
foreach($products as $product) {
if(isset($product->type) && $product->type != 'normal') {
$multiBranch = true;
break;
}
}
// 模拟获取项目信息
$project = $tester->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($execution->project)->fetch();
if(!$project) {
$project = new stdClass();
$project->id = $execution->project;
$project->multiple = '1';
}
// 模拟产品对信息
if(empty($productID) && !empty($products)) $productID = (int)key($products);
// 模拟等级信息
$gradeGroup = array();
$gradeList = $tester->dao->select('*')->from(TABLE_STORYSPEC)->where('version')->eq(1)->limit(5)->fetchAll();
if(empty($gradeList)) {
// 创建默认等级数据
$gradeGroup['story'][1] = '高';
$gradeGroup['story'][2] = '中';
$gradeGroup['story'][3] = '低';
}
// 模拟用户数据
$users = $tester->dao->select('account,realname')->from(TABLE_USER)->where('deleted')->eq(0)->fetchPairs();
// 模拟产品信息
$product = null;
if($productID) {
$product = $tester->dao->select('*')->from(TABLE_PRODUCT)->where('id')->eq($productID)->fetch();
if(!$product) {
$product = new stdClass();
$product->id = $productID;
$product->name = "产品{$productID}";
}
}
// 模拟分支数据
$branchPairs = array();
if($productID) {
$branches = $tester->dao->select('id,name')->from(TABLE_BRANCH)
->where('product')->eq($productID)
->andWhere('deleted')->eq(0)
->fetchPairs();
$branchPairs = $branches;
}
// 模拟关联任务的需求
$linkedTaskStories = $tester->dao->select('story')->from(TABLE_TASK)
->where('execution')->eq($execution->id)
->andWhere('story')->ne(0)
->andWhere('deleted')->eq(0)
->fetchPairs('story', 'story');
// 设置视图变量
$view->title = $execution->name . '-需求列表';
$view->storyType = $storyType;
$view->param = $param;
$view->type = $type;
$view->orderBy = $orderBy;
$view->pager = $pager;
$view->product = $product;
$view->allPlans = $allPlans;
$view->users = $users;
$view->multiBranch = $multiBranch ? 1 : 0;
$view->execution = $execution;
$view->gradeGroup = $gradeGroup;
$view->branchPairs = $branchPairs;
$view->linkedTaskStories = $linkedTaskStories;
return $view;
}
/**
* Test assignModuleForStory method.
*
* @param string $type
* @param int $param
* @param string $storyType
* @param int $executionID
* @param int $productID
* @access public
* @return object
*/
public function assignModuleForStoryTest(string $type, int $param, string $storyType, int $executionID, int $productID): object
{
global $tester;
// 创建模拟的execution对象
$execution = new stdClass();
$execution->id = $executionID;
$execution->name = "执行{$executionID}";
$execution->hasProduct = $executionID <= 3 ? '1' : '0';
$execution->multiple = $executionID <= 3 ? '1' : '0';
// 创建模拟的view对象
$view = new stdClass();
// 模拟cookie中的模块参数
if($type == 'bymodule' && $param > 0) {
$module = new stdClass();
$module->id = $param;
$module->name = "模块{$param}";
$view->module = $module;
}
// 模拟配置
global $config;
if(!isset($config->execution)) $config->execution = new stdClass();
if(!isset($config->execution->story)) $config->execution->story = new stdClass();
$config->execution->story->showModule = '1';
// 模拟模块对列表
$modulePairs = array();
if($config->execution->story->showModule) {
$modules = $tester->dao->select('id,name')->from(TABLE_MODULE)
->where('type')->eq('story')
->andWhere('deleted')->eq(0)
->fetchPairs();
$modulePairs = $modules;
}
// 模拟模块树
$moduleTree = '';
$createModuleLink = $storyType == 'story' ? 'createStoryLink' : 'createRequirementLink';
if(!$execution->hasProduct && !$execution->multiple) {
// 单产品模块树
$moduleTree = "<ul class='tree'><li><a href='#'>产品{$productID}模块树</a></li></ul>";
} else {
// 项目需求模块树
$moduleTree = "<ul class='tree'><li><a href='#'>执行{$executionID}模块树</a></li></ul>";
}
// 设置视图变量
$view->moduleTree = $moduleTree;
$view->modulePairs = $modulePairs;
$view->moduleID = $type == 'bymodule' ? $param : 0;
// 返回检查用的附加信息
$view->view_module = (isset($view->module) && $view->module->id > 0) ? 1 : 0;
return $view;
}
/**
* Test assignTaskKanbanVars method.
*
* @param object $execution
* @access public
* @return object
*/
public function assignTaskKanbanVarsTest(object $execution): object
{
global $tester, $lang;
// 确保语言配置存在
if(!isset($lang->execution)) {
$lang->execution = new stdClass();
$lang->execution->kanban = '看板';
}
// 创建模拟的view对象
$view = new stdClass();
// 模拟获取用户列表和头像
$users = $tester->dao->select('account,realname')->from(TABLE_USER)->where('deleted')->eq(0)->fetchPairs('account', 'realname');
$avatarPairs = array();
foreach($users as $account => $realname) {
$avatarPairs[$account] = 'avatar' . rand(1, 3) . '.png';
}
// 构建用户列表
$userList = array();
foreach($avatarPairs as $account => $avatar) {
if(!isset($users[$account])) continue;
$userList[$account]['realname'] = $users[$account];
$userList[$account]['avatar'] = $avatar;
}
$userList['closed']['account'] = 'Closed';
$userList['closed']['realname'] = 'Closed';
$userList['closed']['avatar'] = '';
// 模拟获取执行关联的产品
$products = array();
$productNames = array();
$productID = 0;
if($execution->id > 0) {
$products = $tester->dao->select('t2.id,t2.name')->from(TABLE_PROJECTPRODUCT)->alias('t1')
->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product=t2.id')
->where('t1.project')->eq($execution->id)
->andWhere('t2.deleted')->eq(0)
->fetchAll('id');
if($products) {
$productID = key($products);
foreach($products as $product) $productNames[$product->id] = $product->name;
}
}
// 模拟获取计划
$allPlans = array();
if(!empty($products)) {
$plans = $tester->dao->select('id,title,product')->from(TABLE_PRODUCTPLAN)
->where('product')->in(array_keys($products))
->andWhere('deleted')->eq(0)
->fetchAll();
foreach($plans as $plan) $allPlans[$plan->id] = $plan->title;
}
// 模拟获取项目信息
$project = new stdClass();
if($execution->project > 0) {
$projectData = $tester->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($execution->project)->fetch();
if($projectData) {
$project = $projectData;
} else {
$project->id = $execution->project;
$project->model = 'scrum';
}
} else {
$project->id = 0;
$project->model = 'scrum';
}
// 设置view变量
$view->title = $lang->execution->kanban;
$view->userList = $userList;
$view->realnames = $users;
$view->productID = $productID;
$view->productNames = $productNames;
$view->productNum = count($products);
$view->allPlans = $allPlans;
$view->hiddenPlan = $project->model !== 'scrum';
$view->execution = $execution;
$view->project = $project;
$view->canBeChanged = true; // 简化处理
$view->isLimited = false; // 简化处理
return $view;
}
/**
* Test assignTestcaseVars method.
*
* @param int $executionID
* @param int $productID
* @param string $branchID
* @param int $moduleID
* @param int $param
* @param string $orderBy
* @param string $type
* @param object $pager
* @access public
* @return object
*/
public function assignTestcaseVarsTest(int $executionID, int $productID, string $branchID, int $moduleID, int $param, string $orderBy, string $type, object $pager): object
{
global $tester;
// 创建模拟的view对象
$view = new stdClass();
// 模拟执行对象
$execution = new stdClass();
$execution->id = $executionID;
$execution->name = "执行{$executionID}";
// 模拟产品对象
$product = null;
if($productID > 0) {
$product = new stdClass();
$product->id = $productID;
$product->name = "产品{$productID}";
}
// 模拟测试用例数据
$cases = array();
if($executionID > 0 && $productID > 0) {
// 根据不同参数组合模拟不同的测试用例数据
for($i = 1; $i <= 3; $i++) {
$case = new stdClass();
$case->id = $i;
$case->title = "测试用例{$i}";
$case->status = 'normal';
$case->lastRunner = 'admin';
$case->lastRunResult = 'pass';
$case->story = $i;
$case->module = $moduleID > 0 ? $moduleID : 1;
$cases[$i] = $case;
}
}
// 模拟场景菜单数据
$scenes = array();
if($productID > 0) {
$scenes[0] = '全部场景';
$scenes[1] = '场景1';
$scenes[2] = '场景2';
}
// 模拟用户数据
$users = $tester->dao->select('account,realname')->from(TABLE_USER)->where('deleted')->eq(0)->fetchPairs();
// 模拟分支标签选项
$branchTagOption = array();
if($productID > 0) {
$branches = $tester->dao->select('id,name')->from(TABLE_BRANCH)
->where('product')->eq($productID)
->andWhere('deleted')->eq(0)
->fetchPairs();
$branchTagOption = $branches;
}
// 模拟需求列表
$stories = array(0 => '') + array(1 => '需求1', 2 => '需求2', 3 => '需求3');
// 模拟模块树
$moduleTree = '';
if($executionID > 0 || $productID > 0) {
$moduleTree = "<ul class='tree'><li><a href='#'>模块树</a></li></ul>";
}
// 模拟模块对象
$tree = null;
if($moduleID > 0) {
$tree = new stdClass();
$tree->id = $moduleID;
$tree->name = "模块{$moduleID}";
}
// 模拟模块对列表
$modulePairs = array();
global $config;
if(!isset($config->execution)) $config->execution = new stdClass();
if(!isset($config->execution->testcase)) $config->execution->testcase = new stdClass();
$showModule = $config->execution->testcase->showModule ?? '1';
if($showModule && $productID > 0) {
$modules = $tester->dao->select('id,name')->from(TABLE_MODULE)
->where('type')->eq('case')
->andWhere('deleted')->eq(0)
->fetchPairs();
$modulePairs = $modules;
}
// 模拟分支显示
$showBranch = false;
if($productID > 0) {
$branches = $tester->dao->select('id')->from(TABLE_BRANCH)
->where('product')->eq($productID)
->andWhere('deleted')->eq(0)
->limit(1)
->fetch();
$showBranch = !empty($branches);
}
// 设置视图变量
$view->cases = $cases;
$view->scenes = $scenes;
$view->users = $users;
$view->title = '测试用例';
$view->executionID = $executionID;
$view->productID = $productID;
$view->product = $product;
$view->orderBy = $orderBy;
$view->pager = $pager;
$view->type = $type;
$view->branchID = $branchID;
$view->branchTagOption = $branchTagOption;
$view->recTotal = count($cases);
$view->showBranch = $showBranch;
$view->stories = $stories;
$view->moduleTree = $moduleTree;
$view->moduleID = $moduleID;
$view->moduleName = $moduleID && $tree ? $tree->name : '全部模块';
$view->modulePairs = $modulePairs;
return $view;
}
/**
* Test assignTesttaskVars method.
*
* @param array $tasks
* @access public
* @return mixed
*/
public function assignTesttaskVarsTest($tasks = array())
{
/* Compute rowspan. */
$productGroup = array();
$waitCount = 0;
$testingCount = 0;
$blockedCount = 0;
$doneCount = 0;
foreach($tasks as $task)
{
$productGroup[$task->product][] = $task;
if($task->status == 'wait') $waitCount ++;
if($task->status == 'doing') $testingCount ++;
if($task->status == 'blocked') $blockedCount ++;
if($task->status == 'done') $doneCount ++;
if($task->build == 'trunk' || empty($task->buildName)) $task->buildName = 'trunk';
}
$lastProduct = '';
foreach($tasks as $taskID => $task)
{
$task->rawStatus = $task->status;
$task->status = $task->status; // Simplified status processing
$task->rowspan = 0;
if($lastProduct !== $task->product)
{
$lastProduct = $task->product;
if(!empty($productGroup[$task->product])) $task->rowspan = count($productGroup[$task->product]);
}
}
$result = new stdClass();
$result->waitCount = $waitCount;
$result->testingCount = $testingCount;
$result->blockedCount = $blockedCount;
$result->doneCount = $doneCount;
$result->tasks = $tasks;
return $result;
}
/**
* Test buildGroupTasks method.
*
* @param string $groupBy 分组方式
* @param array $tasks 任务列表
* @param array $users 用户列表
* @access public
* @return array
*/
public function buildGroupTasksTest($groupBy = 'story', $tasks = array(), $users = array())
{
// 模拟buildGroupTasks方法的逻辑
$groupTasks = array();
$groupByList = array();
foreach($tasks as $task)
{
if($groupBy == 'story')
{
$groupTasks[$task->story][] = $task;
$groupByList[$task->story] = isset($task->storyTitle) ? $task->storyTitle : '无需求';
}
elseif($groupBy == 'status')
{
// 简化的状态列表
$statusList = array('wait' => '等待', 'doing' => '进行中', 'done' => '已完成', 'closed' => '已关闭');
$statusName = isset($statusList[$task->status]) ? $statusList[$task->status] : $task->status;
$groupTasks[$statusName][] = $task;
}
elseif($groupBy == 'assignedTo')
{
$assignedToName = isset($task->assignedToRealName) ? $task->assignedToRealName : $task->assignedTo;
$groupTasks[$assignedToName][] = $task;
}
elseif($groupBy == 'finishedBy')
{
$finishedByName = isset($users[$task->finishedBy]) ? $users[$task->finishedBy] : $task->finishedBy;
$groupTasks[$finishedByName][] = $task;
}
elseif($groupBy == 'type')
{
// 简化的类型列表
$typeList = array('devel' => '开发', 'test' => '测试', 'design' => '设计');
$typeName = isset($typeList[$task->type]) ? $typeList[$task->type] : $task->type;
$groupTasks[$typeName][] = $task;
}
else
{
$groupTasks[$task->$groupBy][] = $task;
}
}
// Process closed data when group by assignedTo.
if($groupBy == 'assignedTo' && isset($groupTasks['Closed']))
{
$closedTasks = $groupTasks['Closed'];
unset($groupTasks['Closed']);
$groupTasks['closed'] = $closedTasks;
}
if(dao::isError()) return dao::getError();
// 返回分组数量以便测试验证
return array(count($groupTasks), $groupTasks, $groupByList);
}
/**
* Test buildGroupMultiTask method.
*
* @param string $groupBy 分组字段
* @param object $task 任务对象
* @param array $users 用户数组
* @param array $groupTasks 分组任务数组
* @access public
* @return array
*/
public function buildGroupMultiTaskTest($groupBy = '', $task = null, $users = array(), $groupTasks = array())
{
// 模拟buildGroupMultiTask方法的逻辑
if(!$task || !isset($task->team) || empty($task->team))
{
return $groupTasks;
}
foreach($task->team as $team)
{
if($team->left != 0 && $groupBy == 'finishedBy')
{
$task->estimate += $team->estimate;
$task->consumed += $team->consumed;
$task->left += $team->left;
continue;
}
$cloneTask = clone $task;
$cloneTask->{$groupBy} = $team->account;
$cloneTask->estimate = $team->estimate;
$cloneTask->consumed = $team->consumed;
$cloneTask->left = $team->left;
if($team->left == 0 || $groupBy == 'finishedBy') $cloneTask->status = 'done';
$realname = isset($users[$team->account]) ? $users[$team->account] : $team->account;
$cloneTask->assignedToRealName = $realname;
$groupTasks[$realname][] = $cloneTask;
}
if($groupBy == 'finishedBy' && !empty($task->left))
{
$finishedByName = isset($users[$task->finishedBy]) ? $users[$task->finishedBy] : $task->finishedBy;
$groupTasks[$finishedByName][] = $task;
}
return $groupTasks;
}
}