Перерасчет заказа на API

12k
Алексей,
Перерасчет заказа на API

Одним методом не обойтись, тут надо комплексно заново применять все скидки и считать сумму. Пример есть в файле /bitrix/modules/sale/admin/order_edit.php:176

Одним методом не обойтись, тут надо комплексно заново применять все скидки и считать сумму. Пример есть в файле /bitrix/modules/sale/admin/order_edit.php:176

Если были добавлены скидки и нужно сделать перерасчет, можно так:

\Bitrix\Main\Loader::includeModule('sale');

$order = \Bitrix\Sale\Order::load($orderId); // или $order = \Bitrix\Sale\Order::loadByAccountNumber($orderNumber);

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

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

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

Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.

Опубликовано 31 мая 2017 | Обновлено 11 октября 2019
делаюИМ, примеры d7
Поделиться
Похожие статьи
Считаем профит покупателей
Для персонализированный рассылки понадобилось узнать кто из покупателей давно не делал заказ, а кто ...
Читать дальше » 0
Алексей,
Выводим выручку по заказам
Скидка, еще одна, плюс бесплатная доставка, а не переборщили ли мы и насколько выгодный получился за...
Читать дальше » 0
Алексей,
Комментарии
❮…❯
Авторизуйтесь чтобы получать уведомления об ответе
19 июн 2023
А как сделать чтобы не сбрасывались купоны после перерасчёта корзины?
Алексей
28 июн 2023
I, вообще он не должен сбрасываться. Я так понимаю речь про компонент корзины? Включить стандартный компонент и посмотрите как это работает там.
7 июн 2023
[Error] Call to a member function calculate() on null (0)
Алексей
28 июн 2023
Алик, проверьте передаётся ли корректный номер заказа в метод load, возможно такого заказа нет, поэтому и скидки не найдены
19 фев 2020
Добрый день. А как пересчитать заказ на событии OnSaleOrderBeforeSaved ? я меняю отгрузку и нужно сделать пересчет. ваш вариант не срабатывает(
Алексей
19 фев 2020
Алексей, добрый день, вообще заказ должен сам рассчитаться после сохранения. Возможно что-то не так меняете в отгрузке.
19 фев 2020
Согласен, по логике должен пересчитаться сам, но по факту этого не происходит. Я изменяю стоимость доставки. Если есть заполненное свойство, то добавляю допуслугу для доставки. Уже не знаю куда копать.
Алексей
19 фев 2020
Алексей, в тех. поддержку напишите, возможно закралась ошибка в ядре.
23 ноя 2017
это когда заказ создан, а на этапе его создания как показывать применение купонов скидок?
Алексей
23 ноя 2017
Юлиана, мне кажется что этот код должен работать и при создании заказа через API, вы же для начала создаете объект заказа $order = Order::create(), потом добавляете в него корзину $order->setBasket() и скидки. И после можно пересчитать. Вообще рекомендую посмотреть код корзины, там же применяется купон без создания заказа.
Одним методом не обойтись, тут надо комплексно заново применять все скидки и считать сумму. Пример есть в файле /bitrix/modules/sale/admin/order_edit.php:176