Алексей, нельзя же так утром в понедельник по лбу
1. Событие вызывается ДО сохранения заказа. Это означает, что вызов $order->save приводит к абсолютно непредсказуемым результатам. В обработчике его быть не должно, save и так будет вызван. Ваша задача - передать измененные данные.
2.
приводит к тому, что вы получаете данные из базы, которые в общем случае уже могут отличаться, т.к. вы отслеживаете изменение только одной сущности.
3. Зачем вы дергаете обновление корзины (refreshData) и никак не пробрасываете результаты пересчета в заказа?
Правильный вариант (здесь нет проверки на ваши условия):
ТЕКУЩИЙ_ИД_СКИДКИ берется не из b_sale_discount, а из b_sale_order_discount. Привязка к заказу этой таблицы - b_sale_order_rules

1. Событие вызывается ДО сохранения заказа. Это означает, что вызов $order->save приводит к абсолютно непредсказуемым результатам. В обработчике его быть не должно, save и так будет вызван. Ваша задача - передать измененные данные.
2.
Цитата |
---|
Алексей Волков написал: $orderEnt = $event->getParameter("ENTITY"); $arPayVals = $orderEnt->getFields()->getValues(); $order = \Bitrix\Sale\Order::load($arPayVals['ORDER_ID']); |
3. Зачем вы дергаете обновление корзины (refreshData) и никак не пробрасываете результаты пересчета в заказа?
Правильный вариант (здесь нет проверки на ваши условия):
Код |
---|
$payment = $event->getParameter('ENTITY'); if ($payment instanceof \Bitrix\Sale\PaymentBase) { $order = $payment->getOrder(); $discount = $order->getDiscount(); $discount->setApplyResult(array('DISCOUNT_LIST' => array('ТЕКУЩИЙ_ИД_СКИДКИ' => 'N'))); // скидка, которую необходимо отменить. для нескольких скидок - несколько записей $res = $discount->calculate(); if ($res->isSuccess()) { if (($discountData = $res->getData()) && !empty($discountData) && is_array($discountData)) { $r = $order->applyDiscount($discountData); } } } |
Не надо сверлить зубы через задний проход дрелью от Сваровски