Задача: пользователи могут оплачивать заказы с бонусного счета (штатный внутренний счет), но если в корзине есть определенные товары - то в этом заказе нужно запретить оплату бонусами.
В моем случае, товары которые запрещены к оплате бонусами имеют свойство "ZAPRESHCHENO_OPLACHIVAT_BONUSAMI" со
значением "Да".
Если такой товар есть в корзине, на странице оформления заказа, в компоненте "bitrix:sale.order.ajax" нужно
изменять параметр:
"PAY_FROM_ACCOUNT" c "Y" на "N"
таким образом оплата с внутреннего счета отключится для всего заказа.
Получаем корзину пользователя на API
На странице оформления заказа, до вызова компонента bitrix:sale.order.ajax нужно получить всю корзину пользователя и в найденных товарах найти свойство ZAPRESHCHENO_OPLACHIVAT_BONUSAMI
Если такой товар есть, просто переключаем параметр "Разрешить оплату с внутреннего счета:" на N
CModule::IncludeModule("sale");
$dbBasketItems = CSaleBasket::GetList(
array("NAME" => "ASC", "ID" => "ASC"),
array(
"FUSER_ID" => CSaleBasket::GetBasketUserID(),
"LID" => SITE_ID,
"ORDER_ID" => "NULL"
),
false,
false,
array(
"PRODUCT_ID"
)
);
while ($basketItem = $dbBasketItems->Fetch()) {
$rsPropertyValues = \CIBlockElement::getProperty(
4, // Инфоблок
$basketItem['PRODUCT_ID'],
false,
false,
array(
'CODE' => 'ZAPRESHCHENO_OPLACHIVAT_BONUSAMI'
)
);
// Товары в корзине c запретом оплаты бонусами
while ($arPropertyValue = $rsPropertyValues->Fetch()) {
if ($arPropertyValue['VALUE'] === 'Да') {
$hidePayBounus = 'Y';
}
}
}
if ($hidePayBounus == 'Y') {
$PAY_FROM_ACCOUNT = 'N';// Если такие есть прячем оплату бонусами
} else {
$PAY_FROM_ACCOUNT = 'Y'; // Если такие есть прячем оплату бонусами
}
$APPLICATION->IncludeComponent(
"bitrix:sale.order.ajax",
"new_order",
array(
... параметры компонента ...
"PAY_FROM_ACCOUNT" => $PAY_FROM_ACCOUNT,
... параметры компонента ...
),
false
);
- С помощью CSaleBasket::GetList получили текущую корзину. Из данных нам нужен только ID товара.
- С помощью CIBlockElement::getPropert получили свойство "ZAPRESHCHENO_OPLACHIVAT_BONUSAMI"
- Если найден товар со значением "Да", полностью отключили параметр "PAY_FROM_ACCOUNT"
Вывести оповещение в корзине
На всякий случай, что бы у пользователя не было вопросов, в корзине выведем оповещение. Проделываем тоже самое в файле mutator.php шаблона корзины:
foreach ($this->basketItems as $basketItem) {
$rsPropertyValues = \CIBlockElement::getProperty(
4, // Инфоблок
$basketItem['PRODUCT_ID'],
false,
false,
array('CODE' => 'ZAPRESHCHENO_OPLACHIVAT_BONUSAMI')
);
while ($arPropertyValue = $rsPropertyValues->Fetch()) {
if ($arPropertyValue['VALUE'] === 'Да') {
$totalData['BASKET_ITEM_NO_BONUS_SHOW'] = 'Y';
}
}
}
Если такой тавар найден будет существовать переменная BASKET_ITEM_NO_BONUS_SHOW. Воводим ее в файле basket-total.php:
{{#BASKET_ITEM_NO_BONUS_SHOW}}
Обратите внимание: в заказе присутствут товары на которые не действует оплата бонусами.
Вы можете оформить такие товары отдельным заказом, что бы применить бонусы к остальным
{{/BASKET_ITEM_NO_BONUS_SHOW}}