Изменение цены товара при сохранении заказа (нестандартная наценка на несколько штук одного товара)

Недавно попалась странная задача - при создании заказа необходимо добавить к каждой строке (то есть товару) фиксированную наценку НЕ ЗАВИСИМО от КОЛИЧЕСТВА товара в строке. То есть фактически нужно разбросать некоторую фиксированную сумму (ее нужно было брать из свойства элемента инфоблока) на все количество товара в строке.

Вот что получилось:

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