• Модуль: crmmobile
  • Путь к файлу: ~/bitrix/modules/crmmobile/lib/ProductGrid/SkuCollectionQuery.php
  • Класс: BitrixCrmMobileProductGridSkuCollectionQuery
  • Вызов: SkuCollectionQuery::execute
public function execute(): array
{
	$product = $this->findParentProduct();
	if (!$product)
	{
		return [];
	}

	$variations = [];

	$storeData = $this->getStoreData($product);
	foreach ($product->getSkuCollection() as $sku)
	{
		$fields = $sku->getFields();

		$basePriceFields = $sku->getPriceCollection()->findBasePrice()->getFields();
		$basePrice = $basePriceFields['PRICE'] ?? 0.0;
		$currencyId = $basePriceFields['CURRENCY'] ?? null;
		if ($currencyId && $currencyId !== $this->currencyId)
		{
			$basePrice = CCrmCurrency::ConvertMoney($basePrice, $currencyId, $this->currencyId);
		}

		$vatId = $fields['VAT_ID'] ?? 0;
		$vatIncluded = ($fields['VAT_INCLUDED'] ?? 'N') === 'Y';

		$this->taxCalculator->calculate((float)$basePrice, (int)$vatId, $vatIncluded);

		$gallery = array_values(array_map(
			fn($item) => File::loadWithPreview($item['ID']),
			$sku->getFrontImageCollection()->toArray()
		));

		$skuId = $sku->getId();

		$variationItem = [
			'ID' => $skuId,
			'NAME' => $sku->getName(),
			'GALLERY' => $gallery,
			'PRICE' => $this->taxCalculator->getFinalPrice(),
			'CURRENCY' => $this->currencyId,
			'PRICE_BEFORE_TAX' => $this->taxCalculator->getPriceBeforeTax(),
			'TAX_VALUE' => $this->taxCalculator->getTaxValue(),
			'TAX_RATE' => $this->taxCalculator->getTaxRate(),
			'TAX_INCLUDED' => $this->taxCalculator->isTaxIncluded(),
			'TAX_NAME' => $this->taxCalculator->getVatName(),
			'TAX_MODE' => $this->accounting->isTaxMode(),
			'EMPTY_PRICE' => empty($basePriceFields['PRICE']),
			'BARCODE' => $this->findBarcode($sku),
		];

		if ($this->isAllowedReservation())
		{
			$store = $storeData[$skuId]['INITIAL_STORE'] ?? null;
			$storeId = $store ? $store['ID'] : null;
			$storeAmount = $storeData[$skuId]['STORES'][$storeId]['AMOUNT'] ?? null;
			$storeAvailableAmount =
				isset($storeAmount) && isset($storeData[$skuId]['STORES'][$storeId]['QUANTITY_RESERVED'])
					? $storeAmount - $storeData[$skuId]['STORES'][$storeId]['QUANTITY_RESERVED']
					: null
			;
			$shouldSyncReserveQuantity = ReservationService::getInstance()->isReserveEqualProductQuantity();

			$variationItem = array_merge(
				$variationItem,
				[
					'HAS_STORE_ACCESS' => true,
					'STORE_ID' => $store ? $store['ID'] : null,
					'STORE_NAME' => $store ? $store['TITLE'] : null,
					'STORE_AMOUNT' => $storeAmount,
					'STORE_AVAILABLE_AMOUNT' => $storeAvailableAmount,
					'STORES' =>
						isset($storeData[$skuId]['STORES'])
							? array_values($storeData[$skuId]['STORES'])
							: []
					,
					'SHOULD_SYNC_RESERVE_QUANTITY' => $shouldSyncReserveQuantity,
					'ROW_RESERVED' => 0,
					'DEDUCTED_QUANTITY' => 0,
				]
			);
		}

		$variations[$skuId] = $variationItem;
	}

	return [
		'variations' => $variations,
	];
}