• Модуль: imopenlines
  • Путь к файлу: ~/bitrix/modules/imopenlines/lib/session.php
  • Класс: BitrixImOpenLinesSession
  • Вызов: Session::readingSession
protected function readingSession($fields, $params)
{
	Debug::addSession($this, 'begin ' . __METHOD__, ['fields' => $fields, '$params' => $params]);

	$result = new Result();

	$result->setResult(false);
	$configManager = new Config();

	$loadSession = false;

	$select = ModelSessionTable::getSelectFieldsPerformance();
	$select['CHECK_DATE_CLOSE'] = 'CHECK.DATE_CLOSE';
	$select['CHECK_DATE_QUEUE'] = 'CHECK.DATE_QUEUE';

	$userCode = $fields['USER_CODE'];

	if (!empty($fields['USER_CODE_FAIL']))
	{
		$userCode = [$fields['USER_CODE'], $fields['USER_CODE_FAIL']];
	}

	$orm = ModelSessionTable::getList([
		'select' => $select,
		'filter' => [
			'=USER_CODE' => $userCode,
			'=CLOSED' => 'N'
		],
		'order' => ['ID' => 'DESC']
	]);
	while ($row = $orm->fetch())
	{
		if (
			$row['USER_CODE'] === $fields['USER_CODE']
			&& empty($loadSession)
		)
		{
			$loadSession = $row;
		}
		//Closes non-closed sessions
		else
		{
			try
			{
				self::closeDuplicate(
					[
						'ID' => $row['ID'],
						'CHAT_ID' => $row['CHAT_ID'],
						'OPERATOR_ID' => $row['OPERATOR_ID'],
					],
					[
						'CHAT_ID' => $loadSession['CHAT_ID'],
						'OPERATOR_ID' => $loadSession['OPERATOR_ID'],
					]
				);
			}
			catch (BitrixMainSystemException $e)
			{
			}
		}
	}

	//There is no open session, but the session voting
	if (
		empty($loadSession)
		&&
		(
			(
				isset($params['VOTE_SESSION'])
				&& $params['VOTE_SESSION'] === 'Y'
			)
			||
			(
				isset($params['REOPEN'])
				&& $params['REOPEN'] === 'Y'
			)
		)
	)
	{
		$select = ModelSessionTable::getSelectFieldsPerformance();
		$select['CHECK_DATE_CLOSE'] = 'CHECK.DATE_CLOSE';
		$select['CHECK_DATE_QUEUE'] = 'CHECK.DATE_QUEUE';

		$orm = ModelSessionTable::getList([
			'select' => $select,
			'filter' => [
				'=USER_CODE' => $fields['USER_CODE'],
				'=CLOSED' => 'Y',
			],
			'order' => ['ID' => 'DESC']
		]);
		$loadSession = $orm->fetch();

		if (
			empty($loadSession) ||
			$loadSession['WAIT_VOTE'] !== 'Y'
		)
		{
			$loadSession = false;
		}
	}

	if ($loadSession)
	{
		$loadSession['SESSION_ID'] = $loadSession['ID'];
		$this->session = $loadSession;

		if (isset($params['VOTE_SESSION']) && $params['VOTE_SESSION'] === 'Y')
		{
			$this->session['VOTE_SESSION'] = true;
		}

		if ($fields['CONFIG_ID'] !== $this->session['CONFIG_ID'])
		{
			$this->config = $configManager->get($this->session['CONFIG_ID']);
			if (!empty($this->config))
			{
				$fields['CONFIG_ID'] = $this->session['CONFIG_ID'];
			}
			else
			{
				$result->addError(new Error(
					Loc::getMessage('IMOL_SESSION_ERROR_NO_IMOL_CONFIGURATION'),
					'NO IMOL CONFIGURATION',
					__METHOD__,
					$params
				));
			}
		}

		if ($result->isSuccess())
		{
			if (
				!($this->chat instanceof Chat)
				|| ($this->chat->getData('ID') != $this->session['CHAT_ID'])
			)
			{
				$this->chat = new Chat($this->session['CHAT_ID']);
			}

			if (
				isset($params['VOTE_SESSION'])
				&& $params['VOTE_SESSION'] === 'Y'
				&& isset($loadSession['DATE_CLOSE_VOTE'])
				&& $loadSession['DATE_CLOSE_VOTE'] instanceof DateTime
				&& $loadSession['DATE_CLOSE_VOTE']->getTimestamp() < time()
			)
			{
				$this->isCloseVote = true;
			}

			if (!$this->isCloseVote())
			{
				//If the session is closed and voting
				if (
					isset($params['VOTE_SESSION'])
					&& $params['VOTE_SESSION'] === 'Y'
					&& $loadSession['CLOSED'] === 'Y'
				)
				{
					MessagesSession::sendMessageReopenSession($this->session['CHAT_ID'], $this->session['SESSION_ID']);

					//statistics
					ConfigStatistic::getInstance((int)$this->session['CONFIG_ID'])->deleteClosed()->addInWork();

					$dateClose = new DateTime();

					$fullCloseTime = $this->config['FULL_CLOSE_TIME'];
					if (!empty($fullCloseTime))
					{
						$dateClose->add($fullCloseTime . ' MINUTES');
					}

					$connectorChatId = (int)Chat::parseLinesChatEntityId($this->session['USER_CODE'])['connectorChatId'];
					$this->session['END_ID'] = 0;
					$this->session['CLOSED'] = 'N';
					$this->session['DATE_CLOSE'] = '';
					$this->session['WAIT_ANSWER'] = 'N';
					$this->session['WAIT_ACTION'] = 'Y';
					$this->session['PAUSE'] = 'N';
					$this->session['LAST_SEND_MAIL_ID'] = Session::getLastMessageId($connectorChatId);

					ModelSessionTable::update($loadSession['ID'], [
						'END_ID' => $this->session['END_ID'],
						'CLOSED' => $this->session['CLOSED'],
						'DATE_CLOSE' => $this->session['DATE_CLOSE'],
						'WAIT_ANSWER' => $this->session['WAIT_ANSWER'],
						'WAIT_ACTION' => $this->session['WAIT_ACTION'],
						'PAUSE' => $this->session['PAUSE'],
						'LAST_SEND_MAIL_ID' => $this->session['LAST_SEND_MAIL_ID'],
						//'STATUS' => self::STATUS_WAIT_CLIENT
					]);
					ModelSessionCheckTable::add([
						'SESSION_ID' => $this->session['SESSION_ID'],
						'DATE_CLOSE' => $dateClose
					]);

					$this->chat->sendJoinMessage($this->joinUserList);
					$this->chat->join($this->session['OPERATOR_ID'], true, true);
					$this->chat->update(['AUTHOR_ID' => $this->session['OPERATOR_ID']]);

					$this->chat->updateFieldData([
						Chat::FIELD_SESSION => [
							'ID' => $this->session['SESSION_ID'],
							'PAUSE' => $this->session['PAUSE'],
							'WAIT_ANSWER' => $this->session['WAIT_ANSWER'],
							'DATE_CREATE' => $this->session['DATE_CREATE']->getTimestamp()
						],
					]);
				}
				elseif (!$this->chat->isNowCreated())
				{
					$this->chat->join($fields['USER_ID']);
				}

				if (
					!empty($fields['OPERATOR_ID']) &&
					empty($this->session['OPERATOR_ID'])
				)
				{
					$resultChatAnswer = $this->chat->answer($fields['OPERATOR_ID'], true);
					$this->answer($fields['OPERATOR_ID']);

					/*if (!$resultChatAnswer->isSuccess())
					{
						$result->addErrors($resultChatAnswer->getErrors());
					}*/
				}

				$result->setResult(true);
			}
		}
	}

	Debug::addSession($this, 'end ' . __METHOD__, ['SUCCESS' => $result->isSuccess(), 'ERRORS' => $result->getErrorMessages()]);

	return $result;
}