ActivityController::recover

  1. Bitrix24 API (v. 23.675.0)
  2. crm
  3. ActivityController
  4. recover
  • Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/recycling/activitycontroller.php
  • Класс: Bitrix\Crm\Recycling\ActivityController
  • Вызов: ActivityController::recover
public function recover($entityID, array $params = array())
{
	if($entityID <= 0)
	{
		return false;
	}

	$recyclingEntityID = isset($params['ID']) ? (int)$params['ID'] : 0;
	if($recyclingEntityID <= 0)
	{
		return false;
	}

	$slots = isset($params['SLOTS']) ? $params['SLOTS'] : null;
	if(!is_array($slots))
	{
		return false;
	}

	$fields = isset($slots['FIELDS']) ? $slots['FIELDS'] : null;
	if(!(is_array($fields) && !empty($fields)))
	{
		return false;
	}

	unset($fields['ID'], $fields['COMPANY_ID'], $fields['COMPANY_IDS'], $fields['LEAD_ID']);

	$relationMap = RelationMap::createByEntity(\CCrmOwnerType::Activity, $entityID, $recyclingEntityID);
	$relationMap->build();

	$ownerTypeID = isset($fields['OWNER_TYPE_ID']) ? (int)$fields['OWNER_TYPE_ID'] : 0;
	$ownerID = isset($fields['OWNER_ID']) ? (int)$fields['OWNER_ID'] : 0;

	if($ownerTypeID > 0 && $ownerID > 0)
	{
		$newOwnerID = $relationMap->findRenewedEntityID($ownerTypeID, $ownerID);
		if($newOwnerID > 0)
		{
			$fields['OWNER_ID'] = $ownerID = $newOwnerID;
		}

		if(empty(Crm\Entity\EntityManager::selectExisted($ownerTypeID, [ $ownerID ])))
		{
			$errorMessage = '';

			$controller = ControllerManager::resolveController($ownerTypeID);
			if($controller)
			{
				$errorMessage = $controller->getActivityOwnerNotFoundMessage(
					$ownerTypeID,
					$ownerID,
					[
						'ID' => $entityID,
						'title' => isset($params['ENTITY']) ? $params['ENTITY']->getTitle() : ''
					]
				);
			}

			if($errorMessage === '')
			{
				$errorMessage = $this->getActivityOwnerNotFoundMessage($ownerTypeID, $ownerID, []);
			}

			throw new Main\InvalidOperationException($errorMessage);
		}
	}

	ActivityRelationManager::getInstance()->prepareRecoveryFields($fields, $relationMap);

	//region Convert User Fields from Suspended Type
	$userFields = $this->prepareRestoredUserFields($recyclingEntityID);
	if(!empty($userFields))
	{
		$fields = array_merge($fields, $userFields);
	}
	//endregion

	$communications = isset($slots['COMMUNICATIONS'])
		? $slots['COMMUNICATIONS'] : null;
	if(is_array($communications))
	{
		for($i = 0, $length = count($communications); $i < $length; $i++)
		{
			$commEntityTypeID = isset($communications[$i]['ENTITY_TYPE_ID'])
				? (int)$communications[$i]['ENTITY_TYPE_ID'] : \CCrmOwnerType::Undefined;
			$commEntityID = isset($communications[$i]['ENTITY_ID'])
				? (int)$communications[$i]['ENTITY_ID'] : 0;

			if(!$relationMap->isEmpty())
			{
				$newCommEntityID = $relationMap->findRenewedEntityID($commEntityTypeID, $commEntityID);
				if($newCommEntityID > 0)
				{
					$communications[$i]['ENTITY_ID'] = $newCommEntityID;
				}
			}
		}
		$fields['COMMUNICATIONS'] = $communications;
	}

	$bindingMap = array();

	if($ownerTypeID > 0 && $ownerID > 0)
	{
		$bindingMap["{$ownerTypeID}_{$ownerID}"] = array('OWNER_TYPE_ID' => $ownerTypeID, 'OWNER_ID' => $ownerID);
	}

	$entityInfos = array_merge(
		$relationMap->getSourceEntityInfos(),
		$relationMap->getDestinationEntityInfos()
	);
	foreach($entityInfos as $entityInfo)
	{
		$bindingKey = "{$entityInfo['ENTITY_TYPE_ID']}_{$entityInfo['ENTITY_ID']}";
		if(!isset($bindingMap[$bindingKey]))
		{
			$bindingMap[$bindingKey] = array(
				'OWNER_TYPE_ID' => $entityInfo['ENTITY_TYPE_ID'],
				'OWNER_ID' => $entityInfo['ENTITY_ID']
			);
		}
	}
	$fields['BINDINGS'] = array_values($bindingMap);

	//region Files
	$files = isset($params['FILES']) ? $params['FILES'] : null;
	if(is_array($files))
	{
		$storageElementIDs = [];
		foreach($files as $file)
		{
			$storageElementIDs[] = (int)$file['FILE_ID'];
		}
		$fields['STORAGE_ELEMENT_IDS'] = $storageElementIDs;
	}
	//endregion

	$newEntityID = 0;

	$provider = \CCrmActivity::GetActivityProvider($fields);
	if($provider)
	{
		$result = $provider::processRestorationFromRecycleBin(
			$fields,
			[ 'creationParams' => [ 'IS_RESTORATION' => true, 'DISABLE_USER_FIELD_CHECK' => true ] ]
		);
		if($result->isSuccess())
		{
			$resultData = $result->getData();
			if(is_array($resultData) && isset($resultData['entityId']))
			{
				$newEntityID = $resultData['entityId'];
			}
		}
	}

	if($newEntityID <= 0)
	{
		$newEntityID = \CCrmActivity::Add(
			$fields,
			false,
			false,
			array(
				'IS_RESTORATION' => true,
				'DISABLE_USER_FIELD_CHECK' => true
			)
		);
	}

	if($newEntityID <= 0)
	{
		return false;
	}

	$this->notifyTimelineMonitorAboutMoveFromBin($fields['BINDINGS'] ?? []);

	//region Relations
	ActivityRelationManager::getInstance()->recoverBindings($newEntityID, $relationMap);
	Relation::updateEntityID(\CCrmOwnerType::Activity, $entityID, $newEntityID, $recyclingEntityID);
	//endregion

	$this->eraseSuspendedUserFields($recyclingEntityID);

	$this->recoverTimeline($recyclingEntityID, $newEntityID);
	$this->recoverLiveFeed($recyclingEntityID, $newEntityID);
	$this->recoverBadges((int)$recyclingEntityID, (int)$newEntityID);
	$this->recoverNotes((int)$recyclingEntityID, (int)$newEntityID);

	//region Relations
	Relation::unregisterRecycleBin($recyclingEntityID);
	Relation::deleteJunks();
	//endregion

	unset($this->entityIdToRecyclingEntityId[$entityID]);
	$this->rebuildSearchIndex($newEntityID);
	$this->fireAfterRecoverEvent($recyclingEntityID, $newEntityID);
	return true;
}

Добавить комментарий