model.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609
  1. <?php
  2. class stakeholderModel extends model
  3. {
  4. /**
  5. * 创建一个干系人。
  6. * Create a stakeholder.
  7. *
  8. * @param object $data
  9. * @access public
  10. * @return int|bool
  11. */
  12. public function create($data)
  13. {
  14. $account = $this->replaceUserInfo($data);
  15. if(dao::isError()) return false;
  16. $stakeholder = new stdclass();
  17. $stakeholder->user = $account;
  18. $stakeholder->objectType = $data->objectType;
  19. $stakeholder->objectID = $data->objectID;
  20. $stakeholder->key = $data->key;
  21. $stakeholder->from = $data->from;
  22. $stakeholder->type = $data->from == 'outside' ? 'outside' : 'inside';
  23. $stakeholder->createdBy = $this->app->user->account;
  24. $stakeholder->createdDate = helper::now();
  25. $this->dao->insert(TABLE_STAKEHOLDER)->data($stakeholder)->check('user', 'unique', "objectID = {$stakeholder->objectID} AND deleted = '0'")->autoCheck()->exec();
  26. $stakeholderID = $this->dao->lastInsertID();
  27. if(dao::isError()) return false;
  28. $userList = empty($stakeholder->user) ? array() : array($stakeholder->user);
  29. $this->loadModel('user')->updateUserView(array($stakeholder->objectID), $stakeholder->objectType, $userList);
  30. /* Update linked products view. */
  31. if($stakeholder->objectType == 'project' && $stakeholder->objectID)
  32. {
  33. $this->loadModel('project')->updateInvolvedUserView($stakeholder->objectID, $userList);
  34. }
  35. if($stakeholder->objectType == 'program' && $stakeholder->objectID)
  36. {
  37. $programID = $stakeholder->objectID;
  38. /* Update children user view. */
  39. $childPrograms = $this->dao->select('id')->from(TABLE_PROJECT)->where('path')->like("%,$programID,%")->andWhere('type')->eq('program')->fetchPairs();
  40. $childProjects = $this->dao->select('id')->from(TABLE_PROJECT)->where('path')->like("%,$programID,%")->andWhere('type')->eq('project')->fetchPairs();
  41. $childProducts = $this->dao->select('id')->from(TABLE_PRODUCT)->where('program')->eq($programID)->fetchPairs();
  42. if(!empty($childPrograms)) $this->user->updateUserView($childPrograms, 'program', array($stakeholder->user));
  43. if(!empty($childProjects)) $this->user->updateUserView($childProjects, 'project', array($stakeholder->user));
  44. if(!empty($childProducts)) $this->user->updateUserView($childProducts, 'product', array($stakeholder->user));
  45. }
  46. return $stakeholderID;
  47. }
  48. /**
  49. * 更新/插入用户信息。
  50. * Update/insert user info.
  51. *
  52. * @param object $data
  53. * @access public
  54. * @return bool|string
  55. */
  56. public function replaceUserInfo($data)
  57. {
  58. $account = isset($data->user) ? $data->user : '';
  59. if($data->from != 'outside')
  60. {
  61. if(!$account) return dao::$errors['user'] = sprintf($this->lang->error->notempty, $this->lang->stakeholder->user);
  62. $user = new stdclass();
  63. $user->nature = $data->nature;
  64. $user->analysis = $data->analysis;
  65. $user->strategy = $data->strategy;
  66. $this->dao->update(TABLE_USER)->data($user)->where('account')->eq($account)->exec();
  67. return $account;
  68. }
  69. if($account) return $account;
  70. /* If it's an outsider and it's added for the first time, insert to user table. */
  71. if(!$data->newUser && !$account) return dao::$errors['user'] = sprintf($this->lang->error->notempty, $this->lang->stakeholder->user);
  72. if(!$data->name) return dao::$errors['name'] = sprintf($this->lang->error->notempty, $this->lang->stakeholder->name);
  73. if(!$data->newCompany && !$data->company) return dao::$errors['company'] = sprintf($this->lang->error->notempty, $this->lang->stakeholder->company);
  74. if($data->newCompany && !$data->companyName) return dao::$errors['company'] = sprintf($this->lang->error->notempty, $this->lang->stakeholder->company);
  75. $companyID = $data->company;
  76. if(isset($data->newCompany) && $data->companyName)
  77. {
  78. $company = new stdclass();
  79. $company->name = $data->companyName;
  80. $this->dao->insert(TABLE_COMPANY)->data($company)->autoCheck()->exec();
  81. $companyID = $this->dao->lastInsertID();
  82. }
  83. /* Create new user. */
  84. $user = new stdclass();
  85. $user->type = 'outside';
  86. $user->realname = $data->name;
  87. $user->account = mt_rand(1111, 99999);
  88. $user->company = $companyID;
  89. $user->phone = $data->phone;
  90. $user->qq = $data->qq;
  91. $user->weixin = $data->weixin;
  92. $user->email = $data->email;
  93. $user->nature = $data->nature;
  94. $user->analysis = $data->analysis;
  95. $user->strategy = $data->strategy;
  96. $this->dao->insert(TABLE_USER)->data($user)->exec();
  97. $userID = $this->dao->lastInsertID();
  98. $account = 'u' . $userID;
  99. $this->dao->update(TABLE_USER)->set('account')->eq($account)->where('id')->eq($userID)->exec();
  100. if(dao::isError()) return false;
  101. return $account;
  102. }
  103. /**
  104. * 批量创建项目的干系人。
  105. * Batch create stakeholders for a project.
  106. *
  107. * @param int $projectID
  108. * @param array $accounts
  109. * @access public
  110. * @return array
  111. */
  112. public function batchCreate($projectID, $accounts)
  113. {
  114. $this->loadModel('action');
  115. $members = $this->loadModel('user')->getTeamMemberPairs($projectID, 'project');
  116. $accounts = array_unique($accounts);
  117. $oldJoin = $this->dao->select('`user`, createdDate')->from(TABLE_STAKEHOLDER)->where('objectID')->eq($projectID)->andWhere('objectType')->eq('project')->fetchPairs();
  118. $this->dao->delete()->from(TABLE_STAKEHOLDER)->where('objectID')->eq($projectID)->andWhere('objectType')->eq('project')->exec();
  119. $stakeholderList = array();
  120. foreach($accounts as $account)
  121. {
  122. if(empty($account)) continue;
  123. $stakeholder = new stdclass();
  124. $stakeholder->objectID = $projectID;
  125. $stakeholder->objectType = 'project';
  126. $stakeholder->user = $account;
  127. $stakeholder->type = in_array($account, array_keys($members)) ? 'inside' : 'outside';
  128. $stakeholder->from = $stakeholder->type == 'inside' ? 'team' : 'company';
  129. $stakeholder->createdBy = $this->app->user->account;
  130. $stakeholder->createdDate = isset($oldJoin[$account]) ? $oldJoin[$account] : helper::now();
  131. $this->dao->insert(TABLE_STAKEHOLDER)->data($stakeholder)->exec();
  132. $stakeholderID = $this->dao->lastInsertId();
  133. $stakeholderList[] = $stakeholderID;
  134. $this->action->create('stakeholder', $stakeholderID, 'added');
  135. if(!empty($accounts) && $stakeholder->objectType == 'program' && $stakeholder->objectID)
  136. {
  137. /* Update children user view. */
  138. $programID = $stakeholder->objectID;
  139. $childPrograms = $this->dao->select('id')->from(TABLE_PROJECT)->where('path')->like("%,$programID,%")->andWhere('type')->eq('program')->fetchPairs();
  140. $childProjects = $this->dao->select('id')->from(TABLE_PROJECT)->where('path')->like("%,$programID,%")->andWhere('type')->eq('project')->fetchPairs();
  141. $childProducts = $this->dao->select('id')->from(TABLE_PRODUCT)->where('program')->eq($programID)->fetchPairs();
  142. if(!empty($childPrograms)) $this->user->updateUserView($childPrograms, 'program', $stakeholder->user);
  143. if(!empty($childProjects)) $this->user->updateUserView($childProjects, 'project', $stakeholder->user);
  144. if(!empty($childProducts)) $this->user->updateUserView($childProducts, 'product', $stakeholder->user);
  145. }
  146. }
  147. /* Only changed account update userview. */
  148. $oldAccounts = array_keys($oldJoin);
  149. $changedAccounts = array_diff($accounts, $oldAccounts);
  150. $changedAccounts = array_merge($changedAccounts, array_diff($oldAccounts, $accounts));
  151. $changedAccounts = array_unique($changedAccounts);
  152. $this->loadModel('user')->updateUserView(array($projectID), 'project', $changedAccounts);
  153. $this->loadModel('project')->updateInvolvedUserView($projectID, $changedAccounts);
  154. return $stakeholderList;
  155. }
  156. /**
  157. * 编辑一个干系人。
  158. * Edit a stakeholder.
  159. *
  160. * @param int $stakeholderID
  161. * @param object $data
  162. * @access public
  163. * @return bool|array
  164. */
  165. public function edit($stakeholderID, $data)
  166. {
  167. $oldStakeholder = $this->getByID($stakeholderID);
  168. if(!$oldStakeholder) return false;
  169. $user = new stdclass();
  170. if($oldStakeholder->from == 'outside')
  171. {
  172. if(empty($data->name))
  173. {
  174. dao::$errors['name'] = sprintf($this->lang->error->notempty, $this->lang->stakeholder->name);
  175. return false;
  176. }
  177. $user->realname = $data->name;
  178. $user->phone = $data->phone;
  179. $user->qq = $data->qq;
  180. $user->weixin = $data->weixin;
  181. $user->email = $data->email;
  182. }
  183. $user->nature = $data->nature;
  184. $user->analysis = $data->analysis;
  185. $user->strategy = $data->strategy;
  186. $this->dao->update(TABLE_USER)->data($user)->where('account')->eq($oldStakeholder->user)->exec();
  187. if(dao::isError()) return false;
  188. $stakeholder = new stdclass();
  189. $stakeholder->key = $data->key;
  190. $stakeholder->editedBy = $this->app->user->account;
  191. $stakeholder->editedDate = helper::now();
  192. $this->dao->update(TABLE_STAKEHOLDER)->data($stakeholder)
  193. ->autoCheck()
  194. ->where('id')->eq($stakeholderID)
  195. ->exec();
  196. if(dao::isError()) return false;
  197. return common::createChanges($oldStakeholder, $stakeholder);
  198. }
  199. /**
  200. * 获取干系人列表数据。
  201. * Get stakeholder list.
  202. *
  203. * @param int $projectID
  204. * @param string $browseType all|inside|outside|key
  205. * @param string $orderBy
  206. * @param object $pager
  207. * @access public
  208. * @return array
  209. */
  210. public function getStakeholders($projectID, $browseType = 'all', $orderBy = 'id_desc', $pager = null)
  211. {
  212. return $this->dao->select('t1.*, t2.role, t2.phone, t2.realname as name, t2.email, t2.qq, t2.weixin, t2.nature, t2.analysis, t2.strategy, t3.name as companyName, t4.model as projectModel')->from(TABLE_STAKEHOLDER)->alias('t1')
  213. ->leftJoin(TABLE_USER)->alias('t2')->on('t1.user=t2.account')
  214. ->leftJoin(TABLE_COMPANY)->alias('t3')->on('t2.company=t3.id')
  215. ->leftJoin(TABLE_PROJECT)->alias('t4')->on('t1.objectID=t4.id')
  216. ->where('t1.deleted')->eq('0')
  217. ->andWhere('t1.objectID')->eq($projectID)
  218. ->beginIF($browseType == 'inside')->andWhere('t1.type')->eq('inside')->fi()
  219. ->beginIF($browseType == 'outside')->andWhere('t1.type')->eq('outside')->fi()
  220. ->beginIF($browseType == 'key')->andWhere('t1.key')->ne('0')->fi()
  221. ->orderBy($orderBy)
  222. ->page($pager)
  223. ->fetchAll('id');
  224. }
  225. /**
  226. * 获取干系人account => realname键值对。
  227. * Get the stakeholder account => realname key-value pair.
  228. *
  229. * @param int $objectID
  230. * @access public
  231. * @return array
  232. */
  233. public function getStakeHolderPairs($objectID)
  234. {
  235. return $this->dao->select('t1.user, t2.realname')->from(TABLE_STAKEHOLDER)->alias('t1')
  236. ->leftJoin(TABLE_USER)->alias('t2')->on('t1.user=t2.account')
  237. ->where('t1.deleted')->eq('0')
  238. ->andWhere('t1.objectID')->eq($objectID)
  239. ->orderBy('t1.id_desc')
  240. ->fetchPairs();
  241. }
  242. /**
  243. * 获取按照对象ID分组的干系人列表。
  244. * Get stakeholder group by object id.
  245. *
  246. * @param array $objectIdList
  247. * @access public
  248. * @return array
  249. */
  250. public function getStakeholderGroup($objectIdList)
  251. {
  252. $stakeholders = $this->dao->select('objectID, user')->from(TABLE_STAKEHOLDER)->where('objectID')->in($objectIdList)->andWhere('deleted')->eq('0')->fetchAll();
  253. $stakeholderGroup = array();
  254. foreach($stakeholders as $stakeholder)
  255. {
  256. $stakeholderGroup[$stakeholder->objectID][$stakeholder->user] = $stakeholder->user;
  257. }
  258. return $stakeholderGroup;
  259. }
  260. /**
  261. * 获取父项目集/父项目的干系人列表。
  262. * Get the stakeholder list for the parent program / parent project.
  263. *
  264. * @param array $objectIdList
  265. * @access public
  266. * @return array
  267. */
  268. public function getParentStakeholderGroup($objectIdList)
  269. {
  270. $parents = array();
  271. $objects = $this->loadModel('project')->getListByAcl('private,program', $objectIdList);
  272. foreach($objects as $object)
  273. {
  274. if($object->parent == 0) continue;
  275. foreach(explode(',', $object->path) as $objectID)
  276. {
  277. if(empty($objectID)) continue;
  278. if($objectID == $object->id) continue;
  279. $parents[$objectID][] = $object->id;
  280. }
  281. }
  282. if(empty($parents)) return array();
  283. /* Get all parent stakeholders. */
  284. $parentStakeholders = $this->dao->select('objectID, user')->from(TABLE_STAKEHOLDER)->where('objectID')->in(array_keys($parents))->andWhere('deleted')->eq('0')->fetchAll();
  285. $parentStakeholderGroup = array();
  286. foreach($parentStakeholders as $parentStakeholder)
  287. {
  288. $subPrograms = zget($parents, $parentStakeholder->objectID, array());
  289. foreach($subPrograms as $subProgramID) $parentStakeholderGroup[$subProgramID][$parentStakeholder->user] = $parentStakeholder->user;
  290. }
  291. return $parentStakeholderGroup;
  292. }
  293. /**
  294. * 获取项目按照人员类型分组的干系人列表。
  295. * Get stakeholder group by type.
  296. *
  297. * @access public
  298. * @return array
  299. */
  300. public function getListByType()
  301. {
  302. return $this->dao->select('t2.realname as name, t2.account, t1.type, t2.role')->from(TABLE_STAKEHOLDER)->alias('t1')
  303. ->leftJoin(TABLE_USER)->alias('t2')->on('t1.user=t2.account')
  304. ->where('t1.deleted')->eq('0')
  305. ->andWhere('t1.objectID')->eq($this->session->project)
  306. ->fetchGroup('type');
  307. }
  308. /**
  309. * 获取干系人信息。
  310. * Get stakeholder by id.
  311. *
  312. * @param int $stakeholderID
  313. * @access public
  314. * @return object|bool
  315. */
  316. public function getByID($stakeholderID)
  317. {
  318. return $this->dao->select('t1.*, t2.phone, t2.realname as name, t2.email, t2.qq, t2.weixin, t2.nature, t2.analysis, t2.strategy, t3.name as companyName, t3.id as company')->from(TABLE_STAKEHOLDER)->alias('t1')
  319. ->leftJoin(TABLE_USER)->alias('t2')->on('t1.user=t2.account')
  320. ->leftJoin(TABLE_COMPANY)->alias('t3')->on('t2.company=t3.id')
  321. ->where('t1.id')->eq($stakeholderID)
  322. ->fetch();
  323. }
  324. /**
  325. * 获取项目按照进度分组的活动列表。
  326. * Get group activities.
  327. *
  328. * @access public
  329. * @return array
  330. */
  331. public function getProcessGroup()
  332. {
  333. return $this->dao->select('process, activity')->from(TABLE_PROGRAMACTIVITY)
  334. ->where('project')->eq($this->session->project)
  335. ->andWhere('result')->eq('yes')
  336. ->fetchGroup('process');
  337. }
  338. /**
  339. * 获取进度id=>name的键值对。
  340. * Get the key-value pair of progress id=>name.
  341. *
  342. * @access public
  343. * @return array
  344. */
  345. public function getProcess()
  346. {
  347. return $this->dao->select('id, name')->from(TABLE_PROCESS)
  348. ->where('deleted')->eq(0)
  349. ->fetchPairs();
  350. }
  351. /**
  352. * 获取项目的干预列表信息。
  353. * Get intervention list.
  354. *
  355. * @access public
  356. * @return array
  357. */
  358. public function getPlans()
  359. {
  360. return $this->dao->select('*')->from(TABLE_INTERVENTION)
  361. ->where('deleted')->eq(0)
  362. ->andWhere('project')->eq($this->session->project)
  363. ->fetchAll('activity');
  364. }
  365. /**
  366. * 获取项目下干系人提出的问题列表。
  367. * Get a list of issues owner by stakeholders under the project.
  368. *
  369. * @access public
  370. * @return array
  371. */
  372. public function getIssues()
  373. {
  374. $stakeholders = $this->getStakeHolderPairs($this->session->project);
  375. return $this->dao->select('*')->from(TABLE_ISSUE)
  376. ->where('deleted')->eq(0)
  377. ->andWhere('project')->eq($this->session->project)
  378. ->andWhere('owner')->in(array_keys($stakeholders))
  379. ->orWhere('activity')->ne('')
  380. ->orderBy('id_desc')
  381. ->fetchAll('id');
  382. }
  383. /**
  384. * 获取活动 id=>name 的键值对。
  385. * Get the key-value pair for the activity id=>name.
  386. *
  387. * @access public
  388. * @return array
  389. */
  390. public function getActivities()
  391. {
  392. return $this->dao->select('id, name')->from(TABLE_ACTIVITY)
  393. ->where('deleted')->eq(0)
  394. ->fetchPairs();
  395. }
  396. /**
  397. * 添加一条期望记录。
  398. * Add a expect record.
  399. *
  400. * @param object $data
  401. * @access public
  402. * @return int|bool
  403. */
  404. public function expect($data)
  405. {
  406. $this->dao->insert(TABLE_EXPECT)->data($data)
  407. ->autoCheck()
  408. ->batchCheck($this->config->stakeholder->expect->requiredFields, 'notempty')
  409. ->exec();
  410. if(dao::isError()) return false;
  411. return $this->dao->lastInsertID();
  412. }
  413. /**
  414. * 获取期望列表数据。
  415. * Get expect list.
  416. *
  417. * @param string $browseType all|bysearch
  418. * @param int $queryID
  419. * @param string $orderBy
  420. * @param object $pager
  421. * @access public
  422. * @return array
  423. */
  424. public function getExpectList($browseType = 'all', $queryID = 0, $orderBy = 'id_desc', $pager = null)
  425. {
  426. $stakeholderQuery = '';
  427. if($browseType == 'bysearch')
  428. {
  429. $query = $queryID ? $this->loadModel('search')->getQuery($queryID) : '';
  430. if($query)
  431. {
  432. $this->session->set('stakeholderQuery', $query->sql);
  433. $this->session->set('stakeholderForm', $query->form);
  434. }
  435. if($this->session->stakeholderQuery == false) $this->session->set('stakeholderQuery', ' 1=1');
  436. $stakeholderQuery = $this->session->stakeholderQuery;
  437. }
  438. return $this->dao->select('t1.*,t2.key,t3.realname')->from(TABLE_EXPECT)->alias('t1')
  439. ->leftJoin(TABLE_STAKEHOLDER)->alias('t2')->on('t1.userID=t2.id')
  440. ->leftJoin(TABLE_USER)->alias('t3')->on('t2.user=t3.account')
  441. ->where('t1.project')->eq($this->session->project)
  442. ->beginIF($browseType == 'bysearch')
  443. ->andWhere($stakeholderQuery)
  444. ->fi()
  445. ->andWhere('t1.deleted')->eq('0')
  446. ->orderBy($orderBy)
  447. ->page($pager)
  448. ->fetchAll();
  449. }
  450. /**
  451. * 删除一个期望。
  452. * Delete a expect.
  453. *
  454. * @param int $expectID
  455. * @access public
  456. * @return bool
  457. */
  458. public function deleteExpect($expectID)
  459. {
  460. $this->dao->update(TABLE_EXPECT)->set('deleted')->eq('1')->where('id')->eq($expectID)->exec();
  461. return !dao::isError();
  462. }
  463. /**
  464. * 获取项目下干系人field=>realname的键值对。
  465. * Get a key-value pair for stakeholder field=>realname under the project.
  466. *
  467. * @access public
  468. * @return array
  469. * @param string $field
  470. */
  471. public function getStakeholderUsers($field = 'id')
  472. {
  473. return $this->dao->select("t1.{$field}, CONCAT_WS('/', t3.name,t2.realname) as realname")->from(TABLE_STAKEHOLDER)->alias('t1')
  474. ->leftJoin(TABLE_USER)->alias('t2')->on('t1.user=t2.account')
  475. ->leftJoin(TABLE_COMPANY)->alias('t3')->on('t2.company=t3.id')
  476. ->where('t1.objectID')->eq($this->session->project)
  477. ->andWhere('t1.deleted')->eq('0')
  478. ->fetchPairs($field, 'realname');
  479. }
  480. /**
  481. * 通过ID获取期望详情。
  482. * Get expect detail by ID.
  483. *
  484. * @param int $expectID
  485. * @access public
  486. * @return object|bool
  487. */
  488. public function getExpectByID($expectID = 0)
  489. {
  490. return $this->dao->select('*')->from(TABLE_EXPECT)->where('id')->eq($expectID)->andWhere('deleted')->eq('0')->fetch();
  491. }
  492. /**
  493. * 获取给定用户ID的期望信息。
  494. * Get the expect information by user ID.
  495. *
  496. * @param int $userID
  497. * @access public
  498. * @return array
  499. */
  500. public function getExpectByUser($userID = 0)
  501. {
  502. return $this->dao->select('*')->from(TABLE_EXPECT)
  503. ->where('userID')->eq($userID)
  504. ->andWhere('deleted')->eq('0')
  505. ->orderBy('id_desc')
  506. ->fetchAll('id', false);
  507. }
  508. /**
  509. * 获取给定干系人在当前项目下的问题信息。
  510. * Get the issue information by account.
  511. *
  512. * @param string $account
  513. * @access public
  514. * @return array
  515. */
  516. public function getStakeholderIssue($account)
  517. {
  518. return $this->dao->select('*')->from(TABLE_ISSUE)
  519. ->where('project')->eq($this->session->project)
  520. ->andWhere('owner')->eq($account)
  521. ->andWhere('deleted')->eq('0')
  522. ->orderBy('id_desc')
  523. ->fetchAll();
  524. }
  525. /**
  526. * 判断当前操作按钮是否可以点击。
  527. * Judge the action is clickable.
  528. *
  529. * @param object $stakeholder
  530. * @param string $action
  531. * @access public
  532. * @return bool
  533. */
  534. public static function isClickable($stakeholder, $action)
  535. {
  536. /* Judge the object whether can be changed. */
  537. $canChange = common::canBeChanged('stakeholder', $stakeholder);
  538. if(!$canChange) return false;
  539. global $config;
  540. $action = strtolower($action);
  541. /* Special action can be set its own condition. */
  542. if($action == 'notexists') return false;
  543. if($action == 'userissue' && !in_array($config->edition, array('max', 'ipd'))) return false;
  544. /* The action is clickable by default. */
  545. return true;
  546. }
  547. }