Ситуация следующая: При оформлении заказа вводится купон, в корзине все считается нормально, скидки применяются и так далее. Но после оформления заказа в админке указывается цена без скидки, причем купон отображается, но в неактивном виде: http://prntscr.com/mte6c9
Самое интересное, что если нажать "редактировать заказ", а потом кнопку "Пересчитать заказ" в админке, то купон применяется и все отображается корректно. В чем проблема?
З.Ы. Думал на обработчик навесить функцию, которая будет автоматом пересчитывать заказ и применять купоны, но вот эта конструкция не работает (кроме того, применяется еще и подтягивается неверный тип цены (Подтягивается базовая цена, а для зарегистрированных пользователей должна подтягиваться цена для ИМ)
Код
use Bitrix\Main\Loader;
use Bitrix\Sale;
Loader::includeModule("sale");
$order = Sale\Order::load(27076);
Sale\DiscountCouponsManager::init(
Sale\DiscountCouponsManager::MODE_ORDER, [
"userId" => $order->getUserId(),
"orderId" => $order->getId()
]
);
$coupons = \Bitrix\Sale\DiscountCouponsManager::get(false, array());
\Bitrix\Sale\DiscountCouponsManager::clearApply(true);
\Bitrix\Sale\DiscountCouponsManager::useSavedCouponsForApply(true);
foreach($coupons as $coup){
\Bitrix\Sale\DiscountCouponsManager::add($coup);
}
$discount = $order->getDiscount();
$discount->setOrderRefresh(true);
$discount->setApplyResult(array());
if (!($basket = $order->getBasket())) {
throw new \Bitrix\Main\ObjectNotFoundException('Корзины не найдено');
}
$basket->refreshData(array('PRICE', 'COUPONS'));
$discount->calculate();
$order->save();
\Bitrix\Sale\Provider::resetTrustData($order->getSiteId());
Эта проблема на форуме не однократно поднималась, единственное рабочее решение, которое я видел это использовать старое CSaleDiscount::DoProcessOrder Я и тут где-то писал, что не работает и в техподдержку (2176105) даже привел пример в демолаборатории(правда пока ответили на тикет срок истек), но дальше копаться не мог. Предполагаю, что большую роль играет версия модуля sale(На 17 у меня так и не заработало) и ошибка кроется либо в каком-то не указанном параметре, либо не подключенном методе.
Александр Яровой, попробуйте еще указать конкретный купон $discount->setApplyResult(array( 'COUPON_LIST' => array ( 'код купона' => 'Y', ) ));