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

	if ($this->isDataLoaded())
	{
		$transferUserId = (int)$params['TO'];

		if (
			$skipCheck
			|| (
				!User::getInstance($transferUserId)->isBot() &&
				!User::getInstance($transferUserId)->isExtranet() &&
				!User::getInstance($transferUserId)->isConnector()
			)
		)
		{
			$chat = new CIMChat(0);
			$relations = CIMChat::GetRelationById($this->chat['ID'], false, true, false);
			foreach ($relations as $relation)
			{
				if (
					$relation['USER_ID'] != $params['FROM']
					&& !User::getInstance($relation['USER_ID'])->isConnector()
					&& !User::getInstance($relation['USER_ID'])->isBot()
				)
				{
					$chat->DeleteUser($this->chat['ID'], $relation['USER_ID'], false, true);
				}
			}

			if ($params['FROM'] > 0 && $selfExit)
			{
				$chat->DeleteUser($this->chat['ID'], $params['FROM'], false, true);
			}

			$sessionField = $this->getFieldData(self::FIELD_SESSION);
			if ($sessionField['ID'] != $session->getData('ID'))
			{
				$this->updateFieldData([
					self::FIELD_SESSION => [
						'ID' => $session->getData('ID')
					]
				]);
			}

			if ($session->getConfig('ACTIVE') === 'Y')
			{
				$this->update(['AUTHOR_ID' => 0]);
			}
			else
			{
				$this->update(['AUTHOR_ID' => $transferUserId]);
			}
			if ($transferUserId > 0)
			{
				$chat->AddUser($this->chat['ID'], $transferUserId, false, true);
			}

			$userFrom = User::getInstance($params['FROM']);
			if ($transferUserId > 0)
			{
				$userTo = User::getInstance($transferUserId);
			}

			Log::write([$params['FROM'], $transferUserId], 'TRANSFER TO USER');

			if (
				$transferUserId > 0
				&& $params['FROM'] > 0
				&&
				(
					$mode === self::TRANSFER_MODE_MANUAL
					|| $mode === self::TRANSFER_MODE_BOT
				)
			)
			{
				$message = Loc::getMessage('IMOL_CHAT_TRANSFER_'.$userFrom->getGender(), [
						'#USER_FROM#' => '[USER=' . $userFrom->getId() . '][/USER]',
						'#USER_TO#' => '[USER=' . $userTo->getId() . '][/USER]']
				);
			}
			elseif (empty($transferUserId))
			{
				$message = Loc::getMessage('IMOL_CHAT_NO_OPERATOR_AVAILABLE_IN_QUEUE_NEW');
			}
			else
			{
				$message = Loc::getMessage('IMOL_CHAT_NEXT_IN_QUEUE_NEW', ['#USER_TO#' => '[USER=' . $userTo->getId() . '][/USER]']);
			}

			OperatorTransferTable::Add([
				'CONFIG_ID' => $session->getData('CONFIG_ID'),
				'SESSION_ID' => $session->getData('ID'),
				'USER_ID' => (int)$params['FROM'],
				'TRANSFER_MODE' => $mode,
				'TRANSFER_TYPE' => 'USER',
				'TRANSFER_USER_ID' => $transferUserId
			]);

			Im::addMessage([
				"TO_CHAT_ID" => $this->chat['ID'],
				"MESSAGE" => $message,
				"SYSTEM" => 'Y',
			]);

			$updateDataSession = [
				'OPERATOR_FROM_CRM' => 'N',
				'SKIP_CHANGE_STATUS' => true,
			];

			if ($userFrom->isBot() && !$session->getData('DATE_OPERATOR'))
			{
				$currentDate = new DateTime();
				$updateDataSession['DATE_OPERATOR'] = $currentDate;
				$updateDataSession['TIME_BOT'] = $currentDate->getTimestamp()-$session->getData('DATE_CREATE')->getTimestamp();
			}

			if ($mode === self::TRANSFER_MODE_MANUAL)
			{
				$this->answer($transferUserId, false, true, true);
				$updateDataSession['DATE_MODIFY'] = new DateTime();
				$updateDataSession['SKIP_DATE_CLOSE'] = true;
			}
			else
			{
				$session->setOperatorId($transferUserId, true, true);
			}

			$session->update($updateDataSession);

			$result = true;
		}
	}

	return $result;
}