Вот что получилось:
\Bitrix\Main\EventManager::getInstance()->addEventHandler("sale", "OnSaleOrderBeforeSaved", "onOrderSave");
function onOrderSave($event)
{
// получим заказ
$order = $event->getParameter("ENTITY");
// запросим корзину заказа
$basket = $order->getBasket();
// запросим товары в корзине
$basket_items = $basket->getBasketItems();
foreach ($basket_items as $Item) {
// запросим актуальную цену
$arPrice = CCatalogProduct::GetOptimalPrice($Item->getField('PRODUCT_ID'), $Item->getField('QUANTITY'), array(), "N");
$base_price = $arPrice[RESULT_PRICE][BASE_PRICE];
// и id инфоблока
$iblock_id = $arPrice[PRICE][ELEMENT_IBLOCK_ID];
// проверим свойство минимального кол-ва
$db_min_count = CIBlockElement::GetProperty($iblock_id, $Item->getField('PRODUCT_ID'), array("sort" => "asc"), Array("CODE"=>"MIN_QUANTITY"));
if($ar_min_count = $db_min_count->Fetch())
$min_count = IntVal($ar_min_count["VALUE"]);
else
$min_count = 1;
$Item->getQuantity(); // Количество
$Item->getFinalPrice(); // Сумма
// запросим свойство товара, в котором записана дополнительная цена
$item_props = $Item->getPropertyCollection();
$arProps = $item_props->getPropertyValues();
if(isset($arProps[PRICE_RATIO])){
// сформируем новую цену товара (здесь у вас может быть своя логика)
if($min_count == 1){
$new_prise = $base_price + $arProps[PRICE_RATIO][VALUE];
}else{
$new_prise = ($Item->getQuantity()*$base_price + $arProps[PRICE_RATIO][VALUE])/$Item->getQuantity();
}
// формируем массив изманений для товара
$Item->setFields(array(
'BASE_PRICE' => $base_price,
'PRICE' => $new_prise,
// 'DISCOUNT_PRICE' => 0,
"IGNORE_CALLBACK_FUNC" => "Y",
'CUSTOM_PRICE' => "Y",
)); // Изменение полей
// и сохраняем корзину
$basket->save();
}
}
} |
Если цена единицы товара получится с количеством знаков после запятой более чем 2, то придется пошаманить как написано