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