- Модуль: imopenlines
- Путь к файлу: ~/bitrix/modules/imopenlines/lib/queuemanager.php
- Класс: BitrixImOpenLinesQueueManager
- Вызов: QueueManager::update
public function update($fields, $usersFields = false): Result
{
$result = new Result();
foreach ($fields as $cell => $fieldsEntity)
{
if(
$fieldsEntity['ENTITY_TYPE'] === 'user' &&
!self::isValidUser($fieldsEntity['ENTITY_ID'])
)
{
unset($fields[$cell], $usersFields[$fieldsEntity['ENTITY_ID']]);
}
}
if(self::validateQueueFields($fields))
{
$taggedCache = Application::getInstance()->getTaggedCache();
$queueUsersBefore = [];
$queueUsersAfter = [];
$addUsers = [];
$updateUsers = [];
$deleteUsers = [];
$addQueue = [];
$updateQueue = [];
$deleteQueue = [];
$usersRaw = QueueTable::getList([
'filter' => [
'=CONFIG_ID' => $this->idLine
],
'order' => [
'SORT' => 'ASC',
'ID' => 'ASC'
]
]);
while ($user = $usersRaw->fetch())
{
$currentUsers[$user['USER_ID']] = $user;
$queueUsersBefore[] = $user['USER_ID'];
$deleteUsers[$user['USER_ID']] = $user;
}
$configQueueRaw = ConfigQueueTable::getList([
'filter' => [
'=CONFIG_ID' => $this->idLine
],
'order' => [
'SORT' => 'ASC',
'ID' => 'ASC'
]
]);
while ($configQueue = $configQueueRaw->fetch())
{
$currentConfigQueue[$configQueue['ENTITY_TYPE']][$configQueue['ENTITY_ID']] = $configQueue;
$deleteQueue[$configQueue['ENTITY_TYPE']][$configQueue['ENTITY_ID']] = $configQueue;
}
$numUser = 0;
$numQueue = 0;
$newUsers = [];
foreach ($fields as $fieldsEntity)
{
if(!empty($currentConfigQueue[$fieldsEntity['ENTITY_TYPE']][$fieldsEntity['ENTITY_ID']]))
{
unset($deleteQueue[$fieldsEntity['ENTITY_TYPE']][$fieldsEntity['ENTITY_ID']]);
$updateFields = self::getDataUpdateConfigQueue($fieldsEntity, $currentConfigQueue[$fieldsEntity['ENTITY_TYPE']][$fieldsEntity['ENTITY_ID']], $numQueue);
if(!empty($updateFields))
{
$updateQueue[$currentConfigQueue[$fieldsEntity['ENTITY_TYPE']][$fieldsEntity['ENTITY_ID']]['ID']] = $updateFields;
}
}
else
{
$addQueue[] = self::getDataAddConfigQueue($this->idLine, $fieldsEntity, $numQueue);
}
if($fieldsEntity['ENTITY_TYPE'] === 'user')
{
if(empty($newUsers[$fieldsEntity['ENTITY_ID']]))
{
$queueUsersAfter[] = $fieldsEntity['ENTITY_ID'];
if(!empty($currentUsers[$fieldsEntity['ENTITY_ID']]))
{
unset($deleteUsers[$fieldsEntity['ENTITY_ID']]);
$updateFields = self::getDataUpdateUser($fieldsEntity['ENTITY_ID'], $currentUsers[$fieldsEntity['ENTITY_ID']], $usersFields, $numUser);
if(!empty($updateFields))
{
$updateUsers[$currentUsers[$fieldsEntity['ENTITY_ID']]['ID']] = $updateFields;
}
}
else
{
$addUsers[] = self::getDataAddUser($this->idLine, $fieldsEntity['ENTITY_ID'], $usersFields, $numUser);
}
}
$newUsers[$fieldsEntity['ENTITY_ID']] = true;
$numUser++;
}
elseif($fieldsEntity['ENTITY_TYPE'] === 'department')
{
$usersDepartment = self::getUsersDepartment($fieldsEntity['ENTITY_ID']);
while ($userId = $usersDepartment->fetch()['ID'])
{
if(self::isValidUser($userId))
{
if(empty($newUsers[$userId]))
{
$queueUsersAfter[] = $userId;
if(!empty($currentUsers[$userId]))
{
unset($deleteUsers[$userId]);
$updateFields = self::getDataUpdateUser($userId, $currentUsers[$userId], $usersFields, $numUser, $fieldsEntity['ENTITY_ID']);
if(!empty($updateFields))
{
$updateUsers[$currentUsers[$userId]['ID']] = $updateFields;
}
}
else
{
$addUsers[] = self::getDataAddUser($this->idLine, $userId, $usersFields, $numUser, $fieldsEntity['ENTITY_ID']);
}
}
$newUsers[$userId] = true;
$numUser++;
}
}
}
$numQueue++;
}
if(empty($fields))
{
$addUsers = $this->getDefaultUsers();
if(!empty($addUsers))
{
foreach ($addUsers as $addUser)
{
$addQueue[] = self::getDataAddConfigQueue($this->idLine, ['ENTITY_TYPE' => 'user', 'ENTITY_ID' => $addUser['USER_ID']], $numQueue);
$numQueue++;
}
}
}
if(!empty($deleteQueue))
{
foreach ($deleteQueue as $typeEntity)
{
if(!empty($typeEntity))
{
foreach ($typeEntity as $entity)
{
ConfigQueueTable::delete($entity['ID']);
}
$result->setResult(true);
}
}
}
if(!empty($updateQueue))
{
foreach ($updateQueue as $id => $queue)
{
ConfigQueueTable::update($id, $queue);
}
$result->setResult(true);
}
if(!empty($addQueue))
{
foreach ($addQueue as $queue)
{
ConfigQueueTable::add($queue);
}
$result->setResult(true);
}
if(!empty($deleteUsers))
{
foreach ($deleteUsers as $user)
{
QueueTable::delete($user['ID']);
}
$result->setResult(true);
}
if(!empty($updateUsers))
{
foreach ($updateUsers as $id => $user)
{
QueueTable::update($id, $user);
}
$result->setResult(true);
}
if(!empty($addUsers))
{
foreach ($addUsers as $user)
{
QueueTable::add($user);
}
$result->setResult(true);
}
$this->sendQueueChangeEvents($queueUsersBefore, $queueUsersAfter);
}
else
{
$result->addError(new Error('Invalid fields describing queue entities were passed', 'IMOL_ERROR_INCORRECT_FIELDS', __METHOD__, $fields));
}
return $result;
}