- Модуль: crm
- Путь к файлу: ~/bitrix/modules/crm/lib/merger/requisitemerginghelper.php
- Класс: Bitrix\Crm\Merger\RequisiteMergingHelper
- Вызов: RequisiteMergingHelper::getEntityRequisites
protected function getEntityRequisites($entityID, $roleID)
{
$requisiteList = array();
$requisite = new Crm\EntityRequisite();
$res = $requisite->getList(
array(
'order' => array('SORT', 'ID'),
'select' => array('ID', 'PRESET_ID'),
'filter' => array('=ENTITY_TYPE_ID' => $this->entityTypeID, '=ENTITY_ID' => $entityID)
)
);
while ($row = $res->fetch())
{
$requisiteId = (int)$row['ID'];
$presetId = (int)$row['PRESET_ID'];
if ($requisiteId > 0 && $presetId > 0)
{
if (!isset($requisiteList[$requisiteId]))
$requisiteList[$requisiteId] = array(
'ID' => $requisiteId,
'ENTITY_TYPE_ID' => $this->entityTypeID,
'ENTITY_ID' => $entityID,
'PRESET_ID' => $presetId
);
if (!isset($this->presetList[$presetId]))
$this->presetList[$presetId] = array('ID' => $presetId);
}
}
$allowedFieldsMap = array_fill_keys(
array_merge(
$requisite->getRqFields(),
$requisite->getUserFields()
),
true
);
// load presets
$selectMap = array('ID' => true, 'PRESET_ID' => true);
if (!empty($this->presetList))
{
$preset = new Crm\EntityPreset();
$res = $preset->getList(array(
'order' => array('SORT' => 'ASC'),
'filter' => array(
'=ENTITY_TYPE_ID' => Crm\EntityPreset::Requisite,
'@ID' => array_keys($this->presetList)
),
'select' => array('ID', 'COUNTRY_ID', 'SETTINGS')
));
while ($row = $res->fetch())
{
$id = (int)$row['ID'];
$countryId = (int)$row['COUNTRY_ID'];
if ($countryId > 0 && is_array($row['SETTINGS']))
{
$presetFieldsMap = array();
foreach ($preset->settingsGetFields($row['SETTINGS']) as $fieldInfo)
{
if (isset($fieldInfo['FIELD_NAME']) && isset($allowedFieldsMap[$fieldInfo['FIELD_NAME']]))
$presetFieldsMap[$fieldInfo['FIELD_NAME']] = true;
}
$presetFields = array_keys($presetFieldsMap);
unset($presetFieldsMap);
foreach ($presetFields as $fieldName)
{
if (!isset($selectMap[$fieldName]))
$selectMap[$fieldName] = true;
}
$this->presetList[$id] = array(
'ID' => $id,
'COUNTRY_ID' => $countryId,
'FIELDS' => $presetFields
);
}
}
}
unset($allowedFieldsMap);
if (!empty($requisiteList))
{
// load requisites
$requisiteBasicFields = array_keys(Crm\EntityRequisite::getBasicFieldsInfo());
foreach ($requisiteBasicFields as $fieldName)
{
if (!isset($selectMap[$fieldName]))
$selectMap[$fieldName] = true;
}
$res = $requisite->getList(
array(
'order' => array('SORT', 'ID'),
'select' => array_keys($selectMap),
'filter' => array('=ENTITY_TYPE_ID' => $this->entityTypeID, '=ENTITY_ID' => $entityID)
)
);
while ($row = $res->fetch())
{
$requisiteId = (int)$row['ID'];
$presetId = (int)$row['PRESET_ID'];
if ($requisiteId > 0 && $presetId > 0
&& isset($requisiteList[$requisiteId]) && isset($this->presetList[$presetId]))
{
foreach ($requisiteBasicFields as $fieldName)
{
if (!isset($requisiteList[$requisiteId][$fieldName]))
$requisiteList[$requisiteId][$fieldName] = $row[$fieldName];
}
$requisiteList[$requisiteId]['PRESET_COUNTRY_ID'] = $this->presetList[$presetId]['COUNTRY_ID'];
if (is_array($this->presetList[$presetId]['FIELDS'])
&& !empty($this->presetList[$presetId]['FIELDS']))
{
foreach ($this->presetList[$presetId]['FIELDS'] as $fieldName)
{
if ($fieldName === Crm\EntityRequisite::ADDRESS)
{
// load addresses
$requisiteList[$requisiteId][$fieldName] =
Crm\EntityRequisite::getAddresses($requisiteId);
}
else
{
$requisiteList[$requisiteId][$fieldName] = $row[$fieldName];
}
}
}
}
}
// load bank detail fields map
$countryMap = array();
$bankDetailList = array();
$bankDetail = new Crm\EntityBankDetail();
$selectMap = array('ID' => true, 'ENTITY_ID' => true, 'COUNTRY_ID' => true);
$res = $bankDetail->getList(
array(
'order' => array('ENTITY_ID', 'SORT', 'ID'),
'filter' => array(
'=ENTITY_TYPE_ID' => \CCrmOwnerType::Requisite,
'@ENTITY_ID' => array_keys($requisiteList)
),
'select' => array('ID', 'ENTITY_ID', 'COUNTRY_ID')
)
);
while ($row = $res->fetch())
{
$bankDetailId = (int)$row['ID'];
$requisiteId = (int)$row['ENTITY_ID'];
$countryId = (int)$row['COUNTRY_ID'];
if ($countryId <= 0 && $requisiteId > 0 && is_array($requisiteList[$requisiteId])
&& isset($requisiteList[$requisiteId]['PRESET_COUNTRY_ID']))
{
$countryId = (int)$requisiteList[$requisiteId]['PRESET_COUNTRY_ID'];
}
if ($bankDetailId > 0 && $requisiteId > 0 && $countryId > 0)
{
if (!isset($bankDetailList[$bankDetailId]))
$bankDetailList[$bankDetailId] = array(
'ID' => $bankDetailId,
'ENTITY_TYPE_ID' => \CCrmOwnerType::Requisite,
'ENTITY_ID' => $requisiteId,
'COUNTRY_ID' => $countryId
);
if (!isset($countryMap[$countryId]))
$countryMap[$countryId] = array();
}
}
foreach ($bankDetail->getRqFieldByCountry() as $countryId => $fields)
{
$fields[] = 'COMMENTS';
if (isset($countryMap[$countryId]))
{
foreach ($fields as $fieldName)
{
if (!isset($selectMap[$fieldName]))
$selectMap[$fieldName] = true;
}
if (!isset($this->bankDetailFieldsMap[$countryId]))
$this->bankDetailFieldsMap[$countryId] = $fields;
}
}
unset($countryMap);
// load bank details
$bankDetailBasicFields = array_keys(Crm\EntityBankDetail::getBasicFieldsInfo());
foreach ($bankDetailBasicFields as $fieldName)
{
if (!isset($selectMap[$fieldName]))
$selectMap[$fieldName] = true;
}
$res = $bankDetail->getList(
array(
'order' => array('ENTITY_ID', 'SORT', 'ID'),
'filter' => array(
'=ENTITY_TYPE_ID' => \CCrmOwnerType::Requisite,
'@ENTITY_ID' => array_keys($requisiteList)
),
'select' => array_keys($selectMap)
)
);
while ($row = $res->fetch())
{
$bankDetailId = (int)$row['ID'];
if (is_array($bankDetailList[$bankDetailId]))
{
foreach ($bankDetailBasicFields as $fieldName)
{
if (!isset($bankDetailList[$bankDetailId][$fieldName]))
$bankDetailList[$bankDetailId][$fieldName] = $row[$fieldName];
}
foreach ($this->bankDetailFieldsMap[$bankDetailList[$bankDetailId]['COUNTRY_ID']] as $fieldName)
$bankDetailList[$bankDetailId][$fieldName] = $row[$fieldName];
$requisiteId = $bankDetailList[$bankDetailId]['ENTITY_ID'];
if (!is_array($requisiteList[$requisiteId]['BD']))
$requisiteList[$requisiteId]['BD'] = array();
$requisiteList[$requisiteId]['BD'][$bankDetailId] = $bankDetailList[$bankDetailId];
}
}
unset($bankDetailList);
}
return $requisiteList;
}