static function PrepareRequisiteData($entityTypeId, $entityId, $options = array())
{
$entityTypeId = (int)$entityTypeId;
$entityId = (int)$entityId;
// Options
$copyMode = (
isset($options['COPY_MODE']) && ($options['COPY_MODE'] === true || $options['COPY_MODE'] === 'Y')
);
$viewDataOnly = (
isset($options['VIEW_DATA_ONLY'])
&& ($options['VIEW_DATA_ONLY'] === true || $options['VIEW_DATA_ONLY'] === 'Y')
);
$viewFormatted = (
isset($options['VIEW_FORMATTED'])
&& ($options['VIEW_FORMATTED'] === true || $options['VIEW_FORMATTED'] === 'Y')
);
$addressAsJson = (
isset($options['ADDRESS_AS_JSON'])
&& ($options['ADDRESS_AS_JSON'] === true || $options['ADDRESS_AS_JSON'] === 'Y')
);
$result = array();
$requisite = new \Bitrix\Crm\EntityRequisite();
$preset = new \Bitrix\Crm\EntityPreset();
$fieldsInfo = $requisite->getFormFieldsInfo();
if ($requisite->validateEntityReadPermission($entityTypeId, $entityId))
{
// selected
$requisiteIdSelected = 0;
$bankDetailIdSelected = 0;
$settings = $requisite->loadSettings($entityTypeId, $entityId);
if (is_array($settings))
{
if (isset($settings['REQUISITE_ID_SELECTED']))
{
$requisiteIdSelected = (int)$settings['REQUISITE_ID_SELECTED'];
if ($requisiteIdSelected < 0)
$requisiteIdSelected = 0;
}
if (isset($settings['BANK_DETAIL_ID_SELECTED']))
{
$bankDetailIdSelected = (int)$settings['BANK_DETAIL_ID_SELECTED'];
if ($bankDetailIdSelected < 0)
$bankDetailIdSelected = 0;
}
}
$bSelected = false;
$fieldsAllowedMap = array();
foreach ($fieldsInfo as $fieldName => $fieldInfo)
{
if ($fieldInfo['isRQ'])
{
$fieldsAllowedMap[$fieldName] = true;
}
}
unset($fieldName, $fieldInfo);
$select = array_keys($fieldsInfo);
// address field
$needLoadAddresses = false;
if (array_search(Bitrix\Crm\EntityRequisite::ADDRESS, $select, true))
{
$needLoadAddresses = true;
unset($select[Bitrix\Crm\EntityRequisite::ADDRESS]);
}
$requisiteList = array();
$presetList = array();
$presetIds = array();
$requisiteAddresses = array();
if (is_array($select) && !empty($select))
{
$res = $requisite->getList(
array(
'order' => array('SORT' => 'ASC', 'ID' => 'ASC'),
'filter' => array(
'=ENTITY_TYPE_ID' => $entityTypeId,
'=ENTITY_ID' => $entityId
),
'select' => $select
)
);
while ($row = $res->fetch())
{
if ($needLoadAddresses)
{
$row[Bitrix\Crm\EntityRequisite::ADDRESS] = [];
}
$presetIds[] = (int)$row['PRESET_ID'];
$requisiteList[$row['ID']] = $row;
if (!$bSelected && $requisiteIdSelected === intval($row['ID']))
$bSelected = true;
}
if (!empty($requisiteList))
{
if (!empty($presetIds))
{
$presetIds = array_unique($presetIds);
$res = $preset->getList(
array(
'filter' => array(
'=ID' => $presetIds,
'=ENTITY_TYPE_ID' => \Bitrix\Crm\EntityPreset::Requisite/*,
'=ACTIVE' => 'Y'*/
),
'select' => array('ID', 'NAME', 'COUNTRY_ID', 'SETTINGS')
)
);
while ($row = $res->Fetch())
{
$presetList[$row['ID']] = $row;
}
}
// load addresses
if ($needLoadAddresses)
{
$rqAddr = new Bitrix\Crm\RequisiteAddress();
$res = $rqAddr->getList(
array(
'filter' => array(
'ENTITY_TYPE_ID' => \CCrmOwnerType::Requisite,
'ENTITY_ID' => array_keys($requisiteList)
),
'select' => array(
'ENTITY_ID',
'TYPE_ID',
'ADDRESS_1',
'ADDRESS_2',
'CITY',
'POSTAL_CODE',
'REGION',
'PROVINCE',
'COUNTRY',
'COUNTRY_CODE',
'LOC_ADDR_ID'
)
)
);
while ($row = $res->fetch())
{
$requisiteId = (int)$row['ENTITY_ID'];
$typeId = (int)$row['TYPE_ID'];
unset($row['ENTITY_ID'], $row['TYPE_ID']);
$requisiteAddresses[$typeId] = \Bitrix\Crm\Format\AddressFormatter::getSingleInstance()->formatTextComma($row);
if ($addressAsJson)
{
if (RequisiteAddress::isLocationModuleIncluded())
{
/** @var $locationAddress Address */
$locationAddress = RequisiteAddress::makeLocationAddressByFields($row);
if ($locationAddress)
{
$requisiteList[$requisiteId][Bitrix\Crm\EntityRequisite::ADDRESS][$typeId] =
$locationAddress->toJson();
}
unset($locationAddress);
}
}
else
{
$requisiteList[$requisiteId][Bitrix\Crm\EntityRequisite::ADDRESS][$typeId] = $row;
}
}
}
$index = 0;
foreach ($requisiteList as $requisiteId => $fields)
{
$presetID = isset($fields['PRESET_ID']) ? (int)$fields['PRESET_ID'] : 0;
$bankDetailCountryId = 0;
$dataFields = array();
foreach ($fields as $fName => $fValue)
{
if ($copyMode && ($fName === 'ID' || $fName === 'ENTITY_ID'))
$fValue = 0;
if ($fValue instanceof \Bitrix\Main\Type\DateTime)
$dataFields[$fName] = $fValue->toString();
else
$dataFields[$fName] = $fValue;
}
unset($fName, $fValue);
$presetFieldsMap = [];
$presetFieldsIndex = [];
$presetFieldsSort = [
'ID' => [],
'SORT' => [],
'FIELD_NAME' => []
];
if (is_array($presetList[$fields['PRESET_ID']]))
{
if (is_array($presetList[$fields['PRESET_ID']]['SETTINGS']))
{
$presetFieldsInfo = $preset->settingsGetFields($presetList[$fields['PRESET_ID']]['SETTINGS']);
foreach ($presetFieldsInfo as $fieldInfo)
{
if (isset($fieldInfo['FIELD_NAME']))
{
$presetFieldsSort['ID'][] = isset($fieldInfo['ID']) ? (int)$fieldInfo['ID'] : 0;
$presetFieldsSort['SORT'][] = isset($fieldInfo['SORT']) ? (int)$fieldInfo['SORT'] : 0;
$presetFieldsSort['FIELD_NAME'][] = $fieldInfo['FIELD_NAME'];
}
}
unset($presetFieldsInfo, $fieldInfo);
}
if (is_array($presetList[$fields['PRESET_ID']]['COUNTRY_ID']))
{
$bankDetailCountryId = (int)$presetList[$fields['PRESET_ID']]['COUNTRY_ID'];
}
}
if (!empty($presetFieldsSort['FIELD_NAME']))
{
if(array_multisort(
$presetFieldsSort['SORT'], SORT_ASC, SORT_NUMERIC,
$presetFieldsSort['ID'], SORT_ASC, SORT_NUMERIC,
$presetFieldsSort['FIELD_NAME']))
{
$presetFieldsMap = array_fill_keys($presetFieldsSort['FIELD_NAME'], true);
$presetFieldsIndex = array_flip($presetFieldsSort['FIELD_NAME']);
}
}
unset($presetFieldsSort);
// sort fields by preset
$viewDataFields = array();
if (!empty($presetFieldsIndex))
{
$dataFieldsSortedIndex = array();
$dataFieldsUnsortedIndex = array();
foreach ($dataFields as $dataFieldName => &$dataField)
{
if (isset($presetFieldsIndex[$dataFieldName]))
$dataFieldsSortedIndex[$presetFieldsIndex[$dataFieldName]] = $dataFieldName;
else
$dataFieldsUnsortedIndex[] = $dataFieldName;
}
unset($dataFieldName, $dataField);
if (!empty($dataFieldsSortedIndex))
{
ksort($dataFieldsSortedIndex, SORT_NUMERIC);
foreach ($dataFieldsSortedIndex as $dataFieldName)
$viewDataFields[$dataFieldName] = &$dataFields[$dataFieldName];
unset($dataFieldName);
}
unset($dataFieldsSortedIndex);
if (!empty($dataFieldsUnsortedIndex))
{
foreach ($dataFieldsUnsortedIndex as $dataFieldName)
$viewDataFields[$dataFieldName] = &$dataFields[$dataFieldName];
unset($dataFieldName);
}
unset($dataFieldsUnsortedIndex);
}
else
{
$viewDataFields = &$dataFields;
}
$requisiteData = array();
if (!$viewDataOnly)
{
$requisiteData['fields'] = $dataFields;
}
$fieldsInView = array_intersect_assoc($presetFieldsMap, $fieldsAllowedMap);
if ($viewFormatted)
{
$requisiteData['viewData'] = $requisite->prepareViewDataFormatted($viewDataFields, $fieldsInView);
}
else
{
$requisiteData['viewData'] = $requisite->prepareViewData($viewDataFields, $fieldsInView);
}
unset($presetFields, $fieldsInView);
if ($bankDetailCountryId <= 0)
$bankDetailCountryId = \Bitrix\Crm\EntityPreset::getCurrentCountryId();
$bankDetailsData = self::PrepareBankDetailsData(
\CCrmOwnerType::Requisite,
$requisiteId,
array(
'VIEW_DATA_ONLY' => $viewDataOnly,
'SKIP_CHECK_PERMISSION' => true,
'COUNTRY_ID' => $bankDetailCountryId,
'BANK_DETAIL_ID_SELECTED' => $bankDetailIdSelected
)
);
if (!$viewDataOnly)
{
$requisiteData['bankDetailFieldsList'] = &$bankDetailsData['bankDetailFieldsList'];
}
$requisiteData['bankDetailViewDataList'] = &$bankDetailsData['bankDetailViewDataList'];
$requisiteData['bankDetailIdSelected'] = &$bankDetailsData['bankDetailIdSelected'];
$requisiteData['formattedAddresses'] = $requisiteAddresses;
unset($viewDataFields, $bankDetailsData, $requisiteAddress);
$requisiteDataJson = '';
$requisiteDataSign = '';
if (is_array($requisiteData))
{
$jsonData = null;
try
{
$jsonData = \Bitrix\Main\Web\Json::encode($requisiteData);
}
catch (\Bitrix\Main\SystemException $e)
{}
if ($jsonData)
{
if ($viewDataOnly)
{
$requisiteDataJson = $jsonData;
}
else
{
$signer = new \Bitrix\Main\Security\Sign\Signer();
$requisiteDataSign = '';
try
{
$requisiteDataSign = $signer->getSignature(
$jsonData,
'crm.requisite.edit-'.$entityTypeId
);
}
catch (\Bitrix\Main\SystemException $e)
{}
if (!empty($requisiteDataSign))
{
$requisiteDataJson = $jsonData;
}
}
}
unset($jsonData);
}
if (!empty($requisiteDataJson) && ($viewDataOnly || !empty($requisiteDataSign)))
{
if (is_array($presetList[$presetID])
&& isset($presetList[$presetID]['COUNTRY_ID']))
{
$presetCountryId = (int)$presetList[$presetID]['COUNTRY_ID'];
}
else
{
$presetCountryId = 0;
}
$resultItem = array(
'presetId' => $presetID,
'presetCountryId' => $presetCountryId,
'requisiteId' => $copyMode ? 0 : $requisiteId,
'entityTypeId' => $entityTypeId,
'entityId' => $copyMode ? 0 : $entityId,
'requisiteData' => $requisiteDataJson
);
if (!$viewDataOnly)
{
$resultItem['requisiteDataSign'] = $requisiteDataSign;
}
$resultItem['selected'] = (!$bSelected && $index === 0
|| $requisiteIdSelected === intval($requisiteId));
$result[$index++] = $resultItem;
unset($resultItem);
}
unset($dataFields);
}
unset($requisiteId, $fields);
}
}
}
return $result;
}