• Модуль: 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;
}