Как пересчитать заказ с учетом всех скидок с использованием события OnSaleOrderSaved?

Есть оформление заказа еще на старом API. В битриксе есть такой фукционал как допуслуги.
Мне нужно внести выбор допуслуг в оформление.

Галочки я добавил. На основании этих галочек заполняется свойство заказа. Далее я использую событие OnSaleOrderSaved где проверяю заполненность свойства и если не пустое проставляю стоимость доставки. Но вся беда, что скидки на доставку при этом не учитываются. Если нажать пересчитать заказ, то все встанет на места как нужно, но это не вариант, так как клиенты оплачивают заказ сразу, и менеджеры не вкурсе что заказ не верно посчитан.
вот мой результирующий код на текущий момент и как обойти эту ситуацию не могу понять.
spoiler

//событие OnSaleOrderSaved
public static function OnSaleOrderSavedEnded(Event $event)
    {
        $order = $event->getParameter('ENTITY');
        $isNew = $event->getParameter("IS_NEW");
        if ($isNew) {
         $orderProperties = $order->getPropertyCollection();
         $propertyValue = $orderProperties->getItemByOrderPropertyId(61)->getValue();
         if(intval($propertyValue)>0){
            $shipmentCollection = $order->getShipmentCollection();
            foreach ($shipmentCollection as $shipment)
            {
               if ($shipment->isSystem()) continue;
               $shipment->setExtraServices([$propertyValue=>'Y']);

               $resCalc = \Bitrix\Sale\Delivery\Services\Manager::calculateDeliveryPrice($shipment,$shipment->getField("DELIVERY_ID"));
               if($resCalc->isSuccess()){
                  $arShipments1 = $resCalc->getExtraServicesPrice();
                  $service = \Bitrix\Sale\Delivery\Services\Manager::getById($shipment->getField("DELIVERY_ID"));
                  $deliveryData = [
                     'DELIVERY_ID' => $service['ID'],
                     'DELIVERY_NAME' => $service['NAME'],
                     'ALLOW_DELIVERY' => 'N',
                     'PRICE_DELIVERY' => $arShipments1,
                     'BASE_PRICE_DELIVERY' => $arShipments1,
                     'CUSTOM_PRICE_DELIVERY' => 'N',
                     'CURRENCY' => $order->getCurrency(),
                  ];
                  $shipment->setFields($deliveryData);
               }                                
            }
            $now_order_id=$order->getId();
            $order->save();

            $order_resave = \Bitrix\Sale\Order::load($now_order_id);
            $discount = $order_resave->getDiscount();
            \Bitrix\Sale\DiscountCouponsManager::clearApply(true);
            \Bitrix\Sale\DiscountCouponsManager::useSavedCouponsForApply(true);
            $discount->setOrderRefresh(true);
            $discount->setApplyResult(array());

            if (!($basket = $order_resave->getBasket())) {
               throw new \Bitrix\Main\ObjectNotFoundException('Entity "Basket" not found');
            }

            $basket->refreshData(array('PRICE', 'COUPONS'));
            $discount->calculate();

            $order_resave->setField("PRICE", $order_resave->getPrice());
            $order_resave->save();
         }
      }
}

  • Вопрос задан
  • 117 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Aisamiery
Во-первых, вы не правильное событие используете, не стоит использовать в событиях сохранения заказа само сохранение, это как правило приводит к печальным последствиям. Лучше подвешиваться на события до сохранения, если вам нужно именно изменить заказ и чтоб он сохранился измененным.

Во-вторых, не совсем понятно что вы тут делаете, так как вы сбрасываете все скидки на заказе, а потом пытаетесь их пересчитать
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы