• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/timeline/entity/timelinebinding.php
  • Класс: Bitrix\Crm\Timeline\Entity\TimelineBindingTable
  • Вызов: TimelineBindingTable::rebind
static function rebind($entityTypeID, $oldEntityID, $newEntityID, array $typeIDs)
{
	$entityTypeID = (int)$entityTypeID;
	$oldEntityID = (int)$oldEntityID;
	$newEntityID = (int)$newEntityID;

	$connection = Main\Application::getConnection();
	$typeIDs = array_filter(array_map('intval', $typeIDs));
	if(!empty($typeIDs))
	{
		$typeSql = implode(',', $typeIDs);
		$dbResult = $connection->query(
			"SELECT b.OWNER_ID FROM b_crm_timeline_bind b INNER JOIN b_crm_timeline t ON b.OWNER_ID = t.ID AND t.TYPE_ID IN ({$typeSql}) AND b.ENTITY_TYPE_ID = {$entityTypeID} AND b.ENTITY_ID = {$oldEntityID}"
		);
	}
	else
	{
		$dbResult = $connection->query(
			"SELECT OWNER_ID FROM b_crm_timeline_bind WHERE ENTITY_TYPE_ID = {$entityTypeID} AND ENTITY_ID = {$oldEntityID}"
		);
	}

	$updateMap = array();
	$deleteMap = array();

	while($fields = $dbResult->fetch())
	{
		$updateMap[$fields['OWNER_ID']] = true;
	}

	$sliceSize = 200;
	$ownerIDs = array_keys($updateMap);
	while(!empty($ownerIDs))
	{
		$conditionSql = implode(',', array_splice($ownerIDs, 0, $sliceSize));
		if($conditionSql === '')
		{
			break;
		}

		$dbResult = $connection->query("SELECT OWNER_ID FROM b_crm_timeline_bind WHERE ENTITY_TYPE_ID = {$entityTypeID} AND ENTITY_ID = {$newEntityID} AND OWNER_ID IN ({$conditionSql})");
		while($fields = $dbResult->fetch())
		{
			$deleteMap[$fields['OWNER_ID']] = true;
			unset($updateMap[$fields['OWNER_ID']]);
		}

		//Skip records that are associated with old entity
		if(in_array(TimelineType::CREATION, $typeIDs, true))
		{
			$dbResult = $connection->query("SELECT ID FROM b_crm_timeline WHERE ASSOCIATED_ENTITY_TYPE_ID = {$entityTypeID} AND ASSOCIATED_ENTITY_ID = {$oldEntityID} AND ID IN ({$conditionSql})");
			while($fields = $dbResult->fetch())
			{
				unset($updateMap[$fields['ID']]);
			}
		}
	}

	if(!empty($updateMap))
	{
		$ownerIDs = array_keys($updateMap);
		while(!empty($ownerIDs))
		{
			$conditionSql = implode(',', array_splice($ownerIDs, 0, $sliceSize));
			if($conditionSql === '')
			{
				break;
			}

			$connection->queryExecute(
				"UPDATE b_crm_timeline_bind b SET b.ENTITY_ID = {$newEntityID} WHERE ENTITY_TYPE_ID = {$entityTypeID} AND ENTITY_ID = {$oldEntityID} AND OWNER_ID IN ({$conditionSql})"
			);
		}
	}

	if(!empty($deleteMap))
	{
		$ownerIDs = array_keys($deleteMap);
		while(!empty($ownerIDs))
		{
			$conditionSql = implode(',', array_splice($ownerIDs, 0, $sliceSize));
			if($conditionSql === '')
			{
				break;
			}

			$connection->queryExecute(
				"DELETE FROM b_crm_timeline_bind WHERE ENTITY_TYPE_ID = {$entityTypeID} AND ENTITY_ID = {$oldEntityID} AND OWNER_ID IN ({$conditionSql})"
			);
		}
	}

	if (\CCrmOwnerType::IsDefined($entityTypeID))
	{
		if ($oldEntityID > 0)
		{
			Monitor::getInstance()->onTimelineEntryRemove(new ItemIdentifier($entityTypeID, $oldEntityID));
		}
		if ($newEntityID > 0)
		{
			Monitor::getInstance()->onTimelineEntryAdd(new ItemIdentifier($entityTypeID, $newEntityID));
		}
	}

	self::cleanCache();
}