Есть задача. Применять скидку при выборе определенной платежной системы. С этим проблем нет. Но, в нашем случае покупатель может изменять платежную систему на уже оформленный заказ. Каким образом можно запрограммировать корректный обсчет скидки с таким вариантом работы.
На данный момент скидка применяется нормально, но есть 2 проблемы:
1) Она не отменяется.
2) Она может примениться повторно.
Код, срабатывающий на OnBeforeOrderUpdate
[CODE]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));
}
}[/CODE] Как мне отписали из ТП, скидку пересчитывает как раз CSaleDiscount::DoProcessOrder. Но пока почему-то только в 1 сторону и по нескольку раз.
Если кто сталкивался с подобной задачей, поделитесь пожалуйста решением.