Есть оформление заказа еще на старом 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();
}
}
}