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