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