Отключение складывания скидок на заказ и товар
Материал из Umicms
В версии системы 2.8.4.3 и ниже логика применения скидок в модуле emarket такова, что если на товар в корзине действует скидка и на сам заказ также распространяется другая скидка, то в итоге, к товару будет применена его родная скидка, а потом будет еще применена скидка от заказа. В некоторых случаях хотелось бы видеть такую логику системы:
- если скидка на товар больше чем скидка на заказ, то применить к товару только скидку на товар, без дополнительного применения скидки на заказ;
- если скидка на товар меньше чем скидка на заказ, то скидку на товар (элемент заказа) отменить и применить к нему скидку на заказ.
Для реализации данной задачи, воспользуемся Событием order_refresh модуля emarket:
$eventPoint = new umiEventPoint("order_refresh"); $eventPoint->addRef("order", $object); $eventPoint->setMode('after'); $eventPoint->addRef("actualPrice", $actualPrice); $eventPoint->call();
в файле \classes\modules\emarket\classes\orders\oder.php.
Добавим в папку classes/modules/emarke/ файл custom_events.php:
<?php new umiEventListener('order_refresh', 'emarket', 'onSetDiscount'); ?>
и также файл permissions.custom.php:
<?php $permissions = array('purchasing' => array('onSetDiscount')); ?>
А в файл \classes\modules\emarket\__custom.php добавим метод onSetDiscount:
public function onSetDiscount($e) { if($e->getMode() == "after") { $order = $e->getRef('order'); if($discount_id = $order->order_discount_id){ // сумма к которой необходимо будет применить скидку на заказ $originalPriceForDiscounts = 0; // сумма к которой не надо применять скидку на заказ, т.к. скидка на элемент заказа больше $originalPrice = 0; $objects = umiObjectsCollection::getInstance(); $object_discount = $objects->getObject($discount_id); if(!$object_discount) return; //значение скидки на заказ $value_proc_order = $objects->getObject($object_discount->discount_modificator_id)->proc; //элементы заказа, массив object_id $items = $order->order_items; //текущая актуальная цена заказа $actual_price = &$e->getRef('actualPrice'); foreach($items as $item) { $object_item = $objects->getObject($item); $item_discount_id = $object_item->item_discount_id; $item_total_original_price = $object_item->item_total_original_price; if($item_discount_id){ $object_discount_item = $objects->getObject($item_discount_id); // значение скидки на элемент заказа $value_proc_item = $objects->getObject($object_discount_item->discount_modificator_id)->proc; if($value_proc_order > $value_proc_item){ $originalPriceForDiscounts += $item_total_original_price; //удаляем скидку из элемента заказа $object_item->setValue('item_discount_id', ''); $object_item->setValue('item_total_price', $item_total_original_price); }else{ $originalPrice += $object_item->item_total_price; } }else{ $originalPriceForDiscounts += $item_total_original_price; } } //применяем скидку на заказ, скидка применяется только к $originalPriceForDiscounts $actual_price = $originalPriceForDiscounts - ($originalPriceForDiscounts * $value_proc_order / 100); $delivery_price = $order->delivery_price; $actual_price += $originalPrice + $delivery_price; } } }
Теперь, в случае активных скидок на элемент заказа и на заказ, будет действовать логика описанная в начале статьи.
