- Модуль: catalog
- Путь к файлу: ~/bitrix/modules/catalog/lib/component/storeamount.php
- Класс: BitrixCatalogComponentStoreAmount
- Вызов: StoreAmount::getProductStores
public function getProductStores(array $params = []): array
{
$stores = [];
$offset = $params['offset'] ?? 0;
$limit = $params['limit'] ?? null;
$variationIds = $this->getVariationIds();
$filter = [
'=PRODUCT_ID' => $variationIds,
'=STORE.ACTIVE' => 'Y',
];
$filter = array_merge(
$filter,
AccessController::getCurrent()->getEntityFilter(
ActionDictionary::ACTION_STORE_VIEW,
StoreProductTable::class
)
);
$storeProductData = StoreProductTable::getList([
'select' => ['SID_DISTINCT'],
'filter' => $filter,
'runtime' => [
new BitrixMainEntityExpressionField('SID_DISTINCT', 'DISTINCT(STORE_ID)'),
],
])->fetchAll();
$storeIds = array_column($storeProductData, 'SID_DISTINCT');
$storeIds = array_slice($storeIds, $offset, $limit);
$storeProductData = StoreProductTable::getList([
'select' => [
'STORE_ID',
'PRODUCT_ID',
'AMOUNT',
'QUANTITY_RESERVED'
],
'filter' => [
'=STORE_ID' => $storeIds,
'=PRODUCT_ID' => $variationIds,
'=STORE.ACTIVE' => 'Y',
],
])->fetchAll();
$fetchedVariationIds = array_column($storeProductData, 'PRODUCT_ID');
$variationsData = $this->getVariationsData($fetchedVariationIds);
$variations = [];
foreach ($variationsData as $variationData)
{
$variations[$variationData['ID']] = $variationData;
}
$storeIds = [];
foreach ($storeProductData as $storeProduct)
{
$productData = $variations[$storeProduct['PRODUCT_ID']];
if ((float)$storeProduct['QUANTITY_RESERVED'] === 0.0 && (float)$storeProduct['AMOUNT'] === 0.0)
{
continue;
}
$storeId = (int)$storeProduct['STORE_ID'];
$amount = (float)$productData['PURCHASING_PRICE'] * (float)$storeProduct['AMOUNT'];
$measureId = $productData['MEASURE'] ?? (int)$this->getDefaultMeasure()['ID'];
$currency = $productData['PURCHASING_CURRENCY'];
if (!isset($stores[$storeId]))
{
$storeIds[] = $storeId;
$stores[$storeId] = [
'ID' => $storeId,
'QUANTITY' => [],
'AMOUNT' => [],
];
}
// MEASURE EXIST CHECK
if (!isset($stores[$storeId]['QUANTITY'][$measureId]))
{
$stores[$storeId]['QUANTITY'][$measureId] = [
'QUANTITY_COMMON' => (float)$storeProduct['AMOUNT'],
'QUANTITY_RESERVED' => (float)$storeProduct['QUANTITY_RESERVED'],
'MEASURE_ID' => $measureId,
];
}
else
{
$stores[$storeId]['QUANTITY'][$measureId]['QUANTITY_COMMON'] += (float)$storeProduct['AMOUNT'];
$stores[$storeId]['QUANTITY'][$measureId]['QUANTITY_RESERVED'] += (float)$storeProduct['QUANTITY_RESERVED'];
}
// CURRENCY EXIST CHECK
if (!isset($stores[$storeId]['AMOUNT'][$currency]))
{
$stores[$storeId]['AMOUNT'][$currency] = [
'AMOUNT' => $amount,
'CURRENCY' => $currency,
];
}
else
{
$stores[$storeId]['AMOUNT'][$currency]['AMOUNT'] += $amount;
}
}
$storesInfo = $this->getStoresInfo($storeIds);
foreach ($storesInfo as $storeInfo)
{
if (isset($stores[(int)$storeInfo['ID']]))
{
$stores[(int)$storeInfo['ID']]['TITLE'] = $storeInfo['TITLE'];
}
}
return $stores;
}