- Модуль: imopenlines
- Путь к файлу: ~/bitrix/modules/imopenlines/lib/chat.php
- Класс: BitrixImOpenLinesChat
- Вызов: Chat::transferToQueue
protected function transferToQueue($params, $session, $mode): bool
{
$result = false;
if ($this->isDataLoaded())
{
$userFrom = User::getInstance($params['FROM']);
$lineFromId = $session->getConfig('ID');
$lineFrom = $session->getConfig('LINE_NAME');
$userCode = $session->getData('USER_CODE');
//Transfer the same queue
if ($params['TO'] === 'queue')
{
$queueId = $lineFromId;
}
else
{
$queueId = (int)mb_substr($params['TO'], 5);
}
$config = ConfigTable::getById($queueId)->fetch();
if ($config)
{
$session->setOperatorId(0, true, !($mode === self::TRANSFER_MODE_MANUAL));
$this->update(['AUTHOR_ID' => 0]);
$this->updateFieldData([
self::FIELD_SESSION => [
'LINE_ID' => $queueId,
'ID' => $session->getData('ID'),
]
]);
$chat = new CIMChat(0);
$relations = CIMChat::GetRelationById($this->chat['ID'], false, true, false);
foreach ($relations as $relation)
{
if (
!User::getInstance($relation['USER_ID'])->isConnector()
&& (
$relation['USER_ID'] != $params['FROM']
|| !User::getInstance($relation['USER_ID'])->isBot()
)
)
{
$chat->DeleteUser($this->chat['ID'], $relation['USER_ID'], false, true);
}
}
if ($queueId == 0)
{
$queueId = $lineFromId;
}
Log::write([$params['FROM'], $queueId], 'TRANSFER TO LINE');
OperatorTransferTable::Add([
'CONFIG_ID' => $session->getData('CONFIG_ID'),
'SESSION_ID' => $session->getData('ID'),
'USER_ID' => $params['FROM'],
'TRANSFER_MODE' => $mode,
'TRANSFER_TYPE' => 'QUEUE',
'TRANSFER_LINE_ID' => $queueId
]);
$updateData = [
'CONFIG_ID' => $queueId,
'QUEUE_HISTORY' => [],
'SKIP_DATE_CLOSE' => true,
'SKIP_CHANGE_STATUS' => true,
'DATE_MODIFY' => new DateTime(),
'OPERATOR_FROM_CRM' => 'N'
];
if (
$userFrom->isBot()
&& !$session->getData('DATE_OPERATOR')
)
{
$currentDate = new DateTime();
$updateData['DATE_OPERATOR'] = $currentDate;
$updateData['TIME_BOT'] = $currentDate->getTimestamp() - $session->getData('DATE_CREATE')->getTimestamp();
}
$session->update($updateData);
$lineTo = $session->getConfig('LINE_NAME');
if ($params['TO'] === 'queue')
{
$message = Loc::getMessage('IMOL_CHAT_RETURNED_TO_QUEUE_NEW');
}
elseif ($lineFromId == $queueId)
{
$message = Loc::getMessage('IMOL_CHAT_SKIP_'.$userFrom->getGender(), [
'#USER#' => '[USER='.$userFrom->getId().'][/USER]',
]);
}
else
{
$message = Loc::getMessage('IMOL_CHAT_TRANSFER_LINE_'.$userFrom->getGender(), [
'#USER_FROM#' => '[USER='.$userFrom->getId().'][/USER]',
'#LINE_FROM#' => '[b]'.$lineFrom.'[/b]',
'#LINE_TO#' => '[b]'.$lineTo.'[/b]',
]);
}
$session->transferToNextInQueue(false);
Im::addMessage([
'TO_CHAT_ID' => $this->chat['ID'],
'MESSAGE' => $message,
'SYSTEM' => 'Y',
]);
$result = true;
}
}
return $result;
}