Правильное подключение купонов к заказам через 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();