5use Bitrix\HumanResources\Builder\Structure\Filter\Column\EntityIdFilter;
6use Bitrix\HumanResources\Builder\Structure\Filter\Column\Node\NodeTypeFilter;
7use Bitrix\HumanResources\Builder\Structure\Filter\NodeFilter;
8use Bitrix\HumanResources\Builder\Structure\Filter\NodeMemberFilter;
9use Bitrix\HumanResources\Builder\Structure\NodeMemberDataBuilder;
10use Bitrix\HumanResources\Config\Storage;
11use Bitrix\HumanResources\Item\Collection\NodeMemberCollection;
12use Bitrix\HumanResources\Service\Container;
13use Bitrix\HumanResources\Type\IntegerCollection;
14use Bitrix\HumanResources\Type\MemberEntityType;
15use Bitrix\HumanResources\Type\NodeEntityType;
16use Bitrix\HumanResources\Type\NodeEntityTypeCollection;
30 "ID" => self::PROVIDER_ID,
31 "CLASS" => self::class,
38 $this->
id = self::PROVIDER_ID;
47 && Storage::instance()->isCompanyStructureConverted()
50 $this->updateCodesByHr(
$userId);
55 $iblockId = \COption::GetOptionInt(
'intranet',
'iblock_structure');
58 $tableName =
"b_uts_iblock_".
$iblockId .
"_section";
60 if (!
$DB->TableExists($tableName))
74 while ($row =
$res->fetch())
76 $id = (int) $row[
'VALUE_ID'];
78 $sql = $helper->getInsertIgnore(
80 '(USER_ID, PROVIDER_ID, ACCESS_CODE)',
82 ('.
$userId.
',\''.$this->id.
'\',\
''.AccessCode::ACCESS_DIRECTOR.
'0\'),
83 ('.
$userId.
',\''.$this->id.
'\',\
''.AccessCode::ACCESS_DIRECTOR.$id.
'\')
'
90 private function updateCodesByHr(int $userId): void
92 $roleHelperService = Container::getRoleHelperService();
93 $roleCollection = $roleHelperService->getAllRoleCollectionForSync();
94 if ($roleCollection->empty())
99 $getMemberCollectionByNodeType =
100 static fn(NodeEntityType $nodeType) =>
101 (new NodeMemberDataBuilder())
103 new NodeMemberFilter(
104 entityIdFilter: EntityIdFilter::fromEntityId($userId),
105 entityType: MemberEntityType::USER,
106 nodeFilter: new NodeFilter(
107 entityTypeFilter: NodeTypeFilter::fromNodeTypes([$nodeType]),
109 findRelatedMembers: false,
118 $departmentMemberCollection = $getMemberCollectionByNodeType(NodeEntityType::DEPARTMENT);
119 if (!$departmentMemberCollection->empty())
121 $accessCodeSet[AccessCode::ACCESS_EMPLOYEE . '0
'] = true;
124 $teamMemberCollection = $getMemberCollectionByNodeType(NodeEntityType::TEAM);
125 if (!$teamMemberCollection->empty())
127 $accessCodeSet[AccessCode::ACCESS_TEAM_EMPLOYEE . '0
'] = true;
130 $nodeMemberCollection = new NodeMemberCollection(...[
131 ...$departmentMemberCollection->getValues(),
132 ...$teamMemberCollection->getValues(),
135 foreach ($nodeMemberCollection as $nodeMember)
137 if ($nodeMember->entityType !== MemberEntityType::USER)
142 $neededRoleIds = array_intersect($roleCollection->getKeys(), $nodeMember->roles);
143 if (empty($neededRoleIds))
148 $userId = $nodeMember->entityId;
150 foreach ($neededRoleIds as $roleId)
152 $role = $roleCollection->getItemById($roleId);
158 $type = $roleHelperService->getAccessCodeByRoleXmlId($role->xmlId);
164 $accessCode = $type . $nodeMember->nodeId;
166 $accessCodeSet[$type . '0
'] = true;
167 $accessCodeSet[$accessCode] = true;
172 $accessCodes = array_keys($accessCodeSet);
173 foreach ($accessCodes as $accessCode)
175 $insertValues[] = "($userId, '$this->
id', '$accessCode
')";
178 if (!empty($insertValues))
180 $connection = Application::getConnection();
181 $helper = $connection->getSqlHelper();
183 $sql = $helper->getInsertIgnore(
192 $connection->query($sql);
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
static getConnection($name="")
static includeModule($moduleName)