...Человеческий поиск в разработке...
- Модуль: crm
- Путь к файлу: ~/bitrix/modules/crm/classes/general/crm_entity_selector_helper.php
- Класс: \CCrmEntitySelectorHelper
- Вызов: CCrmEntitySelectorHelper::PrepareEntityInfo
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; }