UMIhelp

Разработка сайта на UMI.CMS => Шаблоны TPL => Тема начата: smartweb от 16 Ноября 2016, 14:14:06

Название: Не суммировать скидку на товар с общей скидкой от суммы заказа
Отправлено: smartweb от 16 Ноября 2016, 14:14:06
Всем привет.
Возник вопрос:
в системе добавлены 2 типа скидок:
1) 20% от суммы заказа в 5000 р
2) 30% на определённый товар "Сувенир"

При добавлении "обычных" товаров без скидок на сумму 5000 р и добавлении товара "Сувенир" скидки в корзине суммируются, т.е. UMI берёт 20% от суммы заказа, включая товар, который уже итак идёт с 30% скидкой.

Задача: при расчёте скидки на заказ не брать во внимание товар "Сувенир"( и вообще скидку на группу товаров) и его скидочную цену.

В каком направлении двигаться? начали ковыряться в /classes/modules/emarket/classes/discounts/discounts/OrderDiscount.php, но что-то не ясно пока что да как. Насколько я понимаю, нужно исправить функцию search

<?php
/**
* Скидка на заказ в интернет-магазине
*/
class orderDiscount extends discount {
/**
* Проверить, применима ли скидка к заказу $order
* @param order $order
* @return Boolean
*/
public function validate(order $order) {
$rules = $this->getDiscountRules();

$validateCount = 0;
foreach($rules as $rule) {
if($rule instanceof orderDiscountRule == false) {
continue;
}

if($rule->validateOrder($order) == false) {
return false;
}
$validateCount++;
}
return $validateCount > 0;
}


/**
* Найти наиболее подходящую скидку для заказа $order
* @param order $order заказ
* @return orderDiscount самая подходящая скидка для заказа $order
*/
public static function search(order $order) {
$cmsController = cmsController::getInstance();
$emarket = $cmsController->getModule('emarket');

if($emarket instanceof def_module == false) {
throw new coreException('Emarket module must be installed in order to calculate discounts');
}

$allDiscounts = $emarket->getAllDiscounts('order'); $discounts = array();
foreach($allDiscounts as $discountObject) {
$discount = discount::get($discountObject->id);
if($discount instanceof orderDiscount == false) continue;
if($discount->validate($order)) $discounts[] = $discount;
}

switch(sizeof($discounts)) {
case 0: return null;
default:
$orderPrice = $order->getOriginalPrice();
$maxDiscount = null; $minPrice = null;
foreach($discounts as $i => $discount) {
$price = $discount->recalcPrice($orderPrice);
if($price <= 0) continue;

if(is_null($minPrice) || $minPrice > $price) {
$minPrice = $price;
$maxDiscount = $discount;
}
}
return $maxDiscount;
}
}
};
?>

Название: Re: Не суммировать скидку на товар с общей скидкой от суммы заказа
Отправлено: aghigay от 16 Ноября 2016, 18:07:37
Предполагаю, что нужно делать новый тип скидок, в который добавить товары, на которые не нужно делать скидки. Это, условно, будет называться "Скидка 20% от суммы заказа в 5000 р, где сумма заказа складывается только из тех товаров, которых нет в списке самой скидки"
Название: Re: Не суммировать скидку на товар с общей скидкой от суммы заказа
Отправлено: smartweb от 19 Декабря 2016, 12:26:45
Предполагаю, что нужно делать новый тип скидок, в который добавить товары, на которые не нужно делать скидки. Это, условно, будет называться "Скидка 20% от суммы заказа в 5000 р, где сумма заказа складывается только из тех товаров, которых нет в списке самой скидки"
а если товары подгружаются из 1С и их много? как думаете: не вариант ковырять .php файл и написать конструкцию перед расчётом скидки от заказа?
Название: Re: Не суммировать скидку на товар с общей скидкой от суммы заказа
Отправлено: aghigay от 19 Декабря 2016, 12:29:09
Конечно вариант ковырять php-файл. :-)
Особенно учитывая то, что создание нового типа скидки - это создание отдельного php-файла с соответсвующими параметрами и логикой внутри