• Модуль: 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."
			");
		}
	}
}