- Модуль: imopenlines
- Путь к файлу: ~/bitrix/modules/imopenlines/lib/session.php
- Класс: BitrixImOpenLinesSession
- Вызов: Session::readingSession
protected function readingSession($fields, $params)
{
Debug::addSession($this, 'begin ' . __METHOD__, ['fields' => $fields, '$params' => $params]);
$result = new Result();
$result->setResult(false);
$configManager = new Config();
$loadSession = false;
$select = ModelSessionTable::getSelectFieldsPerformance();
$select['CHECK_DATE_CLOSE'] = 'CHECK.DATE_CLOSE';
$select['CHECK_DATE_QUEUE'] = 'CHECK.DATE_QUEUE';
$userCode = $fields['USER_CODE'];
if (!empty($fields['USER_CODE_FAIL']))
{
$userCode = [$fields['USER_CODE'], $fields['USER_CODE_FAIL']];
}
$orm = ModelSessionTable::getList([
'select' => $select,
'filter' => [
'=USER_CODE' => $userCode,
'=CLOSED' => 'N'
],
'order' => ['ID' => 'DESC']
]);
while ($row = $orm->fetch())
{
if (
$row['USER_CODE'] === $fields['USER_CODE']
&& empty($loadSession)
)
{
$loadSession = $row;
}
//Closes non-closed sessions
else
{
try
{
self::closeDuplicate(
[
'ID' => $row['ID'],
'CHAT_ID' => $row['CHAT_ID'],
'OPERATOR_ID' => $row['OPERATOR_ID'],
],
[
'CHAT_ID' => $loadSession['CHAT_ID'],
'OPERATOR_ID' => $loadSession['OPERATOR_ID'],
]
);
}
catch (BitrixMainSystemException $e)
{
}
}
}
//There is no open session, but the session voting
if (
empty($loadSession)
&&
(
(
isset($params['VOTE_SESSION'])
&& $params['VOTE_SESSION'] === 'Y'
)
||
(
isset($params['REOPEN'])
&& $params['REOPEN'] === 'Y'
)
)
)
{
$select = ModelSessionTable::getSelectFieldsPerformance();
$select['CHECK_DATE_CLOSE'] = 'CHECK.DATE_CLOSE';
$select['CHECK_DATE_QUEUE'] = 'CHECK.DATE_QUEUE';
$orm = ModelSessionTable::getList([
'select' => $select,
'filter' => [
'=USER_CODE' => $fields['USER_CODE'],
'=CLOSED' => 'Y',
],
'order' => ['ID' => 'DESC']
]);
$loadSession = $orm->fetch();
if (
empty($loadSession) ||
$loadSession['WAIT_VOTE'] !== 'Y'
)
{
$loadSession = false;
}
}
if ($loadSession)
{
$loadSession['SESSION_ID'] = $loadSession['ID'];
$this->session = $loadSession;
if (isset($params['VOTE_SESSION']) && $params['VOTE_SESSION'] === 'Y')
{
$this->session['VOTE_SESSION'] = true;
}
if ($fields['CONFIG_ID'] !== $this->session['CONFIG_ID'])
{
$this->config = $configManager->get($this->session['CONFIG_ID']);
if (!empty($this->config))
{
$fields['CONFIG_ID'] = $this->session['CONFIG_ID'];
}
else
{
$result->addError(new Error(
Loc::getMessage('IMOL_SESSION_ERROR_NO_IMOL_CONFIGURATION'),
'NO IMOL CONFIGURATION',
__METHOD__,
$params
));
}
}
if ($result->isSuccess())
{
if (
!($this->chat instanceof Chat)
|| ($this->chat->getData('ID') != $this->session['CHAT_ID'])
)
{
$this->chat = new Chat($this->session['CHAT_ID']);
}
if (
isset($params['VOTE_SESSION'])
&& $params['VOTE_SESSION'] === 'Y'
&& isset($loadSession['DATE_CLOSE_VOTE'])
&& $loadSession['DATE_CLOSE_VOTE'] instanceof DateTime
&& $loadSession['DATE_CLOSE_VOTE']->getTimestamp() < time()
)
{
$this->isCloseVote = true;
}
if (!$this->isCloseVote())
{
//If the session is closed and voting
if (
isset($params['VOTE_SESSION'])
&& $params['VOTE_SESSION'] === 'Y'
&& $loadSession['CLOSED'] === 'Y'
)
{
MessagesSession::sendMessageReopenSession($this->session['CHAT_ID'], $this->session['SESSION_ID']);
//statistics
ConfigStatistic::getInstance((int)$this->session['CONFIG_ID'])->deleteClosed()->addInWork();
$dateClose = new DateTime();
$fullCloseTime = $this->config['FULL_CLOSE_TIME'];
if (!empty($fullCloseTime))
{
$dateClose->add($fullCloseTime . ' MINUTES');
}
$connectorChatId = (int)Chat::parseLinesChatEntityId($this->session['USER_CODE'])['connectorChatId'];
$this->session['END_ID'] = 0;
$this->session['CLOSED'] = 'N';
$this->session['DATE_CLOSE'] = '';
$this->session['WAIT_ANSWER'] = 'N';
$this->session['WAIT_ACTION'] = 'Y';
$this->session['PAUSE'] = 'N';
$this->session['LAST_SEND_MAIL_ID'] = Session::getLastMessageId($connectorChatId);
ModelSessionTable::update($loadSession['ID'], [
'END_ID' => $this->session['END_ID'],
'CLOSED' => $this->session['CLOSED'],
'DATE_CLOSE' => $this->session['DATE_CLOSE'],
'WAIT_ANSWER' => $this->session['WAIT_ANSWER'],
'WAIT_ACTION' => $this->session['WAIT_ACTION'],
'PAUSE' => $this->session['PAUSE'],
'LAST_SEND_MAIL_ID' => $this->session['LAST_SEND_MAIL_ID'],
//'STATUS' => self::STATUS_WAIT_CLIENT
]);
ModelSessionCheckTable::add([
'SESSION_ID' => $this->session['SESSION_ID'],
'DATE_CLOSE' => $dateClose
]);
$this->chat->sendJoinMessage($this->joinUserList);
$this->chat->join($this->session['OPERATOR_ID'], true, true);
$this->chat->update(['AUTHOR_ID' => $this->session['OPERATOR_ID']]);
$this->chat->updateFieldData([
Chat::FIELD_SESSION => [
'ID' => $this->session['SESSION_ID'],
'PAUSE' => $this->session['PAUSE'],
'WAIT_ANSWER' => $this->session['WAIT_ANSWER'],
'DATE_CREATE' => $this->session['DATE_CREATE']->getTimestamp()
],
]);
}
elseif (!$this->chat->isNowCreated())
{
$this->chat->join($fields['USER_ID']);
}
if (
!empty($fields['OPERATOR_ID']) &&
empty($this->session['OPERATOR_ID'])
)
{
$resultChatAnswer = $this->chat->answer($fields['OPERATOR_ID'], true);
$this->answer($fields['OPERATOR_ID']);
/*if (!$resultChatAnswer->isSuccess())
{
$result->addErrors($resultChatAnswer->getErrors());
}*/
}
$result->setResult(true);
}
}
}
Debug::addSession($this, 'end ' . __METHOD__, ['SUCCESS' => $result->isSuccess(), 'ERRORS' => $result->getErrorMessages()]);
return $result;
}