так код я выше привел.
привожу конечный на текущий момент(решили не на определенную платежку, а на любую пересчет повесить)
Код |
---|
\Bitrix\Main\EventManager::getInstance()->addEventHandler('sale', 'OnSalePaymentSetField', 'changePay');
function changePay(\Bitrix\Main\Event $event)
{
$arParameters = $event->getParameters();
if($arParameters['NAME']=='PAY_SYSTEM_ID'){
if($arParameters['VALUE']!=$arParameters['OLD_VALUE']) { //это условие при смене платежки всегда отрабатывает
\Bitrix\Main\Loader::includeModule('sale');
$orderEnt = $event->getParameter("ENTITY");
$arPayVals = $orderEnt->getFields()->getValues();
$order = \Bitrix\Sale\Order::load($arPayVals['ORDER_ID']);
$discount = $order->getDiscount();
\Bitrix\Sale\DiscountCouponsManager::clearApply(true);
\Bitrix\Sale\DiscountCouponsManager::useSavedCouponsForApply(true);
$discount->setOrderRefresh(true);
$discount->setApplyResult(array());
if (!($basket = $order->getBasket())) {
file_put_contents($_SERVER["DOCUMENT_ROOT"] . "/upload/log/changePay.txt", "\n\n** " . date("d.m.Y H:i:s") . " ****" . __FILE__ . " " . __LINE__ . "\n" . print_r([$arPayVals['ORDER_ID'],'no basket'], true), FILE_APPEND | LOCK_EX);
}
$basket->refreshData(array('PRICE', 'COUPONS'));
$discount->calculate();
$order->save();
}
}
}
|
чтобы было более понятно берем за основу 2 платежки нал и карта
создаем заказ так чтобы были скидки - карта, далее в личном кабинете меняем способ оплаты на наличку
при этом отрпбатывает код
Код |
---|
$arFields = array(
"PAY_SYSTEM_ID" => 1
);
\CSaleOrder::Update($oId, $arFields);
|
наше событие changePay при этом может как сработать так и нет, но в 80% оно отрабатывает.
идем в админку проверяем. нам повезло и все скидки пересчитались, оплата наличными, все отлично.
там же в админке возвращаем все обратно, оплата картой. возвращаемся в той же админке в заказ - и тут фиг вам, скидок нет. идем опять в платежки(через админку) меняем карту на наличку, сохраняем и обратно в заказ - видим что вообще все скидки послетали, опять идем меняем наличку на карту и тут вуаля все пересчиталось и применилось.
Но повторюсь это я привел именно самый плохой вариант. примерно в 80% все отрабатывает отлично, т.е. на 10 заказов - 2 выходят без пересчета.