Rose debug info
---------------

Правильное подключение купонов к заказам через d7 bitrix api

При программном подключении купонов к заказу внутри Битрикс API стоит учитывать некоторые нюансы, которые скрыты внутри ядра, а именно частые кейсы когда при повторном создание заказа без купонов, автоматически прикрепляются старые купоны и наоборот.
Попробуем разобраться как надо прикреплять купон к заказу правильно:

Добавим купон к заказу

\Bitrix\Sale\DiscountCouponsManager::init(
    \Bitrix\Sale\DiscountCouponsManager::MODE_ORDER, [
        "userId" => $order->getUserId(),
        "orderId" => $order->getId()
    ], true
);
\Bitrix\Sale\DiscountCouponsManager::add($coupon);
$discount = $order->getDiscount();
$discount->calculate();
$order->doFinalAction(true);
$result = $order->save();

После применения купон к заказу необходимо выполнить его перерасчет для этого можно подсмотреть код в ядре и сделать примерно так:

$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();

ну и на всякий случай в конце сделать вот так:

\Bitrix\Sale\DiscountCouponsManager::logout();
Поделиться
Отправить
 56   1 мес   bitrix   d7