Files
EasySoft-ZenTaoPMS/module/personnel/model.php
2020-11-05 15:41:07 +08:00

404 lines
17 KiB
PHP

<?php
/**
* The model file of personnel 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 personnel
* @version $Id$
* @link http://www.zentao.net
*/
class personnelModel extends model
{
/**
* Access to program set input staff.
*
* @param int $programID
* @param int $deptID
* @param string $browseType
* @param string $orderBy
* @param int $queryID
* @param object $pager
* @access public
* @return array
*/
public function getAccessiblePersonnel($programID = 0, $deptID = 0, $browseType = 'all', $queryID = 0, $pager)
{
$accessibleQuery = '';
if($browseType == 'bysearch')
{
$query = $queryID ? $this->loadModel('search')->getQuery($queryID) : '';
if($query)
{
$this->session->set('accessibleQuery', $query->sql);
$this->session->set('accessibleForm', $query->form);
}
if($this->session->accessibleQuery == false) $this->session->set('accessibleQuery', ' 1=1');
$accessibleQuery = $this->session->accessibleQuery;
}
/* Determine who can be accessed based on access control. */
$program = $this->loadModel('program')->getPGMByID($programID);
if($program->acl == 'open')
{
/* The program is public, and users are judged to be accessible by permission groups. */
$accessibleGroupID = $this->loadModel('group')->getAccessProgramGroup();
$personnelList = $this->dao->select('t1.account,t3.role,t3.dept,t3.realname,t3.gender,t3.id')->from(TABLE_USERGROUP)->alias('t1')
->leftJoin(TABLE_GROUPPRIV)->alias('t2')->on('t1.group = t2.group')
->leftJoin(TABLE_USER)->alias('t3')->on('t1.account = t3.account')
->where('t1.group')->in($accessibleGroupID)
->andWhere('t2.module')->eq('program')
->andWhere('t2.method')->eq('PGMBrowse')
->beginIF($deptID > 0)->andWhere('t3.dept')->eq($deptID)->fi()
->beginIF($browseType == 'bysearch')->andWhere($accessibleQuery)->fi()
->page($pager)
->fetchAll('account');
}
else
{
$personnelList = $this->dao->select('t2.id,t2.dept,t2.account,t2.role,t2.realname,t2.gender')->from(TABLE_USERVIEW)->alias('t1')
->leftJoin(TABLE_USER)->alias('t2')->on('t1.account=t2.account')
->where("CONCAT(',', t1.programs, ',')")->like("%,$programID,%")
->beginIF($deptID > 0)->andWhere('t2.dept')->eq($deptID)->fi()
->beginIF($browseType == 'bysearch')->andWhere($accessibleQuery)->fi()
->page($pager)
->fetchAll();
}
return $personnelList;
}
/**
* Access to program set input staff.
*
* @param int $programID
* @param string $browseType
* @param string $orderBy
* @access public
* @return array
*/
public function getInputPersonnel($programID = 0, $browseType = 'all', $orderBy = 'id_desc')
{
$personnelList = array();
/* Get all projects under the current program. */
$projects = $this->dao->select('id,model,type,parent,path,name')->from(TABLE_PROJECT)
->where('type')->eq('project')
->andWhere('path')->like("%,$programID,%")
->andWhere('deleted')->eq('0')
->orderBy($orderBy)
->fetchAll('id');
$personnelList['projects'] = $projects;
if(empty($projects)) return $personnelList;
$sprintAndStage = $this->getSprintAndStage($projects);
$personnelList['sprintAndStage'] = $sprintAndStage['sprintAndStage'];
$personnelList['childrenStage'] = $sprintAndStage['childrenStage'];
$personnelList['teams'] = $sprintAndStage['teams'];
$personnelList['objectRows'] = $sprintAndStage['objectRows'];
/* Get the program name for each level. */
$programNameList = $this->dao->select('id, name')->from(TABLE_PROGRAM)->where('type')->eq('program')->andWhere('deleted')->eq(0)->fetchPairs();
foreach($personnelList['projects'] as $id => $project)
{
$path = explode(',', $project->path);
$path = array_filter($path);
unset($path[$id]);
$programName = '';
foreach($path as $program)
{
if($program == $id) continue;
$programName .= '/' . $programNameList[$program];
}
$personnelList['projects'][$id]->programName = $programName;
}
return $personnelList;
}
/**
* Access to data on stages and sprints.
*
* @param object $projects
* @access public
* @return array
*/
public function getSprintAndStage($projects)
{
/* Get all sprints and iterations under the project. */
$projectKeys = array_keys($projects);
$projectObjet = $this->dao->select('id,project,model,type,parent,path,grade,name')->from(TABLE_PROJECT)
->where('project')->in($projectKeys)
->andWhere('deleted')->eq('0')
->orderBy('id_desc')
->fetchAll();
/* Get the team's root ID, separate the parent-child iteration. */
$rootIDList = array();
$sprintAndStage = array();
$childrenStage = array();
foreach($projectObjet as $id => $object)
{
if($object->grade == 1)
{
$sprintAndStage[$object->project][] = $object;
}
else
{
$childrenStage[$object->parent][] = $object;
}
$rootIDList[] = $object->id;
}
$teams = $this->dao->select('t1.id,t1.root,t1.type,t1.role,t1.account,t2.realname')->from(TABLE_TEAM)->alias('t1')
->leftJoin(TABLE_USER)->alias('t2')->on('t1.account=t2.account')
->where('t1.root')->in($rootIDList)
->andWhere('t1.type')->in('stage,sprint')
->fetchGroup('root', 'id');
/* Calculate the number of cross rows for iterations and sprints. */
$objectRows = array();
foreach($projects as $project)
{
$objectRows[$project->id] = isset($sprintAndStage[$project->id]) ? count($sprintAndStage[$project->id]) + 1 : 1;
if(!isset($sprintAndStage[$project->id])) continue;
foreach($sprintAndStage[$project->id] as $object)
{
$objectRows[$object->id] = 1;
if($object->type == 'sprint')
{
$objectRows[$object->id] = isset($teams[$object->id]) ? count($teams[$object->id]) + 1 : 1;
$objectRows[$project->id] += $objectRows[$object->id] > 1 ? count($teams[$object->id]) : 0;;
}
elseif($object->type == 'stage' && isset($childrenStage[$object->id]))
{
$objectRows[$object->id] += count($childrenStage[$object->id]);
$objectRows[$project->id] += count($childrenStage[$object->id]);
foreach($childrenStage[$object->id] as $stage)
{
$objectRows[$stage->id] = isset($teams[$stage->id]) ? count($teams[$stage->id]) + 1 : 1;
$objectRows[$object->id] += $objectRows[$stage->id] > 1 ? count($teams[$stage->id]) : 0;
$objectRows[$project->id] += $objectRows[$stage->id] > 1 ? count($teams[$stage->id]) : 0;
}
}
else
{
$objectRows[$object->id] = isset($teams[$object->id]) ? count($teams[$object->id]) + 1 : 1;
$objectRows[$project->id] += $objectRows[$object->id] > 1 ? count($teams[$object->id]) : 0;
}
}
}
return array('sprintAndStage' => $sprintAndStage, 'childrenStage' => $childrenStage, 'teams' => $teams, 'objectRows' => $objectRows);
}
/**
* Access to program set input staff.
*
* @param int $objectID
* @param string $objectType program|project|product|sprint
* @param string $orderBy
* @param object $pager
* @access public
* @return array
*/
public function getWhitelist($objectID = 0, $objectType = '', $orderBy = 'id_desc', $pager = '')
{
return $this->dao->select('t1.id,t1.account,t2.realname,t2.role,t2.phone,t2.qq,t2.weixin,t2.email')->from(TABLE_ACL)->alias('t1')
->leftjoin(TABLE_USER)->alias('t2')->on('t1.account = t2.account')
->where('t1.objectID')->eq($objectID)
->andWhere('t1.type')->eq('whitelist')
->andWhere('t1.objectType')->eq($objectType)
->orderBy($orderBy)
->beginIF(!empty($pager))->page($pager)->fi()
->fetchAll();
}
/**
* Get whitelisted accounts.
*
* @param int $objectID
* @param string $objectType
* @access public
* @return array
*/
public function getWhitelistAccount($objectID = 0, $objectType = '')
{
return $this->dao->select('account')->from(TABLE_ACL)->where('objectID')->eq($objectID)->andWhere('objectType')->eq($objectType)->fetchPairs('account');
}
/**
* Adding users to access control lists.
*
* @param array $users
* @param string $objectType program|project|product|sprint
* @param int $objectID
* @param string $type whitelist|blacklist
* @param string $source upgrade|add|sync
* @access public
* @return void
*/
public function updateWhitelist($users = array(), $objectType = '', $objectID = 0, $type = 'whitelist', $source = 'add')
{
$oldWhitelist = $this->dao->select('account,objectType,objectID,type,source')->from(TABLE_ACL)->where('objectID')->eq($objectID)->andWhere('objectType')->eq($objectType)->fetchAll('account');
$this->dao->delete()->from(TABLE_ACL)->where('objectID')->eq($objectID)->andWhere('objectType')->eq($objectType)->exec();
$users = array_filter($users);
$users = array_unique($users);
$accounts = array();
foreach($users as $account)
{
if(isset($oldWhitelist[$account]))
{
$this->dao->insert(TABLE_ACL)->data($oldWhitelist[$account])->exec();
$accounts[$account] = $account;
continue;
}
$acl = new stdClass();
$acl->account = $account;
$acl->objectType = $objectType;
$acl->objectID = $objectID;
$acl->type = $type;
$acl->source = $source;
$this->dao->insert(TABLE_ACL)->data($acl)->autoCheck()->exec();
$accounts[$account] = $account;
}
$whitelist = ',' . implode(',', $accounts);
$objectTable = $objectType == 'product' ? TABLE_PRODUCT : TABLE_PROJECT;
$this->dao->update($objectTable)->set('whitelist')->eq($whitelist)->where('id')->eq($objectID)->exec();
$deletedAccounts = array();
foreach($oldWhitelist as $account => $whitelist)
{
if(!isset($accounts[$account])) $deletedAccounts[] = $account;
}
/* Synchronization of people from the product whitelist to the program set. */
if($objectType == 'product')
{
$product = $this->loadModel('product')->getById($objectID);
if(empty($product)) return false;
$programWhitelist = $this->getWhitelistAccount($product->program, 'program');
$newWhitelist = array_merge($programWhitelist, $accounts);
$source = $source == 'upgrade' ? 'upgrade' : 'sync';
$this->updateWhitelist($newWhitelist, 'program', $product->program, 'whitelist', $source);
/* Removal of persons from centralized program whitelisting. */
foreach($deletedAccounts as $account) $this->deleteProgramWhitelist($objectID, $account);
}
/* Synchronization of people from the sprint white list to the project. */
if($objectType == 'sprint')
{
$sprint = $this->dao->select('id,project')->from(TABLE_PROJECT)->where('id')->eq($objectID)->fetch();
if(empty($sprint)) return false;
$projectWhitelist = $this->getWhitelistAccount($sprint->project, 'project');
$newWhitelist = array_merge($projectWhitelist, $accounts);
$source = $source == 'upgrade' ? 'upgrade' : 'sync';
$this->updateWhitelist($newWhitelist, 'project', $sprint->project, 'whitelist', $source);
/* Removal of whitelisted persons from projects. */
foreach($deletedAccounts as $account) $this->deleteProjectWhitelist($objectID, $account);
}
}
/**
* Adding users to access control lists.
*
* @param string $objectType program|project|product|sprint
* @param int $objectID
* @access public
* @return void
*/
public function addWhitelist($objectType = '', $objectID = 0)
{
$users = $this->post->accounts;
$this->updateWhitelist($users, $objectType, $objectID);
}
/**
* Determine whether the user exists in the white list of multiple products.
*
* @param int $objectID
* @param string $account
* @access public
* @return void
*/
public function deleteProgramWhitelist($objectID = 0, $account = '')
{
$program = $this->dao->select('id,program,whitelist')->from(TABLE_PRODUCT)->where('id')->eq($objectID)->fetch();
if(empty($program)) return false;
$programID = $program->program;
$products = $this->dao->select('id')->from(TABLE_PRODUCT)->where('program')->eq($programID)->andWhere('deleted')->eq('0')->fetchPairs('id');
$whitelist = $this->dao->select('*')->from(TABLE_ACL)->where('objectID')->in($products)->andWhere('account')->eq($account)->andWhere('objectType')->eq('product')->fetch();
/* Determine if the user exists in other products in the program set. */
if(empty($whitelist))
{
$newWhitelist = str_replace(',' . $account, '', $program->whitelist);
$this->dao->update(TABLE_PROGRAM)->set('whitelist')->eq($newWhitelist)->where('id')->eq($programID)->exec();
$this->dao->delete()->from(TABLE_ACL)->where('objectID')->eq($programID)->andWhere('account')->eq($account)->andWhere('objectType')->eq('program')->exec();
}
}
/**
* Determine if the user is on a whitelist for multiple sprints
*
* @param int $objectID
* @param string $account
* @access public
* @return void
*/
public function deleteProjectWhitelist($objectID = 0, $account = '')
{
$project = $this->dao->select('id,project,whitelist')->from(TABLE_PROJECT)->where('id')->eq($objectID)->fetch();
if(empty($project)) return false;
$projectID = $project->project;
$sprints = $this->dao->select('id')->from(TABLE_PROJECT)->where('project')->eq($projectID)->andWhere('deleted')->eq('0')->fetchPairs('id');
$whitelist = $this->dao->select('*')->from(TABLE_ACL)->where('objectID')->in($sprints)->andWhere('account')->eq($account)->andWhere('objectType')->eq('sprint')->fetch();
/* Determine if the user exists in other sprints in the project set. */
if(empty($whitelist))
{
$newWhitelist = str_replace(',' . $account, '', $project->whitelist);
$this->dao->update(TABLE_PROJECT)->set('whitelist')->eq($newWhitelist)->where('id')->eq($projectID)->exec();
$this->dao->delete()->from(TABLE_ACL)->where('objectID')->eq($projectID)->andWhere('account')->eq($account)->andWhere('objectType')->eq('project')->exec();
}
}
/**
* Create access links by department.
*
* @param object $dept
* @param int $programID
* @access public
* @return string
*/
public function createMemberLink($dept = 0, $programID = 0)
{
return html::a(helper::createLink('personnel', 'accessible', "program={$programID}&deptID={$dept->id}"), $dept->name, '_self', "id='dept{$dept->id}'");
}
/**
* Build search form.
*
* @param int $queryID
* @param string $actionURL
* @access public
* @return void
*/
public function buildSearchForm($queryID = 0, $actionURL = '')
{
$this->config->personnel->accessible->search['actionURL'] = $actionURL;
$this->config->personnel->accessible->search['queryID'] = $queryID;
$this->loadModel('search')->setSearchParams($this->config->personnel->accessible->search);
}
}