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

319 lines
11 KiB
PHP

<?php
/**
* The model file of bugfree version 1 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 Chunsheng Wang <chunsheng@cnezsoft.com>
* @package convert
* @version $Id: bugfree1.php 5028 2013-07-06 02:59:41Z wyd621@gmail.com $
* @link http://www.zentao.net
*/
class bugfree1ConvertModel extends bugfreeConvertModel
{
/**
* Execute the convert.
*
* @access public
* @return array
*/
public function execute()
{
$this->clear();
$this->convertGroup();
$result['users'] = $this->convertUser();
$result['executions'] = $this->convertExecution();
$result['modules'] = $this->convertModule();
$result['bugs'] = $this->convertBug();
$result['actions'] = $this->convertAction();
$result['files'] = $this->convertFile();
$this->dao->dbh($this->dbh);
$this->loadModel('tree')->fixModulePath();
return $result;
}
/**
* Convert groups.
*
* @access public
* @return void
*/
public function convertGroup()
{
$groups = $this->dao->dbh($this->sourceDBH)
->select("groupID AS id, groupName AS name, groupUser AS users")
->from('BugGroup')
->fetchAll('id');
foreach($groups as $groupID => $group)
{
/* Explode into array. */
$groupUsers = explode(',', $group->users);
unset($group->id);
unset($group->users);
/* Insert the group. */
$this->dao->dbh($this->dbh)->insert(TABLE_GROUP)->data($group)->exec();
$zentaoGroupID = $this->dao->lastInsertId();
/* Insert account. */
foreach($groupUsers as $account)
{
if(empty($account)) continue;
$this->dao->dbh($this->dbh)->insert(TABLE_USERGROUP)->set('`group`')->eq($zentaoGroupID)->set('account')->eq($account)->exec();
}
}
}
/**
* Convert user.
*
* @access public
* @return int converted user count
*/
public function convertUser()
{
/* Get users exist in the system. */
$activeUsers = $this->dao
->dbh($this->sourceDBH)
->select("username AS account, userpassword AS password, realname, email")
->from('BugUser')
->orderBy('userID ASC')
->fetchAll('account');
/* Get users in histories. */
$allUsers = $this->dao->select("distinct(username) AS account")->from('BugHistory')->fetchPairs();
/* Merge them. */
foreach($allUsers as $key => $account)
{
if(isset($activeUsers[$account]))
{
$allUsers[$key] = $activeUsers[$account];
}
else
{
$allUsers[$key] = array('account' => $account, 'realname' => $account, 'deleted' => '1');
}
}
foreach($activeUsers as $account => $user) if(!isset($allUsers[$account])) $allUsers[$account] = $user;
/* Insert into zentao. */
$convertCount = 0;
foreach($allUsers as $account => $user)
{
if(!$this->dao->dbh($this->dbh)->findByAccount($account)->from(TABLE_USER)->fetch('account'))
{
$this->dao->dbh($this->dbh)->insert(TABLE_USER)->data($user)->exec();
$convertCount ++;
}
else
{
self::$info['users'][] = sprintf($this->lang->convert->errorUserExists, $account);
}
}
return $convertCount;
}
/**
* Convert execution in bugfree to product in zentao.
*
* @access public
* @return int converted execution count
*/
public function convertExecution()
{
$executions = $this->dao->dbh($this->sourceDBH)->select("executionID AS id, executionName AS name")->from('Bugexecution')->fetchAll('id');
foreach($executions as $executionID => $execution)
{
unset($execution->id);
$this->dao->dbh($this->dbh)->insert(TABLE_PRODUCT)->data($execution)->exec();
$this->map['product'][$executionID] = $this->dao->lastInsertID();
}
return count($executions);
}
/**
* Convert modules.
*
* @access public
* @return int converted modules count
*/
public function convertModule()
{
$this->map['module'][0] = 0;
$modules = $this->dao
->dbh($this->sourceDBH)
->select(
'moduleID AS id,
executionID AS root,
moduleName AS name,
moduleGrade AS grade,
parentID AS parent,
"bug" AS type')
->from('BugModule')
->orderBy('id ASC')
->fetchAll('id');
foreach($modules as $moduleID => $module)
{
$module->root = $this->map['product'][$module->root];
unset($module->id);
$this->dao->dbh($this->dbh)->insert(TABLE_MODULE)->data($module)->exec();
$this->map['module'][$moduleID] = $this->dao->lastInsertID();
}
/* Update parents. */
foreach($modules as $oldModuleID => $module)
{
$newModuleID = $this->map['module'][$oldModuleID];
$newParentID = $this->map['module'][$module->parent];
$this->dao->dbh($this->dbh)->update(TABLE_MODULE)->set('parent')->eq($newParentID)->where('id')->eq($newModuleID)->exec();
}
return count($modules);
}
/**
* Convert bugs.
*
* @access public
* @return int converted bugs count.
*/
public function convertBug()
{
$bugs = $this->dao
->dbh($this->sourceDBH)
->select('
bugID AS id,
executionID AS product,
moduleID AS module,
bugTitle AS title,
bugSeverity AS severity,
bugType AS type,
bugOS AS os,
bugStatus AS status,
mailto,
openedBy, openedDate, openedBuild,
assignedTo, assignedDate,
resolvedBy, resolution, resolvedBuild, resolvedDate,
closedBy, closedDate,
lastEditedBy, lastEditedDate,
linkID as duplicateBug
')
->from('BugInfo')
->orderBy('bugID')
->fetchAll('id');
foreach($bugs as $bugID => $bug)
{
/* Adjust some fields of bug. */
$bugID = (int)$bugID;
unset($bug->id);
if($bug->assignedTo == 'Closed') $bug->assignedTo = 'closed';
$bug->type = strtolower($bug->type);
$bug->os = strtolower($bug->os);
$bug->browser = 'all';
$bug->resolution = str_replace(' ','', strtolower($bug->resolution));
$bug->product = $this->map['product'][$bug->product];
$bug->module = $this->map['module'][$bug->module];
$this->dao->dbh($this->dbh)->insert(TABLE_BUG)->data($bug)->exec();
$this->map['bug'][$bugID] = $this->dao->lastInsertID();
}
/* Update duplicated bugs. */
foreach($this->map['bug'] as $oldBugID => $newBugID)
{
$this->dao->dbh($this->dbh)->update(TABLE_BUG)->set('duplicateBug')->eq($newBugID)->where('duplicateBug')->eq($oldBugID)->exec();
}
return count($bugs);
}
/**
* Convert actions.
*
* @access public
* @return int converted actions count.
*/
public function convertAction()
{
$actions = $this->dao
->dbh($this->sourceDBH)
->select("
'bug' AS objectType,
bugID AS objectID,
userName AS actor,
action,
fullInfo AS comment,
actionDate AS date")
->from('BugHistory')
->orderBy('bugID, historyID')
->fetchGroup('objectID');
$convertCount = 0;
foreach($actions as $bugID => $bugActions)
{
/* Get the related bugID. */
$bugID = (int)$bugID;
$zentaoBugID = $this->map['bug'][$bugID];
/* Process actions. */
foreach($bugActions as $key => $action)
{
$action->objectID = $zentaoBugID;
if($key == 0)
{
$this->dao->dbh($this->dbh)->update(TABLE_BUG)->set('steps')->eq(nl2br($action->comment))->where('id')->eq($zentaoBugID)->exec();
$action->comment = '';
}
$this->dao->dbh($this->dbh)->insert(TABLE_ACTION)->data($action)->exec();
$convertCount ++;
}
}
return $convertCount;
}
/**
* Convert files.
*
* @access public
* @return int converted files count.
*/
public function convertFile()
{
$this->setPath();
$files = $this->dao->dbh($this->sourceDBH)
->select("
fileName AS pathname,
fileTitle AS title,
fileType AS extension,
fileSize AS size,
'bug' AS objectType,
bugID AS objectID,
addUser AS addedBy,
addDate AS addedDate
")
->from('BugFile')
->orderBy('fileID')
->fetchAll();
foreach($files as $file)
{
$file->objectID = $this->map['bug'][(int)$file->objectID];
if(strpos($file->size, 'KB')) $file->size = (int)(str_replace('KB', '', $file->size) * 1024);
if(strpos($file->size, 'MB')) $file->size = (int)(str_replace('MB', '', $file->size) * 1024 * 1024);
$this->dao->dbh($this->dbh)->insert(TABLE_FILE)->data($file)->exec();
/* Copy files. */
$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);
}
}
return count($files);
}
}