• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/exclusion/applicability.php
  • Класс: Bitrix\Crm\Exclusion\Applicability
  • Вызов: Applicability::filterEntities
static function filterEntities($entityTypeId, array &$list)
{
	$entityTypeId = (int) $entityTypeId;
	switch ($entityTypeId)
	{
		case \CCrmOwnerType::Contact:
			self::removeFromContacts($list);
			return;

		case \CCrmOwnerType::Company:
			self::removeFromCompanies($list);
			return;

		case \CCrmOwnerType::Lead:
			$entities = [];
			$leads = LeadTable::getList([
				'select' => [
					'ID', 'IS_RETURN_CUSTOMER', 'COMPANY_ID', 'CONTACT_ID',
					'HAS_EMAIL', 'HAS_PHONE'
				],
				'filter' => ['=ID' => $list]
			]);
			foreach ($leads as $entity)
			{
				if ($entity['IS_RETURN_CUSTOMER'] === 'Y')
				{
					$entities[] = [
						'ID' => $entity['ID'],
						'CONTACT_ID' => $entity['CONTACT_ID'],
						'COMPANY_ID' => $entity['COMPANY_ID'],
					];
				}
				elseif ($entity['HAS_EMAIL'] <> 'Y' && $entity['HAS_PHONE'] <> 'Y')
				{
					self::removeFromList($entity['ID'], $list);
				}
			}
			break;

		case \CCrmOwnerType::Deal:
			$entities = DealTable::getList([
				'select' => ['ID', 'COMPANY_ID', 'CONTACT_ID'],
				'filter' => ['=ID' => $list]
			])->fetchAll();
			break;

		case \CCrmOwnerType::Quote:
			$entities = QuoteTable::getList([
				'select' => ['ID', 'COMPANY_ID', 'CONTACT_ID'],
				'filter' => ['=ID' => $list]
			])->fetchAll();
			break;

		default:
			throw new NotSupportedException("Entity type ID `$entityTypeId` not supported.");
	}

	if (empty($entities))
	{
		return;
	}

	$companies = [];
	$contacts = [];
	foreach ($entities as $entity)
	{
		if ($entity['COMPANY_ID'])
		{
			$companies[] = $entity['COMPANY_ID'];
		}
		if ($entity['CONTACT_ID'])
		{
			$contacts[] = $entity['CONTACT_ID'];
		}
	}

	// find & remove contacts without comm data
	if (!empty($contacts))
	{
		self::removeFromContacts($contacts);
	}

	// find & remove companies without comm data
	if (!empty($companies))
	{
		self::removeFromCompanies($companies);
	}

	// remove entities without comm data
	foreach ($entities as $entity)
	{
		if ($entity['CONTACT_ID'] && in_array($entity['CONTACT_ID'], $contacts))
		{
			continue;
		}

		if ($entity['COMPANY_ID'] && in_array($entity['COMPANY_ID'], $companies))
		{
			continue;
		}

		self::removeFromList($entity['ID'], $list);
	}
}