5use Bitrix\Im\V2\Chat\Copilot\CopilotPopupItem;
6use Bitrix\Im\V2\Chat\ChannelChat;
7use Bitrix\Im\V2\Chat\Comment\CommentPopupItem;
8use Bitrix\Im\V2\Entity\File\FilePopupItem;
9use Bitrix\Im\V2\Entity\Url\UrlCollection;
10use Bitrix\Im\V2\Entity\User\UserPopupItem;
11use Bitrix\Im\V2\Integration\AI\RoleManager;
12use Bitrix\Im\V2\Link\Pin\PinService;
13use Bitrix\Im\V2\Message\AdditionalMessagePopupItem;
14use Bitrix\Im\V2\Message\Param;
15use Bitrix\Im\V2\Message\Reaction\ReactionMessages;
16use Bitrix\Im\V2\Message\Reaction\ReactionPopupItem;
17use Bitrix\Im\V2\Message\ReadService;
18use Bitrix\Im\V2\TariffLimit\DateFilterable;
19use Bitrix\Im\V2\TariffLimit\FilterResult;
20use Bitrix\Imbot\Bot\CopilotChatBot;
21use Bitrix\Main\Loader;
22use Bitrix\Main\ORM\Query\Query;
23use Bitrix\Main\ORM\Fields\ExpressionField;
24use Bitrix\Im\Model\MessageTable;
25use Bitrix\Im\Model\MessageParamTable;
26use Bitrix\Im\Model\MessageUuidTable;
27use Bitrix\Im\V2\Common\ContextCustomer;
28use Bitrix\Im\V2\Entity\File\FileCollection;
29use Bitrix\Im\V2\Link\Reminder\ReminderCollection;
30use Bitrix\Im\V2\Rest\PopupData;
31use Bitrix\Im\V2\Rest\PopupDataAggregatable;
32use Bitrix\Im\V2\Rest\RestConvertible;
33use Bitrix\Im\V2\Service\Context;
34use Bitrix\Im\V2\Message\Params;
35use Bitrix\Main\Type\DateTime;
62 return Message::class;
72 $query = MessageTable::query();
80 $messageOrder = [
'DATE_CREATE' =>
$order[
'ID'] ??
'DESC',
'ID' =>
$order[
'ID'] ??
'DESC'];
81 $query->setOrder($messageOrder);
83 $messageIds =
$query->fetchCollection()->getIdList();
85 if (empty($messageIds))
95 return new static(MessageTable::query()->whereIn(
'ID', $messageIds)->setOrder($messageOrder)->setSelect(
$select)->fetchCollection());
103 return $this->getPrimaryIds();
117 if (
$message->getParams()->isSet(Params::FILE_ID))
119 $ids[
$message->getId()] =
$message->getParams()->get(Params::FILE_ID)->getValue();
132 if (isset($id) &&
$message->getChatId() !== $id)
159 $messagesForRest = [];
166 return $messagesForRest;
182 return (
new FilterResult())->setResult($filtered)->setFiltered($this->
count() !== $filtered->count());
199 if (!$this->isFileFilled)
204 foreach ($fileIdsByMessages as $fileIdsByMessage)
206 foreach ($fileIdsByMessage as $fileId)
208 $fileIds[] = $fileId;
217 foreach ($fileIdsByMessages[
$message->getId()] ?? [] as $fileId)
219 $file =
$files->getById($fileId);
222 $messagesFiles[] = $file->setChatId(
$message->getChatId());
225 $message->fillFiles($messagesFiles);
228 $this->isFileFilled =
true;
244 $messageIds = $this->
getIds();
245 if (!empty($messageIds))
249 $message->getParams(
true)->load([]);
252 $result = MessageParamTable::query()
254 ->whereIn(
'MESSAGE_ID', $this->
getIds())
255 ->whereNot(
'PARAM_NAME',
'LIKE')
259 while ($row =
$result->fetch())
261 $this[$row[
'MESSAGE_ID']]->getParams(
true)->load([$row]);
277 if (!empty($this->
getIds()))
280 '=MESSAGE_ID' => $this->
getIds(),
283 MessageParamTable::deleteBatch(
$filter);
302 if (empty($this->
getIds()))
340 foreach (
$params as $paramName => $paramValue)
344 'PARAM_NAME' => $paramName,
345 'PARAM_VALUE' => $paramValue,
372 $messageIds = $this->
getIds();
373 if (!$this->isUuidFilled && !empty($messageIds))
375 $uuids = MessageUuidTable::query()
376 ->setSelect([
'UUID',
'MESSAGE_ID'])
377 ->whereIn(
'MESSAGE_ID', $this->
getIds())
381 $uuidsByMessageId = [];
382 foreach ($uuids as $uuid)
384 $uuidsByMessageId[$uuid[
'MESSAGE_ID']] = $uuid[
'UUID'];
392 $this->isUuidFilled =
true;
403 if ($this->isUrlsFilled)
409 $urlIdByMessageIds = [];
412 if (!
$message->getParams()->isSet(Params::URL_ID))
417 $urlId =
$message->getParams()->get(Params::URL_ID)->getValue()[0] ??
null;
420 $urlIdByMessageIds[
$message->getId()] = $urlId;
426 if (isset($urlIdByMessageIds[
$message->getId()]))
428 $urlId = $urlIdByMessageIds[
$message->getId()];
429 $message->setUrl($urlCollection->getById($urlId));
433 $this->isUrlsFilled =
true;
443 if ($this->isUnreadFilled)
448 $readStatuses = (
new ReadService())->getReadStatusesByMessageIds($this->
getIds());
455 $this->isUnreadFilled =
true;
462 if ($this->isViewedFilled)
467 $notOwnMessages = [];
471 if (
$message->getAuthorId() === $this->getContext()->getUserId())
478 $notOwnMessages[] =
$message->getMessageId();
481 $viewStatuses = (
new ReadService())->getViewStatusesByMessageIds($notOwnMessages);
483 foreach ($notOwnMessages as $notOwnMessageId)
485 $this[$notOwnMessageId]->setViewed($viewStatuses[$notOwnMessageId]);
488 $this->isViewedFilled =
true;
495 if ($this->isReactionsFilled)
500 $messageIds = $this->
getIds();
502 if (empty($messageIds))
511 $message->setReactions($reactions->getReactionMessage(
$message->getMessageId()));
514 $this->isReactionsFilled =
true;
522 public function fillAllForRest(
bool $shortInfo =
false,
bool $onlyCommonInfo =
false): self
529 if (!$onlyCommonInfo)
568 $filesFromMessage =
$message->getFiles();
569 foreach ($filesFromMessage as $fileFromMessage)
571 $files[] = $fileFromMessage;
575 return $files->getUnique();
585 $usersFromMessage =
$message->getUserIds();
587 if (
$message->getParams()->isSet(Params::FORWARD_USER_ID))
589 $forwardUserId =
$message->getParams()->get(Params::FORWARD_USER_ID)->getValue();
590 $usersFromMessage[] = $forwardUserId;
593 if (
$message->getParams()->isSet(Params::CHAT_USER))
595 foreach (
$message->getParams()->get(Params::CHAT_USER)->getValue() as $chatUser)
597 $usersFromMessage[] = $chatUser;
601 foreach ($usersFromMessage as $userFromMessage)
603 $users[] = $userFromMessage;
624 if (
$message->getParams()->isSet(Params::REPLY_ID))
640 $reactions->addReactionMessage(
$message->getReactions());
655 if (
$params->isSet(Params::COPILOT_ROLE))
657 if (
$params->isSet(Params::FORWARD_ID))
667 if (!
$params->isSet(Params::COMPONENT_ID))
672 $messageComponentId =
$params->get(Params::COMPONENT_ID)->getValue();
675 Loader::includeModule(
'imbot')
676 && in_array($messageComponentId, CopilotChatBot::ALL_COPILOT_MESSAGE_COMPONENTS,
true)
679 $copilotRoles[
$message->getId()] = RoleManager::getDefaultRoleCode();
683 return $copilotRoles;
693 CopilotPopupItem::getInstanceByMessages($this),
696 if (!in_array(ReactionPopupItem::class, $excludedList,
true))
704 !in_array(CommentPopupItem::class, $excludedList,
true)
711 return new PopupData($popup, $excludedList);
716 $filteredCollection =
new static();
720 if (
$message->getChatId() === $chatId)
726 return $filteredCollection;
734 $pinService->setContext($this->context);
736 return $pinService->unpinMessages($this, $clearParams);
746 if (isset(
$filter[
'SEARCH_MESSAGE']) && mb_strlen(
$filter[
'SEARCH_MESSAGE']) > 2)
752 $query->registerRuntimeField(
754 'CASE_INSENSITIVE_MESSAGE',
755 "(CASE WHEN %s ILIKE '%%{$filter['SEARCH_MESSAGE']}%%' THEN 1 ELSE 0 END)",
759 $query->where(
'CASE_INSENSITIVE_MESSAGE',
'=',
'1');
763 $query->whereLike(
'MESSAGE',
"%{$filter['SEARCH_MESSAGE']}%");
774 $operator =
$order[
'ID'] ===
'DESC' ?
'<' :
'>';
778 if (isset(
$filter[
'DATE_FROM']))
795 $query->where(
'DATE_CREATE',
'<=', $to);
798 if (
$filter[
'WITHOUT_SYSTEM_MESSAGE'] ??
false)
800 $query->where(
'AUTHOR_ID',
'!=', 0);
if(! $messageFields||!isset($messageFields['message_id'])||!isset($messageFields['status'])||!CModule::IncludeModule("messageservice")) $messageId
static initByDiskFilesIds(array $diskFilesIds, ?int $chatId=null)
static initByPreviewUrlsIds(array $previewUrlsIds, bool $withHtml=true)
static getByMessagesAndAuthorId(MessageCollection $messages, int $userId)
static getRestEntityName()
toRestFormat(array $option=[])
static getCollectionElementClass()
static processFilters(Query $query, array $filter, array $order)
static find(array $filter, array $order, ?int $limit=null, ?Context $context=null, array $select=[])
getPopupData(array $excludedList=[])
fillAllForRest(bool $shortInfo=false, bool $onlyCommonInfo=false)
getParamsFieldsForMultiAdd(array $params)
unpin(bool $clearParams=true)
filterByDate(DateTime $date)
filterByChatId(int $chatId)
static getConnection($name="")
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']