Решил задачу отмены примененного купона следующим образом.
На событие добавления купона в менеджер проверяю необходимые данные и в случае необходимости удаляю купон из менеджера. Есть один момент - CCatalogDiscountCoupon::GetByID() не сработает если купон на правило корзины, тогда применяем метод \Bitrix\Sale\Internals\DiscountCouponTable::GetList().
Общая структура кода в init.php получается такая:
Код |
---|
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'sale',
'onManagerCouponAdd',
'onManagerCouponAddHandler'
);
function onManagerCouponAddHandler(Bitrix\Main\Event $event) {
$couponData = $event->getParameters();
$couponModule = $couponData["MODULE_ID"];
if ($couponModule === "catalog") {
$arCoupon = CCatalogDiscountCoupon::GetByID($couponData["ID"]);
// some logic here..
// $result = ...
} else if ($couponModule === "sale") {
$dbCoupon = \Bitrix\Sale\Internals\DiscountCouponTable::GetList (
[
"sel ect" => ["ID", "DISCOUNT_ID", "COUPON", "DESCRIPTION"],
"filter" => ['=COUPON' => $couponData["COUPON"]]
]
);
if ($fetched = $dbCoupon->Fetch())
{
// some logic here..
// $result = ...
}
}
// delete coupon fr om manager
if ($result) {
\Bitrix\Sale\DiscountCouponsManager::delete($couponData["COUPON"]);
}
}
|