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

	$connection = Main\Application::getConnection();
	$dbResult = $connection->query(
		"SELECT OWNER_ID FROM b_crm_timeline_bind WHERE ENTITY_TYPE_ID = {$oldEntityTypeID} 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 = {$newEntityTypeID} AND ENTITY_ID = {$newEntityID} AND OWNER_ID IN ({$conditionSql})");
		while($fields = $dbResult->fetch())
		{
			$deleteMap[$fields['OWNER_ID']] = true;
			unset($updateMap[$fields['OWNER_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_TYPE_ID = {$newEntityTypeID}, b.ENTITY_ID = {$newEntityID} WHERE ENTITY_TYPE_ID = {$oldEntityTypeID} 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 = {$oldEntityTypeID} AND ENTITY_ID = {$oldEntityID} AND OWNER_ID IN ({$conditionSql})"
			);
		}
	}

	$connection->queryExecute(
		"UPDATE b_crm_timeline SET ASSOCIATED_ENTITY_TYPE_ID = {$newEntityTypeID}, ASSOCIATED_ENTITY_ID = {$newEntityID} WHERE ASSOCIATED_ENTITY_TYPE_ID = {$oldEntityTypeID} AND ASSOCIATED_ENTITY_ID = {$oldEntityID}"
	);

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

	self::cleanCache();
	TimelineTable::cleanCache();
}