• Модуль: imopenlines
  • Путь к файлу: ~/bitrix/modules/imopenlines/lib/queue/all.php
  • Класс: BitrixImOpenLinesQueueAll
  • Вызов: All::transferToNext
public function transferToNext($manual = true)
{
	$result = false;

	ImOpenLinesDebug::addQueue($this->config['ID'], $this->session['ID'], 'start' . __METHOD__, ['manual' => $manual]);

	if($this->startLock())
	{
		if($manual)
		{
			self::sendMessageSkipAlone($this->session['CHAT_ID']);
		}
		else
		{
			$updateSessionCheck = [
				'REASON_RETURN' => ImOpenLinesQueue::REASON_DEFAULT
			];

			$resultOperatorQueue = $this->getOperatorsQueue();

			$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

			if((bool)$resultOperatorQueue['RESULT'] === true)
			{
				if(!empty($resultOperatorQueue['OPERATOR_LIST']))
				{
					$this->chat->setOperators($resultOperatorQueue['OPERATOR_LIST'], $this->session['ID']);
					$this->chat->update(['AUTHOR_ID' => 0]);
				}
				elseif(
					!empty($resultOperatorQueue['OPERATOR_ID']) &&
					(int)$this->session['OPERATOR_ID'] !== (int)$resultOperatorQueue['OPERATOR_ID']
				)
				{
					$leaveTransfer = (string)$this->config['WELCOME_BOT_LEFT'] === Config::BOT_LEFT_CLOSE && ImUser::getInstance($this->session['OPERATOR_ID'])->isBot()? 'N':'Y';

					$this->chat->transfer(
						[
							'FROM' => $this->session['OPERATOR_ID'],
							'TO' => $resultOperatorQueue['OPERATOR_ID'],
							'MODE' => Chat::TRANSFER_MODE_AUTO,
							'LEAVE' => $leaveTransfer
						],
						$this->sessionManager
					);
				}

				$updateSessionCheck['UNDISTRIBUTED'] = 'N';

				$result = true;
			}
			else
			{
				$this->chat->setOperators([], $this->session['ID']);
				$this->chat->update(['AUTHOR_ID' => 0]);
				$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);

			$updateSession = [
				'OPERATOR_ID' => $resultOperatorQueue['OPERATOR_ID'],
				'QUEUE_HISTORY' => $resultOperatorQueue['QUEUE_HISTORY'],

				//TODO: Fix. You need to rework the status bar. Not optimal. Called in several other places.
				'OPERATOR_FROM_CRM' => 'N',

				//TODO: Fix. Hard-wired status. Potentially bad decision.
				'STATUS' => Session::STATUS_SKIP
			];

			$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;
}