• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/lib/recent.php
  • Класс: BitrixImRecent
  • Вызов: Recent::getOrmParams
static function getOrmParams($params)
{
	$userId = (int)$params['USER_ID'];
	$showOpenlines = BitrixMainLoader::includeModule('imopenlines') && $params['SHOW_OPENLINES'] !== false;
	$isIntranet = BitrixMainLoader::includeModule('intranet') && BitrixIntranetUtil::isIntranetUser($userId);
	$withoutCommonUsers = $params['WITHOUT_COMMON_USERS'] === true || !$isIntranet;
	$unreadOnly = isset($params['UNREAD_ONLY']) && $params['UNREAD_ONLY'] === true;
	$shortInfo = isset($params['SHORT_INFO']) && $params['SHORT_INFO'] === true;

	$shortInfoFields = [
		'*',
		'RELATION_USER_ID' => 'RELATION.USER_ID',
		'RELATION_NOTIFY_BLOCK' => 'RELATION.NOTIFY_BLOCK',
		'RELATION_IS_MANAGER' => 'RELATION.MANAGER',
		'CHAT_ID' => 'CHAT.ID',
		'CHAT_TITLE' => 'CHAT.TITLE',
		'CHAT_TYPE' => 'CHAT.TYPE',
		'CHAT_AVATAR' => 'CHAT.AVATAR',
		'CHAT_AUTHOR_ID' => 'CHAT.AUTHOR_ID',
		'CHAT_EXTRANET' => 'CHAT.EXTRANET',
		'CHAT_COLOR' => 'CHAT.COLOR',
		'CHAT_ENTITY_TYPE' => 'CHAT.ENTITY_TYPE',
		'CHAT_ENTITY_ID' => 'CHAT.ENTITY_ID',
		'CHAT_ENTITY_DATA_1' => 'CHAT.ENTITY_DATA_1',
		'CHAT_ENTITY_DATA_2' => 'CHAT.ENTITY_DATA_2',
		'CHAT_ENTITY_DATA_3' => 'CHAT.ENTITY_DATA_3',
		'CHAT_DATE_CREATE' => 'CHAT.DATE_CREATE',
		'CHAT_USER_COUNT' => 'CHAT.USER_COUNT',
		'MESSAGE_CODE' => 'CODE.PARAM_VALUE',
		'USER_LAST_ACTIVITY_DATE' => 'USER.LAST_ACTIVITY_DATE',
		'MESSAGE_DATE' => 'MESSAGE.DATE_CREATE',
	];

	$additionalInfoFields = [
		'MESSAGE_ID' => 'MESSAGE.ID',
		'MESSAGE_AUTHOR_ID' => 'MESSAGE.AUTHOR_ID',
		'MESSAGE_TEXT' => 'MESSAGE.MESSAGE',
		'MESSAGE_FILE' => 'FILE.PARAM_VALUE',
		'MESSAGE_ATTACH' => 'ATTACH.PARAM_VALUE',
		'MESSAGE_ATTACH_JSON' => 'ATTACH.PARAM_JSON',
		'MESSAGE_USER_LAST_ACTIVITY_DATE' => 'MESSAGE.AUTHOR.LAST_ACTIVITY_DATE',
		'MESSAGE_USER_IDLE' => 'MESSAGE.STATUS.IDLE',
		'MESSAGE_USER_MOBILE_LAST_DATE' => 'MESSAGE.STATUS.MOBILE_LAST_DATE',
		'MESSAGE_USER_DESKTOP_LAST_DATE' => 'MESSAGE.STATUS.DESKTOP_LAST_DATE',
		'USER_EMAIL' => 'USER.EMAIL',
		'USER_IDLE' => 'STATUS.IDLE',
		'USER_MOBILE_LAST_DATE' => 'STATUS.MOBILE_LAST_DATE',
		'USER_DESKTOP_LAST_DATE' => 'STATUS.DESKTOP_LAST_DATE',
		'MESSAGE_UUID_VALUE' => 'MESSAGE_UUID.UUID',
		'HAS_REMINDER' => 'HAS_REMINDER',
		'CHAT_MANAGE_USERS' => 'CHAT.MANAGE_USERS',
		'CHAT_MANAGE_UI' => 'CHAT.MANAGE_UI',
		'CHAT_MANAGE_SETTINGS' => 'CHAT.MANAGE_SETTINGS',
		'CHAT_CAN_POST' => 'CHAT.CAN_POST',
	];

	$shortRuntime = [
		new BitrixMainEntityReferenceField(
			'CODE',
			'BitrixImModelMessageParamTable',
			[
				"=ref.MESSAGE_ID" => "this.ITEM_MID",
				"ref.PARAM_NAME" => new BitrixMainDBSqlExpression("?s", "CODE")
			],
			["join_type" => "LEFT"]
		),
		new BitrixMainEntityReferenceField(
			'USER',
			'BitrixMainUserTable',
			array("=this.ITEM_TYPE" => new BitrixMainDBSqlExpression("?s", IM_MESSAGE_PRIVATE), "=ref.ID" => "this.ITEM_ID"),
			array("join_type"=>"LEFT")
		),
	];

	$reminderTable = LinkReminderTable::getTableName();
	$unreadTable = MessageUnreadTable::getTableName();

	$additionalRuntime = [
		new BitrixMainEntityReferenceField(
			'ATTACH',
			'BitrixImModelMessageParamTable',
			[
				"=ref.MESSAGE_ID" => "this.ITEM_MID",
				"ref.PARAM_NAME" => new BitrixMainDBSqlExpression("?s", "ATTACH")
			],
			["join_type" => "LEFT"]
		),
		new BitrixMainEntityReferenceField(
			'FILE',
			'BitrixImModelMessageParamTable',
			[
				"=ref.MESSAGE_ID" => "this.ITEM_MID",
				"ref.PARAM_NAME" => new BitrixMainDBSqlExpression("?s", "FILE_ID")
			],
			["join_type" => "LEFT"]
		),
		new BitrixMainEntityReferenceField(
			'STATUS',
			'BitrixImModelStatusTable',
			array("=this.ITEM_TYPE" => new BitrixMainDBSqlExpression("?s", IM_MESSAGE_PRIVATE), "=ref.USER_ID" => "this.ITEM_ID"),
			array("join_type"=>"LEFT")
		),
		new ExpressionField(
			'HAS_REMINDER',
			"CASE WHEN EXISTS (
				SELECT 1
				FROM {$reminderTable}
				WHERE CHAT_ID = %s AND AUTHOR_ID = %s AND IS_REMINDED = 'Y'
			) THEN 'Y' ELSE 'N' END",
			['ITEM_CID', 'USER_ID'],
			['data_type' => 'boolean', 'values' => ['N', 'Y']]
		),
		new ExpressionField(
			'HAS_UNREAD_MESSAGE',
			"EXISTS(SELECT 1 FROM {$unreadTable} WHERE CHAT_ID = %s AND USER_ID = %s)",
			['ITEM_CID', 'USER_ID']
		)
	];

	$select = $shortInfo ? $shortInfoFields : array_merge($shortInfoFields, $additionalInfoFields);
	$runtime = $shortInfo ? $shortRuntime : array_merge($shortRuntime, $additionalRuntime);

	if (!$withoutCommonUsers)
	{
		$select['INVITATION_ORIGINATOR_ID'] = 'INVITATION.ORIGINATOR_ID';
	}
	if ($showOpenlines)
	{
		$select['LINES_ID'] = 'LINES.ID';
		$select['LINES_STATUS'] = 'LINES.STATUS';
		$select['LINES_DATE_CREATE'] = 'LINES.DATE_CREATE';
	}

	if (!$withoutCommonUsers)
	{
		$runtime[] = new BitrixMainEntityReferenceField(
			'INVITATION',
			'BitrixIntranetInternalsInvitationTable',
			array("=this.ITEM_TYPE" => new BitrixMainDBSqlExpression("?s", IM_MESSAGE_PRIVATE), "=ref.USER_ID" => "this.ITEM_ID"),
			array("join_type"=>"LEFT")
		);
	}
	if ($showOpenlines)
	{
		$runtime[] = new BitrixMainEntityReferenceField(
			'LINES',
			'BitrixImOpenlinesModelSessionTable',
			[">this.ITEM_OLID" => new BitrixMainDBSqlExpression("0"), "=ref.ID" => "this.ITEM_OLID"],
			["join_type" => "LEFT"]
		);
	}

	if ($withoutCommonUsers)
	{
		$filter = ['=USER_ID' => $userId];
	}
	else
	{
		$filter = ['@USER_ID' => [$userId, 0]];
	}

	if ($unreadOnly)
	{
		$filter[] = [
			'LOGIC' => 'OR',
			['==HAS_UNREAD_MESSAGE' => true],
			['=UNREAD' => true],
		];
	}

	return [
		'select' => $select,
		'filter' => $filter,
		'runtime' => $runtime,
	];
}