- Модуль: imopenlines
- Путь к файлу: ~/bitrix/modules/imopenlines/lib/queue/queue.php
- Класс: BitrixImOpenLinesQueueQueue
- Вызов: Queue::transferToNext
public function transferToNext($manual = true)
{
$result = false;
ImOpenLinesDebug::addQueue($this->config['ID'], $this->session['ID'], 'start' . __METHOD__, ['manual' => $manual]);
if ($this->startLock())
{
$resultOperatorQueue = $this->getOperatorsQueue($this->session['OPERATOR_ID']);
if (
$manual &&
$resultOperatorQueue['RESULT'] != true
)
{
self::sendMessageSkipAlone($this->session['CHAT_ID']);
}
else
{
$updateSessionCheck = [
'REASON_RETURN' => ImOpenLinesQueue::REASON_DEFAULT
];
$reasonReturn = SessionCheckTable::getById($this->session['ID'])->fetch()['REASON_RETURN'];
//Event
$resultOperatorQueue = self::sendEventOnBeforeSessionTransfer(
[
'session' => $this->session,
'config' => $this->config,
'chat' => $this->chat,
'reasonReturn' => $reasonReturn,
'newOperatorQueue' => $resultOperatorQueue
]
);
// END Event
$leaveTransfer = (string)$this->config['WELCOME_BOT_LEFT'] === Config::BOT_LEFT_CLOSE && ImUser::getInstance($this->session['OPERATOR_ID'])->isBot()? 'N':'Y';
if ((bool)$resultOperatorQueue['RESULT'] === true)
{
if (!empty($resultOperatorQueue['OPERATOR_ID']))
{
if ((int)$this->session['OPERATOR_ID'] !== (int)$resultOperatorQueue['OPERATOR_ID'])
{
$this->chat->transfer(
[
'FROM' => $this->session['OPERATOR_ID'],
'TO' => $resultOperatorQueue['OPERATOR_ID'],
'MODE' => Chat::TRANSFER_MODE_AUTO,
'LEAVE' => $leaveTransfer
],
$this->sessionManager
);
}
}
elseif (!empty($resultOperatorQueue['OPERATOR_LIST']))
{
$this->chat->setOperators($resultOperatorQueue['OPERATOR_LIST'], $this->session['ID']);
$this->chat->update(['AUTHOR_ID' => 0]);
}
$updateSessionCheck['UNDISTRIBUTED'] = 'N';
$result = true;
}
else
{
if ((int)$this->session['OPERATOR_ID'] !== 0)
{
$this->chat->transfer(
[
'FROM' => $this->session['OPERATOR_ID'],
'TO' => 0,
'MODE' => Chat::TRANSFER_MODE_AUTO,
'LEAVE' => $leaveTransfer
],
$this->sessionManager
);
}
$updateSessionCheck['UNDISTRIBUTED'] = 'Y';
}
if (
ImUser::getInstance($this->session['OPERATOR_ID'])->isBot()
&& $this->config['NO_ANSWER_RULE'] == Session::RULE_TEXT
&& $this->session['SEND_NO_ANSWER_TEXT'] !== 'Y'
&& $this->session['STATUS'] <= Session::STATUS_CLIENT
)
{
$updateSessionCheck['DATE_NO_ANSWER'] = (new DateTime())->add($this->config['NO_ANSWER_TIME'] . ' SECONDS');
}
$updateSessionCheck['DATE_QUEUE'] = $resultOperatorQueue['DATE_QUEUE'];
SessionCheckTable::update($this->session['ID'], $updateSessionCheck);
if ((int)$this->session['OPERATOR_ID'] !== (int)$resultOperatorQueue['OPERATOR_ID'])
{
$updateSession = [
'OPERATOR_ID' => $resultOperatorQueue['OPERATOR_ID'],
'QUEUE_HISTORY' => $resultOperatorQueue['QUEUE_HISTORY']
];
$this->sessionManager->update($updateSession);
}
ImOpenLinesDebug::addQueue($this->config['ID'], $this->session['ID'],__METHOD__, ['resultOperatorQueue' => $resultOperatorQueue, 'reasonReturn' => $reasonReturn]);
}
$this->stopLock();
}
ImOpenLinesDebug::addQueue($this->config['ID'], $this->session['ID'], 'stop' . __METHOD__);
return $result;
}