@tgarl

Как дать скидку на произвольную сумму в момент оформления заказа, чтобы не затронуть остальные скидки?

Суть вопроса такова: хотим ввести баллы, т.е.
- в момент заказа клиент делает запрос к 1С и получает сумму балов(тут вроде нет проблем),
- вводит любую сумму не больше полученной(тоже особо нет проблем)
вот дальше проблема
- нужно произвести скидку на товары в пределах указанной, не сломав текущие скидки, а добавив к ним информацию что на такой-то товар применена скидка такая-то

итого должно получится:
имеем 2 товара 1399 и 789 руб
баллами у клиента 100
он хочет 58 использовать
но у нас есть скидка по акции 49% на первый товар
получается первый уже стоит 686
значит на него должно пойти 46,5% от 58р = 27р
на второй товар 31р
и чтобы это отобразилось как обычные скидки типа "скидка за баллы(27р)"

и вот такую схему я плохо представляю как организовать. Если бы была возможность сумму скидки привязать не к Скидкам, а к Купонам.. но такого нет в битриксе
  • Вопрос задан
  • 147 просмотров
Решения вопроса 1
1 Есть внутренний счет. Разрешите оплату с внутреннего счета и начисляйте балы на него.
2 Создайте скидку прототип с ограничением по пользователю и укажите пользователя 1 и сумму скидки 1. Дальше можете просто извлекать эту скидку, заменять id пользвоателя на своего.
Пусть в $dctPrototype скидка-прототип (полученная из \Bitrix\Sale\Internals\DiscountTable::getList(['filter'=>$arFilter])->fetch();) тогда примерно так:
// грууппы этого правила для скидки
                $lstGruopsIDs = array_column(
                        \Bitrix\Sale\Internals\DiscountGroupTable::getList(['filter'=>['DISCOUNT_ID'=>$dctPrototype['ID']]])->fetchAll(),
                        'GROUP_ID'
                    );
        
                // переменовываем
                $dctPrototype['NAME'] = 'Автоматическая скидка';
                
                // так надо
                $dctPrototype['VERSION'] = intval($dctPrototype['VERSION']);
                
                // удаляем лишние поля
                unset($dctPrototype['MODIFIED_BY'],$dctPrototype['ID']);
                
                // заменяем id пользователя
                $dctPrototype['CONDITIONS_LIST']['CHILDREN'][0]['DATA']['value'][0] = $UserId;
                $dctPrototype['UNPACK'] = str_replace(
                        'Bitrix\Main\Discount\UserConditionControl::checkBasket($arOrder, array(1), \'Equal\')',
                        'Bitrix\Main\Discount\UserConditionControl::checkBasket($arOrder, array('.$UserId.'), \'Equal\')',
                        $dctPrototype['UNPACK']
                    );
                // добавляем
                $result = \Bitrix\Sale\Internals\DiscountTable::add($dctPrototype);
                
                if ($result->isSuccess()) {
                    $DISCOUNT_ID = $result->getId();
                    
                    // добавляем группы
                    foreach ($lstGruopsIDs as $GROUP_ID) {
                        \Bitrix\Sale\Internals\DiscountGroupTable::add([
                                'ACTIVE'=>'Y',
                                'DISCOUNT_ID'=>$DISCOUNT_ID,
                                'GROUP_ID'=>$GROUP_ID
                            ]);
                    }
                }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы