- Модуль: imopenlines
- Путь к файлу: ~/bitrix/modules/imopenlines/lib/chat.php
- Класс: BitrixImOpenLinesChat
- Вызов: Chat::transferToOperator
protected function transferToOperator($params, $session, $mode, $selfExit, $skipCheck): bool
{
$result = false;
if ($this->isDataLoaded())
{
$transferUserId = (int)$params['TO'];
if (
$skipCheck
|| (
!User::getInstance($transferUserId)->isBot() &&
!User::getInstance($transferUserId)->isExtranet() &&
!User::getInstance($transferUserId)->isConnector()
)
)
{
$chat = new CIMChat(0);
$relations = CIMChat::GetRelationById($this->chat['ID'], false, true, false);
foreach ($relations as $relation)
{
if (
$relation['USER_ID'] != $params['FROM']
&& !User::getInstance($relation['USER_ID'])->isConnector()
&& !User::getInstance($relation['USER_ID'])->isBot()
)
{
$chat->DeleteUser($this->chat['ID'], $relation['USER_ID'], false, true);
}
}
if ($params['FROM'] > 0 && $selfExit)
{
$chat->DeleteUser($this->chat['ID'], $params['FROM'], false, true);
}
$sessionField = $this->getFieldData(self::FIELD_SESSION);
if ($sessionField['ID'] != $session->getData('ID'))
{
$this->updateFieldData([
self::FIELD_SESSION => [
'ID' => $session->getData('ID')
]
]);
}
if ($session->getConfig('ACTIVE') === 'Y')
{
$this->update(['AUTHOR_ID' => 0]);
}
else
{
$this->update(['AUTHOR_ID' => $transferUserId]);
}
if ($transferUserId > 0)
{
$chat->AddUser($this->chat['ID'], $transferUserId, false, true);
}
$userFrom = User::getInstance($params['FROM']);
if ($transferUserId > 0)
{
$userTo = User::getInstance($transferUserId);
}
Log::write([$params['FROM'], $transferUserId], 'TRANSFER TO USER');
if (
$transferUserId > 0
&& $params['FROM'] > 0
&&
(
$mode === self::TRANSFER_MODE_MANUAL
|| $mode === self::TRANSFER_MODE_BOT
)
)
{
$message = Loc::getMessage('IMOL_CHAT_TRANSFER_'.$userFrom->getGender(), [
'#USER_FROM#' => '[USER=' . $userFrom->getId() . '][/USER]',
'#USER_TO#' => '[USER=' . $userTo->getId() . '][/USER]']
);
}
elseif (empty($transferUserId))
{
$message = Loc::getMessage('IMOL_CHAT_NO_OPERATOR_AVAILABLE_IN_QUEUE_NEW');
}
else
{
$message = Loc::getMessage('IMOL_CHAT_NEXT_IN_QUEUE_NEW', ['#USER_TO#' => '[USER=' . $userTo->getId() . '][/USER]']);
}
OperatorTransferTable::Add([
'CONFIG_ID' => $session->getData('CONFIG_ID'),
'SESSION_ID' => $session->getData('ID'),
'USER_ID' => (int)$params['FROM'],
'TRANSFER_MODE' => $mode,
'TRANSFER_TYPE' => 'USER',
'TRANSFER_USER_ID' => $transferUserId
]);
Im::addMessage([
"TO_CHAT_ID" => $this->chat['ID'],
"MESSAGE" => $message,
"SYSTEM" => 'Y',
]);
$updateDataSession = [
'OPERATOR_FROM_CRM' => 'N',
'SKIP_CHANGE_STATUS' => true,
];
if ($userFrom->isBot() && !$session->getData('DATE_OPERATOR'))
{
$currentDate = new DateTime();
$updateDataSession['DATE_OPERATOR'] = $currentDate;
$updateDataSession['TIME_BOT'] = $currentDate->getTimestamp()-$session->getData('DATE_CREATE')->getTimestamp();
}
if ($mode === self::TRANSFER_MODE_MANUAL)
{
$this->answer($transferUserId, false, true, true);
$updateDataSession['DATE_MODIFY'] = new DateTime();
$updateDataSession['SKIP_DATE_CLOSE'] = true;
}
else
{
$session->setOperatorId($transferUserId, true, true);
}
$session->update($updateDataSession);
$result = true;
}
}
return $result;
}