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,
];
}