1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
accessauthprovider.php
См. документацию.
1<?php
2
4
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;
17
21
23{
24 protected const PROVIDER_ID = 'access';
25
26 public static function GetProviders()
27 {
28 return [
29 [
30 "ID" => self::PROVIDER_ID,
31 "CLASS" => self::class,
32 ]
33 ];
34 }
35
36 public function __construct()
37 {
38 $this->id = self::PROVIDER_ID;
39 }
40
41 public function UpdateCodes($userId)
42 {
43 global $DB;
44
45 if (
46 Loader::includeModule('humanresources')
47 && Storage::instance()->isCompanyStructureConverted()
48 )
49 {
50 $this->updateCodesByHr($userId);
51
52 return null;
53 }
54
55 $iblockId = \COption::GetOptionInt('intranet', 'iblock_structure');
56 if ($iblockId > 0)
57 {
58 $tableName = "b_uts_iblock_". $iblockId ."_section";
59
60 if (!$DB->TableExists($tableName))
61 {
62 return null;
63 }
64
65 $res = $DB->query("
66 SELECT VALUE_ID
67 FROM ". $tableName ."
68 WHERE UF_HEAD = " . $userId
69 );
70
72 $helper = $connection->getSqlHelper();
73
74 while ($row = $res->fetch())
75 {
76 $id = (int) $row['VALUE_ID'];
77
78 $sql = $helper->getInsertIgnore(
79 'b_user_access',
80 '(USER_ID, PROVIDER_ID, ACCESS_CODE)',
81 'VALUES
82 ('.$userId.',\''.$this->id.'\',\''.AccessCode::ACCESS_DIRECTOR.'0\'),
83 ('.$userId.',\''.$this->id.'\',\''.AccessCode::ACCESS_DIRECTOR.$id.'\')'
84 );
85 $DB->query($sql);
86 }
87 }
88 }
89
90 private function updateCodesByHr(int $userId): void
91 {
92 $roleHelperService = Container::getRoleHelperService();
93 $roleCollection = $roleHelperService->getAllRoleCollectionForSync();
94 if ($roleCollection->empty())
95 {
96 return;
97 }
98
99 $getMemberCollectionByNodeType =
100 static fn(NodeEntityType $nodeType) =>
101 (new NodeMemberDataBuilder())
102 ->addFilter(
103 new NodeMemberFilter(
104 entityIdFilter: EntityIdFilter::fromEntityId($userId),
105 entityType: MemberEntityType::USER,
106 nodeFilter: new NodeFilter(
107 entityTypeFilter: NodeTypeFilter::fromNodeTypes([$nodeType]),
108 ),
109 findRelatedMembers: false,
110 active: null,
111 )
112 )
113 ->getAll()
114 ;
115
116 $accessCodeSet = [];
117
118 $departmentMemberCollection = $getMemberCollectionByNodeType(NodeEntityType::DEPARTMENT);
119 if (!$departmentMemberCollection->empty())
120 {
121 $accessCodeSet[AccessCode::ACCESS_EMPLOYEE . '0'] = true;
122 }
123
124 $teamMemberCollection = $getMemberCollectionByNodeType(NodeEntityType::TEAM);
125 if (!$teamMemberCollection->empty())
126 {
127 $accessCodeSet[AccessCode::ACCESS_TEAM_EMPLOYEE . '0'] = true;
128 }
129
130 $nodeMemberCollection = new NodeMemberCollection(...[
131 ...$departmentMemberCollection->getValues(),
132 ...$teamMemberCollection->getValues(),
133 ]);
134
135 foreach ($nodeMemberCollection as $nodeMember)
136 {
137 if ($nodeMember->entityType !== MemberEntityType::USER)
138 {
139 continue;
140 }
141
142 $neededRoleIds = array_intersect($roleCollection->getKeys(), $nodeMember->roles);
143 if (empty($neededRoleIds))
144 {
145 continue;
146 }
147
148 $userId = $nodeMember->entityId;
149
150 foreach ($neededRoleIds as $roleId)
151 {
152 $role = $roleCollection->getItemById($roleId);
153 if (!$role)
154 {
155 continue;
156 }
157
158 $type = $roleHelperService->getAccessCodeByRoleXmlId($role->xmlId);
159 if (!$type)
160 {
161 continue;
162 }
163
164 $accessCode = $type . $nodeMember->nodeId;
165
166 $accessCodeSet[$type . '0'] = true;
167 $accessCodeSet[$accessCode] = true;
168 }
169 }
170
171 $insertValues = [];
172 $accessCodes = array_keys($accessCodeSet);
173 foreach ($accessCodes as $accessCode)
174 {
175 $insertValues[] = "($userId, '$this->id', '$accessCode')";
176 }
177
178 if (!empty($insertValues))
179 {
180 $connection = Application::getConnection();
181 $helper = $connection->getSqlHelper();
182
183 $sql = $helper->getInsertIgnore(
184 'b_user_access',
185 '(USER_ID, PROVIDER_ID, ACCESS_CODE)',
186 'VALUES' . implode(
187 ',',
188 $insertValues,
189 ),
190 );
191
192 $connection->query($sql);
193 }
194 }
195}
$connection
Определения actionsdefinitions.php:38
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
static getConnection($name="")
Определения application.php:638
Определения loader.php:13
static includeModule($moduleName)
Определения loader.php:67
Определения authproviders.php:17
$id
Определения authproviders.php:18
$res
Определения filter_act.php:7
$iblockId
Определения iblock_catalog_edit.php:30
global $DB
Определения cron_frame.php:29