• Модуль: imopenlines
  • Путь к файлу: ~/bitrix/modules/imopenlines/lib/tools/correction.php
  • Класс: BitrixImOpenLinesToolsCorrection
  • Вызов: Correction::closeOldSession
static function closeOldSession(bool $correction = true, int $closeDay = -1, int $limit = 0): array
{
	$result = [
		'CLOSE' => [],
		'UPDATE' => []
	];

	$query = new ORMQueryQuery(SessionCheckTable::getEntity());
	$query->setSelect([
		'SESSION_ID',
		'CHAT_ID' => 'SESSION.CHAT_ID',
		'LAST_MESSAGE_ID' => 'SESSION.CHAT.LAST_MESSAGE_ID'
	]);
	$query->setFilter([
		'=DATE_CLOSE' => null
	]);
	if (!empty($limit))
	{
		$query->setLimit($limit);
	}
	$sessionCheckManager = $query->exec();

	$oldCloseTime = new DateTime();
	$closeTime = (new DateTime())->add('30 DAY');
	if ($closeDay > 0)
	{
		$oldCloseTime->add('-' . $closeDay . ' DAY');
	}

	while ($sessionCheck = $sessionCheckManager->fetch())
	{
		$message = 0;

		if (!empty($sessionCheck['LAST_MESSAGE_ID']) && Loader::includeModule('im'))
		{
			$message = MessageTable::getById($sessionCheck['LAST_MESSAGE_ID'])->fetch();
		}

		if (empty($message) || ($closeDay > 0 && $message['DATE_CREATE'] instanceof DateTime && $message['DATE_CREATE']->getTimestamp() < $oldCloseTime->getTimestamp()))
		{
			if ($correction)
			{
				$chat = new Chat($sessionCheck['CHAT_ID']);

				$chat->dismissedOperatorFinish();
			}

			$result['CLOSE'][] = $sessionCheck['SESSION_ID'];
		}
		else
		{
			if ($correction)
			{
				$resultSessionUpdate = SessionCheckTable::update($sessionCheck['SESSION_ID'], ['DATE_CLOSE' => $closeTime]);

				if ($resultSessionUpdate->isSuccess())
				{
					$result['UPDATE'][] = $sessionCheck['SESSION_ID'];
				}
			}
			else
			{
				$result['UPDATE'][] = $sessionCheck['SESSION_ID'];
			}
		}
	}

	return $result;
}