2023-05-16 10:47:08 +08:00

827 lines
33 KiB
PHP

<?php
/**
* The model file of redmine convert of ZenTaoPMS.
*
* @copyright Copyright 2009-2015 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.cnezsoft.com)
* @license ZPL(http://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
* @author Yangyang Shi <shiyangyang@cnezsoft.com>
* @package convert
* @version $Id $
* @link http://www.zentao.net
*/
class redmine11ConvertModel extends redmineConvertModel
{
static $convertGroupCount = 0;
static $convertUserCount = 0;
static $convertProductCount = 0;
static $convertExecutionCount = 0;
static $convertStoryCount = 0;
static $convertTaskCount = 0;
static $convertBugCount = 0;
static $convertProductPlanCount = 0;
static $convertTeamCount = 0;
static $convertReleaseCount = 0;
static $convertBuildCount = 0;
static $convertDocLibCount = 0;
static $convertDocCount = 0;
static $convertFileCount = 0;
public $issueType;
public function __construct($issueType)
{
parent::__construct();
$this->issueType = $issueType;
}
/**
* Execute the converter.
*
* @access public
* @return array
*/
public function execute($version)
{
$this->clear();
$this->setTable();
$this->convertGroup();
$this->convertUser();
$this->convertUserGroup();
$this->convertProduct();
$this->convertExecution();
$this->convertBuildAndRelease();
$this->convertProductPlan();
$this->convertExecutionProduct();
$this->convertTeam();
$this->convertDocLib();
$this->convertDoc();
$this->convertNews();
$this->convertIssue();
$this->convertFile();
$this->dao->dbh($this->dbh);
$this->loadModel('tree')->fixModulePath();
$result['groups'] = self::$convertGroupCount;
$result['users'] = self::$convertUserCount ;
$result['products'] = self::$convertProductCount ;
$result['executions'] = self::$convertExecutionCount ;
$result['stories'] = self::$convertStoryCount;
$result['tasks'] = self::$convertTaskCount ;
$result['bugs'] = self::$convertBugCount ;
$result['productPlans'] = self::$convertProductPlanCount;
$result['teams'] = self::$convertTeamCount;
$result['releases'] = self::$convertReleaseCount;
$result['builds'] = self::$convertBuildCount;
$result['docLibs'] = self::$convertDocLibCount ;
$result['docs'] = self::$convertDocCount;
$result['files'] = self::$convertFileCount;
return $result;
}
/**
* Set table names.
*
* @access public
* @return void
*/
public function setTable()
{
//$dbPrefix = $this->post->dbPrefix;
$dbPrefix = '';
define('REDMINE_TABLE_ATTACHMENTS', $dbPrefix . 'attachments');
define('REDMINE_TABLE_AUTH_SOURCES', $dbPrefix . 'auth_sources');
define('REDMINE_TABLE_BOARDS', $dbPrefix . 'boards');
define('REDMINE_TABLE_CHANGES', $dbPrefix . 'changes');
define('REDMINE_TABLE_CHANGESETS', $dbPrefix . 'changesets');
define('REDMINE_TABLE_CHANGESETS_ISSUES', $dbPrefix . 'changesets_issues');
define('REDMINE_TABLE_COMMENTS', $dbPrefix . 'comments');
define('REDMINE_TABLE_CUSTOM_FIELDS', $dbPrefix . 'custom_fields');
define('REDMINE_TABLE_CUSTOM_FIELDS_EXECUTIONS', $dbPrefix . 'custom_fields_executions');
define('REDMINE_TABLE_CUSTOM_FIELDS_TRACKERS', $dbPrefix . 'custom_fields_trackers');
define('REDMINE_TABLE_CUSTOM_VALUES', $dbPrefix . 'custom_values');
define('REDMINE_TABLE_DOCUMENTS', $dbPrefix . 'documents');
define('REDMINE_TABLE_ENABLED_MODULES', $dbPrefix . 'enabled_modules');
define('REDMINE_TABLE_ENUMERATIONS', $dbPrefix . 'enumerations');
define('REDMINE_TABLE_GROUPS_USERS', $dbPrefix . 'groups_users');
define('REDMINE_TABLE_ISSUES', $dbPrefix . 'issues');
define('REDMINE_TABLE_ISSUE_CATEGORIES', $dbPrefix . 'issue_categories');
define('REDMINE_TABLE_ISSUE_RELATIONS', $dbPrefix . 'issue_relations');
define('REDMINE_TABLE_ISSUE_STATUSES', $dbPrefix . 'issue_statuses');
define('REDMINE_TABLE_JOURNALS', $dbPrefix . 'journals');
define('REDMINE_TABLE_JOURNAL_DETAILS', $dbPrefix . 'journal_details');
define('REDMINE_TABLE_MEMBERS', $dbPrefix . 'members');
define('REDMINE_TABLE_MEMBER_ROLES', $dbPrefix . 'member_roles');
define('REDMINE_TABLE_MESSAGES', $dbPrefix . 'messages');
define('REDMINE_TABLE_NEWS', $dbPrefix . 'news');
define('REDMINE_TABLE_OPEN_ID_AUTHENTICATION_ASSOCIATIONS', $dbPrefix . 'open_id_authentication_associations');
define('REDMINE_TABLE_OPEN_ID_AUTHENTICATION_NONCES', $dbPrefix . 'open_id_authentication_nonces');
define('REDMINE_TABLE_EXECUTIONS', $dbPrefix . 'executions');
define('REDMINE_TABLE_EXECUTIONS_TRACKERS', $dbPrefix . 'executions_trackers');
define('REDMINE_TABLE_QUERIES', $dbPrefix . 'queries');
define('REDMINE_TABLE_REPOSITORIES', $dbPrefix . 'repositories');
define('REDMINE_TABLE_ROLES', $dbPrefix . 'roles');
define('REDMINE_TABLE_SCHEMA_MIGRATIONS', $dbPrefix . 'schema_migrations');
define('REDMINE_TABLE_SETTINGS', $dbPrefix . 'settings');
define('REDMINE_TABLE_TIME_ENTRIES', $dbPrefix . 'time_entries');
define('REDMINE_TABLE_TOKENS', $dbPrefix . 'tokens');
define('REDMINE_TABLE_TRACKERS', $dbPrefix . 'trackers');
define('REDMINE_TABLE_USERS', $dbPrefix . 'users');
define('REDMINE_TABLE_USER_PREFERENCES', $dbPrefix . 'user_preferences');
define('REDMINE_TABLE_VERSIONS', $dbPrefix . 'versions');
define('REDMINE_TABLE_WATCHERS', $dbPrefix . 'watchers');
define('REDMINE_TABLE_WIKIS', $dbPrefix . 'wikis');
define('REDMINE_TABLE_WIKI_CONTENTS', $dbPrefix . 'wiki_contents');
define('REDMINE_TABLE_WIKI_CONTENT_VERSIONS', $dbPrefix . 'wiki_content_versions');
define('REDMINE_TABLE_WIKI_PAGES', $dbPrefix . 'wiki_pages');
define('REDMINE_TABLE_WIKI_REDIRECTS', $dbPrefix . 'wiki_redirects');
define('REDMINE_TABLE_WORKFLOWS', $dbPrefix . 'workflows');
}
/**
* Convert groups.
*
* @access public
* @return void
*/
public function convertGroup()
{
/* Get group list */
$groups = $this->dao->dbh($this->sourceDBH)
->select("id, lastName AS name")
->from(REDMINE_TABLE_USERS)
->where('type')->eq('Group')
->fetchAll('id');
$zentaoGroupNames = $this->dao->dbh($this->dbh)->select('id, name')->from(TABLE_GROUP)->fetchPairs();
$zentaoGroupIDs = $this->dao->dbh($this->dbh)->select('name, id')->from(TABLE_GROUP)->fetchPairs();
/* Insert into zentao */
$convertCount = 0;
foreach($groups as $groupID =>$group)
{
unset($group->id);
if(in_array("$group->name", $zentaoGroupNames))
{
self::$info['groups'][] = sprintf($this->lang->convert->errorGroupExists, $group->name);
$this->map['groups'][$groupID] = $zentaoGroupIDs[$group->name];
}
else
{
$this->dao->dbh($this->dbh)->insert(TABLE_GROUP)
->data($group)->exec();
$this->map['groups'][$groupID] = $this->dao->lastInsertID();
$convertCount ++;
}
}
self::$convertGroupCount += $convertCount;
}
/**
* Convert users.
*
* @access public
* @return void
*/
public function convertUser()
{
/* Get user list. */
$users = $this->dao->dbh($this->sourceDBH)
->select("id, login AS account, firstname, lastname, mail as email")
->from(REDMINE_TABLE_USERS)
->where('type')->eq('User')
->fetchAll('id');
$zentaoUserNames = $this->dao->dbh($this->dbh)->select('id, account')->from(TABLE_USER)->fetchPairs();
$zentaoUserIDs = $this->dao->dbh($this->dbh)->select('account, id')->from(TABLE_USER)->fetchPairs();
/* Insert into zentao. */
$convertCount = 0;
foreach($users as $id => $user)
{
if(in_array("$user->account", $zentaoUserNames))
{
self::$info['users'][] = sprintf($this->lang->convert->errorUserExists, $user->account);
$this->map['users'][$id] = $zentaoUserIDs[$user->account];
}
else
{
$user->password = md5('123456');
$user->realname = $user->lastname . $user->firstname;
unset($user->id);
unset($user->lastname);
unset($user->firstname);
$this->dao->dbh($this->dbh)->insert(TABLE_USER)->data($user)->exec();
$this->map['users'][$id] = $this->dao->lastInsertID();
$convertCount ++;
}
}
self::$convertUserCount += $convertCount;
}
/**
* convert relationship between user and group.
*
* @access public
* @return void
*/
public function convertUserGroup()
{
$this->map['groups'][0] = 0;
/* Get relation between user and group list. */
$userGroups = $this->dao->dbh($this->sourceDBH)
->select("t1.group_id, t2.login as account")
->from(REDMINE_TABLE_GROUPS_USERS)->alias('t1')
->leftJoin(REDMINE_TABLE_USERS)->alias('t2')->on('t1.user_id = t2.id')
->fetchAll();
$zentaoUserGroups = $this->dao->dbh($this->dbh)->select('*')->from(TABLE_USERGROUP)->fetchAll();
/* Insert into zentao. */
$userGroupExist = false;
foreach($userGroups as $userGroup)
{
$userGroup->group = $this->map['groups'][$userGroup->group_id];
unset($userGroup->group_id);
foreach($zentaoUserGroups as $zentaoUserGroup)
{
if($userGroup->group == $zentaoUserGroup->group and $userGroup->account == $zentaoUserGroup->account)
{
$userGroupExist = true;
}
}
if($userGroupExist == false)
{
$this->dao->dbh($this->dbh)->insert(TABLE_USERGROUP)->data($userGroup)->exec();
}
}
}
/**
* convert products.
*
* @access public
* @return void
*/
public function convertProduct()
{
/* Get product list */
$products = $this->dao->dbh($this->sourceDBH)
->select("id, name, description as `desc`, created_on as createdDate")
->from(REDMINE_TABLE_EXECUTIONS)
->fetchAll('id');
/* Insert into zentao */
foreach($products as $productID => $product)
{
unset($product->id);
$this->dao->dbh($this->dbh)->insert(TABLE_PRODUCT)->data($product)->exec();
$this->map['products'][$productID] = $this->dao->lastInsertID();
}
self::$convertProductCount += count($products);
}
/**
* Convert executions.
*
* @access public
* @return void
*/
public function convertExecution()
{
/* Get execution list */
$executions = $this->dao->dbh($this->sourceDBH)
->select("id, name, execution_id, description as `desc`, effective_date AS end")
->from(REDMINE_TABLE_VERSIONS)
->fetchAll('id');
/* Insert into zentao */
foreach($executions as $executionID => $execution)
{
$productID = $execution->execution_id;
unset($execution->id);
unset($execution->execution_id);
$this->dao->dbh($this->dbh)->insert(TABLE_execution)->data($execution)->exec();
$this->map['executions'][$productID][$executionID] = $this->dao->lastInsertID();
$this->map['execution'][$executionID] = $this->map['executions'][$productID][$executionID];
}
/* Create a same name execution with product */
foreach($this->map['products'] as $productID)
{
$execution = $this->dao->dbh($this->dbh)->select('name')->from(TABLE_PRODUCT)->where('id')->eq($productID)->fetch();
$this->dao->dbh($this->dbh)->insert(TABLE_execution)->data($execution)->exec();
$this->map['executionOfProduct'][$productID] = $this->dao->lastinsertID();
}
$convertCount = count($executions) + count($this->map['executionOfProduct']);
self::$convertexecutionCount += $convertCount;
}
/**
* convert builds and releases
*
* @access public
* @return void
*/
public function convertBuildAndRelease()
{
/* Get build list */
$buildAndReleases = $this->dao->dbh($this->sourceDBH)
->select("id, name, execution_id, description as `desc`, effective_date AS date")
->from(REDMINE_TABLE_VERSIONS)
->fetchAll('id');
/* Insert into zentao */
$convertBuildsCount = 0;
$convertReleasesCount = 0;
$zentaoBuildNames = $this->dao->dbh($this->dbh)->select('id, name')->from(TABLE_BUILD)->fetchPairs();
$zentaoBuildIDs = $this->dao->dbh($this->dbh)->select('name, id')->from(TABLE_BUILD)->fetchPairs();
$zentaoReleaseNames = $this->dao->dbh($this->dbh)->select('id, name')->from(TABLE_RELEASE)->fetchPairs();
$zentaoReleaseIDs = $this->dao->dbh($this->dbh)->select('name, id')->from(TABLE_RELEASE)->fetchPairs();
foreach($buildAndReleases as $id => $buildAndRelease)
{
$buildAndRelease->execution = $this->map['execution'][$id];
$buildAndRelease->product = $this->map['products'][$buildAndRelease->execution_id];
unset($buildAndRelease->id);
unset($buildAndRelease->execution_id);
if(in_array($buildAndRelease->name, $zentaoBuildNames))
{
self::$info['builds'][] = sprintf($this->lang->convert->errorBuildExists, $buildAndRelease->name);
$buildAndRelease->build = $zentaoBuildIDs[$buildAndRelease->name];
}
else
{
$this->dao->dbh($this->dbh)->insert(TABLE_BUILD)->data($buildAndRelease)->exec();
$buildAndRelease->build = $this->dao->lastInsertID();
$convertBuildsCount ++;
}
unset($buildAndRelease->execution);
if(in_array($buildAndRelease->name, $zentaoBuildNames))
{
self::$info['releases'][] = sprintf($this->lang->convert->errorReleaseExists, $buildAndRelease->name);
}
else
{
$this->dao->dbh($this->dbh)->insert(TABLE_RELEASE)->data($buildAndRelease)->exec();
$convertReleasesCount ++;
}
}
self::$convertBuildCount += $convertBuildsCount;
self::$convertReleaseCount += $convertReleasesCount;
}
/**
* convert productPlans
*
* @access public
* @return void
*/
public function convertProductPlan()
{
/* Get productPlan list */
$productPlans = $this->dao->dbh($this->sourceDBH)
->select("id, name as title, execution_id, description as `desc`, effective_date as end, created_on AS begin")
->from(REDMINE_TABLE_VERSIONS)
->fetchAll('id');
/* Insert into zentao */
foreach($productPlans as $id => $productPlan)
{
$productPlan->product = $this->map['products'][$productPlan->execution_id];
$productPlan->createdBy = $this->app->user->account;
$productPlan->createdDate = helper::now();
unset($productPlan->id);
unset($productPlan->execution_id);
$this->dao->dbh($this->dbh)->insert(TABLE_PRODUCTPLAN)->data($productPlan)->exec();
}
/* Create a same plan with product */
foreach($this->map['products'] as $productID)
{
$productPlan = $this->dao->dbh($this->dbh)->select("name as title, createdDate as begin")->from(TABLE_PRODUCT)->where('id')->eq($productID)->fetch();
$productPlan->product = $productID;
$productPlan->createdBy = $this->app->user->account;
$productPlan->createdDate = helper::now();
$this->dao->dbh($this->dbh)->insert(TABLE_PRODUCTPLAN)->data($productPlan)->exec();
$this->map['planOfProduct'][$productID] = $this->dao->lastinsertID();
}
$convertCount = count($this->map['products']) + count($productPlans);
self::$convertProductPlanCount += $convertCount;
}
/**
* convert relationship between execution and product.
*
* @access public
* @return void
*/
public function convertExecutionProduct()
{
foreach($this->map['executions'] as $productID => $executions)
{
foreach($executions as $executionID => $execution)
{
$this->dao->dbh($this->dbh)->insert(TABLE_PROJECTPRODUCT)
->set('project')->eq($execution)
->set('product')->eq($this->map['products'][$productID])
->exec();
}
}
}
/**
* convert teams.
*
* @access public
* @return void
*/
public function convertTeam()
{
/* Get team list */
$teams = $this->dao->dbh($this->sourceDBH)
->select("t2.login as account, t1.execution_id, t1.created_on AS joinDate")
->from(REDMINE_TABLE_MEMBERS)->alias('t1')
->leftJoin(REDMINE_TABLE_USERS)->alias('t2')->on('t1.user_id = t2.id')
->where('t2.type')->eq('User')
->fetchAll();
/* Insert into zentao */
foreach($teams as $team)
{
$productID = $team->execution_id;
unset($team->execution_id);
foreach($this->map['executions'][$productID] as $executionID)
{
$team->execution = $executionID;
$this->dao->dbh($this->dbh)->insert(TABLE_TEAM)->data($team)->exec();
}
}
self::$convertTeamCount += count($teams);
}
/**
* convert docLibs.
*
* @access public
* @return void
*/
public function convertDocLib()
{
/* Get docLib list */
$docLibs = $this->dao->dbh($this->sourceDBH)
->select("id, name")->from(REDMINE_TABLE_ENUMERATIONS)
->where('type')->eq('DocumentCategory')
->fetchAll('id');
/* Insert into zentao */
foreach($docLibs as $docLibID => $docLib)
{
unset($docLib->id);
$this->dao->dbh($this->dbh)->insert(TABLE_DOCLIB)->data($docLib)->exec();
$this->map['docLibs'][$docLibID] = $this->dao->lastInsertID();
}
self::$convertDocLibCount += count($docLibs);
}
/**
* convert docs.
*
* @access public
* @return void
*/
public function convertDoc()
{
/* Get all docs */
$docs = $this->dao->dbh($this->sourceDBH)
->select("t1.id, t1.execution_id AS product, t2.id AS lib, t1.title, t1.description AS content, t1.created_on AS addedDate")
->from(REDMINE_TABLE_DOCUMENTS)->alias('t1')
->leftjoin(REDMINE_TABLE_ENUMERATIONS)->alias('t2')->on('t1.category_id = t2.id')
->fetchAll('id');
/* Insert into zentao */
foreach($docs as $docID => $doc)
{
unset($doc->id);
$doc->type = 'text';
$doc->execution = 0;
$doc->product = $this->map['products'][$doc->product];
$doc->lib = $this->map['docLibs'][$doc->lib];
$this->dao->dbh($this->dbh)->insert(TABLE_DOC)->data($doc)->exec();
$this->map['docs'][$docID] = $this->dao->lastInsertID();
}
self::$convertDocCount += count($docs);
}
/**
* convert news.
*
* @access public
* @return void
*/
public function convertNews()
{
/* Get news from redmine */
$news = $this->dao->dbh($this->sourceDBH)
->select("t1.execution_id as product, t1.title, t1.summary as digest, t1.description as content, t2.login as addedBy, t1.created_on as addedDate")
->from(REDMINE_TABLE_NEWS)->alias('t1')
->leftJoin(REDMINE_TABLE_USERS)->alias('t2')->on('t1.author_id = t2.id')
->fetchAll();
/* Create a news docLib */
$newLib->name = 'news';
$this->dao->dbh($this->dbh)->insert(TABLE_DOCLIB)->data($newLib)->exec();
$this->map['news'] = $this->dao->lastInsertID();
self::$convertDocLibCount += 1;
/* Insert into zentao */
foreach($news as $new)
{
$new->product = $this->map['products'][$new->product];
$new->execution = 0;
$new->lib = $this->map['news'];
$new->type = 'text';
$this->dao->dbh($this->dbh)->insert(TABLE_DOC)->data($new)->exec();
}
self::$convertDocCount += count($news);
}
/**
* convert issue
*
* @param array $aimTypes //aimTypes['issueTypeID'] = aimtype eg. aimTypes[1] = 'bug';
* @param array $statusTypes //statusTypes['task']['statusTypeID'] = statusType eg. statusTypes['task'][1] = 'wait';
* //statusTypes['bug']['statusTypeID'] = statusType eg. statusTypes['bug'][1] = 'active';
* @param array $priTypes //priTypes['task']['priTypeID'] = priType; eg. priTypes['task'][1] = 1;
* @access public
* @return void
*/
public function convertIssue()
{
$aimTypes = $this->issueType->aimTypes;
$statusTypes = $this->issueType->statusTypes;
$priTypes = $this->issueType->priTypes;
foreach($aimTypes as $issueType => $aimType)
{
if('story' == $aimType)
{
$this->convertStory($issueType, $statusTypes, $priTypes);
}
elseif('task' == $aimType)
{
$this->convertTask($issueType, $statusTypes, $priTypes);
}
else
{
$this->convertBug($issueType, $statusTypes, $priTypes);
}
}
}
/**
* convert story
*
* @param array $issueType
* @param array $statusTypes
* @param array $priTypes
* @access public
* @return void
*/
public function convertStory($issueType, $statusTypes, $priTypes)
{
/* Get story list*/
$stories = $this->dao->dbh($this->sourceDBH)
->select("t1.id, t1.execution_id as product, t1.subject as title, t1.description as spec, t1.status_id as status, t2.login as assignedTo, t1.priority_id as pri, t3.login as openedBy, t1.created_on as openedDate, t1.estimated_hours as estimate, t1.updated_on as lastEditedDate")
->from(REDMINE_TABLE_ISSUES)->alias('t1')
->leftJoin(REDMINE_TABLE_USERS)->alias('t2')->on('t1.assigned_to_id = t2.id')
->leftJoin(REDMINE_TABLE_USERS)->alias('t3')->on('t1.author_id = t3.id')
->where('t1.tracker_id')->eq($issueType)
->fetchAll('id');
/* Insert into zentao */
foreach($stories as $issueID => $story)
{
$storySpec->title = $story->title;
$storySpec->spec = $story->spec;
unset($story->id);
unset($story->spec);
/* Insert story into table story */
$story->product = $this->map['products'][$story->product];
$story->module = 0;
$story->plan = $this->map['planOfProduct'][$story->product];
$story->fromBug = 0;
$story->pri = $priTypes['story'][$story->pri];
$story->status = $statusTypes['story'][$story->status];
$story->toBug = 0;
$story->duplicateStory = 0;
$this->dao->dbh($this->dbh)->insert(TABLE_STORY)->data($story)->exec();
$this->map['issueID'][$issueID] = $this->dao->lastInsertID();
$this->map['issueType'][$issueID] = 'story';
/* Insert data into table storySpec */
$storySpec->story = $this->map['issueID'][$issueID];
$storySpec->version = 1;
$this->dao->dbh($this->dbh)->insert(TABLE_STORYSPEC)->data($storySpec)->exec();
}
self::$convertStoryCount += count($stories);
}
/**
* convert task
*
* @param array $issueType
* @param array $statusTypes
* @param array $priTypes
* @access public
* @return void
*/
public function convertTask($issueType, $statusTypes, $priTypes)
{
/* Get task list */
$tasks = $this->dao->dbh($this->sourceDBH)
->select("t1.id, t1.execution_id as product, t1.fixed_version_id as execution, t1.subject as name, t1.description as `desc`, t1.due_date as deadline, t1.status_id as status, t2.login as assignedTo, t1.priority_id as pri, t3.login as openedBy, t1.created_on as openedDate, t1.estimated_hours as estimate, t1.updated_on as lastEditedDate")
->from(REDMINE_TABLE_ISSUES)->alias('t1')
->leftJoin(REDMINE_TABLE_USERS)->alias('t2')->on('t1.assigned_to_id = t2.id')
->leftJoin(REDMINE_TABLE_USERS)->alias('t3')->on('t1.author_id = t3.id')
->where('t1.tracker_id')->eq($issueType)
->fetchAll('id');
/* Insert into zentao */
foreach($tasks as $issueID => $task)
{
$task->story = 0;
$task->storyVersion = 0;
$task->type = 'misc';
$task->pri = $priTypes['task'][$task->pri];
$task->status = $statusTypes['task'][$task->status];
if($task->execution == 0)
{
$task->execution = $this->map['executionOfProduct'][$task->product];
}
else
{
$task->execution = $this->map['execution'][$task->execution];
}
unset($task->id);
unset($task->product);
$this->dao->dbh($this->dbh)->insert(TABLE_TASK)->data($task)->exec();
$this->map['issueID'][$issueID] = $this->dao->lastInsertID();
$this->map['issueType'][$issueID] = 'task';
}
self::$convertTaskCount += count($tasks);
}
/**
* convert bug
*
* @param array $issueType
* @param array $statusTypes
* @param array $priTypes
* @access public
* @return void
*/
public function convertBug($issueType, $statusTypes, $priTypes)
{
/* Get bug list */
$bugs = $this->dao->dbh($this->sourceDBH)
->select("t1.id, t1.execution_id as product, t1.fixed_version_id execution, t1.subject as title, t1.description as steps, t1.status_id as status, t2.login as assignedTo, t1.priority_id as pri, t3.login as openedBy, t1.created_on as openedDate, t1.updated_on as lastEditedDate")
->from(REDMINE_TABLE_ISSUES)->alias('t1')
->leftJoin(REDMINE_TABLE_USERS)->alias('t2')->on('t1.assigned_to_id = t2.id')
->leftJoin(REDMINE_TABLE_USERS)->alias('t3')->on('t1.author_id = t3.id')
->where('t1.tracker_id')->eq($issueType)
->fetchAll('id');
/* Insert into zentao */
foreach($bugs as $issueID => $bug)
{
$bug->product = $this->map['products'][$bug->product];
$bug->module = 0;
$bug->story = 0;
$bug->storyVersion = 1;
$bug->task = 0;
$bug->severity = 3;
$bug->type = 'others';
$bug->status = $statusTypes['bug'][$bug->status];
$bug->openedBuild = 'trunk';
$bug->duplicateBug = 0;
$bug->case = 0;
$bug->caseVersion = 1;
$bug->result = 0;
if($bug->execution == 0)
{
$bug->execution = $this->map['executionOfProduct'][$bug->product];
}
else
{
$bug->execution = $this->map['execution'][$bug->execution];
}
unset($bug->id);
$this->dao->dbh($this->dbh)->insert(TABLE_BUG)->data($bug)->exec();
$this->map['issueID'][$issueID] = $this->dao->lastInsertID();
$this->map['issueType'][$issueID] = 'bug';
}
self::$convertBugCount += count($bugs);
}
/**
* Convert attachments.
*
* @access public
* @return void
*/
public function convertFile()
{
$this->setPath();
/* Get file list */
$files = $this->dao->dbh($this->sourceDBH)
->select('t1.id, t1.container_id as objectID, t1.container_type as objectType, t1.filename as title, t1.disk_filename as pathname, t1.filesize as size, t2.login as addedBy, t1.created_on as addedDate, description')
->from(REDMINE_TABLE_ATTACHMENTS)->alias('t1')
->leftJoin(REDMINE_TABLE_USERS)->alias('t2')->on('t1.author_id = t2.id')
->fetchAll('id');
/* Insert into zentao */
foreach($files as $fileID => $file)
{
if($file->description != '')
{
$file->title = $file->description;
unset($file->description);
}
else
{
unset($file->description);
}
/* Transform objectType and objectID */
if($file->objectType == 'Issue')
{
$file->objectType = $this->map['issueType'][$file->objectID];
$file->objectID = $this->map['issueID'][$file->objectID];
}
elseif($file->objectType == 'Document')
{
$file->objectType = 'doc' ;
$file->objectID = $this->map['docs'][$file->objectID];
}
elseif($file->objectType == 'WikiPage')
{
continue;
}
elseif($file->objectType == 'Version')
{
$doc->execution = $this->map['execution'][$file->objectID];
$doc = $this->dao->dbh($this->dbh)->select('product')->from(TABLE_PROJECTPRODUCT)->where('project')->eq($doc->execution)->fetch();
$doc->lib = 'execution';
$doc->module = 0;
$doc->title = $file->title;
$doc->type = 'file';
$doc->addedBy = $file->addedBy;
$doc->addedDate = $file->addedDate;
$this->dao->dbh($this->dbh)->insert(TABLE_DOC)->data($doc)->exec();
self::$convertDocCount += 1;
$file->objectType = 'doc';
$file->objectID = $this->dao->lastInsertID();
}
$pathname = pathinfo($file->pathname);
$file->extension = $pathname["extension"];
unset($file->id);
/* Insert into database. */
$this->dao->dbh($this->dbh)->insert(TABLE_FILE)->data($file)->exec();
/* Copy file. */
$soureFile = $this->filePath . $file->pathname;
if(!file_exists($soureFile))
{
self::$info['files'][] = sprintf($this->lang->convert->errorFileNotExits, $soureFile);
continue;
}
$targetFile = $this->app->getAppRoot() . "www/data/upload/{$this->app->company->id}/" . $file->pathname;
$targetPath = dirname($targetFile);
if(!is_dir($targetPath)) mkdir($targetPath, 0777, true);
if(!copy($soureFile, $targetFile))
{
self::$info['files'][] = sprintf($this->lang->convert->errorCopyFailed, $targetFile);
}
}
self::$convertFileCount += count($files);
}
/**
* Clear the converted records.
*
* @access public
* @return void
*/
public function clear()
{
foreach($this->session->state as $table => $maxID)
{
$this->dao->dbh($this->dbh)->delete()->from($table)->where('id')->gt($maxID)->exec();
}
}
}