static function PrepareEntityInfo($entityTypeName, $entityID, $options = array())
{
$enableSlider = \Bitrix\Crm\Settings\LayoutSettings::getCurrent()->isSliderEnabled();
$entityTypeName = mb_strtoupper(strval($entityTypeName));
$entityID = intval($entityID);
if(!is_array($options))
{
$options = array();
}
$userPermissions = isset($options['USER_PERMISSIONS']) && $options['USER_PERMISSIONS'] instanceof \CCrmPerms
? $options['USER_PERMISSIONS'] : \CCrmPerms::GetCurrentUserPermissions();
$bEntityEditorFormat = (
isset($options['ENTITY_EDITOR_FORMAT'])
&& ($options['ENTITY_EDITOR_FORMAT'] === true || mb_strtoupper($options['ENTITY_EDITOR_FORMAT']) === 'Y')
);
$bEntityPrefixEnabled = (
isset($options['ENTITY_PREFIX_ENABLED'])
&& ($options['ENTITY_PREFIX_ENABLED'] === true || mb_strtoupper($options['ENTITY_PREFIX_ENABLED']) === 'Y')
);
$isHidden = (
isset($options['IS_HIDDEN'])
&& ($options['IS_HIDDEN'] === true || $options['IS_HIDDEN'] === 'Y')
);
$largeImages = (
isset($options['LARGE_IMAGES'])
&& ($options['LARGE_IMAGES'] === true || $options['LARGE_IMAGES'] === 'Y')
);
$entityTypeId = \CCrmOwnerType::ResolveID($entityTypeName);
$serviceUserPermissions = Container::getInstance()->getUserPermissions($userPermissions->GetUserID());
$isMyCompany = (int)$entityTypeId === CCrmOwnerType::Company && CCrmCompany::isMyCompany((int)$entityID);
if (!$isHidden)
{
if ($entityTypeId > 0)
{
$isHidden = $isMyCompany
? !$serviceUserPermissions->getMyCompanyPermissions()->canReadBaseFields((int)$entityID)
: !$serviceUserPermissions->checkReadPermissions($entityTypeId, $entityID)
;
}
}
if($isHidden)
{
$requireMultifields = $requireBindings = $requireRequisiteData = $requireEditRequisiteData = false;
}
else
{
$requireMultifields = !isset($options['REQUIRE_MULTIFIELDS']) || $options['REQUIRE_MULTIFIELDS'] === true;
$requireBindings = !isset($options['REQUIRE_BINDINGS']) || $options['REQUIRE_BINDINGS'] === true;
$requireRequisiteData = (
isset($options['REQUIRE_REQUISITE_DATA'])
&& ($options['REQUIRE_REQUISITE_DATA'] === true || $options['REQUIRE_REQUISITE_DATA'] === 'Y')
);
$requireEditRequisiteData = (
isset($options['REQUIRE_EDIT_REQUISITE_DATA'])
&& ($options['REQUIRE_EDIT_REQUISITE_DATA'] === true || $options['REQUIRE_EDIT_REQUISITE_DATA'] === 'Y')
);
}
$normalizeMultifields = (
isset($options['NORMALIZE_MULTIFIELDS'])
&& ($options['NORMALIZE_MULTIFIELDS'] === true || $options['NORMALIZE_MULTIFIELDS'] === 'Y')
);
$result = array();
if ($bEntityEditorFormat)
{
$result['id'] = $entityID;
$result['type'] = mb_strtolower($entityTypeName);
$result['typeName'] = $entityTypeName;
$result['typeNameTitle'] = \CCrmOwnerType::GetDescription($entityTypeId);
$result['place'] = $result['type'];
$result['hidden'] = $isHidden;
}
$titleKey = $bEntityEditorFormat ? 'title' : 'TITLE';
$result[$titleKey] = "{$entityTypeName}_{$entityID}";
$urlKey = $bEntityEditorFormat ? 'url' : 'URL';
$result[$urlKey] = '';
$descKey = $bEntityEditorFormat ? 'desc' : 'DESC';
$result[$descKey] = '';
$imageKey = $bEntityEditorFormat ? 'image' : 'IMAGE';
$largeImageKey = $bEntityEditorFormat ? 'largeImage' : 'LARGE_IMAGE';
$result[$imageKey] = '';
if($entityTypeName === '' || $entityID <= 0)
{
return $result;
}
$advancedInfoKey = $bEntityEditorFormat ? 'advancedInfo' : 'ADVANCED_INFO';
$contactTypeKey = $bEntityEditorFormat ? 'contactType' : 'CONTACT_TYPE';
$contactTypeIdKey = $bEntityEditorFormat ? 'id' : 'ID';
$contactTypeNameKey = $bEntityEditorFormat ? 'name' : 'NAME';
$multiFieldsKey = $bEntityEditorFormat ? 'multiFields' : 'MULTI_FIELDS';
$requisiteDataKey = $bEntityEditorFormat ? 'requisiteData' : 'REQUISITE_DATA';
$bindingDataKey = $bEntityEditorFormat ? 'bindings' : 'BINDINGS';
$permissionsKey = $bEntityEditorFormat ? 'permissions' : 'PERMISSIONS';
$canUpdateKey = $bEntityEditorFormat ? 'canUpdate' : 'CAN_UPDATE';
if ($bEntityEditorFormat && $bEntityPrefixEnabled)
{
$result['id'] = static::getIdWithEntityPrefix($result['id'], $entityTypeName);
}
if ($isHidden)
{
$result[$titleKey] = static::getHiddenTitle($entityTypeName);
$result[$advancedInfoKey]['hasEditRequisiteData'] = true;
return $result;
}
$result[$permissionsKey] = [
$canUpdateKey => $isMyCompany
? $serviceUserPermissions->getMyCompanyPermissions()->canUpdateByOwnerEntity(
(int)($options['ownerEntityTypeId'] ?? $entityTypeId),
(int)($options['ownerEntityId'] ?? $entityID)
)
: $serviceUserPermissions->checkUpdatePermissions($entityTypeId, $entityID),
];
if($entityTypeName === 'CONTACT')
{
$arImages = array();
$arLargeImages = array();
$contactTypes = CCrmStatus::GetStatusList('CONTACT_TYPE');
$obRes = CCrmContact::GetListEx(
array(),
array('=ID'=> $entityID, 'CHECK_PERMISSIONS' => 'N'),
false,
false,
array('HONORIFIC', 'NAME', 'SECOND_NAME', 'LAST_NAME', 'COMPANY_TITLE', 'POST', 'PHOTO', 'TYPE_ID')
);
if($arRes = $obRes->Fetch())
{
$photoID = intval($arRes['PHOTO']);
if ($photoID > 0 && !isset($arImages[$photoID]))
{
if ($largeImages)
{
// the same size and resize type as in `crm.contact.details` (do not multiply images)
$arImages[$photoID] = $arLargeImages[$photoID] = CFile::ResizeImageGet(
$photoID,
['width' => 200, 'height' => 200],
BX_RESIZE_IMAGE_EXACT,
false,
false,
true
);
}
else
{
$arImages[$photoID] = CFile::ResizeImageGet(
$photoID,
['width' => 25, 'height' => 25],
BX_RESIZE_IMAGE_EXACT
);
$arLargeImages[$photoID] = CFile::ResizeImageGet(
$photoID,
['width' => 38, 'height' => 38],
BX_RESIZE_IMAGE_EXACT
);
}
}
$result[$titleKey] = CCrmContact::PrepareFormattedName(
array(
'HONORIFIC' => isset($arRes['HONORIFIC']) ? $arRes['HONORIFIC'] : '',
'NAME' => isset($arRes['NAME']) ? $arRes['NAME'] : '',
'LAST_NAME' => isset($arRes['LAST_NAME']) ? $arRes['LAST_NAME'] : '',
'SECOND_NAME' => isset($arRes['SECOND_NAME']) ? $arRes['SECOND_NAME'] : ''
),
isset($options['NAME_TEMPLATE']) ? $options['NAME_TEMPLATE'] : ''
);
$result[$urlKey] = CComponentEngine::MakePathFromTemplate(
COption::GetOptionString('crm', $enableSlider ? 'path_to_contact_details' : 'path_to_contact_show'),
array(
'contact_id' => $entityID
)
);
$result[$descKey] = isset($arRes['POST']) && $arRes['POST'] !== ''
? $arRes['POST']
: (isset($arRes['COMPANY_TITLE']) ? $arRes['COMPANY_TITLE'] : '');
$result[$imageKey] = isset($arImages[$photoID]['src']) ? $arImages[$photoID]['src'] : '';
$result[$largeImageKey] = isset($arLargeImages[$photoID]['src']) ? $arLargeImages[$photoID]['src'] : '';
// advanced info
$advancedInfo = array();
if (isset($arRes['TYPE_ID']) && $arRes['TYPE_ID'] != '' && isset($contactTypes[$arRes['TYPE_ID']]))
{
$advancedInfo[$contactTypeKey] = array(
$contactTypeIdKey => $arRes['TYPE_ID'],
$contactTypeNameKey => $contactTypes[$arRes['TYPE_ID']]
);
}
if (!empty($advancedInfo))
$result[$advancedInfoKey] = $advancedInfo;
if ($requireMultifields)
{
$phoneCountryList = static::getPhoneCountryList('CONTACT', $entityID);
// advanced info - phone number, e-mail
$obRes = CCrmFieldMulti::GetList(['ID' => 'asc'], ['ENTITY_ID' => 'CONTACT', 'ELEMENT_ID' => $entityID]);
while ($arRes = $obRes->Fetch())
{
if (
$arRes['TYPE_ID'] === 'PHONE'
|| $arRes['TYPE_ID'] === 'EMAIL'
|| ($arRes['TYPE_ID'] === 'IM' && OpenLineManager::isImOpenLinesValue($arRes['VALUE']))
)
{
$formattedValue = $arRes['TYPE_ID'] === 'PHONE'
? \Bitrix\Main\PhoneNumber\Parser::getInstance()->parse($arRes['VALUE'])->format()
: $arRes['VALUE'];
$multiFieldId = $normalizeMultifields ? $arRes['ID'] : $entityID;
if (!isset($result[$advancedInfoKey]) || !is_array($result[$advancedInfoKey]))
{
$result[$advancedInfoKey] = [];
}
if (
!isset($result[$advancedInfoKey][$multiFieldsKey])
|| !is_array($result[$advancedInfoKey][$multiFieldsKey])
)
{
$result[$advancedInfoKey][$multiFieldsKey] = [];
}
$result[$advancedInfoKey][$multiFieldsKey][] = [
'ID' => $multiFieldId,
'ENTITY_ID' => $normalizeMultifields ? $entityID : $arRes['ID'],
'ENTITY_TYPE_NAME' => $entityTypeName,
'TYPE_ID' => $arRes['TYPE_ID'],
'VALUE_TYPE' => $arRes['VALUE_TYPE'],
'VALUE' => $arRes['VALUE'],
'VALUE_EXTRA' => [
'COUNTRY_CODE' => $phoneCountryList[$multiFieldId] ?? ''
],
'VALUE_FORMATTED' => $formattedValue,
'COMPLEX_ID' => $arRes['COMPLEX_ID'],
'COMPLEX_NAME' => \CCrmFieldMulti::GetEntityNameByComplex($arRes['COMPLEX_ID'], false),
'TITLE' => OpenLineManager::isImOpenLinesValue($arRes['VALUE']) ? OpenLineManager::getOpenLineTitle($arRes['VALUE']) : '',
];
}
}
}
if($requireBindings)
{
$result[$advancedInfoKey][$bindingDataKey][CCrmOwnerType::CompanyName] =
\Bitrix\Crm\Binding\ContactCompanyTable::getContactCompanyIDs($entityID);
}
// requisites
if ($requireRequisiteData)
{
$requisiteDataParams =
$requireEditRequisiteData ?
[
'VIEW_FORMATTED' => true,
'ADDRESS_AS_JSON' => true,
]
:
[
'VIEW_DATA_ONLY' => true
];
$result[$advancedInfoKey][$requisiteDataKey] = self::PrepareRequisiteData(
CCrmOwnerType::Contact, $entityID, $requisiteDataParams
);
}
$result[$advancedInfoKey]['hasEditRequisiteData'] = $requireEditRequisiteData;
}
else
{
$result['notFound'] = true;
}
}
elseif($entityTypeName === 'COMPANY')
{
$arImages = array();
$arLargeImages = array();
$arCompanyTypeList = CCrmStatus::GetStatusList('COMPANY_TYPE');
$arCompanyIndustryList = CCrmStatus::GetStatusList('INDUSTRY');
$obRes = CCrmCompany::GetListEx(
array(),
array('=ID'=> $entityID, 'CHECK_PERMISSIONS' => 'N'),
false,
false,
[
'ID',
'TITLE',
'COMPANY_TYPE',
'INDUSTRY',
'LOGO',
]
);
if ($arRes = $obRes->fetch())
{
$result[$titleKey] = $arRes['TITLE'];
$result[$urlKey] = CComponentEngine::MakePathFromTemplate(
COption::GetOptionString('crm', $enableSlider ? 'path_to_company_details' : 'path_to_company_show'),
array(
'company_id' => $entityID
)
);
$category = Container::getInstance()->getFactory(CCrmOwnerType::Company)
->getItemCategory((int)$arRes['ID']);
$categoryDependentDisabledFields = $category ? $category->getDisabledFieldNames() : [];
$arDesc = [];
if (
isset($arCompanyTypeList[$arRes['COMPANY_TYPE']])
&& !in_array(Item::FIELD_NAME_TYPE_ID, $categoryDependentDisabledFields, true)
)
{
$arDesc[] = $arCompanyTypeList[$arRes['COMPANY_TYPE']];
}
if (
isset($arCompanyIndustryList[$arRes['INDUSTRY']])
&& !in_array(Company::FIELD_NAME_INDUSTRY, $categoryDependentDisabledFields, true)
)
{
$arDesc[] = $arCompanyIndustryList[$arRes['INDUSTRY']];
}
$result[$descKey] = implode(', ', $arDesc);
$logoID = intval($arRes['LOGO']);
if ($logoID > 0 && !isset($arImages[$logoID]))
{
if ($largeImages)
{
// the same size and resize type as in `crm.company.details` (do not multiply images)
$arImages[$logoID] = $arLargeImages[$logoID] = CFile::ResizeImageGet(
$logoID,
['width' => 300, 'height' => 300],
false,
false,
true
);
}
else
{
$arImages[$logoID] = CFile::ResizeImageGet(
$logoID,
['width' => 25, 'height' => 25],
BX_RESIZE_IMAGE_EXACT
);
$arLargeImages[$logoID] = CFile::ResizeImageGet(
$logoID,
['width' => 38, 'height' => 38],
BX_RESIZE_IMAGE_EXACT
);
}
}
$result[$imageKey] = isset($arImages[$logoID]['src']) ? $arImages[$logoID]['src'] : '';
$result[$largeImageKey] = isset($arLargeImages[$logoID]['src']) ? $arLargeImages[$logoID]['src'] : '';
if ($requireMultifields)
{
$phoneCountryList = static::getPhoneCountryList('COMPANY', $entityID);
// advanced info - phone number, e-mail
$obRes = CCrmFieldMulti::GetList(['ID' => 'asc'], ['ENTITY_ID' => 'COMPANY', 'ELEMENT_ID' => $entityID]);
while ($arRes = $obRes->Fetch())
{
if ($arRes['TYPE_ID'] === 'PHONE' || $arRes['TYPE_ID'] === 'EMAIL')
{
$formattedValue = $arRes['TYPE_ID'] === 'PHONE'
? \Bitrix\Main\PhoneNumber\Parser::getInstance()->parse($arRes['VALUE'])->format()
: $arRes['VALUE'];
$multiFieldId = $normalizeMultifields ? $arRes['ID'] : $entityID;
if (!isset($result[$advancedInfoKey]) || !is_array($result[$advancedInfoKey]))
{
$result[$advancedInfoKey] = [];
}
if (
!isset($result[$advancedInfoKey][$multiFieldsKey])
|| !is_array($result[$advancedInfoKey][$multiFieldsKey])
)
{
$result[$advancedInfoKey][$multiFieldsKey] = [];
}
$result[$advancedInfoKey][$multiFieldsKey][] = [
'ID' => $multiFieldId,
'ENTITY_ID' => $normalizeMultifields ? $entityID : $arRes['ID'],
'ENTITY_TYPE_NAME' => $entityTypeName,
'TYPE_ID' => $arRes['TYPE_ID'],
'VALUE_TYPE' => $arRes['VALUE_TYPE'],
'VALUE' => $arRes['VALUE'],
'VALUE_EXTRA' => [
'COUNTRY_CODE' => $phoneCountryList[$multiFieldId] ?? ''
],
'VALUE_FORMATTED' => $formattedValue,
'COMPLEX_ID' => $arRes['COMPLEX_ID'],
'COMPLEX_NAME' => \CCrmFieldMulti::GetEntityNameByComplex($arRes['COMPLEX_ID'], false)
];
}
}
}
}
else
{
$result['notFound'] = true;
}
// requisites
if ($requireRequisiteData)
{
$requisiteDataParams =
$requireEditRequisiteData ?
[
'VIEW_FORMATTED' => true,
'ADDRESS_AS_JSON' => true,
]
:
[
'VIEW_DATA_ONLY' => true
];
$result[$advancedInfoKey][$requisiteDataKey] = self::PrepareRequisiteData(
CCrmOwnerType::Company, $entityID, $requisiteDataParams
);
}
$result[$advancedInfoKey]['hasEditRequisiteData'] = $requireEditRequisiteData;
}
elseif($entityTypeName === 'LEAD')
{
$obRes = CCrmLead::GetListEx(
array(),
array('=ID'=> $entityID),
false,
false,
array('TITLE', 'HONORIFIC', 'NAME', 'SECOND_NAME', 'LAST_NAME')
);
if($arRes = $obRes->Fetch())
{
$result[$titleKey] = isset($arRes['TITLE']) ? $arRes['TITLE'] : '';
if($result[$titleKey] === '')
{
$result[$titleKey] = CCrmLead::PrepareFormattedName(
array(
'HONORIFIC' => isset($arRes['HONORIFIC']) ? $arRes['HONORIFIC'] : '',
'NAME' => isset($arRes['NAME']) ? $arRes['NAME'] : '',
'LAST_NAME' => isset($arRes['LAST_NAME']) ? $arRes['LAST_NAME'] : '',
'SECOND_NAME' => isset($arRes['SECOND_NAME']) ? $arRes['SECOND_NAME'] : ''
),
isset($options['NAME_TEMPLATE']) ? $options['NAME_TEMPLATE'] : ''
);
}
$result[$urlKey] = CComponentEngine::MakePathFromTemplate(
COption::GetOptionString('crm', $enableSlider ? 'path_to_lead_details' : 'path_to_lead_show'),
array(
'lead_id' => $entityID
)
);
$result[$descKey] = CCrmLead::PrepareFormattedName(
array(
'HONORIFIC' => isset($arRes['HONORIFIC']) ? $arRes['HONORIFIC'] : '',
'NAME' => isset($arRes['NAME']) ? $arRes['NAME'] : '',
'SECOND_NAME' => isset($arRes['SECOND_NAME']) ? $arRes['SECOND_NAME'] : '',
'LAST_NAME' => isset($arRes['LAST_NAME']) ? $arRes['LAST_NAME'] : ''
)
);
if ($requireMultifields)
{
$phoneCountryList = static::getPhoneCountryList('LEAD', $entityID);
// advanced info - phone number, e-mail
$obRes = CCrmFieldMulti::GetList(['ID' => 'asc'], ['ENTITY_ID' => 'LEAD', 'ELEMENT_ID' => $entityID]);
while ($arRes = $obRes->Fetch())
{
if ($arRes['TYPE_ID'] === 'PHONE' || $arRes['TYPE_ID'] === 'EMAIL')
{
$formattedValue = $arRes['TYPE_ID'] === 'PHONE'
? \Bitrix\Main\PhoneNumber\Parser::getInstance()->parse($arRes['VALUE'])->format()
: $arRes['VALUE'];
$multiFieldId = $normalizeMultifields ? $arRes['ID'] : $entityID;
if (!isset($result[$advancedInfoKey]) || !is_array($result[$advancedInfoKey]))
{
$result[$advancedInfoKey] = [];
}
if (
!isset($result[$advancedInfoKey][$multiFieldsKey])
|| !is_array($result[$advancedInfoKey][$multiFieldsKey])
)
{
$result[$advancedInfoKey][$multiFieldsKey] = [];
}
$result[$advancedInfoKey][$multiFieldsKey][] = [
'ID' => $multiFieldId,
'ENTITY_ID' => $normalizeMultifields ? $entityID : $arRes['ID'],
'ENTITY_TYPE_NAME' => $entityTypeName,
'TYPE_ID' => $arRes['TYPE_ID'],
'VALUE_TYPE' => $arRes['VALUE_TYPE'],
'VALUE' => $arRes['VALUE'],
'VALUE_EXTRA' => [
'COUNTRY_CODE' => $phoneCountryList[$multiFieldId] ?? ''
],
'VALUE_FORMATTED' => $formattedValue,
'COMPLEX_ID' => $arRes['COMPLEX_ID'],
'COMPLEX_NAME' => \CCrmFieldMulti::GetEntityNameByComplex($arRes['COMPLEX_ID'], false)
];
}
}
}
}
else
{
$result['notFound'] = true;
}
}
elseif($entityTypeName === 'DEAL')
{
$obRes = CCrmDeal::GetListEx(
array(),
array('=ID'=> $entityID),
false,
false,
array('TITLE', 'COMPANY_TITLE', 'CONTACT_FULL_NAME')
);
if($arRes = $obRes->Fetch())
{
$result[$titleKey] = $arRes['TITLE'];
$result[$urlKey] = CComponentEngine::MakePathFromTemplate(
COption::GetOptionString('crm', $enableSlider ? 'path_to_deal_details' : 'path_to_deal_show'),
array(
'deal_id' => $entityID
)
);
$clientTitle = (!empty($arRes['COMPANY_TITLE'])) ? $arRes['COMPANY_TITLE'] : '';
$clientTitle .= (($clientTitle !== '' && !empty($arRes['CONTACT_FULL_NAME'])) ? ', ' : '').
$arRes['CONTACT_FULL_NAME'];
$result[$descKey] = $clientTitle;
}
else
{
$result['notFound'] = true;
}
}
elseif($entityTypeName === 'QUOTE')
{
$obRes = CCrmQuote::GetList(
array(), array('=ID'=> $entityID), false, false,
array('QUOTE_NUMBER', 'TITLE', 'COMPANY_TITLE', 'CONTACT_FULL_NAME', 'BEGINDATE')
);
if($arRes = $obRes->Fetch())
{
$result[$titleKey] = \Bitrix\Crm\Item\Quote::getTitlePlaceholderFromData($arRes);
$result[$urlKey] = Container::getInstance()->getRouter()->getItemDetailUrl(\CCrmOwnerType::Quote, $entityID);
$clientTitle = (!empty($arRes['COMPANY_TITLE'])) ? $arRes['COMPANY_TITLE'] : '';
$clientTitle .= (($clientTitle !== '' && !empty($arRes['CONTACT_FULL_NAME'])) ? ', ' : '').$arRes['CONTACT_FULL_NAME'];
$result[$descKey] = $clientTitle;
}
else
{
$result['notFound'] = true;
}
}
elseif($entityTypeName === 'ORDER')
{
$order = Order::getList([
'select' => ['ID', 'ACCOUNT_NUMBER'],
'filter' => [
'=ID'=> $entityID,
],
])->fetchRaw();
if ($order)
{
$result[$titleKey] = Loc::getMessage(
'CRM_ENT_SEL_HLP_ORDER_SUMMARY',
[
'#ORDER_NUMBER#' => (
isset($order['ACCOUNT_NUMBER'])
? htmlspecialcharsbx($order['ACCOUNT_NUMBER'])
: $order['ID']
),
]
);
$result[$urlKey] = Service\Sale\EntityLinkBuilder\EntityLinkBuilder::getInstance()
->getOrderDetailsLink($entityID);
}
else
{
$result['notFound'] = true;
}
}
elseif(\CCrmOwnerType::isUseFactoryBasedApproach($entityTypeId))
{
$factory = Container::getInstance()->getFactory($entityTypeId);
if (!$factory)
{
return $result;
}
$item = $factory->getItem($entityID);
if (!$item)
{
$result['notFound'] = true;
return $result;
}
$result[$titleKey] = $item->getHeading();
$result[$urlKey] = Container::getInstance()
->getRouter()
->getItemDetailUrl($entityTypeId, $entityID)
;
}
return $result;
}