| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- <?php
- dol_include_once('/documentfollower/class/documentfollowerprocess.class.php');
- dol_include_once('/documentfollower/class/dfprocessuserhandler.class.php');
- dol_include_once('/documentfollower/class/documentfollowerprocessstate.class.php');
- class DfProcessPermissionHandler
- {
- public $user;
- public $db;
- public function __construct()
- {
- global $user, $db;
- $this->user = $user;
- $this->db = $db;
- }
- /**
- *
- */
- public function hasViewPermission(DocumentFollowerProcess $process): bool
- {
- // get users from levels
- $userIds = (new DfProcessUserHandler($process->id))->getLevelMembers($process->id);
- return in_array(intval($this->user->id), $userIds);
- }
- /**
- *
- */
- public function anyoneFromTheGroupAssignedItToThemselves(DocumentFollowerProcess $process): bool
- {
- $assigned = false;
- $userData = (new DfProcessUserHandler($process->id))->getUserDataInProcess($this->user->id);
- if ($userData && $userData->fk_usergroup) {
- $group = new UserGroup($this->db);
- if ($group->fetch($userData->fk_usergroup) > 0) {
- if (!empty($group->members)) {
- $groupMemberIds = array_keys($group->members);
- // remove user's ID
- if (($key = array_search($this->user->id, $groupMemberIds)) !== false) {
- unset($groupMemberIds[$key]);
- }
- if (!empty($groupMemberIds)) {
- $userIds = implode(',', $groupMemberIds);
- $states = (new DocumentFollowerProcessState($this->db))->fetchAll('DESC', 'rowid', 0, 0, [
- 'fk_process' => $process->id,
- 'is_active' => 1,
- 'customsql' => "fk_user_creat IN ({$userIds})"
- ]);
- if (is_array($states) && !empty($states)) {
- $assigned = true;
- }
- }
- }
- }
-
- }
- return $assigned;
- }
- /**
- *
- */
- public function userCouldAccessLookButton(DocumentFollowerProcess $process): bool
- {
- $states = (new DocumentFollowerProcessState($this->db))->fetchAll('DESC', 'rowid', 0, 0, [
- 'fk_process' => $process->id,
- 'is_active' => 1,
- 'fk_user_creat' => $this->user->id
- ]);
- $assignedToGroupMember = $this->anyoneFromTheGroupAssignedItToThemselves($process);
- return (((is_array($states) && empty($states)) || $states < 0) && $this->userIsOnActiveLevel($process) && !$assignedToGroupMember);
- }
- /**
- *
- */
- public function userCouldAccessSignButton(DocumentFollowerProcess $process): bool
- {
- return $this->userHadAnSignOrReturnState($process);
- }
- /**
- *
- */
- public function userCouldAccessReturnButton(DocumentFollowerProcess $process): bool
- {
- return $this->userHadAnSignOrReturnState($process);
- }
- /**
- *
- */
- private function userHadAnSignOrReturnState(DocumentFollowerProcess $process): bool
- {
- $hasAccess = true;
- $states = (new DocumentFollowerProcessState($this->db))->fetchAll('DESC', 'rowid', 0, 0, [
- 'fk_process' => $process->id,
- 'is_active' => 1,
- 'fk_user_creat' => $this->user->id,
- 'customsql' => 'status IN ('.DfProcessAjaxHandler::OPERATION_SIGN.', '.DfProcessAjaxHandler::OPERATION_RESTORE.')'
- ]);
- if (is_array($states) && !empty($states)) {
- $state = reset($states);
- $restores = (new DocumentFollowerProcessState($this->db))->fetchAll('DESC', 'rowid', 0, 0, [
- 'fk_process' => $process->id,
- 'is_active' => 1,
- 'customsql' => 'status IN ('.DfProcessAjaxHandler::OPERATION_RESTORE.') AND rowid > '.$state->id
- ]);
- if (!is_array($restores)) {
- $hasAccess = false;
- }
- }
- $assignedToGroupMember = $this->anyoneFromTheGroupAssignedItToThemselves($process);
- if ($assignedToGroupMember) {
- $hasAccess = false;
- }
- return ($hasAccess && $this->userIsOnActiveLevel($process));
- }
- /**
- *
- */
- private function userIsOnActiveLevel(DocumentFollowerProcess $process): bool
- {
- $userData = (new DfProcessUserHandler($process->id))->getUserDataInProcess($this->user->id);
- $currentLevel = (new DfProcessHandler())->getProcessCurrentLevel($process);
- return ($currentLevel == $userData->level);
- }
- }
|