Отключение складывания скидок на заказ и товар

Материал из 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;                           
      }        		   
   }
}


Теперь, в случае активных скидок на элемент заказа и на заказ, будет действовать логика описанная в начале статьи.

Личные инструменты