dfprocesspermissionhandler.class.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <?php
  2. dol_include_once('/documentfollower/class/documentfollowerprocess.class.php');
  3. dol_include_once('/documentfollower/class/dfprocessuserhandler.class.php');
  4. dol_include_once('/documentfollower/class/documentfollowerprocessstate.class.php');
  5. class DfProcessPermissionHandler
  6. {
  7. public $user;
  8. public $db;
  9. public function __construct()
  10. {
  11. global $user, $db;
  12. $this->user = $user;
  13. $this->db = $db;
  14. }
  15. /**
  16. *
  17. */
  18. public function hasViewPermission(DocumentFollowerProcess $process): bool
  19. {
  20. // get users from levels
  21. $userIds = (new DfProcessUserHandler($process->id))->getLevelMembers($process->id);
  22. return in_array(intval($this->user->id), $userIds);
  23. }
  24. /**
  25. *
  26. */
  27. public function anyoneFromTheGroupAssignedItToThemselves(DocumentFollowerProcess $process): bool
  28. {
  29. $assigned = false;
  30. $userData = (new DfProcessUserHandler($process->id))->getUserDataInProcess($this->user->id);
  31. if ($userData && $userData->fk_usergroup) {
  32. $group = new UserGroup($this->db);
  33. if ($group->fetch($userData->fk_usergroup) > 0) {
  34. if (!empty($group->members)) {
  35. $groupMemberIds = array_keys($group->members);
  36. // remove user's ID
  37. if (($key = array_search($this->user->id, $groupMemberIds)) !== false) {
  38. unset($groupMemberIds[$key]);
  39. }
  40. if (!empty($groupMemberIds)) {
  41. $userIds = implode(',', $groupMemberIds);
  42. $states = (new DocumentFollowerProcessState($this->db))->fetchAll('DESC', 'rowid', 0, 0, [
  43. 'fk_process' => $process->id,
  44. 'is_active' => 1,
  45. 'customsql' => "fk_user_creat IN ({$userIds})"
  46. ]);
  47. if (is_array($states) && !empty($states)) {
  48. $assigned = true;
  49. }
  50. }
  51. }
  52. }
  53. }
  54. return $assigned;
  55. }
  56. /**
  57. *
  58. */
  59. public function userCouldAccessLookButton(DocumentFollowerProcess $process): bool
  60. {
  61. $states = (new DocumentFollowerProcessState($this->db))->fetchAll('DESC', 'rowid', 0, 0, [
  62. 'fk_process' => $process->id,
  63. 'is_active' => 1,
  64. 'fk_user_creat' => $this->user->id
  65. ]);
  66. $assignedToGroupMember = $this->anyoneFromTheGroupAssignedItToThemselves($process);
  67. return (((is_array($states) && empty($states)) || $states < 0) && $this->userIsOnActiveLevel($process) && !$assignedToGroupMember);
  68. }
  69. /**
  70. *
  71. */
  72. public function userCouldAccessSignButton(DocumentFollowerProcess $process): bool
  73. {
  74. return $this->userHadAnSignOrReturnState($process);
  75. }
  76. /**
  77. *
  78. */
  79. public function userCouldAccessReturnButton(DocumentFollowerProcess $process): bool
  80. {
  81. return $this->userHadAnSignOrReturnState($process);
  82. }
  83. /**
  84. *
  85. */
  86. private function userHadAnSignOrReturnState(DocumentFollowerProcess $process): bool
  87. {
  88. $hasAccess = true;
  89. $states = (new DocumentFollowerProcessState($this->db))->fetchAll('DESC', 'rowid', 0, 0, [
  90. 'fk_process' => $process->id,
  91. 'is_active' => 1,
  92. 'fk_user_creat' => $this->user->id,
  93. 'customsql' => 'status IN ('.DfProcessAjaxHandler::OPERATION_SIGN.', '.DfProcessAjaxHandler::OPERATION_RESTORE.')'
  94. ]);
  95. if (is_array($states) && !empty($states)) {
  96. $state = reset($states);
  97. $restores = (new DocumentFollowerProcessState($this->db))->fetchAll('DESC', 'rowid', 0, 0, [
  98. 'fk_process' => $process->id,
  99. 'is_active' => 1,
  100. 'customsql' => 'status IN ('.DfProcessAjaxHandler::OPERATION_RESTORE.') AND rowid > '.$state->id
  101. ]);
  102. if (!is_array($restores)) {
  103. $hasAccess = false;
  104. }
  105. }
  106. $assignedToGroupMember = $this->anyoneFromTheGroupAssignedItToThemselves($process);
  107. if ($assignedToGroupMember) {
  108. $hasAccess = false;
  109. }
  110. return ($hasAccess && $this->userIsOnActiveLevel($process));
  111. }
  112. /**
  113. *
  114. */
  115. private function userIsOnActiveLevel(DocumentFollowerProcess $process): bool
  116. {
  117. $userData = (new DfProcessUserHandler($process->id))->getUserDataInProcess($this->user->id);
  118. $currentLevel = (new DfProcessHandler())->getProcessCurrentLevel($process);
  119. return ($currentLevel == $userData->level);
  120. }
  121. }