Задать вопрос

Как пересчитать заказ с учетом всех скидок с использованием события 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();
         }
      }
}

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

Во-вторых, не совсем понятно что вы тут делаете, так как вы сбрасываете все скидки на заказе, а потом пытаетесь их пересчитать
Ответ написан
@tgarl Автор вопроса
Я был не прав что отказался от before. Нужно все же на событии до сохранения. Но беда остается, что нет пересчета окончательной цены с учетом скидок на доставку. По логике пересчет должен производится сам, но этого не происходит. Заказ по своей цене, доставка по своей.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы