• Модуль: imopenlines
  • Путь к файлу: ~/bitrix/modules/imopenlines/lib/session/update.php
  • Класс: BitrixImOpenLinesSessionUpdate
  • Вызов: Update::closeSession
private function closeSession(): void
{
	if (
		isset($this->newData['CLOSED']) &&
		$this->newData['CLOSED'] === 'Y'
	)
	{
		if ($this->session->getSessionField('SPAM') == 'Y')
		{
			$this->setStatus(Session::STATUS_SPAM);
			$this->updateChatSession['ID'] = 0;
		}
		else
		{
			$this->setStatus(Session::STATUS_CLOSE);
		}

		$this->newData['PAUSE'] = 'N';
		$this->updateChatSession['PAUSE'] = 'N';

		$this->updateCheckTable = [];

		ConfigStatistic::getInstance((int)$this->session->getSessionField('CONFIG_ID'))->addClosed()->deleteInWork();

		if (!isset($this->newData['FORCE_CLOSE']) || $this->newData['FORCE_CLOSE'] != 'Y')
		{
			$this->session->chat->close();
		}

		if (
			Connector::isLiveChat($this->session->getSessionField('SOURCE')) &&
			$this->session->getSessionField('SPAM') !== 'Y'
		)
		{
			if (
				Loader::includeModule('im') &&
				User::getInstance($this->session->getSessionField('USER_ID'))->isOnline())

			{
				CAgent::AddAgent(
					'BitrixImOpenLinesMail::sendOperatorAnswerAgent('.$this->session->getSessionField('ID').');',
					"imopenlines",
					"N",
					60,
					"",
					"Y",
					ConvertTimeStamp(time()+CTimeZone::GetOffset()+60, "FULL")
				);
			}
			else
			{
				Mail::sendOperatorAnswer($this->session->getSessionField('ID'));
			}
		}

		SessionCheckTable::delete($this->session->getSessionField('ID'));
	}
	elseif (isset($this->newData['PAUSE']))
	{
		if ($this->newData['PAUSE'] == 'Y')
		{
			$datePause = new DateTime();
			$datePause->add('1 WEEK');

			$this->updateCheckTable['DATE_CLOSE'] = $datePause;
			$this->updateCheckTable['DATE_QUEUE'] = null;
		}
	}
	elseif (isset($this->newData['WAIT_ANSWER']))
	{
		if ($this->newData['WAIT_ANSWER'] == 'Y')
		{
			$this->setStatus(Session::STATUS_SKIP);
			$this->newData['PAUSE'] = 'N';
			$this->updateChatSession['PAUSE'] = 'N';

			$dateQueue = new DateTime();
			//TODO: A bad place! Potential problem. Can change the distribution time logic by ignoring rules from the queue.
			$dateQueue->add($this->session->getConfig('QUEUE_TIME') . ' SECONDS');
			$this->updateCheckTable['DATE_QUEUE'] = $dateQueue;
		}
		else
		{
			if (
				$this->session->getSessionField('STATUS') < Session::STATUS_ANSWER &&
				$this->newData['STATUS'] < Session::STATUS_ANSWER
			)
			{
				$this->setStatus(Session::STATUS_ANSWER);
			}
			$this->newData['WAIT_ACTION'] = isset($this->newData['WAIT_ACTION'])? $this->newData['WAIT_ACTION']: 'N';
			$this->newData['PAUSE'] = 'N';
			$this->updateChatSession['WAIT_ACTION'] = $this->newData['WAIT_ACTION'];
			$this->updateChatSession['PAUSE'] = 'N';

			$this->updateCheckTable['DATE_QUEUE'] = null;
		}
	}
}