entityManager = $entityManager; $this->entityType = $entityType; $this->actionId = $actionId; $this->workflowId = $workflowId; $this->flowchartId = $flowchartId; } /** * @param array|WhereItem|null $whereClause * @return array * @throws Error */ public function getAssignmentAttributes( Entity $entity, string $targetTeamId, ?string $targetUserPosition, ?string $listReportId = null, $whereClause = null ): array { $team = $this->entityManager->getEntityById(Team::ENTITY_TYPE, $targetTeamId); if (!$team) { throw new Error('RoundRobin: No team with id ' . $targetTeamId); } $where = [ 'isActive' => true, ]; if ($targetUserPosition) { $where['@relation.role'] = $targetUserPosition; } $userList = $this->entityManager ->getRDBRepository(Team::ENTITY_TYPE) ->getRelation($team, 'users') ->select('id') ->order('id') ->where($where) ->find(); if (is_countable($userList) && count($userList) === 0) { throw new Error('RoundRobin: No users found in team ' . $targetTeamId); } $userIdList = []; foreach ($userList as $user) { $userIdList[] = $user->getId(); } // @todo lock table ? $lastUserId = $this->getLastUserId(); if ($lastUserId === null) { $num = 0; } else { $num = array_search($lastUserId, $userIdList); if ($num === false || $num == count($userIdList) - 1) { $num = 0; } else { $num++; } } $userId = $userIdList[$num]; $this->storeLastUserId($userId); $attributes = ['assignedUserId' => $userId]; if ($attributes['assignedUserId']) { /** @var ?User $user */ $user = $this->entityManager->getEntityById(User::ENTITY_TYPE, $attributes['assignedUserId']); if ($user) { $attributes['assignedUserName'] = $user->getName(); } } return $attributes; } private function getLastUserId(): ?string { $item = $this->entityManager ->getRDBRepository(WorkflowRoundRobin::ENTITY_TYPE) ->select(['lastUserId']) ->where([ 'actionId' => $this->actionId, 'workflowId' => $this->workflowId, 'flowchartId' => $this->flowchartId, ]) ->findOne(); if (!$item) { return null; } return $item->get('lastUserId'); } private function storeLastUserId(string $userId): void { $item = $this->entityManager ->getRDBRepository(WorkflowRoundRobin::ENTITY_TYPE) ->select(['id', 'lastUserId']) ->where([ 'actionId' => $this->actionId, 'workflowId' => $this->workflowId, 'flowchartId' => $this->flowchartId, ]) ->findOne(); if (!$item) { $this->entityManager->createEntity(WorkflowRoundRobin::ENTITY_TYPE, [ 'actionId' => $this->actionId, 'lastUserId' => $userId, 'entityType' => $this->entityType, 'workflowId' => $this->workflowId, 'flowchartId' => $this->flowchartId, ]); return; } $item->set('lastUserId', $userId); $this->entityManager->saveEntity($item); } }