Merge branch '15.0.beta3' of https://gitlab.zcorp.cc/easycorp/zentaopms into 15.0.beta3
This commit is contained in:
@@ -256,6 +256,9 @@ $lang->action->label->tracked = 'tracked';
|
||||
$lang->action->label->hangup = 'hangup';
|
||||
$lang->action->label->run = 'run';
|
||||
$lang->action->label->estimated = 'estimated';
|
||||
$lang->action->label->reviewclosed = 'Review Failed';
|
||||
$lang->action->label->passreviewed = 'Pass';
|
||||
$lang->action->label->clarifyreviewed = 'Clarify';
|
||||
|
||||
/* 动态信息按照对象分组 */
|
||||
$lang->action->dynamicAction = new stdclass;
|
||||
@@ -331,6 +334,8 @@ $lang->action->dynamicAction->execution['undeleted'] = 'Restore ' . $lang->execu
|
||||
$lang->action->dynamicAction->execution['hidden'] = 'Hide ' . $lang->executionCommon;
|
||||
$lang->action->dynamicAction->execution['moved'] = 'Improt Task';
|
||||
|
||||
$lang->action->dynamicAction->team['managedTeam'] = 'Manage Team';
|
||||
|
||||
$lang->action->dynamicAction->task['opened'] = 'Create Task';
|
||||
$lang->action->dynamicAction->task['edited'] = 'Edit Task';
|
||||
$lang->action->dynamicAction->task['commented'] = 'Task Comment';
|
||||
|
||||
@@ -260,6 +260,9 @@ $lang->action->label->tracked = 'tracked';
|
||||
$lang->action->label->hangup = 'hangup';
|
||||
$lang->action->label->run = 'run';
|
||||
$lang->action->label->estimated = 'estimated';
|
||||
$lang->action->label->reviewclosed = 'Review Failed';
|
||||
$lang->action->label->passreviewed = 'Pass';
|
||||
$lang->action->label->clarifyreviewed = 'Clarify';
|
||||
|
||||
/* Dynamic information is grouped by object. */
|
||||
$lang->action->dynamicAction = new stdclass;
|
||||
@@ -335,6 +338,8 @@ $lang->action->dynamicAction->execution['undeleted'] = 'Restore ' . $lang->execu
|
||||
$lang->action->dynamicAction->execution['hidden'] = 'Hide ' . $lang->executionCommon;
|
||||
$lang->action->dynamicAction->execution['moved'] = 'Improt Task';
|
||||
|
||||
$lang->action->dynamicAction->team['managedTeam'] = 'Manage Team';
|
||||
|
||||
$lang->action->dynamicAction->task['opened'] = 'Create Task';
|
||||
$lang->action->dynamicAction->task['edited'] = 'Edit Task';
|
||||
$lang->action->dynamicAction->task['commented'] = 'Task Comment';
|
||||
|
||||
@@ -256,6 +256,9 @@ $lang->action->label->tracked = 'tracked';
|
||||
$lang->action->label->hangup = 'hangup';
|
||||
$lang->action->label->run = 'run';
|
||||
$lang->action->label->estimated = 'estimated';
|
||||
$lang->action->label->reviewclosed = 'Review Failed';
|
||||
$lang->action->label->passreviewed = 'Pass';
|
||||
$lang->action->label->clarifyreviewed = 'Clarify';
|
||||
|
||||
/* 动态信息按照对象分组 */
|
||||
$lang->action->dynamicAction = new stdclass();
|
||||
@@ -344,6 +347,8 @@ $lang->action->dynamicAction->execution['undeleted'] = 'Restore ' . $lang->execu
|
||||
$lang->action->dynamicAction->execution['hidden'] = 'Hide ' . $lang->executionCommon;
|
||||
$lang->action->dynamicAction->execution['moved'] = 'Improt Task';
|
||||
|
||||
$lang->action->dynamicAction->team['managedTeam'] = 'Manage Team';
|
||||
|
||||
$lang->action->dynamicAction->task['opened'] = 'Créer Tâche';
|
||||
$lang->action->dynamicAction->task['edited'] = 'Editer Tâche';
|
||||
$lang->action->dynamicAction->task['commented'] = 'Commenter Tâche';
|
||||
|
||||
@@ -256,6 +256,9 @@ $lang->action->label->tracked = 'tracked';
|
||||
$lang->action->label->hangup = 'hangup';
|
||||
$lang->action->label->run = 'run';
|
||||
$lang->action->label->estimated = 'estimated';
|
||||
$lang->action->label->reviewclosed = 'Review Failed';
|
||||
$lang->action->label->passreviewed = 'Pass';
|
||||
$lang->action->label->clarifyreviewed = 'Clarify';
|
||||
|
||||
/* Dynamic information is grouped by object. */
|
||||
$lang->action->dynamicAction = new stdclass;
|
||||
@@ -331,6 +334,8 @@ $lang->action->dynamicAction->execution['undeleted'] = 'Phục hổi ' . $lang->
|
||||
$lang->action->dynamicAction->execution['hidden'] = 'Ẩn ' . $lang->executionCommon;
|
||||
$lang->action->dynamicAction->execution['moved'] = 'Nhập nhiệm vụ';
|
||||
|
||||
$lang->action->dynamicAction->team['managedTeam'] = 'Manage Team';
|
||||
|
||||
$lang->action->dynamicAction->task['opened'] = 'Tạo nhiệm vụ';
|
||||
$lang->action->dynamicAction->task['edited'] = 'Sửa nhiệm vụ';
|
||||
$lang->action->dynamicAction->task['commented'] = 'Task nhận xét';
|
||||
|
||||
@@ -260,6 +260,9 @@ $lang->action->label->tracked = '跟踪了';
|
||||
$lang->action->label->hangup = '挂起了';
|
||||
$lang->action->label->run = '执行了';
|
||||
$lang->action->label->estimated = '估算了';
|
||||
$lang->action->label->reviewclosed = '评审失败';
|
||||
$lang->action->label->passreviewed = '确认通过';
|
||||
$lang->action->label->clarifyreviewed = '有待明确';
|
||||
|
||||
/* 动态信息按照对象分组 */
|
||||
$lang->action->dynamicAction = new stdclass();
|
||||
@@ -335,6 +338,8 @@ $lang->action->dynamicAction->execution['undeleted'] = '还原' . $lang->executi
|
||||
$lang->action->dynamicAction->execution['hidden'] = '隐藏' . $lang->executionCommon;
|
||||
$lang->action->dynamicAction->execution['moved'] = '导入任务';
|
||||
|
||||
$lang->action->dynamicAction->team['managedTeam'] = '维护团队';
|
||||
|
||||
$lang->action->dynamicAction->task['opened'] = '创建任务';
|
||||
$lang->action->dynamicAction->task['edited'] = '编辑任务';
|
||||
$lang->action->dynamicAction->task['commented'] = '备注任务';
|
||||
|
||||
@@ -78,6 +78,8 @@ class actionModel extends model
|
||||
$action->execution = (int)$extra;
|
||||
}
|
||||
|
||||
if($objectType == 'story' and $actionType !== 'reviewed' and strpos('reviewclosed,passreviewed,clarifyreviewed', $actionType) !== false) $action->actor = 'System';
|
||||
|
||||
if($objectType == 'case' and (strpos(',linked2testtask,unlinkedfromtesttask,assigned,run,', ',' . $actionType . ',') !== false))
|
||||
{
|
||||
$testtask = $this->dao->select('project,execution')->from(TABLE_TESTTASK)->where('id')->eq((int)$extra)->fetch();
|
||||
@@ -213,15 +215,16 @@ class actionModel extends model
|
||||
if($objectType == 'release') $fields = 'product, build';
|
||||
if($objectType == 'task') $fields = 'project, execution, story';
|
||||
|
||||
$record = $this->dao->select($fields)->from($this->config->objectTables[$objectType])->where('id')->eq($objectID)->fetch();
|
||||
if($objectType != 'team') $record = $this->dao->select($fields)->from($this->config->objectTables[$objectType])->where('id')->eq($objectID)->fetch();
|
||||
|
||||
/* Process story, release and task. */
|
||||
if($objectType == 'story') $record->project = $this->dao->select('project')->from(TABLE_PROJECTSTORY)->where('story')->eq($objectID)->orderBy('project_desc')->limit(1)->fetch('project');
|
||||
if($objectType == 'release') $record->project = $this->dao->select('project')->from(TABLE_BUILD)->where('id')->eq($record->build)->fetch('project');
|
||||
if($objectType == 'team')
|
||||
{
|
||||
$team = $this->dao->select('type')->from(TABLE_PROJECT)->where('id')->eq($objectID)->fetch();
|
||||
$type = $team->type == 'project' ? 'project' : 'execution';
|
||||
$team = $this->dao->select('type')->from(TABLE_PROJECT)->where('id')->eq($objectID)->fetch();
|
||||
$type = $team->type == 'project' ? 'project' : 'execution';
|
||||
$record = new stdclass();
|
||||
$record->$type = $objectID;
|
||||
}
|
||||
if($objectType == 'task')
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
/**
|
||||
* The automation module zh-cn file of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL (http://zpl.pub/page/zplv12.html)
|
||||
* @author Chunsheng Wang <chunsheng@cnezsoft.com>
|
||||
* @package automation
|
||||
* @version $Id: zh-cn.php 4767 2013-05-05 06:10:13Z wwccss $
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
$lang->automation->common = 'Automated testing';
|
||||
$lang->automation->browse = 'Index';
|
||||
|
||||
$lang->automation->title = 'Automated test solutions';
|
||||
|
||||
$lang->automation->ztfSite = 'ZTF Website';
|
||||
$lang->automation->ztfDownload = 'ZTF Download';
|
||||
$lang->automation->ztfManual = 'ZTF Manual';
|
||||
|
||||
$lang->automation->ztfFeature1 = 'ZTF solves various problems for you.';
|
||||
$lang->automation->ztfFeature2 = 'ZTF solves the following problems for you.';
|
||||
$lang->automation->ztfFeature3 = 'Management of use case information.';
|
||||
$lang->automation->ztfFeature4 = 'Comparison of test results';
|
||||
$lang->automation->ztfFeature5 = 'Test the execution of the script';
|
||||
$lang->automation->ztfFeature6 = 'Defect Bug submission.';
|
||||
|
||||
$lang->automation->ztfFeature7 = 'ZTF has no dependence on the environment.';
|
||||
$lang->automation->ztfFeature8 = 'Developed in the Go language.';
|
||||
$lang->automation->ztfFeature9 = 'Deploy without any dependencies.';
|
||||
$lang->automation->ztfFeature10 = 'It works on all platforms.';
|
||||
$lang->automation->ztfFeature11 = 'There is only one executable.';
|
||||
|
||||
$lang->automation->ztfFeature12 = 'ZTF has no requirement for automated testing.';
|
||||
$lang->automation->ztfFeature13 = 'Support for a variety of common development languages.';
|
||||
$lang->automation->ztfFeature14 = 'Can be integrated with known testing frameworks.';
|
||||
$lang->automation->ztfFeature15 = 'There are no requirements for how the script is implemented.';
|
||||
|
||||
$lang->automation->ztfFeature16 = 'You can batch export Zen test cases to scripts';
|
||||
$lang->automation->ztfFeature17 = 'The results of the execution can be submitted to the Zentao';
|
||||
$lang->automation->ztfFeature18 = 'Execution results can be created as bug';
|
||||
$lang->automation->ztfFeature19 = 'Deep integration of ZTF and Zentao';
|
||||
|
||||
$lang->automation->zendataSite = 'ZenData Website';
|
||||
$lang->automation->zendataDownload = 'ZenData Download';
|
||||
$lang->automation->zendataManual = 'ZenData Manual';
|
||||
|
||||
$lang->automation->zendata = 'Generic data generation tool';
|
||||
$lang->automation->zendataFeature1 = 'Do not understand the code can also be used, easy to get started';
|
||||
$lang->automation->zendataFeature2 = 'The data format is completely customizable without any restrictions';
|
||||
$lang->automation->zendataFeature3 = 'One click generates a million pieces of data, no pressure';
|
||||
|
||||
$lang->automation->zendataFeature4 = 'Cross-platform and cross-language';
|
||||
$lang->automation->zendataFeature5 = 'Only one executable is required to run';
|
||||
$lang->automation->zendataFeature6 = 'You can use Windows, Linux, MacOS';
|
||||
$lang->automation->zendataFeature7 = 'A variety of languages can be used';
|
||||
|
||||
$lang->automation->zendataFeature8 = 'All kinds of black tricks';
|
||||
$lang->automation->zendataFeature9 = 'Interval, Step Size, Random, Repeat, References';
|
||||
$lang->automation->zendataFeature10 = 'Specify a list of files to be queried in Excel';
|
||||
$lang->automation->zendataFeature11 = 'Parallel generation, recursive generation, reverse parsing';
|
||||
|
||||
$lang->automation->groupTips = 'Welcome to join the automated test QQ communication group';
|
||||
$lang->automation->groupTitle = 'Software test communication group:';
|
||||
$lang->automation->qqGroup = '522506766';
|
||||
$lang->automation->groupDescription = 'Software testing technology exchange community for software testing practitioners, sharing software testing tools and methods, help everyone to improve the level of software testing skills.';
|
||||
@@ -498,6 +498,7 @@ $lang->navGroup->milestone = 'project';
|
||||
$lang->navGroup->execution = 'execution';
|
||||
$lang->navGroup->task = 'execution';
|
||||
$lang->navGroup->build = 'execution';
|
||||
$lang->navGroup->team = 'execution';
|
||||
|
||||
$lang->navGroup->doc = 'doc';
|
||||
$lang->navGroup->doclib = 'doc';
|
||||
|
||||
@@ -115,23 +115,6 @@ class custom extends control
|
||||
{
|
||||
$data = fixer::input('post')->get();
|
||||
$this->loadModel('setting')->setItems("system.$module", $data);
|
||||
if($data->reviewRules == 'halfpass')
|
||||
{
|
||||
$storyList = $this->dao->select('t1.*')->from(TABLE_STORYREVIEW)->alias('t1')
|
||||
->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story = t2.id')
|
||||
->where('t2.status')->in('change, draft')
|
||||
->fetchGroup('story');
|
||||
|
||||
foreach($storyList as $storyID => $reviewerList)
|
||||
{
|
||||
$passCount = 0;
|
||||
foreach($reviewerList as $reviewer) $passCount += $reviewer->result == 'pass' ? 1 : 0;
|
||||
if($passCount >= floor(count($reviewerList) / 2) + 1)
|
||||
{
|
||||
$this->dao->update(TABLE_STORY)->set('status')->eq('active')->where('id')->eq($storyID)->exec();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
elseif($module == 'testcase' and $field == 'review')
|
||||
{
|
||||
|
||||
@@ -103,6 +103,7 @@ $lang->custom->story->fields['sourceList'] = 'Source';
|
||||
$lang->custom->story->fields['reasonList'] = 'Close Reason';
|
||||
$lang->custom->story->fields['stageList'] = 'Phase';
|
||||
$lang->custom->story->fields['statusList'] = 'Status';
|
||||
$lang->custom->story->fields['reviewRules'] = 'Review Rules';
|
||||
$lang->custom->story->fields['reviewResultList'] = 'Review Result';
|
||||
$lang->custom->story->fields['review'] = 'Review Required';
|
||||
|
||||
|
||||
@@ -103,6 +103,7 @@ $lang->custom->story->fields['sourceList'] = 'Source';
|
||||
$lang->custom->story->fields['reasonList'] = 'Raison Fermeture';
|
||||
$lang->custom->story->fields['stageList'] = 'Phase';
|
||||
$lang->custom->story->fields['statusList'] = 'Statut';
|
||||
$lang->custom->story->fields['reviewRules'] = 'Review Rules';
|
||||
$lang->custom->story->fields['reviewResultList'] = 'Valider Résultats';
|
||||
$lang->custom->story->fields['review'] = 'Validation Requise';
|
||||
|
||||
|
||||
@@ -103,6 +103,7 @@ $lang->custom->story->fields['sourceList'] = 'Nguồn';
|
||||
$lang->custom->story->fields['reasonList'] = 'Lý do đóng';
|
||||
$lang->custom->story->fields['stageList'] = 'Giai đoạn';
|
||||
$lang->custom->story->fields['statusList'] = 'Tình trạng';
|
||||
$lang->custom->story->fields['reviewRules'] = 'Review Rules';
|
||||
$lang->custom->story->fields['reviewResultList'] = 'Duyệt kết quả';
|
||||
$lang->custom->story->fields['review'] = 'Duyệt nhu cầu';
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
<th class='c-hours'> <?php common::printOrderLink('estimate', $orderBy, $vars, $lang->story->estimateAB);?></th>
|
||||
<th class='c-status'> <?php common::printOrderLink('status', $orderBy, $vars, $lang->statusAB);?></th>
|
||||
<th class='c-stage'> <?php common::printOrderLink('stage', $orderBy, $vars, $lang->story->stageAB);?></th>
|
||||
<th class='c-actions-4'> <?php echo $lang->actions;?></th>
|
||||
<th class='c-actions-5'> <?php echo $lang->actions;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -137,7 +137,7 @@
|
||||
if($canBeChanged)
|
||||
{
|
||||
$vars = "story={$child->id}";
|
||||
common::printIcon('story', 'change', $vars, $child, 'list', 'fork');
|
||||
common::printIcon('story', 'change', $vars, $child, 'list', 'alter');
|
||||
common::printIcon('story', 'review', $vars, $child, 'list', 'search');
|
||||
common::printIcon('story', 'close', $vars, $child, 'list', '', '', 'iframe', true);
|
||||
common::printIcon('story', 'edit', $vars, $child, 'list');
|
||||
|
||||
@@ -141,7 +141,7 @@
|
||||
if($canBeChanged)
|
||||
{
|
||||
$vars = "story={$child->id}";
|
||||
common::printIcon('story', 'change', $vars, $child, 'list', 'fork');
|
||||
common::printIcon('story', 'change', $vars, $child, 'list', 'alter');
|
||||
common::printIcon('story', 'review', $vars, $child, 'list', 'search');
|
||||
common::printIcon('story', 'close', $vars, $child, 'list', '', '', 'iframe', true);
|
||||
common::printIcon('story', 'edit', $vars, $child, 'list');
|
||||
|
||||
@@ -25,3 +25,4 @@ $lang->projectrelease->batchUnlinkBug = "Mehrere Bugs entfernen";
|
||||
$lang->projectrelease->unlinkStory = "Unlink {$lang->SRCommon}";
|
||||
$lang->projectrelease->unlinkBug = 'Unlink Bug';
|
||||
$lang->projectrelease->export = 'Export as HTML';
|
||||
$lang->projectrelease->browseAction = "Release List";
|
||||
|
||||
@@ -25,3 +25,4 @@ $lang->projectrelease->batchUnlinkBug = "Batch Unlink Bugs";
|
||||
$lang->projectrelease->unlinkStory = "Unlink {$lang->SRCommon}";
|
||||
$lang->projectrelease->unlinkBug = 'Unlink Bug';
|
||||
$lang->projectrelease->export = 'Export as HTML';
|
||||
$lang->projectrelease->browseAction = "Release List";
|
||||
|
||||
@@ -25,3 +25,4 @@ $lang->projectrelease->batchUnlinkBug = "Retirer Bugs par Lot";
|
||||
$lang->projectrelease->unlinkStory = "Unlink {$lang->SRCommon}";
|
||||
$lang->projectrelease->unlinkBug = 'Unlink Bug';
|
||||
$lang->projectrelease->export = 'Export HTML';
|
||||
$lang->projectrelease->browseAction = "Release List";
|
||||
|
||||
@@ -25,3 +25,4 @@ $lang->projectrelease->batchUnlinkBug = "Hủy liên kết Bug hàng loạt";
|
||||
$lang->projectrelease->unlinkStory = "Unlink {$lang->SRCommon}";
|
||||
$lang->projectrelease->unlinkBug = 'Unlink Bug';
|
||||
$lang->projectrelease->export = 'Xuất ra HTML';
|
||||
$lang->projectrelease->browseAction = "Release List";
|
||||
|
||||
@@ -25,5 +25,4 @@ $lang->projectrelease->batchUnlinkBug = "批量移除Bug";
|
||||
$lang->projectrelease->unlinkStory = "移除{$lang->SRCommon}";
|
||||
$lang->projectrelease->unlinkBug = '移除Bug';
|
||||
$lang->projectrelease->export = '导出HTML';
|
||||
|
||||
$lang->projectrelease->browseAction = "发布列表";
|
||||
$lang->projectrelease->browseAction = "发布列表";
|
||||
|
||||
@@ -9,4 +9,5 @@
|
||||
* @version $Id: en.php 4129 2013-01-18 01:58:14Z wwccss $
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
$lang->qa->index = 'QS Home';
|
||||
$lang->qa->index = 'QS Home';
|
||||
$lang->qa->indexAction = 'QA Index';
|
||||
|
||||
@@ -9,4 +9,5 @@
|
||||
* @version $Id: en.php 4129 2013-01-18 01:58:14Z wwccss $
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
$lang->qa->index = 'QA Home';
|
||||
$lang->qa->index = 'QA Home';
|
||||
$lang->qa->indexAction = 'QA Index';
|
||||
|
||||
@@ -9,4 +9,5 @@
|
||||
* @version $Id: en.php 4129 2013-01-18 01:58:14Z wwccss $
|
||||
* @link https://www.zentao.pm
|
||||
*/
|
||||
$lang->qa->index = 'Accueil Qualité';
|
||||
$lang->qa->index = 'Accueil Qualité';
|
||||
$lang->qa->indexAction = 'QA Index';
|
||||
|
||||
@@ -9,4 +9,5 @@
|
||||
* @version $Id: vi.php 4129 2013-01-18 01:58:14Z wwccss $
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
$lang->qa->index = 'Trang QA';
|
||||
$lang->qa->index = 'Trang QA';
|
||||
$lang->qa->indexAction = 'QA Index';
|
||||
|
||||
@@ -9,6 +9,5 @@
|
||||
* @version $Id: zh-cn.php 4129 2013-01-18 01:58:14Z wwccss $
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
$lang->qa->index = '测试主页';
|
||||
|
||||
$lang->qa->index = '测试主页';
|
||||
$lang->qa->indexAction = '测试仪表盘';
|
||||
|
||||
@@ -164,7 +164,7 @@ class story extends control
|
||||
setcookie('storyModule', 0, 0, $this->config->webRoot, '', $this->config->cookieSecure, false);
|
||||
$branchID = $this->post->branch ? $this->post->branch : $branch;
|
||||
$response['locate'] = $this->createLink('product', 'browse', "productID=$productID&branch=$branchID&browseType=unclosed¶m=0&type=$type&orderBy=id_desc");
|
||||
if($this->session->storyList) $response['locate'] = $this->session->storyList;
|
||||
if($this->session->storyList and $this->app->openApp != 'product') $response['locate'] = $this->session->storyList;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -900,6 +900,7 @@ class story extends control
|
||||
$modulePath = $this->tree->getParents($story->module);
|
||||
$storyModule = empty($story->module) ? '' : $this->tree->getById($story->module);
|
||||
$users = $this->user->getPairs('noletter');
|
||||
$reviewers = $this->dao->select('reviewer,result')->from(TABLE_STORYREVIEW)->where('story')->eq($storyID)->andWhere('version')->eq($story->version)->fetchAll('reviewer');
|
||||
|
||||
/* Set the menu. */
|
||||
$from = $this->app->openApp;
|
||||
@@ -937,6 +938,7 @@ class story extends control
|
||||
$this->view->story = $story;
|
||||
$this->view->track = $this->story->getTrackByID($story->id);
|
||||
$this->view->users = $users;
|
||||
$this->view->reviewers = array_keys($reviewers);
|
||||
$this->view->relations = $this->story->getStoryRelation($story->id, $story->type);
|
||||
$this->view->executions = $this->execution->getPairs(0, 'all', 'nocode');
|
||||
$this->view->execution = empty($story->execution) ? array() : $this->dao->findById($story->execution)->from(TABLE_EXECUTION)->fetch();
|
||||
@@ -1004,9 +1006,13 @@ class story extends control
|
||||
{
|
||||
$result = $this->post->result;
|
||||
$reasonParam = $result == 'reject' ? ',' . $this->post->closedReason : '';
|
||||
$storyStatus = $this->dao->findById($storyID)->from(TABLE_STORY)->fetch('status');
|
||||
$actionID = $this->action->create('story', $storyID, 'Reviewed', $this->post->comment, ucfirst($result) . $reasonParam);
|
||||
if($storyStatus == 'closed') $actionID = $this->action->create('story', $storyID, 'ReviewClosed');
|
||||
$story = $this->dao->findById($storyID)->from(TABLE_STORY)->fetch();
|
||||
$reviewers = $this->dao->select('reviewer,result')->from(TABLE_STORYREVIEW)->where('story')->eq($storyID)->andWhere('version')->eq($story->version)->fetchAll('reviewer');
|
||||
$reviewedBy = explode(',', trim($story->reviewedBy, ','));
|
||||
$actionID = $this->action->create('story', $storyID, 'Reviewed', $this->post->comment, ucfirst($result) . $reasonParam);
|
||||
if($story->status == 'closed') $actionID = $this->action->create('story', $storyID, 'ReviewClosed');
|
||||
if($story->status == 'active') $actionID = $this->action->create('story', $storyID, 'PassReviewed');
|
||||
if(!array_diff(array_keys($reviewers), $reviewedBy) and ($story->status == 'draft' || $story->status == 'changed')) $actionID = $this->action->create('story', $storyID, 'ClarifyReviewed');
|
||||
$this->action->logHistory($actionID, $changes);
|
||||
}
|
||||
|
||||
@@ -1042,9 +1048,10 @@ class story extends control
|
||||
|
||||
/* Set the review result options. */
|
||||
$reviewers = $this->dao->select('reviewer')->from(TABLE_STORYREVIEW)->where('story')->eq($storyID)->andWhere('version')->eq($story->version)->fetchAll('reviewer');
|
||||
if($story->status == 'draft' and $story->version == 1) unset($this->lang->story->reviewResultList['revert']);
|
||||
if($story->status == 'changed') unset($this->lang->story->reviewResultList['reject']);
|
||||
if(count($reviewers) > 1) unset($this->lang->story->reviewResultList['revert']);
|
||||
$this->lang->story->resultList = $this->lang->story->reviewResultList;
|
||||
if($story->status == 'draft' and $story->version == 1) unset($this->lang->story->resultList['revert']);
|
||||
if($story->status == 'changed') unset($this->lang->story->resultList['reject']);
|
||||
if(count($reviewers) > 1) unset($this->lang->story->resultList['revert']);
|
||||
|
||||
$this->view->title = $this->lang->story->review . "STORY" . $this->lang->colon . $story->title;
|
||||
$this->view->position[] = html::a($this->createLink('product', 'browse', "product=$product->id&branch=$story->branch"), $product->name);
|
||||
|
||||
@@ -123,6 +123,7 @@ $lang->story->closedDate = 'Geschlossen am';
|
||||
$lang->story->closedReason = 'Geschlossen weil';
|
||||
$lang->story->rejectedReason = 'Abgelehnt weil';
|
||||
$lang->story->reviewedBy = 'Prüfer';
|
||||
$lang->story->reviewers = 'Reviewers';
|
||||
$lang->story->reviewedDate = 'Geprüft am';
|
||||
$lang->story->version = 'Version';
|
||||
$lang->story->plan = 'Plan';
|
||||
@@ -155,6 +156,8 @@ $lang->story->noRequirement = 'No Requirements';
|
||||
$lang->story->one = 'One';
|
||||
$lang->story->field = 'Synchronized fields';
|
||||
$lang->story->completeRate = 'Completion Rate';
|
||||
$lang->story->reviewed = 'Reviewed';
|
||||
$lang->story->toBeReviewed = 'To Be Reviewed';
|
||||
|
||||
$lang->story->ditto = 'Dito';
|
||||
$lang->story->dittoNotice = 'Die Story gehört nicht zum Projekt wie die vorherige!';
|
||||
@@ -279,6 +282,8 @@ $lang->story->form->file = 'Wenn Dateien zu dieser Story gehören, laden Sie
|
||||
|
||||
$lang->story->action = new stdclass();
|
||||
$lang->story->action->reviewed = array('main' => '$date, geprüft von <strong>$actor</strong>. Das Ergebnis ist <strong>$extra</strong>.', 'extra' => 'reviewResultList');
|
||||
$lang->story->action->passreviewed = array('main' => '$date, determined by the <strong>System</strong>. The result is <strong>Pass</strong>.');
|
||||
$lang->story->action->clarifyreviewed = array('main' => '$date, determined by the <strong>System</strong>. The result is <strong>Clarify</strong>. Please re-initiate the review after changing.');
|
||||
$lang->story->action->rejectreviewed = array('main' => '$date, geprüft von <strong>$actor</strong>. Das Ergebnis ist <strong>$extra</strong>, Der Grund ist <strong>$reason</strong>.', 'extra' => 'reviewResultList', 'reason' => 'reasonList');
|
||||
$lang->story->action->closed = array('main' => '$date, geschlossen von <strong>$actor</strong>. Der Grund ist <strong>$extra</strong> $appendLink.', 'extra' => 'reasonList');
|
||||
$lang->story->action->reviewclosed = array('main' => '$date, closed by <strong>System</strong>. The reasion is <strong>Review Failed</strong>.');
|
||||
|
||||
@@ -124,6 +124,7 @@ $lang->story->closedDate = 'ClosedDate';
|
||||
$lang->story->closedReason = 'Reason';
|
||||
$lang->story->rejectedReason = 'Reject Reason';
|
||||
$lang->story->reviewedBy = 'ReviewedBy';
|
||||
$lang->story->reviewers = 'Reviewers';
|
||||
$lang->story->reviewedDate = 'ReviewedDate';
|
||||
$lang->story->version = 'Version';
|
||||
$lang->story->plan = 'Linked Plan';
|
||||
@@ -156,6 +157,8 @@ $lang->story->noRequirement = 'No Requirements';
|
||||
$lang->story->one = 'One';
|
||||
$lang->story->field = 'Synchronized fields';
|
||||
$lang->story->completeRate = 'Completion Rate';
|
||||
$lang->story->reviewed = 'Reviewed';
|
||||
$lang->story->toBeReviewed = 'To Be Reviewed';
|
||||
|
||||
$lang->story->ditto = 'Ditto';
|
||||
$lang->story->dittoNotice = 'This story is not linked to the same product as the last one is!';
|
||||
@@ -280,6 +283,8 @@ $lang->story->form->file = 'If any file that is linked to a story, please cl
|
||||
|
||||
$lang->story->action = new stdclass();
|
||||
$lang->story->action->reviewed = array('main' => '$date, recorded by <strong>$actor</strong>. The result is <strong>$extra</strong>.', 'extra' => 'reviewResultList');
|
||||
$lang->story->action->passreviewed = array('main' => '$date, determined by the <strong>System</strong>. The result is <strong>Pass</strong>.');
|
||||
$lang->story->action->clarifyreviewed = array('main' => '$date, determined by the <strong>System</strong>. The result is <strong>Clarify</strong>. Please re-initiate the review after changing.');
|
||||
$lang->story->action->rejectreviewed = array('main' => '$date, recorded by <strong>$actor</strong>. The result is <strong>$extra</strong>. The reasion is <strong>$reason</strong>.', 'extra' => 'reviewResultList', 'reason' => 'reasonList');
|
||||
$lang->story->action->closed = array('main' => '$date, closed by <strong>$actor</strong>. The reasion is <strong>$extra</strong> $appendLink.', 'extra' => 'reasonList');
|
||||
$lang->story->action->reviewclosed = array('main' => '$date, closed by <strong>System</strong>. The reasion is <strong>Review Failed</strong>.');
|
||||
|
||||
@@ -123,6 +123,7 @@ $lang->story->closedDate = 'Date Fermeture';
|
||||
$lang->story->closedReason = 'Raison';
|
||||
$lang->story->rejectedReason = 'Raison du Rejet';
|
||||
$lang->story->reviewedBy = 'Validée par';
|
||||
$lang->story->reviewers = 'Reviewers';
|
||||
$lang->story->reviewedDate = 'Date Validation';
|
||||
$lang->story->version = 'Version';
|
||||
$lang->story->plan = 'Intégrée Plans';
|
||||
@@ -155,6 +156,8 @@ $lang->story->noRequirement = 'No Requirements';
|
||||
$lang->story->one = 'One';
|
||||
$lang->story->field = 'Synchronized fields';
|
||||
$lang->story->completeRate = 'Completion Rate';
|
||||
$lang->story->reviewed = 'Reviewed';
|
||||
$lang->story->toBeReviewed = 'To Be Reviewed';
|
||||
|
||||
$lang->story->ditto = 'Idem';
|
||||
$lang->story->dittoNotice = "La story n'est pas associée au même product que la précédente !";
|
||||
@@ -279,6 +282,8 @@ $lang->story->form->file = 'Si certains fichiers sont associés à la story,
|
||||
|
||||
$lang->story->action = new stdclass();
|
||||
$lang->story->action->reviewed = array('main' => '$date, validée par <strong>$actor</strong>. Le résultat est <strong>$extra</strong>.', 'extra' => 'reviewResultList');
|
||||
$lang->story->action->passreviewed = array('main' => '$date, determined by the <strong>System</strong>. The result is <strong>Pass</strong>.');
|
||||
$lang->story->action->clarifyreviewed = array('main' => '$date, determined by the <strong>System</strong>. The result is <strong>Clarify</strong>. Please re-initiate the review after changing.');
|
||||
$lang->story->action->rejectreviewed = array('main' => '$date, validée par <strong>$actor</strong>. Le résultat est <strong>$extra</strong>. La raison est <strong>$reason</strong>.', 'extra' => 'reviewResultList', 'reason' => 'reasonList');
|
||||
$lang->story->action->closed = array('main' => '$date, Fermée par <strong>$actor</strong>. La raison est <strong>$extra</strong> $appendLink.', 'extra' => 'reasonList');
|
||||
$lang->story->action->reviewclosed = array('main' => '$date, closed by <strong>System</strong>. The reasion is <strong>Review Failed</strong>.');
|
||||
|
||||
@@ -123,6 +123,7 @@ $lang->story->closedDate = 'Ngày đóng';
|
||||
$lang->story->closedReason = 'Lý do';
|
||||
$lang->story->rejectedReason = 'Lý do từ chối';
|
||||
$lang->story->reviewedBy = 'Người duyệt';
|
||||
$lang->story->reviewers = 'Reviewers';
|
||||
$lang->story->reviewedDate = 'Ngày duyệt';
|
||||
$lang->story->version = 'Phiên bản';
|
||||
$lang->story->plan = 'Kế hoạch liên kết';
|
||||
@@ -155,6 +156,8 @@ $lang->story->noRequirement = 'No Requirements';
|
||||
$lang->story->one = 'One';
|
||||
$lang->story->field = 'Synchronized fields';
|
||||
$lang->story->completeRate = 'Completion Rate';
|
||||
$lang->story->reviewed = 'Reviewed';
|
||||
$lang->story->toBeReviewed = 'To Be Reviewed';
|
||||
|
||||
$lang->story->ditto = 'Như trên';
|
||||
$lang->story->dittoNotice = 'Câu chuyện này chưa liên kết tới cùng sản phẩm bởi bởi vì nó là cuối cùng!';
|
||||
@@ -279,6 +282,8 @@ $lang->story->form->file = 'Nếu bất kỳ tập tin mà liên kết tới
|
||||
|
||||
$lang->story->action = new stdclass();
|
||||
$lang->story->action->reviewed = array('main' => '$date, ghi nhận bởi <strong>$actor</strong>. Kết quả là <strong>$extra</strong>.', 'extra' => 'reviewResultList');
|
||||
$lang->story->action->passreviewed = array('main' => '$date, determined by the <strong>System</strong>. The result is <strong>Pass</strong>.');
|
||||
$lang->story->action->clarifyreviewed = array('main' => '$date, determined by the <strong>System</strong>. The result is <strong>Clarify</strong>. Please re-initiate the review after changing.');
|
||||
$lang->story->action->rejectreviewed = array('main' => '$date, ghi nhận bởi <strong>$actor</strong>. Kết quả là <strong>$extra</strong>. Lý do là <strong>$reason</strong>', 'extra' => 'reviewResultList', 'reason' => 'reasonList');
|
||||
$lang->story->action->closed = array('main' => '$date, được đóng bởi <strong>$actor</strong>. Lý do là <strong>$extra</strong> $appendLink.', 'extra' => 'reasonList');
|
||||
$lang->story->action->reviewclosed = array('main' => '$date, closed by <strong>System</strong>. The reasion is <strong>Review Failed</strong>.');
|
||||
|
||||
@@ -124,6 +124,7 @@ $lang->story->closedDate = '关闭日期';
|
||||
$lang->story->closedReason = '关闭原因';
|
||||
$lang->story->rejectedReason = '拒绝原因';
|
||||
$lang->story->reviewedBy = '由谁评审';
|
||||
$lang->story->reviewers = '评审人员';
|
||||
$lang->story->reviewedDate = '评审时间';
|
||||
$lang->story->version = '版本号';
|
||||
$lang->story->plan = "所属计划";
|
||||
@@ -156,6 +157,8 @@ $lang->story->noRequirement = '无需求';
|
||||
$lang->story->one = '一个';
|
||||
$lang->story->field = '同步的字段';
|
||||
$lang->story->completeRate = '完成率';
|
||||
$lang->story->reviewed = '已评审';
|
||||
$lang->story->toBeReviewed = '待评审';
|
||||
|
||||
$lang->story->ditto = '同上';
|
||||
$lang->story->dittoNotice = "该{$lang->SRCommon}与上一{$lang->SRCommon}不属于同一产品!";
|
||||
@@ -280,6 +283,8 @@ $lang->story->form->file = "附件,如果该{$lang->SRCommon}有相关文
|
||||
|
||||
$lang->story->action = new stdclass();
|
||||
$lang->story->action->reviewed = array('main' => '$date, 由 <strong>$actor</strong> 记录评审结果,结果为 <strong>$extra</strong>。', 'extra' => 'reviewResultList');
|
||||
$lang->story->action->passreviewed = array('main' => '$date, 由 <strong>系统</strong> 判定,结果为 <strong>确认通过</strong>。');
|
||||
$lang->story->action->clarifyreviewed = array('main' => '$date, 由 <strong>系统</strong> 判定,结果为 <strong>有待明确</strong>,请变更后重新发起评审。');
|
||||
$lang->story->action->rejectreviewed = array('main' => '$date, 由 <strong>$actor</strong> 记录评审结果,结果为 <strong>$extra</strong>,原因为 <strong>$reason</strong>。', 'extra' => 'reviewResultList', 'reason' => 'reasonList');
|
||||
$lang->story->action->closed = array('main' => '$date, 由 <strong>$actor</strong> 关闭,原因为 <strong>$extra</strong> $appendLink。', 'extra' => 'reasonList');
|
||||
$lang->story->action->reviewclosed = array('main' => '$date, 由 <strong>系统</strong> 关闭,原因为 <strong>评审失败</strong>。');
|
||||
|
||||
@@ -124,6 +124,7 @@ $lang->story->closedDate = '關閉日期';
|
||||
$lang->story->closedReason = '關閉原因';
|
||||
$lang->story->rejectedReason = '拒絶原因';
|
||||
$lang->story->reviewedBy = '由誰評審';
|
||||
$lang->story->reviewers = '評審人員';
|
||||
$lang->story->reviewedDate = '評審時間';
|
||||
$lang->story->version = '版本號';
|
||||
$lang->story->plan = "所屬計劃";
|
||||
@@ -156,6 +157,8 @@ $lang->story->noRequirement = '無需求';
|
||||
$lang->story->one = '一個';
|
||||
$lang->story->field = '同步的欄位';
|
||||
$lang->story->completeRate = '完成率';
|
||||
$lang->story->reviewed = '已評審';
|
||||
$lang->story->toBeReviewed = '待評審';
|
||||
|
||||
$lang->story->ditto = '同上';
|
||||
$lang->story->dittoNotice = "該{$lang->SRCommon}與上一{$lang->SRCommon}不屬於同一產品!";
|
||||
@@ -280,6 +283,8 @@ $lang->story->form->file = "附件,如果該{$lang->SRCommon}有相關檔
|
||||
|
||||
$lang->story->action = new stdclass();
|
||||
$lang->story->action->reviewed = array('main' => '$date, 由 <strong>$actor</strong> 記錄評審結果,結果為 <strong>$extra</strong>。', 'extra' => 'reviewResultList');
|
||||
$lang->story->action->passreviewed = array('main' => '$date, 由 <strong>系統</strong> 判定,結果為 <strong>確認通過</strong>。');
|
||||
$lang->story->action->clarifyreviewed = array('main' => '$date, 由 <strong>系統</strong> 判定,結果為 <strong>有待明確</strong>,請變更後重新發起評審。');
|
||||
$lang->story->action->rejectreviewed = array('main' => '$date, 由 <strong>$actor</strong> 記錄評審結果,結果為 <strong>$extra</strong>,原因為 <strong>$reason</strong>。', 'extra' => 'reviewResultList', 'reason' => 'reasonList');
|
||||
$lang->story->action->closed = array('main' => '$date, 由 <strong>$actor</strong> 關閉,原因為 <strong>$extra</strong> $appendLink。', 'extra' => 'reasonList');
|
||||
$lang->story->action->reviewclosed = array('main' => '$date, 由 <strong>系統</strong> 關閉,原因為 <strong>評審失敗</strong>。');
|
||||
|
||||
@@ -1185,9 +1185,9 @@ class storyModel extends model
|
||||
$reviewedBy = explode(',', trim($story->reviewedBy, ','));
|
||||
if(!array_diff(array_keys($reviewerList), $reviewedBy))
|
||||
{
|
||||
$passCount = 0;
|
||||
$rejectCount = 0;
|
||||
$reviewRule = $this->config->story->reviewRules;
|
||||
$passCount = 0;
|
||||
$rejectCount = 0;
|
||||
$reviewRule = $this->config->story->reviewRules;
|
||||
foreach($reviewerList as $reviewer => $result)
|
||||
{
|
||||
$passCount = $result == 'pass' ? $passCount + 1 : $passCount;
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->story->reviewResult;?></th>
|
||||
<td class = 'required'><?php echo html::select('result', $lang->story->reviewResultList, '', 'class=form-control onchange="switchShow(this.value)"');?></td><td></td>
|
||||
<td class = 'required'><?php echo html::select('result', $lang->story->resultList, '', 'class=form-control onchange="switchShow(this.value)"');?></td><td></td>
|
||||
</tr>
|
||||
<tr id='rejectedReasonBox' class='hide'>
|
||||
<th><?php echo $lang->story->rejectedReason;?></th>
|
||||
|
||||
@@ -370,8 +370,16 @@
|
||||
<td><?php if($story->assignedTo) echo zget($users, $story->assignedTo) . $lang->at . $story->assignedDate;?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->story->reviewedBy;?></th>
|
||||
<td><?php $reviewedBy = explode(',', $story->reviewedBy); foreach($reviewedBy as $account) echo ' ' . zget($users, trim($account)); ?></td>
|
||||
<th><?php echo $lang->story->reviewers;?></th>
|
||||
<td>
|
||||
<?php
|
||||
$reviewedBy = explode(',', trim($story->reviewedBy, ','));
|
||||
foreach($reviewers as $reviewer)
|
||||
{
|
||||
echo in_array($reviewer, $reviewedBy) ? '<span style="color: #cbd0db" title="' . $lang->story->reviewed . '"> ' . zget($users, $reviewer) . '</span>' : '<span title="' . $lang->story->toBeReviewed .'"> ' . zget($users, $reviewer) . '</span>';
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->story->reviewedDate;?></th>
|
||||
|
||||
@@ -49,6 +49,7 @@ $lang->testreport->legendLegacyBugs = 'Legacy Bugs';
|
||||
$lang->testreport->legendReport = 'Bericht';
|
||||
$lang->testreport->legendComment = 'Summe';
|
||||
$lang->testreport->legendMore = 'Mehr';
|
||||
$lang->testreport->date = 'Date';
|
||||
|
||||
$lang->testreport->bugSeverityGroups = 'Nach Dringlichkeit';
|
||||
$lang->testreport->bugTypeGroups = 'Nach Typ';
|
||||
@@ -57,10 +58,17 @@ $lang->testreport->bugOpenedByGroups = 'Nach Ersteller';
|
||||
$lang->testreport->bugResolvedByGroups = 'Nach Löser';
|
||||
$lang->testreport->bugResolutionGroups = 'Nach Lösung';
|
||||
$lang->testreport->bugModuleGroups = 'Nach Modul';
|
||||
$lang->testreport->bugStageGroups = 'Bug importance stage distribution';
|
||||
$lang->testreport->bugHandleGroups = 'Distribution of daily bug processing';
|
||||
$lang->testreport->legacyBugs = 'Legacy Bugs';
|
||||
$lang->testreport->bugConfirmedRate = 'Bestätigte Bugs Rate (Lösung ist gelöst oder verschoben / Status ist gelöst oder Geschlossen)';
|
||||
$lang->testreport->bugCreateByCaseRate = 'Bug in Fall Rate (Bugs erstellt in Fall / Neu hinzugefügte Bugs)';
|
||||
|
||||
$lang->testreport->bugStageList = array();
|
||||
$lang->testreport->bugStageList['generated'] = 'Generated Bugs';
|
||||
$lang->testreport->bugStageList['legacy'] = 'Legacy Bugs';
|
||||
$lang->testreport->bugStageList['resolved'] = 'Resolved Bugs';
|
||||
|
||||
$lang->testreport->caseSummary = ' <strong>%s</strong> Fälle in Summe : <strong>%s</strong> ausgeführt, <strong>%s</strong> Ergebnisse, <strong>%s</strong> fehlgeschlagen.';
|
||||
$lang->testreport->buildSummary = 'Getsetetes <strong>%s</strong> Build.';
|
||||
$lang->testreport->confirmDelete = 'Möchten Sie diesen Bericht löschen?';
|
||||
|
||||
@@ -49,6 +49,7 @@ $lang->testreport->legendLegacyBugs = 'Left Bugs';
|
||||
$lang->testreport->legendReport = 'Report';
|
||||
$lang->testreport->legendComment = 'Summary';
|
||||
$lang->testreport->legendMore = 'More';
|
||||
$lang->testreport->date = 'Date';
|
||||
|
||||
$lang->testreport->bugSeverityGroups = 'Bug Severity Distribution';
|
||||
$lang->testreport->bugTypeGroups = 'Bug Type Distribution';
|
||||
@@ -57,10 +58,17 @@ $lang->testreport->bugOpenedByGroups = 'Bug ReportedBy Distribution';
|
||||
$lang->testreport->bugResolvedByGroups = 'Bug ResolvedBy Distribution';
|
||||
$lang->testreport->bugResolutionGroups = 'Bug Resolution Distribution';
|
||||
$lang->testreport->bugModuleGroups = 'Bug Module Distribution';
|
||||
$lang->testreport->bugStageGroups = 'Bug importance stage distribution';
|
||||
$lang->testreport->bugHandleGroups = 'Distribution of daily bug processing';
|
||||
$lang->testreport->legacyBugs = 'Left Bugs';
|
||||
$lang->testreport->bugConfirmedRate = 'Confirmed-Bug Rate (Resolution is fixed or postponed / status is resolved or closed)';
|
||||
$lang->testreport->bugCreateByCaseRate = 'Bug-Reported-in-Case Rate (Bugs reported in cases / New added bugs)';
|
||||
|
||||
$lang->testreport->bugStageList = array();
|
||||
$lang->testreport->bugStageList['generated'] = 'Generated Bugs';
|
||||
$lang->testreport->bugStageList['legacy'] = 'Legacy Bugs';
|
||||
$lang->testreport->bugStageList['resolved'] = 'Resolved Bugs';
|
||||
|
||||
$lang->testreport->caseSummary = 'Total <strong>%s</strong> cases. <strong>%s</strong> cases run. <strong>%s</strong> results generated. <strong>%s</strong> cases failed.';
|
||||
$lang->testreport->buildSummary = 'Tested <strong>%s</strong> builds.';
|
||||
$lang->testreport->confirmDelete = 'Do you want to delete this report?';
|
||||
|
||||
@@ -49,6 +49,7 @@ $lang->testreport->legendLegacyBugs = 'Bugs Restants';
|
||||
$lang->testreport->legendReport = 'Rapport';
|
||||
$lang->testreport->legendComment = 'Résumé';
|
||||
$lang->testreport->legendMore = 'Plus...';
|
||||
$lang->testreport->date = 'Date';
|
||||
|
||||
$lang->testreport->bugSeverityGroups = 'Distribution Sévérité de Bug';
|
||||
$lang->testreport->bugTypeGroups = 'Distribution Type de Bug';
|
||||
@@ -57,10 +58,17 @@ $lang->testreport->bugOpenedByGroups = 'Distribution Bug Signalé par';
|
||||
$lang->testreport->bugResolvedByGroups = 'Distribution Bug Résolu par';
|
||||
$lang->testreport->bugResolutionGroups = 'Distribution Bug Résolution';
|
||||
$lang->testreport->bugModuleGroups = 'Distribution Bug Module';
|
||||
$lang->testreport->bugStageGroups = 'Bug importance stage distribution';
|
||||
$lang->testreport->bugHandleGroups = 'Distribution of daily bug processing';
|
||||
$lang->testreport->legacyBugs = 'Bugs Restants';
|
||||
$lang->testreport->bugConfirmedRate = 'Taux de Bugs confirmés (Résolution est corrigée ou reportée / statut est résolu ou fermé)';
|
||||
$lang->testreport->bugCreateByCaseRate = 'Taux Bug Signalés par CasTest (Bugs signalés dans les CasTests / Nouveaux bugs)';
|
||||
|
||||
$lang->testreport->bugStageList = array();
|
||||
$lang->testreport->bugStageList['generated'] = 'Generated Bugs';
|
||||
$lang->testreport->bugStageList['legacy'] = 'Legacy Bugs';
|
||||
$lang->testreport->bugStageList['resolved'] = 'Resolved Bugs';
|
||||
|
||||
$lang->testreport->caseSummary = 'Total <strong>%s</strong> casTests. <strong>%s</strong> casTests joués. <strong>%s</strong> résultats générés. <strong>%s</strong> casTests ont échoué.';
|
||||
$lang->testreport->buildSummary = 'Testé <strong>%s</strong> builds.';
|
||||
$lang->testreport->confirmDelete = 'Voulez-vous supprimer ce rapport ?';
|
||||
|
||||
@@ -49,6 +49,7 @@ $lang->testreport->legendLegacyBugs = 'Bug còn lại';
|
||||
$lang->testreport->legendReport = 'Báo cáo';
|
||||
$lang->testreport->legendComment = 'Tóm tắt';
|
||||
$lang->testreport->legendMore = 'Thêm';
|
||||
$lang->testreport->date = 'Date';
|
||||
|
||||
$lang->testreport->bugSeverityGroups = 'Phân chia mức độ Bug';
|
||||
$lang->testreport->bugTypeGroups = 'Phân chia loại Bug';
|
||||
@@ -57,10 +58,17 @@ $lang->testreport->bugOpenedByGroups = 'Phân chia người báo cáo Bug';
|
||||
$lang->testreport->bugResolvedByGroups = 'Phân chia người giải quyết Bug';
|
||||
$lang->testreport->bugResolutionGroups = 'Phân chia giải pháp Bug';
|
||||
$lang->testreport->bugModuleGroups = 'Phân chia Module Bug';
|
||||
$lang->testreport->bugStageGroups = 'Bug importance stage distribution';
|
||||
$lang->testreport->bugHandleGroups = 'Distribution of daily bug processing';
|
||||
$lang->testreport->legacyBugs = 'Bug còn lại';
|
||||
$lang->testreport->bugConfirmedRate = 'Đánh giá Bug đã xác nhận (Nghị quyết đã ban hành hoặc tạm hoãn / tình trạng được giải quyết hoặc đóng)';
|
||||
$lang->testreport->bugCreateByCaseRate = 'Đánh giá Bug được báo cáo trong Tình huống (Bug được báo cáo trong tình huống /Thêm mới Bugs)';
|
||||
|
||||
$lang->testreport->bugStageList = array();
|
||||
$lang->testreport->bugStageList['generated'] = 'Generated Bugs';
|
||||
$lang->testreport->bugStageList['legacy'] = 'Legacy Bugs';
|
||||
$lang->testreport->bugStageList['resolved'] = 'Resolved Bugs';
|
||||
|
||||
$lang->testreport->caseSummary = 'Tổng <strong>%s</strong> tình huống. <strong>%s</strong> tình huống đang chạy. <strong>%s</strong> kết quả được tạo. <strong>%s</strong> cases thất bại';
|
||||
$lang->testreport->buildSummary = 'Đã test <strong>%s</strong> bản dựng.';
|
||||
$lang->testreport->confirmDelete = 'Bạn có muốn xóa báo cáo này?';
|
||||
|
||||
@@ -49,6 +49,7 @@ $lang->testreport->legendLegacyBugs = '遗留的Bug';
|
||||
$lang->testreport->legendReport = '报表';
|
||||
$lang->testreport->legendComment = '总结';
|
||||
$lang->testreport->legendMore = '更多功能';
|
||||
$lang->testreport->date = '日期';
|
||||
|
||||
$lang->testreport->bugSeverityGroups = 'Bug严重级别分布';
|
||||
$lang->testreport->bugTypeGroups = 'Bug类型分布';
|
||||
@@ -57,10 +58,17 @@ $lang->testreport->bugOpenedByGroups = 'Bug创建者分布';
|
||||
$lang->testreport->bugResolvedByGroups = 'Bug解决者分布';
|
||||
$lang->testreport->bugResolutionGroups = 'Bug解决方案分布';
|
||||
$lang->testreport->bugModuleGroups = 'Bug模块分布';
|
||||
$lang->testreport->bugStageGroups = 'Bug重要程度阶段分布';
|
||||
$lang->testreport->bugHandleGroups = 'Bug每日处理情况分布';
|
||||
$lang->testreport->legacyBugs = '遗留的Bug';
|
||||
$lang->testreport->bugConfirmedRate = '有效Bug率 (方案为已解决或延期 / 状态为已解决或已关闭)';
|
||||
$lang->testreport->bugCreateByCaseRate = '用例发现Bug率 (用例创建的Bug / 时间区间中新增的Bug)';
|
||||
|
||||
$lang->testreport->bugStageList = array();
|
||||
$lang->testreport->bugStageList['generated'] = '产生的Bug';
|
||||
$lang->testreport->bugStageList['legacy'] = '遗留的Bug';
|
||||
$lang->testreport->bugStageList['resolved'] = '解决的Bug';
|
||||
|
||||
$lang->testreport->caseSummary = '共有<strong>%s</strong>个用例,共执行<strong>%s</strong>个用例,产生了<strong>%s</strong>个结果,失败的用例有<strong>%s</strong>个。';
|
||||
$lang->testreport->buildSummary = '共测试了<strong>%s</strong>个版本。';
|
||||
$lang->testreport->confirmDelete = '是否删除该报告?';
|
||||
|
||||
@@ -138,23 +138,77 @@ class testreportModel extends model
|
||||
public function getBugInfo($tasks, $productIdList, $begin, $end, $builds)
|
||||
{
|
||||
$generatedBugs = $this->dao->select('*')->from(TABLE_BUG)->where('product')->in($productIdList)->andWhere('openedDate')->ge($begin)->andWhere('openedDate')->le("$end 23:59:59")->andWhere('deleted')->eq(0)->fetchAll();
|
||||
$resolvedBugs = $this->dao->select('*')->from(TABLE_BUG)->where('product')->in($productIdList)->andWhere('resolvedDate')->ge($begin)->andWhere('resolvedDate')->le("$end 23:59:59")->andWhere('deleted')->eq(0)->fetchAll();
|
||||
$foundBugs = array();
|
||||
$legacyBugs = array();
|
||||
$byCaseNum = 0;
|
||||
$buildIdList = array_keys($builds);
|
||||
$taskIdList = array_keys($tasks);
|
||||
|
||||
$severityGroups = $statusGroups = $openedByGroups = $resolvedByGroups = $resolutionGroups = $moduleGroups = $typeGroups = $stageGoups = $handleGroups = array();
|
||||
|
||||
/* Init stageGroups. */
|
||||
foreach($this->lang->bug->priList as $priKey => $priValue)
|
||||
{
|
||||
$stageGroups[$priKey]['generated'] = 0;
|
||||
$stageGroups[$priKey]['legacy'] = 0;
|
||||
$stageGroups[$priKey]['resolved'] = 0;
|
||||
}
|
||||
|
||||
/* Init handleGroups. */
|
||||
$beginTimeStamp = strtotime($begin);
|
||||
$endTimeStamp = strtotime($end);
|
||||
for($i = $beginTimeStamp; $i <= $endTimeStamp; $i += 86400)
|
||||
{
|
||||
$date = date('m-d', $i);
|
||||
$handleGroups['generated'][$date] = 0;
|
||||
$handleGroups['legacy'][$date] = 0;
|
||||
$handleGroups['resolved'][$date] = 0;
|
||||
}
|
||||
|
||||
/* Get the resolved bug data. */
|
||||
foreach($resolvedBugs as $bug)
|
||||
{
|
||||
if(array_intersect(explode(',', $bug->openedBuild), $buildIdList))
|
||||
{
|
||||
$resolvedDate = date('m-d', strtotime($bug->resolvedDate));
|
||||
$stageGroups[$bug->pri]['resolved'] += 1;
|
||||
$handleGroups['resolved'][$resolvedDate] += 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Get the generated and leagcy bug data. */
|
||||
foreach($generatedBugs as $bug)
|
||||
{
|
||||
if(array_intersect(explode(',', $bug->openedBuild), $buildIdList))
|
||||
{
|
||||
$openedDate = date('m-d', strtotime($bug->openedDate));
|
||||
|
||||
$foundBugs[$bug->id] = $bug;
|
||||
if($bug->status == 'active' or $bug->resolvedDate > "$end 23:59:59") $legacyBugs[$bug->id] = $bug;
|
||||
$stageGroups[$bug->pri]['generated'] += 1;
|
||||
$handleGroups['generated'][$openedDate] += 1;
|
||||
|
||||
if($bug->status == 'active' or $bug->resolvedDate > "$end 23:59:59")
|
||||
{
|
||||
$legacyBugs[$bug->id] = $bug;
|
||||
$stageGroups[$bug->pri]['legacy'] += 1;
|
||||
|
||||
$beginTimeStamp = strtotime($begin);
|
||||
$endTimeStamp = strtotime($end);
|
||||
for($i = $beginTimeStamp; $i <= $endTimeStamp; $i += 86400)
|
||||
{
|
||||
$dateTime = date('Y-m-d 23:59:59', $i);
|
||||
if($bug->openedDate <= $dateTime and (helper::isZeroDate($bug->resolvedDate) or $bug->resolvedDate > $dateTime))
|
||||
{
|
||||
$date = date('m-d', $i);
|
||||
$handleGroups['legacy'][$date] += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if($bug->case and !empty($bug->testtask) and in_array($bug->testtask, $taskIdList)) $byCaseNum ++;
|
||||
}
|
||||
}
|
||||
|
||||
$severityGroups = $statusGroups = $openedByGroups = $resolvedByGroups = $resolutionGroups = $moduleGroups = $typeGroups = array();
|
||||
$resolvedBugs = 0;
|
||||
foreach($foundBugs as $bug)
|
||||
{
|
||||
@@ -174,6 +228,8 @@ class testreportModel extends model
|
||||
$bugInfo['countBugByTask'] = $byCaseNum;
|
||||
$bugInfo['bugConfirmedRate'] = empty($resolvedBugs) ? 0 : round((zget($resolutionGroups, 'fixed', 0) + zget($resolutionGroups, 'postponed', 0)) / $resolvedBugs * 100, 2);
|
||||
$bugInfo['bugCreateByCaseRate'] = empty($byCaseNum) ? 0 : round($byCaseNum / count($foundBugs) * 100, 2);
|
||||
$bugInfo['bugStageGroups'] = $stageGroups;
|
||||
$bugInfo['bugHandleGroups'] = $handleGroups;
|
||||
|
||||
$this->app->loadLang('bug');
|
||||
$users = $this->loadModel('user')->getPairs('noclosed|noletter|nodeleted');
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
<?php foreach($bugInfo as $infoKey => $infoValue):?>
|
||||
<tr>
|
||||
<td class='text-top'>
|
||||
<table class='table table-condensed table-report' id='bugSeverityGroups'>
|
||||
<table class='table table-condensed table-report' id='bugStageGroups'>
|
||||
<?php if(empty($infoValue)):?>
|
||||
<tr>
|
||||
<td class='none-data'>
|
||||
@@ -56,6 +56,85 @@
|
||||
<?php echo $lang->testreport->none;?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php elseif($infoKey == 'bugStageGroups'):?>
|
||||
<tr class='text-top'>
|
||||
<td class='w-p70'>
|
||||
<div class='chart-wrapper text-center'>
|
||||
<h5><?php echo $lang->testreport->$infoKey?></h5>
|
||||
<div class='chart-canvas'>
|
||||
<?php if(isset($_POST["chart-{$infoKey}"])):?>
|
||||
<img src='<?php echo strip_tags($_POST["chart-{$infoKey}"])?>' />
|
||||
<?php else:?>
|
||||
<canvas id='chart-<?php echo $infoKey?>' width='90' height='20' data-responsive='true'></canvas>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td class='text-top'>
|
||||
<div class='table-wrapper' style='overflow:auto'>
|
||||
<table class='table table-condensed table-hover table-striped table-bordered' data-chart='bar' data-target='#chart-<?php echo $infoKey?>' data-animation='false'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class='w-60px'><?php echo $lang->bug->pri;?></th>
|
||||
<th class='w-80px'><?php echo $lang->testreport->bugStageList['generated'];?></th>
|
||||
<th class='w-80px'><?php echo $lang->testreport->bugStageList['legacy'];?></th>
|
||||
<th class='w-80px'><?php echo $lang->testreport->bugStageList['resolved'];?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<?php foreach($lang->bug->priList as $key => $value):?>
|
||||
<tr class='text-center'>
|
||||
<td class='chart-color w-20px'><i class="chart-color-dot pri-<?php echo $key;?>"></i> <?php echo $key == 0 ? $lang->null : $value;?></td>
|
||||
<td class='chart-value'><?php echo $infoValue[$key]['generated'];?></td>
|
||||
<td class='chart-value'><?php echo $infoValue[$key]['legacy'];?></td>
|
||||
<td class='chart-value'><?php echo $infoValue[$key]['resolved'];?></td>
|
||||
</tr>
|
||||
<?php endforeach?>
|
||||
</table>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<?php elseif($infoKey == 'bugHandleGroups'):?>
|
||||
<tr class='text-top'>
|
||||
<td class='w-p70'>
|
||||
<div class='chart-wrapper text-center'>
|
||||
<h5><?php echo $lang->testreport->$infoKey?></h5>
|
||||
<div class='chart-canvas'>
|
||||
<?php if(isset($_POST["chart-{$infoKey}"])):?>
|
||||
<img src='<?php echo strip_tags($_POST["chart-{$infoKey}"])?>' />
|
||||
<?php else:?>
|
||||
<canvas id='chart-<?php echo $infoKey?>' width='90' height='20' data-responsive='true'></canvas>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td class='text-top'>
|
||||
<div class='table-wrapper' style='overflow:auto'>
|
||||
<table class='table table-condensed table-hover table-striped table-bordered' data-chart='line' data-target='#chart-<?php echo $infoKey?>' data-animation='false'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class='w-40px'><?php echo $lang->testreport->date;?></th>
|
||||
<th class='w-80px'><i class='chart-color-dot generated'></i> <?php echo $lang->testreport->bugStageList['generated'];?></th>
|
||||
<th class='w-80px'><i class='chart-color-dot legacy'></i> <?php echo $lang->testreport->bugStageList['legacy'];?></th>
|
||||
<th class='w-80px'><i class='chart-color-dot resolved'></i> <?php echo $lang->testreport->bugStageList['resolved'];?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<?php
|
||||
$beginTime = isset($report->begin) ? strtotime($report->begin) : strtotime($begin);
|
||||
$endTime = isset($report->end) ? strtotime($report->end) : strtotime($end);
|
||||
?>
|
||||
<?php for($time = $beginTime; $time <= $endTime; $time += 86400):?>
|
||||
<?php $date = date('m-d', $time);?>
|
||||
<tr class='text-center'>
|
||||
<td class='chart-value'><?php echo $date?></td>
|
||||
<td class='chart-value'><?php echo $infoValue['generated'][$date];?></td>
|
||||
<td class='chart-value'><?php echo $infoValue['legacy'][$date];?></td>
|
||||
<td class='chart-value'><?php echo $infoValue['resolved'][$date];?></td>
|
||||
</tr>
|
||||
<?php endfor?>
|
||||
</table>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<?php else:?>
|
||||
<?php $sum = 0; foreach($infoValue as $value) $sum += $value->value;?>
|
||||
<tr class='text-top'>
|
||||
@@ -115,3 +194,54 @@
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
</table>
|
||||
<?php js::set('bugStageList', $lang->testreport->bugStageList);?>
|
||||
<?php js::set('bugStageValueList', array_values($lang->testreport->bugStageList));?>
|
||||
<?php js::set('bugPriList', $lang->bug->priList);?>
|
||||
<?php js::set('zeroPri', $lang->null);?>
|
||||
<?php js::set('bugStageGroups', $bugInfo['bugStageGroups']);?>
|
||||
<?php js::set('bugHandleGroups', $bugInfo['bugHandleGroups']);?>
|
||||
<?php js::set('dateGroups', array_keys($bugInfo['bugHandleGroups']['generated']));?>
|
||||
<script>
|
||||
var priList = [];
|
||||
var stageList = [];
|
||||
var colorList = ['#d5d9df', '#d50000', '#ff9800', '#2098ee', '#009688'];
|
||||
var colorKey = 0;
|
||||
for(var key in bugPriList)
|
||||
{
|
||||
$('.pri-' + key).css('background', colorList[colorKey]);
|
||||
var priName = key == 0 ? zeroPri : bugPriList[key];
|
||||
var pri = {
|
||||
label: priName,
|
||||
color: colorList[colorKey],
|
||||
data: [bugStageGroups[key]['generated'], bugStageGroups[key]['legacy'], bugStageGroups[key]['resolved']]
|
||||
}
|
||||
priList.push(pri);
|
||||
colorKey++;
|
||||
if(colorKey >= 5) colorKey -= 5;
|
||||
}
|
||||
var data = {
|
||||
labels: bugStageValueList,
|
||||
datasets: priList,
|
||||
};
|
||||
var options = {responsive: true};
|
||||
var bugStageGroups = $('#chart-bugStageGroups').barChart(data, options);
|
||||
|
||||
colorKey = 2;
|
||||
for(var key in bugHandleGroups)
|
||||
{
|
||||
$('.' + key).css('background', colorList[colorKey]);
|
||||
var stageName = bugStageList[key];
|
||||
var stage = {
|
||||
label: stageName,
|
||||
color: colorList[colorKey],
|
||||
data: bugHandleGroups[key]
|
||||
}
|
||||
stageList.push(stage);
|
||||
colorKey++;
|
||||
}
|
||||
var data = {
|
||||
labels: dateGroups,
|
||||
datasets: stageList,
|
||||
};
|
||||
var bugHandleGroups = $('#chart-bugHandleGroups').lineChart(data, options);
|
||||
</script>
|
||||
|
||||
@@ -176,6 +176,8 @@ $lang->testtask->report->charts['bugOpenedByGroups'] = 'Bugersteller Bericht'
|
||||
$lang->testtask->report->charts['bugResolvedByGroups'] = 'Gelöst von Bericht';
|
||||
$lang->testtask->report->charts['bugResolutionGroups'] = 'Lösungsbersicht';
|
||||
$lang->testtask->report->charts['bugModuleGroups'] = 'Bug Modul Bericht';
|
||||
$lang->testtask->report->charts['bugStageGroups'] = 'Bug importance stage distribution';
|
||||
$lang->testtask->report->charts['bugHandleGroups'] = 'Distribution of daily bug processing';
|
||||
|
||||
$lang->testtask->report->options = new stdclass();
|
||||
$lang->testtask->report->options->graph = new stdclass();
|
||||
|
||||
@@ -179,6 +179,8 @@ $lang->testtask->report->charts['bugOpenedByGroups'] = 'Bug ReportedBy Distri
|
||||
$lang->testtask->report->charts['bugResolvedByGroups'] = 'Bug ResolvedBy Distribution';
|
||||
$lang->testtask->report->charts['bugResolutionGroups'] = 'Bug Resolution Distribution';
|
||||
$lang->testtask->report->charts['bugModuleGroups'] = 'Bug Module Distribution';
|
||||
$lang->testtask->report->charts['bugStageGroups'] = 'Bug importance stage distribution';
|
||||
$lang->testtask->report->charts['bugHandleGroups'] = 'Distribution of daily bug processing';
|
||||
|
||||
$lang->testtask->report->options = new stdclass();
|
||||
$lang->testtask->report->options->graph = new stdclass();
|
||||
|
||||
@@ -176,6 +176,8 @@ $lang->testtask->report->charts['bugOpenedByGroups'] = 'Distribution signalem
|
||||
$lang->testtask->report->charts['bugResolvedByGroups'] = 'Distribution Résolus par';
|
||||
$lang->testtask->report->charts['bugResolutionGroups'] = 'Distribution Résolution';
|
||||
$lang->testtask->report->charts['bugModuleGroups'] = 'Distribution Bug Module';
|
||||
$lang->testtask->report->charts['bugStageGroups'] = 'Bug importance stage distribution';
|
||||
$lang->testtask->report->charts['bugHandleGroups'] = 'Distribution of daily bug processing';
|
||||
|
||||
$lang->testtask->report->options = new stdclass();
|
||||
$lang->testtask->report->options->graph = new stdclass();
|
||||
|
||||
@@ -176,6 +176,8 @@ $lang->testtask->report->charts['bugOpenedByGroups'] = 'Phân chia người b
|
||||
$lang->testtask->report->charts['bugResolvedByGroups'] = 'Phân chia người giải quyết Bug';
|
||||
$lang->testtask->report->charts['bugResolutionGroups'] = 'Phân chia giải pháp Bug';
|
||||
$lang->testtask->report->charts['bugModuleGroups'] = 'Phân chia Module Bug';
|
||||
$lang->testtask->report->charts['bugStageGroups'] = 'Bug importance stage distribution';
|
||||
$lang->testtask->report->charts['bugHandleGroups'] = 'Distribution of daily bug processing';
|
||||
|
||||
$lang->testtask->report->options = new stdclass();
|
||||
$lang->testtask->report->options->graph = new stdclass();
|
||||
|
||||
@@ -179,6 +179,8 @@ $lang->testtask->report->charts['bugOpenedByGroups'] = 'Bug创建者分布';
|
||||
$lang->testtask->report->charts['bugResolvedByGroups'] = 'Bug解决者分布';
|
||||
$lang->testtask->report->charts['bugResolutionGroups'] = 'Bug解决方案分布';
|
||||
$lang->testtask->report->charts['bugModuleGroups'] = 'Bug模块分布';
|
||||
$lang->testtask->report->charts['bugStageGroups'] = 'Bug重要程度阶段分布';
|
||||
$lang->testtask->report->charts['bugHandleGroups'] = 'Bug每日处理情况分布';
|
||||
|
||||
$lang->testtask->report->options = new stdclass();
|
||||
$lang->testtask->report->options->graph = new stdclass();
|
||||
|
||||
Reference in New Issue
Block a user