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