- Модуль: crm
- Путь к файлу: ~/bitrix/modules/crm/lib/agent/activity/synccountabledataagent.php
- Класс: Bitrix\Crm\Agent\Activity\SyncCountableDataAgent
- Вызов: SyncCountableDataAgent::getCountableEntityList
private function getCountableEntityList(int &$lastEntityTypeId, int &$lastEntityId, int $limit): array
{
$dataByEntityTypeId = [];
$iterator = EntityCountableActivityTable::query()
->setSelect([
'ENTITY_ID',
'ENTITY_TYPE_ID',
])
->where('ENTITY_ID', $lastEntityId)
->where('ENTITY_TYPE_ID', '>', $lastEntityTypeId)
->setOrder(['ENTITY_ID' => 'ASC', 'ENTITY_TYPE_ID' => 'ASC'])
->setGroup(['ENTITY_ID', 'ENTITY_TYPE_ID'])
->exec()
;
while($item = $iterator->fetch())
{
$lastEntityTypeId = (int)$item['ENTITY_TYPE_ID'];
$lastEntityId = (int)$item['ENTITY_ID'];
$dataByEntityTypeId[$lastEntityTypeId][] = $lastEntityId;
}
$iterator = EntityCountableActivityTable::query()
->setSelect([
'ENTITY_ID',
'ENTITY_TYPE_ID',
])
->where('ENTITY_ID', '>', $lastEntityId)
->setLimit($limit)
->setOrder(['ENTITY_ID' => 'ASC', 'ENTITY_TYPE_ID' => 'ASC'])
->setGroup(['ENTITY_ID', 'ENTITY_TYPE_ID'])
->exec()
;
while($item = $iterator->fetch())
{
$lastEntityTypeId = (int)$item['ENTITY_TYPE_ID'];
$lastEntityId = (int)$item['ENTITY_ID'];
$dataByEntityTypeId[$lastEntityTypeId][] = $lastEntityId;
}
if (empty($dataByEntityTypeId))
{
return [];
}
$result = [];
foreach ($dataByEntityTypeId as $entityTypeId => $entityIds)
{
$entityIds = array_unique($entityIds);
sort($entityIds);
if (empty($entityIds))
{
continue;
}
$factory = Container::getInstance()->getFactory($entityTypeId);
if (!$factory)
{
continue;
}
$assignedByFiledName = $factory->getEntityFieldNameByMap(Item::FIELD_NAME_ASSIGNED);
$select = [
Item::FIELD_NAME_ID,
];
if ($factory->isFieldExists(Item::FIELD_NAME_ASSIGNED))
{
$select[] = $assignedByFiledName;
}
$entitiesIterator = $factory->getDataClass()::query()
->setSelect($select)
->whereIn('ID', $entityIds)
->exec();
$entityData = [];
while ($entity = $entitiesIterator->fetch())
{
$entityData[$entity[Item::FIELD_NAME_ID]] = [
'DELETED' => false,
'ENTITY_TYPE_ID' => $entityTypeId,
'ENTITY_ID' => $entity[Item::FIELD_NAME_ID],
'ENTITY_ASSIGNED_BY_ID' => $entity[$assignedByFiledName],
];
}
foreach ($entityIds as $entityId)
{
if (isset($entityData[$entityId]))
{
$result[] = $entityData[$entityId];
}
else
{
$result[] = [
'DELETED' => true,
'ENTITY_TYPE_ID' => $entityTypeId,
'ENTITY_ID' => $entityId,
];
}
}
}
return $result;
}