• Модуль: 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;
}