- Модуль: intranet
- Путь к файлу: ~/bitrix/modules/intranet/classes/general/authproviders.php
- Класс: CIntranetAuthProvider
- Вызов: CIntranetAuthProvider::UpdateCodes
public function UpdateCodes($USER_ID)
{
/** @global CUserTypeManager $USER_FIELD_MANAGER */
global $DB, $USER_FIELD_MANAGER;
$USER_ID = intval($USER_ID);
$iblockId = (int) COption::getOptionInt('intranet', 'iblock_structure', 0);
$res = CUserTypeEntity::GetList(array(), array("ENTITY_ID"=>"IBLOCK_".$iblockId."_SECTION", "FIELD_NAME"=>"UF_HEAD"));
if($res->Fetch())
{
$arDep = $USER_FIELD_MANAGER->getUserFieldValue('USER', 'UF_DEPARTMENT', $USER_ID) ?: array();
$res = $DB->query("
SELECT BS.ID AS ID
FROM b_iblock_section BS INNER JOIN b_uts_iblock_".$iblockId."_section BUF ON BUF.VALUE_ID = BS.ID
WHERE BS.IBLOCK_ID = ".$iblockId." AND BS.GLOBAL_ACTIVE = 'Y' AND BUF.UF_HEAD = ".$USER_ID
);
while ($dep = $res->fetch())
$arDep[] = $dep['ID'];
$arDep = array_unique($arDep);
if(is_array($arDep) && !empty($arDep))
{
//user's department ('D') and all departments above ('DR')
$DB->Query("
INSERT INTO b_user_access (USER_ID, PROVIDER_ID, ACCESS_CODE)
SELECT ".$USER_ID.", '".$DB->ForSQL($this->id)."', ".$DB->Concat("T1.ROLE_X", ($DB->type == "MSSQL" ? "CAST(T1.ID as varchar(17))": "T1.ID"))."
FROM (
SELECT DISTINCT BS2.ID ID, (case when BS.ID = BS2.ID then 'D' else 'DR' end) ROLE_X
FROM b_iblock_section BS
LEFT JOIN b_iblock_section BS2 ON BS2.IBLOCK_ID = BS.IBLOCK_ID AND BS2.LEFT_MARGIN <= BS.LEFT_MARGIN AND BS2.RIGHT_MARGIN >= BS.RIGHT_MARGIN
WHERE BS.ID IN (".implode(",", $arDep).")
AND BS.IBLOCK_ID = ".$iblockId."
AND BS2.GLOBAL_ACTIVE = 'Y'
UNION
SELECT BS.ID ID, 'DR' ROLE_X
FROM b_iblock_section BS
WHERE BS.ID IN (".implode(",", $arDep).")
AND BS.IBLOCK_ID = ".$iblockId."
AND BS.GLOBAL_ACTIVE = 'Y'
) T1
");
//intranet user himself ('IU')
$DB->Query("
INSERT INTO b_user_access (USER_ID, PROVIDER_ID, ACCESS_CODE)
VALUES (".$USER_ID.", '".$DB->ForSQL($this->id)."', 'IU".$USER_ID."')
");
//if the user is a boss let's add all his subordinates ('IU')
$DB->Query("
INSERT INTO b_user_access (USER_ID, PROVIDER_ID, ACCESS_CODE)
SELECT DISTINCT ".$USER_ID.", '".$DB->ForSQL($this->id)."', ".$DB->Concat("'IU'", ($DB->type == "MSSQL" ? "CAST(U.ID as varchar(17))": "U.ID"))."
FROM
b_user U
INNER JOIN b_utm_user BUF1 ON BUF1.VALUE_ID = U.ID
INNER JOIN b_user_field UF ON UF.ID = BUF1.FIELD_ID
INNER JOIN (SELECT BS2.ID AS ID
FROM
b_iblock_section BS
INNER JOIN b_uts_iblock_".$iblockId."_section BUF ON BUF.VALUE_ID = BS.ID
LEFT JOIN b_iblock_section BS2 ON BS2.IBLOCK_ID = BS.IBLOCK_ID AND BS2.LEFT_MARGIN >= BS.LEFT_MARGIN AND BS2.RIGHT_MARGIN <= BS.RIGHT_MARGIN
WHERE
BS.IBLOCK_ID = ".$iblockId."
AND BS2.GLOBAL_ACTIVE = 'Y'
AND BUF.UF_HEAD = ".$USER_ID."
) S ON S.ID = BUF1.VALUE_INT
WHERE
UF.FIELD_NAME = 'UF_DEPARTMENT'
AND U.ID <> ".$USER_ID."
");
}
}
}