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

2020.08.10
Например имеется два типа цен, Оптовая и Розничная, нужно если в корзине товаров больше чем на 5000 рублей в розничной цене то применять оптовую.
Для изменения типа цены будем изменять принадлежность пользователя к группе которой разрешена покупка по данному типу цен.
Для этого достаточно разместить скрипт представленный ниже в файл init.php находящийся по пути /bitrix/php_interface/init.php или /local/php_interface/init.php или же нужно будет создать его либо там либо там.
После вставки скрипта необходимо отредактировать константы представленные в самом начале кода
public $PRICE_CART = 5000; /* Лимит после которого включается оптовая цена */
public $GROUP_PRICE = 5; /* ID группы пользователей кому доступна оптовая цена */
public $BASE_PRICE = 1; /* ID Розничной цены */

Готово, можно проверять работу
(Важно! все изменения подключения и создание файла init.php лучше производить через файловый менеджер)
        <?
use Bitrix\Sale;

AddEventHandler("sale", "OnBasketUpdate", Array("SaleEventHendlers", "StartUpdateCart"));

class SaleEventHendlers{

    public $PRICE_CART = 5000; /* Лимит после которого включается оптовая цена */
    public $GROUP_PRICE = 5; /* ID группы пользователей кому доступна оптовая цена */
    public $BASE_PRICE = 1; /* ID Розничной цены */

    public function RegCart(&$arFields){

        $dbBasketItems = CSaleBasket::GetList(
            array(
                "NAME" => "ASC",
                "ID" => "ASC"
            ),
            array(
                "FUSER_ID" => CSaleBasket::GetBasketUserID(),
                "LID" => SITE_ID,
                "ORDER_ID" => "NULL"
            ),
            false,
            false,
            array("ID", "CALLBACK_FUNC", "MODULE",
                "PRODUCT_ID", "QUANTITY", "DELAY",
                "CAN_BUY", "PRICE", "WEIGHT")
        );
        $productFilter = array();
        $result = array();
        while ($arItems = $dbBasketItems->Fetch()) {
            if (strlen($arItems["CALLBACK_FUNC"]) > 0) {
                CSaleBasket::UpdatePrice($arItems["ID"],
                    $arItems["CALLBACK_FUNC"],
                    $arItems["MODULE"],
                    $arItems["PRODUCT_ID"],
                    $arItems["QUANTITY"]);
                $arItems = CSaleBasket::GetByID($arItems["ID"]);
            }
            $productFilter[] = $arItems['PRODUCT_ID'];
            $result[$arItems['PRODUCT_ID']] = $arItems;
        }
        $ProductTableOB = \Bitrix\Catalog\PriceTable::getList(array(
            'filter' => array(
                'PRODUCT_ID' => $productFilter, 
                'CATALOG_GROUP_ID' => $this->BASE_PRICE
             )
        ));
        $SUMM = 0;
        while ($ProductPrice = $ProductTableOB->fetch()){
            $SUMM = $SUMM + $result[$ProductPrice['PRODUCT_ID']]['QUANTITY'] * $ProductPrice['PRICE'];
        }
        if ($SUMM > $this->PRICE_CART){
            global $USER;
            $arGroups = CUser::GetUserGroup($USER->GetID());
            if(!in_array($this->GROUP_PRICE, $arGroups)){
                $arGroups[] = $this->GROUP_PRICE;
                $arFields = [
                    'GROUP_ID' => $arGroups,
                ];
                $USER->Update($USER->GetID(), $arFields);
            }
        }else{
            global $USER;
            $arGroups = CUser::GetUserGroup($USER->GetID());
            if(in_array($this->GROUP_PRICE, $arGroups)){
                foreach ($arGroups as $key => $oneGroup){
                    if ($oneGroup == $this->GROUP_PRICE){
                        unset($arGroups[$key]);
                    }
                }
                $arFields = [
                    'GROUP_ID' => $arGroups,
                ];
                $USER->Update($USER->GetID(), $arFields);
            }
        }
    }

    public function StartUpdateCart($ID, &$arFields){
        $ob = new SaleEventHendlers();
        $ob->RegCart($arFields);
    }
}
    
Текст сообщения*
Загрузить файл или картинкуПеретащить с помощью Drag'n'drop
Перетащите файлы
Ничего не найдено
Защита от автоматических сообщений