Здравствуйте!
Прошу помощи в настройке правил корзины. нужно изолировать правила друг от друга.
Пример:
в корзине 5 товаров. общей суммой в 12 000р
На товар 1 и 2 действует скидка 10%
На Все товары действует правило если Итог больше и равно 10 000р, то скидка 5%.
Проблема в том, что 5% от суммы заказа накладывается и на товары 1 и 2 у которых уже 10% скидки, в итоге на них получается скидка около 14%.
Как сделать так. чтобы на товар 1 и 2 действовала скидка 10%, а на товар 3 4 5 действовала скидка от суммы заказа 5%, но не действовала на товары 1 и 2. Тоесть товары 1 и 2 имеют свою скидку но учавствуют срабатывании правила от суммы заказа.
Экспериментируйте с настройкой прерывания применения ценовых правил (см. Stop Further Rules Processing) и порядком их применения.
Пробовали. проблема в том, что нельзя изолировать правила друг от друга..
Если поставить галочку Stop Further Processing, то после первого сработавшего правила (из двух в примере, например, 10 % на 2 книги из 5ти) второе правило, 5% от суммы в корзине не сработает. (и наоборот если поменять приоритеты)
Вроде не реально сделать стандартными средствами. Нет условия "к товару не применена другая скидка". Если сможете эти товары как-то по другому отсеять, то поиграйтесь с закладкой "Действия", там есть "Применить правило только для товаров в корзине, удовлетворяющим следующим условиям (оставьте пустым для всех товаров)".
Ну вот никак ) В данном примере мы отсеиваем те товары, у которых своя скидка 10% (тут все ок), а второе правило действует на всю корзину и отделить товары на которые скидка отдельная, никак не выходит. Скидки суммируются. Думали может не знаем о каких то условиях. Стандартными средствами никак не получается. Может быть кто-то может посоветовать уже готовый сторонний модуль на замену стандартного, в котором можно более гибко настраивать правила скидок?
Мне тоже интересно как можно не применять скидки в корзине на товары, у которых есть своя персональная скидка.
И как это можно программно поправить..
Есть решение, как это реализовать. Но надо всё же немного кода написать.
Есть метод process в классе Mage_SalesRule_Model_Validator он рассчитывает скидку и с нем есть вот такая строка https://github.com/OpenMage/magento-mirror/blob/magento-1.9/app/code/core/Mage/SalesRule/Model/Valid...
Соответственно можно подписаться на событие salesrule_validator_process и вызвать свой обработчик:
<salesrule_validator_process>
<observers>
<my_salesrule_validator_process>
<class>my_module/observer</class>
<method>salesruleValidatorProcess</method>
</my_salesrule_validator_process>
</observers>
</salesrule_validator_process>
и в методе написать что-то вроде
public function salesruleValidatorProcess($event)
{
$result = $event->getResult();
$discountAmount = $result->getDiscountAmount();
$item = $event->getItem();
$qty = $item->getQty();
$baseProductTotal = $qty * $item->getProduct()->getPrice();
$baseItemTotal = $qty * $item->getPrice();
$productDiscountPercent = 1 - $baseItemTotal / $baseProductTotal;
$itemDiscountPercent = $discountAmount / $baseItemTotal;
if ($productDiscountPercent == 0) {
return;
}
if ($itemDiscountPercent > $productDiscountPercent) {
$newDiscountPercent = ($itemDiscountPercent - $productDiscountPercent) / (1 - $productDiscountPercent);
$discountAmount = $newDiscountPercent * $baseItemTotal;
$baseDiscountAmount = $discountAmount;
$result->setDiscountAmount($discountAmount);
$result->setBaseDiscountAmount($baseDiscountAmount);
$item->setDiscountPercent($newDiscountPercent);
} else {
$result->setDiscountAmount(0);
$result->setBaseDiscountAmount(0);
$item->setDiscountPercent(0);
}
}
Наверно можно изящней, но главное принцип