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