Алексей, нельзя же так утром в понедельник по лбу
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);
}
}
}
|
ТЕКУЩИЙ_ИД_СКИДКИ берется не из b_sale_discount, а из b_sale_order_discount. Привязка к заказу этой таблицы - b_sale_order_rules