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

490 lines
18 KiB
PHP

<?php
class stakeholder extends control
{
/**
* Stakeholder list.
*
* @param int $projectID
* @param string $browseType
* @param string $orderBy
* @param int $recTotal
* @param int $recPerPage
* @param int $pageID
* @access public
* @return void
*/
public function browse($projectID, $browseType = 'all', $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1)
{
$this->app->loadClass('pager', true);
$pager = pager::init($recTotal, $recPerPage, $pageID);
$this->loadModel('project')->setMenu($projectID);
$stakeholders = $this->stakeholder->getStakeholders($projectID, $browseType, $orderBy, $pager);
$this->view->title = $this->lang->stakeholder->browse;
$this->view->position[] = $this->lang->stakeholder->browse;
$this->view->pager = $pager;
$this->view->recTotal = $recTotal;
$this->view->recPerPage = $recPerPage;
$this->view->pageID = $pageID;
$this->view->projectID = $projectID;
$this->view->orderBy = $orderBy;
$this->view->browseType = $browseType;
$this->view->stakeholders = $stakeholders;
$this->display();
}
/**
* Create a stakeholder.
*
* @param int objectID
* @access public
* @return void
*/
public function create($objectID = 0)
{
if($_POST)
{
$stakeholderID = $this->stakeholder->create($objectID);
$response['result'] = 'success';
$response['message'] = $this->lang->saveSuccess;
if(!$stakeholderID or dao::isError())
{
$response['result'] = 'fail';
$response['message'] = dao::getError();
return $this->send($response);
}
$actionID = $this->loadModel('action')->create('stakeholder', $stakeholderID, 'added');
if($this->viewType == 'json') return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'id' => $stakeholderID));
$moduleName = $this->app->tab == 'program' ? 'program' : $this->moduleName;
$methodName = $this->app->tab == 'program' ? 'stakeholder' : 'browse';
$param = $this->app->tab == 'program' ? "programID=$objectID" : "projectID=$objectID";
$locate = $this->createLink($moduleName, $methodName, $param);
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $locate));
}
$members = array();
if($this->app->tab == 'program')
{
$this->loadModel('program')->setMenu($objectID);
$members = $this->loadModel('program')->getTeamMemberPairs($objectID);
}
else
{
$this->loadModel('project')->setMenu($objectID);
$members = $this->loadModel('user')->getTeamMemberPairs($objectID, 'project');
}
$stakeholders = $this->loadModel('stakeholder')->getStakeHolderPairs($objectID);
foreach($members as $account => $realname)
{
if(isset($stakeholders[$account])) unset($members[$account]);
}
$this->view->title = $this->lang->stakeholder->create;
$this->view->position[] = $this->lang->stakeholder->create;
$this->view->companys = $this->loadModel('company')->getOutsideCompanies();
$this->view->programID = $this->app->tab == 'program' ? $objectID : 0;
$this->view->projectID = $this->app->tab == 'project' ? $objectID : 0;
$this->view->members = $members;
$this->display();
}
/**
* Batch create stakeholders.
*
* @param int $projectID
* @param string $dept
* @param string $dept
* @access public
* @return void
*/
public function batchCreate($projectID, $dept = '', $parentID = 0)
{
if($_POST)
{
$stakeholderList = $this->stakeholder->batchCreate($projectID);
if($this->viewType == 'json') return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'idList' => $stakeholderList));
return print(js::locate($this->createLink('stakeholder', 'browse', "projectID=$projectID"), 'parent'));
}
if($this->app->tab == 'program')
{
$this->loadModel('program')->setMenu($projectID);
}
else
{
$this->loadModel('project')->setMenu($projectID);
}
$this->loadModel('user');
$this->loadModel('dept');
$this->loadModel('execution');
$deptUsers = $dept === '' ? array() : $this->dept->getDeptUserPairs($dept);
$this->view->title = $this->lang->stakeholder->batchCreate;
$this->view->position[] = $this->lang->stakeholder->batchCreate;
$this->view->project = $this->loadModel('project')->getByID($this->session->project);
$this->view->users = $this->user->getPairs('all|nodeleted|noclosed');
$this->view->deptUsers = $deptUsers;
$this->view->dept = $dept;
$this->view->projectID = $projectID;
$this->view->depts = array('' => '') + $this->dept->getOptionMenu();
$this->view->stakeholders = $this->stakeholder->getStakeholders($projectID, 'all', 'id_desc');
$this->view->parentStakeholders = $this->loadModel('program')->getStakeholders($parentID, 't1.id_desc');
$this->display();
}
/**
* Edit a stakeholder.
*
* @param int $stakeholderID
* @access public
* @return void
*/
public function edit($stakeholderID = 0)
{
$stakeholder = $this->stakeholder->getByID($stakeholderID);
$this->loadModel('project')->setMenu($stakeholder->objectID);
if($_POST)
{
$changes = $this->stakeholder->edit($stakeholderID);
$response['result'] = 'success';
$response['message'] = $this->lang->saveSuccess;
if(dao::isError())
{
$response['result'] = 'fail';
$response['message'] = dao::getError();
return $this->send($response);
}
$actionID = $this->loadModel('action')->create('stakeholder', $stakeholderID, 'Edited');
$this->action->logHistory($actionID, $changes);
$response['locate'] = $this->createLink('stakeholder', 'browse', "projectID=$stakeholder->objectID");
return $this->send($response);
}
$users = array('' => '');
if($stakeholder->from == 'team') $users = $this->loadModel('user')->getTeamMemberPairs($this->session->project, 'project');
elseif($stakeholder->from == 'company')
{
$members = $this->loadModel('user')->getTeamMemberPairs($this->session->project, 'project');
$users = $this->user->getPairs('noclosed');
$users = array('' => '') + array_diff($users, $members);
}
$this->view->title = $this->lang->stakeholder->edit;
$this->view->position[] = $this->lang->stakeholder->edit;
$this->view->stakeholder = $stakeholder;
$this->view->users = $users;
$this->view->companys = $this->loadModel('company')->getOutsideCompanies();
$this->display();
}
/**
* Ajax get members.
*
* @param string $user
* @param int $programID
* @param int $projectID
* @access public
* @return void
*/
public function ajaxGetMembers($user = '', $programID = 0, $projectID = 0)
{
if($programID)
{
$members = $this->loadModel('program')->getTeamMemberPairs($programID);
}
else
{
$members = $this->loadModel('user')->getTeamMemberPairs($projectID, 'project');
}
$stakeholders = $this->loadModel('stakeholder')->getStakeHolderPairs($programID ? $programID : $projectID);
foreach($members as $account => $realname)
{
if(isset($stakeholders[$account])) unset($members[$account]);
}
echo html::select('user', $members, $user, "class='form-control chosen'");
}
/**
* Ajax get company user.
*
* @param string $user
* @param int $programID
* @param int $projectID
* @access public
* @return void
*/
public function ajaxGetCompanyUser($user = '', $programID = 0, $projectID = 0)
{
if($programID)
{
$members = $this->loadModel('program')->getTeamMemberPairs($programID);
}
else
{
$members = $this->loadModel('user')->getTeamMemberPairs($projectID, 'project');
}
$users = $this->loadModel('user')->getPairs('noclosed');
$companyUsers = array('' => '') + array_diff($users, $members);
$stakeholders = $this->loadModel('stakeholder')->getStakeHolderPairs($programID ? $programID : $projectID);
foreach($companyUsers as $account => $realname)
{
if(isset($stakeholders[$account])) unset($companyUsers[$account]);
}
echo html::select('user', $companyUsers, $user, "class='form-control chosen'");
}
/**
* Ajax get outside user.
*
* @access public
* @return void
*/
public function ajaxGetOutsideUser($objectID = 0)
{
$users = $this->loadModel('user')->getPairs('noclosed|outside|noletter');
$stakeholders = $this->loadModel('stakeholder')->getStakeHolderPairs($objectID);
foreach($users as $account => $realname)
{
if(isset($stakeholders[$account])) unset($users[$account]);
}
echo html::select('user', $users, '', "class='form-control chosen' onchange=changeUser(this.value);");
}
/**
* Ajax get control.
*
* @access public
* @return void
*/
public function ajaxGetControl($activityID = 0)
{
$plan = $this->dao->select('*')->from(TABLE_INTERVENTION)->where('activity')->eq($activityID)->fetch();
$begin = html::input("begin[$activityID]", isset($plan->begin) ? $plan->begin : '', 'class="form-control form-date"');
$realBegin = html::input("realBegin[$activityID]", isset($plan->realBegin) ? $plan->realBegin: '', 'class="form-control form-date"');
$status = html::select("status[$activityID]", $this->lang->stakeholder->planField->stautsList, isset($plan->status) ? $plan->status : '', 'class="form-control"');
$situation = html::select("situation[$activityID]", $this->lang->stakeholder->situationList, isset($plan->situation) ? $plan->situation : '', 'class="form-control"');
$stakeholders = $this->stakeholder->getListByType();
$partakeList = isset($plan->partake) ? json_decode($plan->partake) : new stdclass();
$insideList = array("<td style='width: 100px;'></td>");
$outsideList = array("<td style='width: 100px;'></td>");
if(isset($stakeholders['inside']))
{
$insideList = array();
foreach($stakeholders['inside'] as $user)
{
$partake = isset($partakeList->{$user->account}) ? $partakeList->{$user->account} : '';
$insideList[] = "<td style='width: 100px;'>" . html::select("partake[$activityID][$user->account]", $this->lang->stakeholder->planField->partakeList, $partake, "class='form-control'") . '</td>';
}
}
if(isset($stakeholders['outside']))
{
$outsideList = array();
foreach($stakeholders['outside'] as $user)
{
$partake = isset($partakeList->{$user->account}) ? $partakeList->{$user->account} : '';
$outsideList[] = "<td style='width: 100px;'>" . html::select("partake[$activityID][$user->account]", $this->lang->stakeholder->planField->partakeList, $partake, "class='form-control'") . '</td>';
}
}
$partakeList = array_merge($insideList, $outsideList);
echo json_encode(array('begin' => $begin, 'realBegin' => $realBegin, 'status' => $status, 'situation' => $situation, 'partakeList' => $partakeList));
}
/**
* Deleted user.
*
* @access public
* @param int $userID
* @param string $confirm yes|no
* @return void
*/
public function delete($userID, $confirm = 'no')
{
if($confirm == 'no')
{
return print(js::confirm($this->lang->stakeholder->confirmDelete, inLink('delete', "userID=$userID&confirm=yes")));
}
else
{
$stakeholder = $this->stakeholder->getByID($userID);
$this->stakeholder->delete(TABLE_STAKEHOLDER, $userID);
$this->loadModel('user')->updateUserView($this->session->project, 'project');
/* Update linked products view. */
if($stakeholder->objectType == 'project' and $stakeholder->objectID)
{
$this->loadModel('project')->updateInvolvedUserView($stakeholder->objectID, $stakeholder->user);
}
return print(js::reload('parent'));
}
}
/**
* User details.
*
* @access public
* @param int $userID
* @return void
*/
public function view($userID = 0)
{
$user = $this->stakeholder->getByID($userID);
$this->loadModel('project')->setMenu($user->objectID);
$this->commonAction($userID, 'stakeholder');
$this->view->title = $this->lang->stakeholder->common . $this->lang->colon . $this->lang->stakeholder->view;
$this->view->position[] = $this->lang->stakeholder->view;
$this->view->user = $user;
$this->view->users = $this->loadModel('user')->getTeamMemberPairs($this->session->project, 'project', 'nodeleted');
$this->view->expects = $this->stakeholder->getExpectByUser($userID);
$this->display();
}
/**
* Stakeholder issues.
*
* @access public
* @return void
*/
public function issue()
{
$this->loadModel('issue');
if(common::hasPriv('issue', 'create')) $this->lang->TRActions = html::a($this->createLink('issue', 'create', 'from=stakeholder'), "<i class='icon icon-sm icon-plus'></i> " . $this->lang->issue->create, '', "class='btn btn-primary'");
$this->view->title = $this->lang->stakeholder->common . $this->lang->colon . $this->lang->stakeholder->issue;
$this->view->position[] = $this->lang->stakeholder->issue;
$this->view->users = $this->loadModel('company')->getCompanyUserPairs();
$this->view->issues = $this->stakeholder->getIssues();
$this->display();
}
/**
* View activity's issues.
*
* @access public
* @return void
*/
public function viewIssue($activityID = 0, $recTotal = 0, $recPerPage = 20, $pageID = 1)
{
$this->app->loadClass('pager', true);
$pager = pager::init($recTotal, $recPerPage, $pageID);
$this->view->users = $this->loadModel('user')->getPairs('all|noletter');
$this->view->activity = $this->dao->findByID($activityID)->from(TABLE_ACTIVITY)->fetch();
$this->view->issues = $this->loadModel('issue')->getStakeholderIssue('', $activityID, $pager);
$this->display();
}
/**
* Add communication record.
*
* @access public
* @param int $userID
* @return void
*/
public function communicate($userID)
{
$this->commonAction($userID, 'stakeholder');
if(!empty($_POST))
{
$result = $this->stakeholder->communicate($userID);
if(dao::isError()) return print(js::error(dao::getError()));
if(isonlybody()) return print(js::closeModal('parent.parent', 'this'));
}
$this->view->title = $this->lang->stakeholder->common . $this->lang->colon . $this->lang->stakeholder->communicate;
$this->view->position[] = $this->lang->stakeholder->view;
$this->view->user = $this->stakeholder->getByID($userID);
$this->view->users = $this->loadModel('user')->getTeamMemberPairs($this->session->project, 'project', 'nodeleted');
$this->display();
}
/**
* Add expect record.
*
* @access public
* @param int $expectID
* @return void
*/
public function expect($expectID)
{
$user = $this->stakeholder->getByID($expectID);
if(!empty($_POST))
{
$expectID = $this->stakeholder->expect($user->id);
if(dao::isError()) return print(js::error(dao::getError()));
return print(js::closeModal('parent.parent', 'this'));
}
$this->view->title = $this->lang->stakeholder->common . $this->lang->colon . $this->lang->stakeholder->communicate;
$this->view->position[] = $this->lang->stakeholder->view;
$this->view->user = $user;
$this->display();
}
/**
* Common actions of stakeholder module.
*
* @param int $stakeholderID
* @access public
* @return void
*/
public function commonAction($stakeholderID, $object)
{
$this->view->actions = $this->loadModel('action')->getList($object, $stakeholderID);
}
/**
* Issue details.
*
* @access public
* @param int $userID
* @return void
*/
public function userIssue($userID)
{
$this->app->loadLang('issue');
$stakeholder = $this->stakeholder->getByID($userID);
$this->view->title = $this->lang->stakeholder->common . $this->lang->colon . $this->lang->stakeholder->communicate;
$this->view->position[] = $this->lang->stakeholder->view;
$this->view->stakeholder = $stakeholder;
$this->view->projectID = $stakeholder->objectID;
$this->view->issueList = $this->stakeholder->getStakeholderIssue($stakeholder->user);
$this->display();
}
}