• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/helpers/order/builder/basketbuilder.php
  • Класс: BitrixSaleHelpersOrderBuilderBasketBuilder
  • Вызов: BasketBuilder::setItemsFieldsByFormData
protected function setItemsFieldsByFormData()
{
	/** @var  BitrixSaleBasketItem  $item */
	$basketItems = $this->getBasket()->getBasketItems();

	foreach($basketItems as $item)
	{
		$basketCode = $item->getBasketCode();

		if(empty($this->formData['PRODUCT'][$basketCode]))
			continue;

		$productData = $this->formData['PRODUCT'][$basketCode];
		$isProductDataNeedUpdate = in_array($basketCode, $this->needDataUpdate);

		if(isset($productData["PRODUCT_PROVIDER_CLASS"]) && $productData["PRODUCT_PROVIDER_CLASS"] <> '')
		{
			$item->setField("PRODUCT_PROVIDER_CLASS", trim($productData["PRODUCT_PROVIDER_CLASS"]));
		}

		/*
		 * Let's extract cached provider product data from field
		 * in case activity is through ajax.
		 */
		if($this->cacheProductProviderData && !$isProductDataNeedUpdate)
		{
			self::sendProductCachedDataToProvider($item, $this->getOrder(), $productData);
		}

		if (isset($productData['NAME']))
		{
			$item->setField('NAME', $productData['NAME']);
		}

		$item->setField('TYPE', $productData['TYPE'] ?? null);

		if (isset($productData['CUSTOM_PRICE']) && $productData['CUSTOM_PRICE'] === 'Y')
		{
			$item->markFieldCustom('PRICE');
		}

		$res = $item->setField("QUANTITY", $productData["QUANTITY"]);

		if(!$res->isSuccess())
		{
			$this->getErrorsContainer()->addErrors($res->getErrors());
			throw new BuildingException();
		}

		if (isset($productData['VAT_RATE']))
		{
			$item->markFieldCustom('VAT_RATE');
			$item->setField('VAT_RATE', $productData['VAT_RATE']);
		}

		if (isset($productData['VAT_INCLUDED']))
		{
			$item->markFieldCustom('VAT_INCLUDED');
			$item->setField('VAT_INCLUDED', $productData['VAT_INCLUDED']);
		}

		if(isset($productData["MODULE"]) && $productData["MODULE"] == "catalog")
		{
			$this->catalogProductsIds[] = $item->getField('PRODUCT_ID');
		}
		elseif(empty($productData["PRODUCT_PROVIDER_CLASS"]))
		{
			$availableFields = BasketItemBase::getAvailableFields();
			$availableFields = array_fill_keys($availableFields, true);
			$fillFields = array_intersect_key($productData, $availableFields);

			$orderCurrency = $this->getOrder()->getCurrency();
			if (
				isset($fillFields['CURRENCY'])
				&& $fillFields['CURRENCY'] !== $orderCurrency
			)
			{
				$fillFields['PRICE'] = CCurrencyRates::ConvertCurrency(
					(float)$fillFields['PRICE'],
					$fillFields['CURRENCY'],
					$orderCurrency
				);
				$fillFields['BASE_PRICE'] = CCurrencyRates::ConvertCurrency(
					(float)$fillFields['BASE_PRICE'],
					$fillFields['CURRENCY'],
					$orderCurrency
				);
				$fillFields['CURRENCY'] = $orderCurrency;
			}

			if (!empty($fillFields))
			{
				$r = $item->setFields($fillFields);

				if(!$r->isSuccess())
				{
					$this->getErrorsContainer()->getErrors($r->addErrors());
				}
			}
		}
	}
}