• Модуль: intranet
  • Путь к файлу: ~/bitrix/modules/intranet/lib/user.php
  • Класс: BitrixIntranetUserTable
  • Вызов: UserTable::postInitialize
static function postInitialize(BitrixMainORMEntity $entity)
{
	parent::postInitialize($entity);

	// add intranet user type expression
	$conditionList = [];
	$externalUserTypesUsed = [];

	if (ModuleManager::isModuleInstalled('sale'))
	{
		$conditionList[] = [
			'PATTERN' => 'EXTERNAL_AUTH_ID',
			'VALUE' => "WHEN %s IN ('sale', 'saleanonymous', 'shop') THEN 'sale'"
		];
		$externalUserTypesUsed[] = 'sale';
		$externalUserTypesUsed[] = 'saleanonymous';
		$externalUserTypesUsed[] = 'shop';
	}
	if (ModuleManager::isModuleInstalled('imconnector'))
	{
		$conditionList[] = [
			'PATTERN' => 'EXTERNAL_AUTH_ID',
			'VALUE' => "WHEN %s = 'imconnector' THEN 'imconnector'"
		];
		$externalUserTypesUsed[] = 'imconnector';
	}
	if (ModuleManager::isModuleInstalled('im'))
	{
		$conditionList[] = [
			'PATTERN' => 'EXTERNAL_AUTH_ID',
			'VALUE' => "WHEN %s = 'bot' THEN 'bot'"
		];
		$externalUserTypesUsed[] = 'bot';
	}
	if (ModuleManager::isModuleInstalled('mail'))
	{
		$conditionList[] = [
			'PATTERN' => 'EXTERNAL_AUTH_ID',
			'VALUE' => "WHEN %s = 'email' THEN 'email'"
		];
		$externalUserTypesUsed[] = 'email';
	}

	$externalUserTypes = BitrixMainUserTable::getExternalUserTypes();
	$externalUserTypesAdditional = array_diff($externalUserTypes, $externalUserTypesUsed);
	if (!empty($externalUserTypesAdditional))
	{
		$sqlHelper = BitrixMainApplication::getInstance()->getConnection()->getSqlHelper();
		foreach($externalUserTypesAdditional as $externalAuthId)
		{
			$value = $sqlHelper->convertToDbText($externalAuthId);
			$conditionList[] = [
				'PATTERN' => 'EXTERNAL_AUTH_ID',
				'VALUE' => "WHEN %s = ".$value." THEN ".$value.""
			];
		}
	}

	// duplicate for inner join
	$conditionListInner = $conditionList;

	$extranetUserType = (
		ModuleManager::isModuleInstalled('extranet')
			? 'extranet'
			: 'shop'
	);

	$serializedValue = serialize([]);

	$conditionList[] = [
		'PATTERN' => 'UF_DEPARTMENT',
		'VALUE' => "WHEN %s = '".$serializedValue."' THEN '".$extranetUserType."'"
	];
	$conditionList[] = [
		'PATTERN' => 'UF_DEPARTMENT',
		'VALUE' => "WHEN %s IS NULL THEN '".$extranetUserType."'"
	];
	$conditionListInner[] = [
		'PATTERN' => 'UTS_OBJECT_INNER.UF_DEPARTMENT',
		'VALUE' => "WHEN %s = '".$serializedValue."' THEN '".$extranetUserType."'"
	];
	$conditionListInner[] = [
		'PATTERN' => 'UTS_OBJECT_INNER.UF_DEPARTMENT',
		'VALUE' => "WHEN %s IS NULL THEN '".$extranetUserType."'"
	];

	// add USER_TYPE with left join
	$condition = "CASE ";
	$patternList = [];

	foreach($conditionList as $conditionFields)
	{
		$condition .= ' '.$conditionFields['VALUE'].' ';
		$patternList[] = $conditionFields['PATTERN'];
	}
	$condition .= "ELSE 'employee' END";

	$entity->addField(new ExpressionField('USER_TYPE',
		$condition,
		$patternList
	));

	if (Loader::includeModule('socialnetwork'))
	{
		$entity->addField(new BitrixMainORMFieldsRelationsOneToMany('TAGS', BitrixSocialnetworkUserTagTable::class, 'USER'));
	}

	// add USER_TYPE with inner join
	$condition = "CASE ";
	$patternList = [];

	foreach($conditionListInner as $conditionFields)
	{
		$condition .= ' '.$conditionFields['VALUE'].' ';
		$patternList[] = $conditionFields['PATTERN'];
	}
	$condition .= "ELSE 'employee' END";

	$entity->addField(new ExpressionField('USER_TYPE_INNER',
		$condition,
		$patternList
	));

	// add other fields
	$entity->addField(new ExpressionField('USER_TYPE_IS_EMPLOYEE',
		"CASE WHEN %s = 'employee' THEN 1 ELSE 0 END",
		'USER_TYPE_INNER'
	));
}