| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299 |
- <?php
- dol_include_once('/documentfollower/class/documentfollowerprocess.class.php');
- dol_include_once('/documentfollower/class/documentfollowerprocessstate.class.php');
- dol_include_once('/documentfollower/class/documentfollowerprocessuser.class.php');
- dol_include_once('/documentfollower/class/dfprocessajaxhandler.class.php');
- class DfProcessHandler
- {
- public $db;
- public $user;
- /**
- *
- */
- public function __construct()
- {
- global $db, $user;
- $this->db = $db;
- $this->user = $user;
- }
- /**
- *
- */
- public function getProcessLog(DocumentFollowerProcess $process): array
- {
- $log = [];
- $rows = (new DocumentFollowerProcessState($this->db))->fetchAll('DESC', 'date_creation', 0, 0, [
- 'fk_process' => $process->id
- ]);
- if (is_array($rows)) {
- foreach ($rows as $row) {
- $userData = $this->getLogUserData($row->fk_user_creat);
- $levelData = $this->getLogLevelData($row->fk_user_creat, $process->id);
- if (isset($levelData['user_group'])) {
- $userData['user_group'] = $levelData['user_group'];
- }
- $data = [
- 'user' => $userData,
- 'level' => $levelData,
- 'date' => $row->date_creation,
- 'status' => $this->getLogStatusData($row)
- ];
- if ($row->return_level) {
- $data['return'] = $this->getLogReturnData($process->id, $row->return_level);
- }
- $log[] = $data;
- }
- }
- return $log;
- }
- /**
- *
- */
- private function getLogReturnData(int $processId, int $level): array
- {
- global $langs;
- $res = ['level' => $level];
- $condition = [
- 'fk_process' => $processId,
- 'level' => $level
- ];
- $levelUsers = (new DocumentFollowerProcessUser($this->db))->fetchAll('', '', 0, 0, $condition);
- if ($levelUsers) {
- $res['names'] = array_map(
- function ($item) use ($langs) {
- $name = '';
- if ($item->fk_usergroup) {
- $group = new UserGroup($this->db);
- $group->fetch($item->fk_usergroup);
- $name = $group->name;
- } else {
- $user = new User($this->db);
- $user->fetch($item->fk_user);
- $name = $user->getFullName($langs);
- }
- return $name;
- },
- $levelUsers
- );
- }
- return $res;
- }
- /**
- *
- */
- private function getLogStatusData(DocumentFollowerProcessState $state): array
- {
- $dict = array_map(
- 'strval',
- $state->fields['status']['arrayofkeyval']
- );
- return [
- 'status' => $state->status,
- 'label' => $dict[$state->status]
- ];
- }
- /**
- *
- */
- private function getLogLevelData(int $userId, int $processId): array
- {
- $result = [];
- $processUser = $this->getProcessUserData($processId, $userId);
- if (!$processUser) {
- $userGroups = (new UserGroup($this->db))->listGroupsForUser($userId);
- if (!empty($userGroups)) {
- $userGroupIds = array_column($userGroups, 'id');
- $processUser = $this->getProcessUserData($processId, null, $userGroupIds);
- }
- }
- if ($processUser) {
- $result = [
- 'id' => $processUser->id,
- 'level' => $processUser->level
- ];
- if ($processUser->fk_usergroup) {
- $uGroupId = $processUser->fk_usergroup;
- // user can be a member of several groups
- $group = array_filter($userGroups, function ($uGroup) use ($uGroupId) {
- return ($uGroup->id == $uGroupId);
- });
- $group = reset($group);
- $result['user_group'] = $group->nom;
- }
- }
- return $result;
- }
- /**
- *
- */
- private function getProcessUserData(int $processId, int $userId = null, array $userGroupIds = []): ?DocumentFollowerProcessUser
- {
- $result = null;
- $condition = [
- 'fk_process' => $processId
- ];
- if ($userId) {
- $condition['fk_user'] = $userId;
- }
- if (!empty($userGroupIds)) {
- $condition['customsql'] = 'fk_usergroup IN ('.implode(',', $userGroupIds).')';
- }
- $processUser = (new DocumentFollowerProcessUser($this->db))->fetchAll('', '', 0, 0, $condition);
- if (is_array($processUser) && !empty($processUser)) {
- $result = reset($processUser);
- }
- return $result;
- }
- /**
- *
- */
- private function getLogUserData(int $id): array
- {
- global $langs;
- $user = new User($this->db);
- $user->fetch($id);
- return [
- 'id' => $user->id,
- 'name' => $user->getFullName($langs),
- 'email' => $user->email
- ];
- }
- /**
- *
- */
- public function getProcessSummarySite(DocumentFollowerProcess $process): string
- {
- return 'https://'.$_SERVER['HTTP_HOST'].'/custom/documentfollower/dfwizard.php?action=summary&id='.$process->id;
- }
- /**
- *
- */
- public function getProcessSignSite(DocumentFollowerProcess $process): string
- {
- return 'https://'.$_SERVER['HTTP_HOST'].'/custom/documentfollower/dfprocess.php?id='.$process->id.'&ref='.$process->ref;
- }
- /**
- *
- */
- public function getProcessEditSite(DocumentFollowerProcess $process): string
- {
- return 'https://'.$_SERVER['HTTP_HOST'].'/custom/documentfollower/dfwizard.php?action=create&id='.$process->id;
- }
- /**
- *
- */
- public function getListUrl(DocumentFollowerProcess $process): string
- {
- return ($process->status == 0) ? $this->getProcessEditSite($process) : $this->getProcessSummarySite($process);
- }
- /**
- *
- */
- public function getProcessCurrentLevel(DocumentFollowerProcess $process): int
- {
- $activeLevel = 1;
- $states = (new DocumentFollowerProcessState($this->db))->fetchAll('DESC', 'date_creation', 1, 0, [
- 'fk_process' => $process->id,
- //'is_active' => 1
- ]);
- if (is_array($states) && !empty($states)) {
- $lastActiveState = reset($states);
-
- if ($lastActiveState->return_level) {
- $activeLevel = $lastActiveState->return_level;
- } else {
- $userId = $lastActiveState->fk_user_creat;
- $groupIds = [];
- $groups = (new UserGroup($this->db))->listGroupsForUser($userId, false);
- $customSql = "fk_user={$userId}";
- if (!empty($groups)) {
- $groupIds = implode(',', array_keys($groups));
- $customSql = "({$customSql} OR fk_usergroup IN (".$groupIds."))";
- }
- $condition = [
- 'fk_process' => $process->id,
- 'customsql' => $customSql
- ];
- $processUsers = (new DocumentFollowerProcessUser($this->db))->fetchAll('', '', 0, 0, $condition);
- if (!empty($processUsers)) {
- $processUser = reset($processUsers);
- $activeLevel = $processUser->level;
- if ($this->checkEverybodySignedTheLevel($process, $processUser->level)) {
- $lastLevel = (new DfProcessUserHandler($process->id))->getLastLevel();
- if ($activeLevel < $lastLevel) {
- $activeLevel++;
- }
- }
- }
- }
- }
- return $activeLevel;
- }
- /**
- *
- */
- public function checkEverybodySignedTheLevel(DocumentFollowerProcess $process, int $level): bool
- {
- $everybodySigned = false;
- // number of assigned users and/or groups
- $levelUsers = (new DocumentFollowerProcessUser($this->db))->fetchAll('ASC', 'level', 0, 0, [
- 'level' => $level,
- 'fk_process' => $process->id
- ]);
- // possible users on this level (including all members of usergroups)
- $userIds = (new DfProcessUserHandler($process->id))->getLevelMembers($process->id, $level);
- if (empty($userIds)) {
- $everybodySigned = true;
- } else {
- // get signed status rows
- $signed = (new DocumentFollowerProcessState($this->db))->fetchAll('', '', 0, 0, [
- 'fk_process' => $process->id,
- 'is_active' => 1,
- 'status' => DfProcessAjaxHandler::OPERATION_SIGN,
- 'customsql' => 'fk_user_creat IN ('.implode(',', $userIds).')'
- ]);
- $everybodySigned = (count($signed) >= count($levelUsers));
- }
- return $everybodySigned;
- }
- }
|