Меню

Запретить оплату с внутреннего счета, если в корзине есть определенный товар

Просмотров: 592

Задача: пользователи могут оплачивать заказы с бонусного счета (штатный внутренний счет), но если в корзине  есть определенные товары - то в этом заказе нужно запретить оплату бонусами.

Запретить оплату с внутреннего счета, если в корзине е сть определенный товар

В моем случае, товары которые запрещены к оплате бонусами имеют свойство "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}}
Михаил Базаров 24.09.2024
Улучшенный вариант получения корзины на D7
Код
use Bitrix\Sale;
use Bitrix\Main\Loader;
use Bitrix\Iblock\Elements\ElementTable;
use Bitrix\Iblock\PropertyTable;

Loader::includeModule("sale");
Loader::includeModule("iblock");

// Получаем корзину текущего пользователя
$basket = Sale\Basket::loadItemsForFUser(Sale\Fuser::getId(), SITE_ID);

// Проходим по элементам корзины
foreach ($basket as $basketItem) {
    $productId = $basketItem->getProductId();

    // Получаем значение свойства товара с кодом 'ZAPRESHCHENO_OPLACHIVAT_BONUSAMI'
    $property = PropertyTable::getList([
        'filter' => [
            'IBLOCK_ID' => 4,
            'CODE' => 'ZAPRESHCHENO_OPLACHIVAT_BONUSAMI',
            'IBLOCK_ELEMENT_ID' => $productId
        ],
        'select' => ['VALUE']
    ])->fetch();

    // Проверка на запрет оплаты бонусами
    if ($property && $property['VALUE'] === 'Да') {
        $hidePayBonus = 'Y';
        break; // Прерываем цикл, если нашли хотя бы один товар с запретом
    }
}
$APPLICATION->IncludeComponent(
    "bitrix:sale.order.ajax",
    "new_order",
    array(
       ... параметры компонента ...
        "PAY_FROM_ACCOUNT" =>  $hidePayBonus ? 'N' : 'Y';
        ... параметры компонента ...
    ),
    false
);

Стоимость и сроки разработки сайтов и приложений

Окончательная стоимость и сроки разработки сайта формируются после обсуждения деталей на этапе заказа. Как правило, они редко выходят за обозначенные ниже рамки.

Интернет магазин: разработка с нуля от 350 000 руб.
от 4-х недель

Cоздание интернет-магазина на 1С-Битрикс. Разработка с нуля, оптимизация кода под конкретный проект и требования. Реализация любого функционала без ограничений готовых решений.

Интернет-магазин на готовом решении от 100 000 руб.
от 7-ми дней

Готовое решение — вариант для тех, кто не хочет тратить много средств на индивидуальный проект, и не имеет серьезных требований к сайту. Запускается на одном из 200-та (на ваш выбор) готовых решений.

Мобильное приложение от 400 000 руб.
от 1-го месяца

Разработка кроссплатформенного мобильного приложения, которое не уступает нативным решениям как в производительности, так и пользовательском опыте. Публикуется в AppStore, GooglePlay и RuStore

Опросник на разработку. После ознакомления, задам уточняющие вопросы и оценю проект по стоимости и срокам разработки.