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

	if ($this->isDataLoaded())
	{
		$userFrom = User::getInstance($params['FROM']);

		$lineFromId = $session->getConfig('ID');
		$lineFrom = $session->getConfig('LINE_NAME');
		$userCode = $session->getData('USER_CODE');

		//Transfer the same queue
		if ($params['TO']  === 'queue')
		{
			$queueId = $lineFromId;
		}
		else
		{
			$queueId = (int)mb_substr($params['TO'], 5);
		}

		$config = ConfigTable::getById($queueId)->fetch();
		if ($config)
		{
			$session->setOperatorId(0, true, !($mode === self::TRANSFER_MODE_MANUAL));
			$this->update(['AUTHOR_ID' => 0]);
			$this->updateFieldData([
				self::FIELD_SESSION => [
					'LINE_ID' => $queueId,
					'ID' => $session->getData('ID'),
				]
			]);

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

			if ($queueId == 0)
			{
				$queueId = $lineFromId;
			}

			Log::write([$params['FROM'], $queueId], 'TRANSFER TO LINE');

			OperatorTransferTable::Add([
				'CONFIG_ID' => $session->getData('CONFIG_ID'),
				'SESSION_ID' => $session->getData('ID'),
				'USER_ID' => $params['FROM'],
				'TRANSFER_MODE' => $mode,
				'TRANSFER_TYPE' => 'QUEUE',
				'TRANSFER_LINE_ID' => $queueId
			]);

			$updateData = [
				'CONFIG_ID' => $queueId,
				'QUEUE_HISTORY' => [],
				'SKIP_DATE_CLOSE' => true,
				'SKIP_CHANGE_STATUS' => true,
				'DATE_MODIFY' => new DateTime(),
				'OPERATOR_FROM_CRM' => 'N'
			];

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

			$session->update($updateData);

			$lineTo = $session->getConfig('LINE_NAME');

			if ($params['TO']  === 'queue')
			{
				$message = Loc::getMessage('IMOL_CHAT_RETURNED_TO_QUEUE_NEW');
			}
			elseif ($lineFromId == $queueId)
			{
				$message = Loc::getMessage('IMOL_CHAT_SKIP_'.$userFrom->getGender(), [
					'#USER#' => '[USER='.$userFrom->getId().'][/USER]',
				]);
			}
			else
			{
				$message = Loc::getMessage('IMOL_CHAT_TRANSFER_LINE_'.$userFrom->getGender(), [
					'#USER_FROM#' => '[USER='.$userFrom->getId().'][/USER]',
					'#LINE_FROM#' => '[b]'.$lineFrom.'[/b]',
					'#LINE_TO#' => '[b]'.$lineTo.'[/b]',
				]);
			}

			$session->transferToNextInQueue(false);

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

			$result = true;
		}
	}

	return $result;
}