Вот что получилось:
\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, то придется пошаманить как написано