• Модуль: imopenlines
  • Путь к файлу: ~/bitrix/modules/imopenlines/lib/chat.php
  • Класс: BitrixImOpenLinesChat
  • Вызов: Chat::transfer
public function transfer($params, $session = null): bool
{
	$result = false;

	if ($this->isDataLoaded())
	{
		$keyLock = QueueQueue::PREFIX_KEY_LOCK . $this->chat['ID'];

		if (ToolsLock::getInstance()->set($keyLock))
		{
			$mode = in_array($params['MODE'], [self::TRANSFER_MODE_AUTO, self::TRANSFER_MODE_BOT], true) ? $params['MODE']: self::TRANSFER_MODE_MANUAL;
			$selfExit = !(isset($params['LEAVE']) && $params['LEAVE'] === 'N');
			$skipCheck = isset($params['SKIP_CHECK']) && $params['SKIP_CHECK'] === 'Y';

			if (!$session instanceof Session)
			{
				$session = new Session();
				$session->setChat($this);
			}

			$resultLoadSession = $session->load([
				'USER_CODE' => $this->chat['ENTITY_ID']
			]);
			if ($resultLoadSession)
			{
				if ($this->validationAction($session->getData('CHAT_ID')))
				{
					//Event
					$event = new Event("imopenlines", "OnOperatorTransfer", [
						'CHAT' => $this->chat,
						'SESSION' => $session,
						'TRANSFER' => [
							'MODE' => $mode,
							'FROM' => $params['FROM'],
							'TO' => $params['TO'],
						]
					]);
					$event->send();

					foreach ($event->getResults() as $eventResult)
					{
						if ($eventResult->getType() !== BitrixMainEventResult::SUCCESS)
						{
							continue;
						}

						$newValues = $eventResult->getParameters();
						if (!empty($newValues['TRANSFER_ID']))
						{
							$params['TO'] = $newValues['TRANSFER_ID'];
						}
					}
					// END Event

					//Transfer to queue
					if (mb_strpos($params['TO'], 'queue') === 0)
					{
						$result = $this->transferToQueue($params, $session, $mode);
					}
					//Transfer to the operator
					else
					{
						$result = $this->transferToOperator($params, $session, $mode, $selfExit, $skipCheck);
					}
				}
			}

			ToolsLock::getInstance()->delete($keyLock);
		}
	}

	return $result;
}