- Модуль: crm
- Путь к файлу: ~/bitrix/modules/crm/lib/agent/duplicate/volatile/cleaner.php
- Класс: Bitrix\Crm\Agent\Duplicate\Volatile\Cleaner
- Вызов: Cleaner::processStep
protected function processStep(): bool
{
$result = false;
// Prefpare filter
$entityTypeIds = DuplicateVolatileCriterion::getSupportedEntityTypes();
$volatileTypeIds = DuplicateVolatileCriterion::getAllSupportedDedupeTypes();
$activeTypeIds = [];
$activeEntityTypeIds = [];
foreach (TypeInfo::getInstance()->get() as $typeInfo)
{
if ($typeInfo['ACTIVE'] === 'Y')
{
$activeTypeIds[] = $typeInfo['ID'];
$activeEntityTypeIds[] = $typeInfo['ENTITY_TYPE_ID'];
}
}
$inactiveTypeIds = array_diff($volatileTypeIds, $activeTypeIds);
$filter = [
'LOGIC' => 'OR',
];
foreach ($inactiveTypeIds as $volatileTypeId)
{
$filter[] = [
'=TYPE_ID' => $volatileTypeId,
'@ENTITY_TYPE_ID' => $entityTypeIds,
];
}
foreach ($activeTypeIds as $index => $volatileTypeId)
{
if (in_array($activeEntityTypeIds[$index], $entityTypeIds, true))
{
$entityTypeIdsToDelete = array_diff($entityTypeIds, [$activeEntityTypeIds[$index]]);
}
else
{
$entityTypeIdsToDelete = $entityTypeIds;
}
if (!empty($entityTypeIdsToDelete))
{
$filter[] = [
'=TYPE_ID' => $volatileTypeId,
'@ENTITY_TYPE_ID' => $entityTypeIdsToDelete,
];
}
}
$limit = static::ITEM_LIMIT;
if (count($filter) > 1)
{
// Cleaning hashes
$res = DuplicateEntityMatchHashTable::getList(
[
'select' => [
'ENTITY_ID',
'ENTITY_TYPE_ID',
'TYPE_ID',
'MATCH_HASH',
'SCOPE',
],
'filter' => $filter,
'limit' => $limit,
]
);
if (is_object($res))
{
while ($row = $res->fetch())
{
$result = true;
DuplicateEntityMatchHashTable::delete(
[
'ENTITY_ID' => (int)$row['ENTITY_ID'],
'ENTITY_TYPE_ID' => (int)$row['ENTITY_TYPE_ID'],
'TYPE_ID' => (int)$row['TYPE_ID'],
'MATCH_HASH' => $row['MATCH_HASH'],
'SCOPE' => $row['SCOPE'],
]
);
}
}
// Cleaning match codes
$res = DuplicateVolatileMatchCodeTable::getList(
[
'select' => ['ID'],
'filter' => $filter,
'limit' => $limit,
]
);
if (is_object($res))
{
while ($row = $res->fetch())
{
$result = true;
DuplicateVolatileMatchCodeTable::delete((int)$row['ID']);
}
}
}
return $result;
}