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

	$query = new ORMQueryQuery(SessionTable::getEntity());
	$selectFields = [
		'ID',
		'CHAT_ID',
		'STATUS',
		'OPERATOR_ID'
	];

	if (Loader::includeModule('im'))
	{
		$selectFields['LAST_MESSAGE_ID'] = 'CHAT.LAST_MESSAGE_ID';
	}

	$query->setSelect($selectFields);
	$query->setFilter([
		'!=CLOSED' => 'Y',
		'=CHECK.SESSION_ID' => null
	]);
	if (!empty($limit))
	{
		$query->setLimit($limit);
	}
	$sessionManager = $query->exec();

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

	while ($session = $sessionManager->fetch())
	{
		$message = 0;

		if (!empty($session['LAST_MESSAGE_ID']) && Loader::includeModule('im'))
		{
			$message = MessageTable::getById($session['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($session['CHAT_ID']);

				$chat->dismissedOperatorFinish();
			}

			$result['CLOSE'][] = $session['ID'];
		}
		else
		{
			if ($correction)
			{
				$addFields = [
					'SESSION_ID' => $session['ID'],
					'DATE_CLOSE' =>  $closeTime
				];

				if (
					$session['STATUS'] < Session::STATUS_ANSWER
					|| empty($session['OPERATOR_ID'])
					|| !Queue::isRealOperator($session['OPERATOR_ID'])
					|| !(ImUser::getInstance($session['OPERATOR_ID'])->isActive()))
				{
					$addFields['DATE_QUEUE'] = new DateTime();
				}

				$resultSessionUpdate = SessionCheckTable::add($addFields);

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

	return $result;
}