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

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

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

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

В моем случае, товары которые запрещены к оплате бонусами имеют свойство "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
);

Блог-note: заметки разработчика

Постраничная навигация в списке разделов Битрикс- catalog.section.list

Если в магазине очень много разделов и хочется вывести их с постраничной навигацией: можно воспользоваться методами CDBR...

Добавить СЕО-метатеги в результаты поиска по каталогу

Задача: на странице с результатами поиска по каталогу нужно установить уникальные метатеги: keywords, description, canon...

Адаптивное гамбургер меню для битрикс

Заметка коротенькая, но решил оставить ее - так как самому часто нужно нечто подобное. В архиве готовый шаблон для Битри...

Вывести товары из того же раздела в карточке товара

Немножко топорный, но все же вполне действенный способ по выводу внутри подробной карточки товара, элементов того же раз...

Фотогалерея на шаблоне новостей в 1С-Битрикс

Частенько стоит задача, по мимо стандартных "Картинка для анонса" и "Детальная картинка", добавить в...

Получение SEO данных элементов и разделов инфоблока, через API 1С-Битрикс

Для того чтобы извлечь данные из вкладки SEO административной панели Битрикс, необходимо использовать специализированные...

Умный фильтр во всплывающей панели на мобильных.

Шаблон умного фильтра в Битриксе достаточно сложный, с точки зрения верстки и не очень красиво отображается на мобильных...

Вывести компонент новостей на страницу в Битрикс

Посмотрел Яндекс метрику на свой сайт, и решил что буду частенько писать сюда именно то, что ищут люди. Итак за последню...

Вывести новости из конкретного раздела инфоблока Битрикс

Бывает что требуется вывести конкретные новости или статьи из одного раздела инфоблока в Битрикс, для этого потребуется ...