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