• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/basketcomponenthelper.php
  • Класс: BitrixSaleBasketComponentHelper
  • Вызов: BasketComponentHelper::correctQuantityRatio
static function correctQuantityRatio(Basket $basket, BasketItem $item = null)
{
	$result = new Result();
	$changedItems = array();

	$checkRatioList = array();
	$checkRatioResult = static::checkQuantityRatio($basket, $item);

	if ($checkRatioResult->isSuccess())
	{
		$checkRatioData = $checkRatioResult->getData();

		if (!empty($checkRatioData['CHECK_RATIO_LIST']) && is_array($checkRatioData['CHECK_RATIO_LIST']))
		{
			$checkRatioList = $checkRatioData['CHECK_RATIO_LIST'];
		}
	}

	$basketItemRatioList = array();
	$ratioList = null;

	/** @var BasketItem $basketItem */
	foreach ($basket as $basketItem)
	{
		$basketItemCode = $basketItem->getBasketCode();

		if ($item === null || $item->getBasketCode() === $basketItemCode)
		{
			$basketItemRatioList[$basketItemCode] = false;

			if (isset($checkRatioList[$basketItemCode]) && $checkRatioList[$basketItemCode] === false)
			{
				if ($ratioList === null)
				{
					$ratioList = array();
					$ratioResult = static::getRatio($basket, $item);

					if ($ratioResult->isSuccess())
					{
						$ratioData = $ratioResult->getData();

						if (!empty($ratioData['RATIO_LIST']) && is_array($ratioData['RATIO_LIST']))
						{
							$ratioList = $ratioData['RATIO_LIST'];
						}
					}
				}

				if (!isset($ratioList[$basketItemCode]))
				{
					$result->addError(new ResultError(MainLocalizationLoc::getMessage('SALE_BASKET_COMPONENT_HELPER_PRODUCT_RATIO_NOT_FOUND', array(
						'#PRODUCT_NAME#' => $basketItem->getField('NAME')
					)), 'SALE_BASKET_COMPONENT_HELPER_PRODUCT_RATIO_NOT_FOUND'));
					continue;
				}

				$basketItemQuantity = $basketItem->getQuantity();
				$basketItemRatio = (float)$ratioList[$basketItemCode];

				$mod = roundEx(($basketItemQuantity / $basketItemRatio - round($basketItemQuantity / $basketItemRatio)), 6);

				if ($mod != 0)
				{
					$changedItems[] = $basketItemCode;

					$closestQuantity = round($basketItemQuantity / $basketItemRatio) * $basketItemRatio;
					if ($closestQuantity < $basketItemRatio)
					{
						$closestQuantity = $basketItemRatio;
					}

					$r = $basketItem->setField('QUANTITY', $closestQuantity);
					if (!$r->isSuccess())
					{
						$floorQuantity = floor(ceil($basketItemQuantity) / $basketItemRatio) * $basketItemRatio;
						if ($floorQuantity < $basketItemRatio)
						{
							$floorQuantity = $basketItemRatio;
						}

						if ($floorQuantity != $closestQuantity)
						{
							$r = $basketItem->setField('QUANTITY', $floorQuantity);
						}
					}

					if (!$r->isSuccess())
					{
						$result->addErrors($r->getErrors());

						$r = $basketItem->setField('CAN_BUY', 'N');
						if (!$r->isSuccess())
						{
							$result->addErrors($r->getErrors());
						}
					}
				}
			}
		}
	}

	$result->addData(array('CHANGED_BASKET_ITEMS' => $changedItems));

	return $result;
}