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