Есть задача. Применять скидку при выборе определенной платежной системы. С этим проблем нет. Но, в нашем случае покупатель может изменять платежную систему на уже оформленный заказ. Каким образом можно запрограммировать корректный обсчет скидки с таким вариантом работы.
На данный момент скидка применяется нормально, но есть 2 проблемы:
1) Она не отменяется.
2) Она может примениться повторно.
Код, срабатывающий на OnBeforeOrderUpdate
Как мне отписали из ТП, скидку пересчитывает как раз CSaleDiscount::DoProcessOrder. Но пока почему-то только в 1 сторону и по нескольку раз.
Если кто сталкивался с подобной задачей, поделитесь пожалуйста решением.
На данный момент скидка применяется нормально, но есть 2 проблемы:
1) Она не отменяется.
2) Она может примениться повторно.
Код, срабатывающий на OnBeforeOrderUpdate
Код |
---|
function OnBeforeOrderUpdateHandler($ID, &$arFields) { $arErrors = array(); $arOrder = CSaleOrder::GetByID($ID); $arOrder['SITE_ID'] = SITE_ID; $arBasketItems = self::getBasketItems($ID); //получает корзину по аналогии с компонентом sale.order.ajax $arOrderProps = array(); $dbOrderProps = CSaleOrderPropsValue::GetOrderProps($ID); while ($arOrderProp = $dbOrderProps->Fetch()) { $arOrderProps[$arOrderProp['ORDER_PROPS_ID']] = $arOrderProp['VALUE']; } $arOrder = array_merge($arOrder,$arFields); $arOrder['BASKET_ITEMS'] = $arBasketItems; CSaleDiscount::DoProcessOrder($arOrder,array(),$arErrors); //AddMessage2Log($arOrder); $arFields['PRICE'] = $arOrder['ORDER_PRICE']; $arFields['ORDER_PRICE'] = $arOrder['ORDER_PRICE']; $arFields['DISCOUNT_PRICE'] = $arOrder['DISCOUNT_PRICE']; $arFields['DISCOUNT_VALUE'] = $arOrder['DISCOUNT_VALUE']; foreach ($arOrder['BASKET_ITEMS'] as $arBasketItem) { $ID = $arBasketItem['ID']; unset($arBasketItem['ID']); unset($arBasketItem['PROPS']); $arBaskItemFields = array(); foreach ($arBasketItem as $code => $baskItem) { if (strpos($code,'~') !== false && $baskItem !== false && !is_null($baskItem)) { $c = str_replace('~','',$code); $arBaskItemFields[$c] = $baskItem; } } unset($arBaskItemFields['PRODUCT_PROVIDER_CLASS']); //если не делать unset, то не изменяется цена в корзине // AddMessage2Log(CSaleBasket::Update($ID,$arBaskItemFields)); } } |
Если кто сталкивался с подобной задачей, поделитесь пожалуйста решением.