dfprocesshandler.class.php 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. <?php
  2. dol_include_once('/documentfollower/class/documentfollowerprocess.class.php');
  3. dol_include_once('/documentfollower/class/documentfollowerprocessstate.class.php');
  4. dol_include_once('/documentfollower/class/documentfollowerprocessuser.class.php');
  5. dol_include_once('/documentfollower/class/dfprocessajaxhandler.class.php');
  6. class DfProcessHandler
  7. {
  8. public $db;
  9. public $user;
  10. /**
  11. *
  12. */
  13. public function __construct()
  14. {
  15. global $db, $user;
  16. $this->db = $db;
  17. $this->user = $user;
  18. }
  19. /**
  20. *
  21. */
  22. public function getProcessLog(DocumentFollowerProcess $process): array
  23. {
  24. $log = [];
  25. $rows = (new DocumentFollowerProcessState($this->db))->fetchAll('DESC', 'date_creation', 0, 0, [
  26. 'fk_process' => $process->id
  27. ]);
  28. if (is_array($rows)) {
  29. foreach ($rows as $row) {
  30. $userData = $this->getLogUserData($row->fk_user_creat);
  31. $levelData = $this->getLogLevelData($row->fk_user_creat, $process->id);
  32. if (isset($levelData['user_group'])) {
  33. $userData['user_group'] = $levelData['user_group'];
  34. }
  35. $data = [
  36. 'user' => $userData,
  37. 'level' => $levelData,
  38. 'date' => $row->date_creation,
  39. 'status' => $this->getLogStatusData($row)
  40. ];
  41. if ($row->return_level) {
  42. $data['return'] = $this->getLogReturnData($process->id, $row->return_level);
  43. }
  44. $log[] = $data;
  45. }
  46. }
  47. return $log;
  48. }
  49. /**
  50. *
  51. */
  52. private function getLogReturnData(int $processId, int $level): array
  53. {
  54. global $langs;
  55. $res = ['level' => $level];
  56. $condition = [
  57. 'fk_process' => $processId,
  58. 'level' => $level
  59. ];
  60. $levelUsers = (new DocumentFollowerProcessUser($this->db))->fetchAll('', '', 0, 0, $condition);
  61. if ($levelUsers) {
  62. $res['names'] = array_map(
  63. function ($item) use ($langs) {
  64. $name = '';
  65. if ($item->fk_usergroup) {
  66. $group = new UserGroup($this->db);
  67. $group->fetch($item->fk_usergroup);
  68. $name = $group->name;
  69. } else {
  70. $user = new User($this->db);
  71. $user->fetch($item->fk_user);
  72. $name = $user->getFullName($langs);
  73. }
  74. return $name;
  75. },
  76. $levelUsers
  77. );
  78. }
  79. return $res;
  80. }
  81. /**
  82. *
  83. */
  84. private function getLogStatusData(DocumentFollowerProcessState $state): array
  85. {
  86. $dict = array_map(
  87. 'strval',
  88. $state->fields['status']['arrayofkeyval']
  89. );
  90. return [
  91. 'status' => $state->status,
  92. 'label' => $dict[$state->status]
  93. ];
  94. }
  95. /**
  96. *
  97. */
  98. private function getLogLevelData(int $userId, int $processId): array
  99. {
  100. $result = [];
  101. $processUser = $this->getProcessUserData($processId, $userId);
  102. if (!$processUser) {
  103. $userGroups = (new UserGroup($this->db))->listGroupsForUser($userId);
  104. if (!empty($userGroups)) {
  105. $userGroupIds = array_column($userGroups, 'id');
  106. $processUser = $this->getProcessUserData($processId, null, $userGroupIds);
  107. }
  108. }
  109. if ($processUser) {
  110. $result = [
  111. 'id' => $processUser->id,
  112. 'level' => $processUser->level
  113. ];
  114. if ($processUser->fk_usergroup) {
  115. $uGroupId = $processUser->fk_usergroup;
  116. // user can be a member of several groups
  117. $group = array_filter($userGroups, function ($uGroup) use ($uGroupId) {
  118. return ($uGroup->id == $uGroupId);
  119. });
  120. $group = reset($group);
  121. $result['user_group'] = $group->nom;
  122. }
  123. }
  124. return $result;
  125. }
  126. /**
  127. *
  128. */
  129. private function getProcessUserData(int $processId, int $userId = null, array $userGroupIds = []): ?DocumentFollowerProcessUser
  130. {
  131. $result = null;
  132. $condition = [
  133. 'fk_process' => $processId
  134. ];
  135. if ($userId) {
  136. $condition['fk_user'] = $userId;
  137. }
  138. if (!empty($userGroupIds)) {
  139. $condition['customsql'] = 'fk_usergroup IN ('.implode(',', $userGroupIds).')';
  140. }
  141. $processUser = (new DocumentFollowerProcessUser($this->db))->fetchAll('', '', 0, 0, $condition);
  142. if (is_array($processUser) && !empty($processUser)) {
  143. $result = reset($processUser);
  144. }
  145. return $result;
  146. }
  147. /**
  148. *
  149. */
  150. private function getLogUserData(int $id): array
  151. {
  152. global $langs;
  153. $user = new User($this->db);
  154. $user->fetch($id);
  155. return [
  156. 'id' => $user->id,
  157. 'name' => $user->getFullName($langs),
  158. 'email' => $user->email
  159. ];
  160. }
  161. /**
  162. *
  163. */
  164. public function getProcessSummarySite(DocumentFollowerProcess $process): string
  165. {
  166. return 'https://'.$_SERVER['HTTP_HOST'].'/custom/documentfollower/dfwizard.php?action=summary&id='.$process->id;
  167. }
  168. /**
  169. *
  170. */
  171. public function getProcessSignSite(DocumentFollowerProcess $process): string
  172. {
  173. return 'https://'.$_SERVER['HTTP_HOST'].'/custom/documentfollower/dfprocess.php?id='.$process->id.'&ref='.$process->ref;
  174. }
  175. /**
  176. *
  177. */
  178. public function getProcessEditSite(DocumentFollowerProcess $process): string
  179. {
  180. return 'https://'.$_SERVER['HTTP_HOST'].'/custom/documentfollower/dfwizard.php?action=create&id='.$process->id;
  181. }
  182. /**
  183. *
  184. */
  185. public function getListUrl(DocumentFollowerProcess $process): string
  186. {
  187. return ($process->status == 0) ? $this->getProcessEditSite($process) : $this->getProcessSummarySite($process);
  188. }
  189. /**
  190. *
  191. */
  192. public function getProcessCurrentLevel(DocumentFollowerProcess $process): int
  193. {
  194. $activeLevel = 1;
  195. $states = (new DocumentFollowerProcessState($this->db))->fetchAll('DESC', 'date_creation', 1, 0, [
  196. 'fk_process' => $process->id,
  197. //'is_active' => 1
  198. ]);
  199. if (is_array($states) && !empty($states)) {
  200. $lastActiveState = reset($states);
  201. if ($lastActiveState->return_level) {
  202. $activeLevel = $lastActiveState->return_level;
  203. } else {
  204. $userId = $lastActiveState->fk_user_creat;
  205. $groupIds = [];
  206. $groups = (new UserGroup($this->db))->listGroupsForUser($userId, false);
  207. $customSql = "fk_user={$userId}";
  208. if (!empty($groups)) {
  209. $groupIds = implode(',', array_keys($groups));
  210. $customSql = "({$customSql} OR fk_usergroup IN (".$groupIds."))";
  211. }
  212. $condition = [
  213. 'fk_process' => $process->id,
  214. 'customsql' => $customSql
  215. ];
  216. $processUsers = (new DocumentFollowerProcessUser($this->db))->fetchAll('', '', 0, 0, $condition);
  217. if (!empty($processUsers)) {
  218. $processUser = reset($processUsers);
  219. $activeLevel = $processUser->level;
  220. if ($this->checkEverybodySignedTheLevel($process, $processUser->level)) {
  221. $lastLevel = (new DfProcessUserHandler($process->id))->getLastLevel();
  222. if ($activeLevel < $lastLevel) {
  223. $activeLevel++;
  224. }
  225. }
  226. }
  227. }
  228. }
  229. return $activeLevel;
  230. }
  231. /**
  232. *
  233. */
  234. public function checkEverybodySignedTheLevel(DocumentFollowerProcess $process, int $level): bool
  235. {
  236. $everybodySigned = false;
  237. // number of assigned users and/or groups
  238. $levelUsers = (new DocumentFollowerProcessUser($this->db))->fetchAll('ASC', 'level', 0, 0, [
  239. 'level' => $level,
  240. 'fk_process' => $process->id
  241. ]);
  242. // possible users on this level (including all members of usergroups)
  243. $userIds = (new DfProcessUserHandler($process->id))->getLevelMembers($process->id, $level);
  244. if (empty($userIds)) {
  245. $everybodySigned = true;
  246. } else {
  247. // get signed status rows
  248. $signed = (new DocumentFollowerProcessState($this->db))->fetchAll('', '', 0, 0, [
  249. 'fk_process' => $process->id,
  250. 'is_active' => 1,
  251. 'status' => DfProcessAjaxHandler::OPERATION_SIGN,
  252. 'customsql' => 'fk_user_creat IN ('.implode(',', $userIds).')'
  253. ]);
  254. $everybodySigned = (count($signed) >= count($levelUsers));
  255. }
  256. return $everybodySigned;
  257. }
  258. }