• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/ml/model/dealscoring.php
  • Класс: Bitrix\Crm\Ml\Model\DealScoring
  • Вызов: DealScoring::buildFeaturesVector
public function buildFeaturesVector(int $entityId) // filter maybe?
{
	$result = DealTable::getList([
		"select" => [
			"DEAL_ID" => "ID",
			"DATE_CREATE",
			"STAGE_SEMANTIC_ID",
			"SOURCE_ID" => "SOURCE_ID",
			"SOURCE_DESCRIPTION" => "SOURCE_DESCRIPTION",
			"ASSIGNED_BY_ID",
			"IS_RETURN_CUSTOMER" => "IS_RETURN_CUSTOMER",
			"IS_REPEATED_APPROACH" => "IS_REPEATED_APPROACH",
			"TITLE",
			"COMMENTS",
			"COMPANY_ID",
			"COMPANY_TYPE" => "COMPANY.COMPANY_TYPE",
			"COMPANY_INDUSTRY" => "COMPANY.INDUSTRY",
			"CONTACT_ID",
			"CONTACT_TYPE_ID" => "CONTACT.TYPE_ID",
			"CONTACT_SOURCE_ID" => "CONTACT.SOURCE_ID",
			"CONTACT_POST" => "CONTACT.POST",
		],
		"filter" => [
			"=ID" => $entityId
		]
	])->fetch();

	if (!$result)
	{
		return false;
	}

	$stage = $result["STAGE_SEMANTIC_ID"];
	unset($result["STAGE_SEMANTIC_ID"]);

	$isClosed = PhaseSemantics::isFinal($stage);
	$dateClose = null;
	if ($isClosed)
	{
		$result["SUCCESS"] = PhaseSemantics::isLost($stage) ? "N" : "Y";
		$lastStageHistoryEntry = DealStageHistoryEntry::getLatest($entityId);
		$dateClose = $lastStageHistoryEntry["CREATED_TIME"];
	}

	$result["IS_RETURN_CUSTOMER"] = isset($result["IS_RETURN_CUSTOMER"]) && $result["IS_RETURN_CUSTOMER"] === "Y"
		? "Y"
		: "N";
	$result["IS_REPEATED_APPROACH"] = isset($result["IS_REPEATED_APPROACH"]) && $result["IS_REPEATED_APPROACH"] === "Y"
		? "Y"
		: "N";
	$result["TITLE"] = FeatureBuilder::clearText($result["TITLE"] ?? '');
	$result["COMMENTS"] = FeatureBuilder::clearText($result["COMMENTS"] ?? '');

	// MultiFields
	$result["HAS_EMAIL"] = "N";
	$result["HAS_PHONE"] = "N";
	$bindings = [];
	if (isset($result["COMPANY_ID"]) && $result["COMPANY_ID"] > 0)
	{
		$bindings[] = [
			"=ENTITY_ID" => CCrmOwnerType::CompanyName,
			"=ELEMENT_ID" => $result["COMPANY_ID"]
		];
	}

	unset($result["COMPANY_ID"]);

	if (isset($result["CONTACT_ID"]) && $result["CONTACT_ID"] > 0)
	{
		$bindings[] = [
			"=ENTITY_ID" => CCrmOwnerType::ContactName,
			"=ELEMENT_ID" => $result["CONTACT_ID"]
		];
	}

	unset($result["CONTACT_ID"]);

	$additionalContacts = DealContactTable::getDealContactIDs($entityId);
	foreach ($additionalContacts as $contactId)
	{
		$bindings[] = [
			"=ENTITY_ID" => CCrmOwnerType::ContactName,
			"=ELEMENT_ID" => $contactId
		];
	}

	if (count($bindings) > 0)
	{
		$cursor = FieldMultiTable::getList([
			"select" => ["*"],
			"filter" => [
				"=TYPE_ID" => [CCrmFieldMulti::PHONE, CCrmFieldMulti::EMAIL],
				[
					"LOGIC" => "OR",
					$bindings
				]
			]
		]);

		while ($row = $cursor->fetch())
		{
			if ($row["TYPE_ID"] === CCrmFieldMulti::EMAIL)
			{
				$result["HAS_EMAIL"] = "Y";
			}
			else if ($row["TYPE_ID"] === CCrmFieldMulti::PHONE)
			{
				$result["HAS_PHONE"] = "Y";
			}
		}
	}

	$isDateCreateExist = isset($result["DATE_CREATE"]) && $result["DATE_CREATE"] instanceof DateTime;
	$result["DATE_CREATE_MONTH"] = $isDateCreateExist
		? FeatureBuilder::getMonth($result["DATE_CREATE"])
		: '';

	$result["DATE_CREATE_DAY_OF_WEEK"] = $isDateCreateExist
		? FeatureBuilder::getDayOfWeek($result["DATE_CREATE"])
		: '';

	$result["DATE_CREATE_TIME"] = $isDateCreateExist
		? FeatureBuilder::getTimeMnemonic($result["DATE_CREATE"])
		: '';

	unset($result["DATE_CREATE"]);

	// UF features
	$ufFeatures = static::getUserFieldFeatures($entityId);
	if (is_array($ufFeatures))
	{
		$result += $ufFeatures;
	}

	/** @var DataProvider\Base[] $providers */
	$providers = [
		new DataProvider\Mail($dateClose),
		new DataProvider\OpenLines($dateClose),
		new DataProvider\Telephony($dateClose),
		new DataProvider\Tracking($dateClose),
	];

	foreach ($providers as $provider)
	{
		$providerFeatures = $provider->getFeatures(CCrmOwnerType::Deal, $entityId);
		if (is_array($providerFeatures))
		{
			$result += $providerFeatures;
		}
	}

	return $result;
}