- Модуль: 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;
}