Jump to content

Не учитывать скидку пользователя в коризне.


Recommended Posts

Добрый день. Нужно сделать, чтобы скидка пользователя не учитывалась для товаров у которых уже акционная цена. Думаю нужно править этот кусок кода в cart.php.

// Пользовательская скидка
$cart->discount = 0;
if(isset($_SESSION['user_id']) && $user = $this->users->get_user(intval($_SESSION['user_id'])))
$cart->discount = $user->discount;
					
$cart->total_price *= (100-$cart->discount)/100;

За помощь готов отблагодарить материально 10-20$.

Link to post
Share on other sites

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

Но скажу сразу на форуме есть специалисты, которые сделают то что Вы хотите, но точно не за те деньги которые предлагаете.

Link to post
Share on other sites

Мне тоже необходима помощь в данной доработке!
В Симпле скидка пользователя считается таким образом: сначала складываются все товары в корзине и полученная сумма умножается на скидку пользователя. Исходя из этого начал пробовать решать данную проблему правильного расчета скидок на "акционные" товары.
1. Как выделить "акционные" товары от остальных? Мое решение: добавить в поле "Артикул" слово "sale". Ну все эти товары добавил в отдельную категорию "Акции и скидки".
2. При расчете общей стоимости корзины $cart->total_price в файле api/Cart.php надо разделить товары на "акционные" и обычные и раздельно посчитать для каждой группы, соответсвенно для "акционных" скидка будет ноль, а для остальных "скидка пользователя".
ИЛИ
Считать надо последовательно каждый товар и накладывать или не накладывать скидку, считаем частный итог по товару, а потом все частные итоги складываем и получаем $cart->total_price. Этот вариант расчета мне кажется наиболее верным, но он и более сложный, поэтому я попробовал сделать расчет по первой схеме.
3. В файле api/Cart.php в функции get_cart() добавил переменную $cart->total_price_sale = 0;
4. В цикле при расчете $cart->total_price добавил условие для расчета суммы "акционных" товаров $cart->total_price_sale

 

foreach($items as $variant_id=>$item)
{
$purchase = null;
if(!empty($products[$item->variant->product_id]))
  {
  $purchase->product = $products[$item->variant->product_id];
     
  $purchase->variant = $item->variant;
     
  $purchase->amount = $item->amount;
  
  $cart->purchases[] = $purchase;
  $cart->total_price += $item->variant->price*$item->amount;
  if($item->variant->sku=='sale')
  {
   $cart->total_price_sale += $item->variant->price*$item->amount;
  }
  $cart->total_products += $item->amount;
  }
}

 

5. Получается мы получили две переменные - общую стоимость корзины $cart->total_price и стоимость акционных товаров $cart->total_price_sale
6. Далее в расчете пользовательской скидки изменим на:

 

// Пользовательская скидка
$cart->discount = 0;
if(isset($_SESSION['user_id']) && $user = $this->users->get_user(intval($_SESSION['user_id'])))
$cart->discount = $user->discount;
   
$cart->total_price = $cart->total_price - $cart->total_price_sale;
$cart->total_price *= (100-$cart->discount)/100;
$cart->total_price = $cart->total_price + $cart->total_price_sale;

 

7. В итоге мы получили общую стоимость корзины, в которой скидка на "акционные" товары не учитывается.
8. Далее надо сделать необходимые изменения в файле design/ваш_шаблон/html/cart.tpl чтобы правильно отображалась скидка, если вы её показываете, общая стоимость и т.д. Не привожу код, т.к. мой файл достаточно сильно изменен в связи с другими дополнениями (учет стоимости доставки при расчете, аякс пересчет корзины и т.д.). У меня в корзине все правильно рассчитывает и показывает.

НО!

Вот далее возникли трудности!
В базу данных записывается общая стоимость корзины $cart->total_price НЕ правильная, а та которая рассчитывалась ранее, до внесенных изменений, т.е. скидка посчиталась на все товары. Видимо расчет корзины есть где-то ещё, либо моя логика расчета в корне не правильная! Буду рад если спецы поделятся соображениями по данному вопросу.

Link to post
Share on other sites

Здесь расчет скидки тесно связан с ценой, мне пришлось добавить еще 2 цены, которые чисто технические, потому-что я делал автоматическое изменение скидок после окончания времени скидок...

Но там с API есть заплет, вот то что у меня, думаю по теме:

 

    // Функция возвращает корзину
    public function get_cart()
    {
        // Устанавливаем нулевые значения переменных
        $cart->purchases = array();
        $cart->total_products = 0;
        $cart->discount = 0;
        $cart->actual_discount = 0;
        $cart->total_promo_price = 0;
        $cart->total_base_price_nodiscount = 0;
        $cart->total_base_price = 0;
        $cart->total_price_nodiscount = 0;
        $cart->total_price = 0;

        // Берем из сессии список variant_id=>amount
        if(!empty($_SESSION['shopping_cart']))
        {
            $session_items = $_SESSION['shopping_cart'];
            
            $variants = $this->variants->get_variants(array('id'=>array_keys($session_items)));
            if(!empty($variants))
            {
                // Выбираем вариант
                foreach($variants as $variant)
                {
                    $items[$variant->id]->variant = $variant;
                    $items[$variant->id]->amount = $session_items[$variant->id];
                    $products_ids[] = $variant->product_id;
                }
    
                $products = array();
                foreach($this->products->get_products(array('id'=>$products_ids)) as $p)
                    $products[$p->id]=$p;

                $images = $this->products->get_images(array('product_id'=>$products_ids));
                foreach($images as $image)
                    $products[$image->product_id]->images[$image->id] = $image;
            
                // Показываем заказанные товары, как варианты товаров
                foreach($items as $variant_id=>$item)
                {    
                    $purchase = null;
                    if(!empty($products[$item->variant->product_id]))
                    {
                        // Заказанный товар, как товар
                        $purchase->product = $products[$item->variant->product_id];
                        // Вариант заказанного товара, как вариант заказанного товара
                        $purchase->variant = $item->variant;
                        // Количество, как количество
                        $purchase->amount = $item->amount;
                        // Определение товаров в корзине
                        $cart->purchases[] = $purchase;
                        // Количество товаров в корзине
                        $cart->total_products += $item->amount;

                        // Сумма всех товаров корзины на которые НЕ распространяется действие скидки
                        if ($item->variant->low_price == $item->variant->price || $item->variant->no_discount)
                            $cart->total_promo_price += $item->variant->price*$item->amount;

                        // Сумма всех товаров корзины на которые РАСПРОСТРАНЯЕТСЯ действие скидки
                        if ($item->variant->low_price != $item->variant->price && empty($item->variant->no_discount))
                        {
                            // Сумма всех товаров корзины с базовой ценой без скидки
                            $cart->total_base_price_nodiscount += $item->variant->price*$item->amount;
                            // Сумма всех товаров корзины с базовой ценой со скидкой
                            $cart->total_base_price += $item->variant->price*$item->amount;
                        }

                        // Сумма всех товаров корзины без скидки
                        $cart->total_price_nodiscount += $item->variant->price*$item->amount;
                    }
                }
                
                // СИСТЕМА СКИДОК для товаров на которые распространяется скидка
                $discountlimits = $this->users->get_discountlimits();
                
                // Если установлены скидки
                if(!empty($discountlimits))
                {
                    foreach($discountlimits as $discountlimit)
                    {
                    // Если сумма заказов на которые распространяется скидка больше суммы установленного лимита
                    if($cart->total_base_price>$discountlimit->d_limit)
                        $cart->discount = $discountlimit->d_discount;
                    }
                }
                // Если скидоки не установлены
                else
                {
                    // Скидка корзины
                    $cart->discount = 0;
                }
                
                // Если зарегистрированный пользователь
                if(isset($_SESSION['user_id']) && $user = $this->users->get_user(intval($_SESSION['user_id'])))                
                    // Если есть скидка клиента и скидка от суммы заказа, выбираем большую скидку
                    if ($user->discount>$cart->discount)
                        $cart->discount = $user->discount;

                 // Результат: Сумма всех товаров корзины с акционной ценой
                $cart->total_promo_price *= 100/100;    
                            
                 // Результат: Сумма всех товаров корзины с базовой ценой без скидки
                $cart->total_promo_price_nodiscount *= 100/100;                
                // Результат: Сумма всех товаров корзины с базовой ценой со скидкой
                $cart->total_base_price *= (100-$cart->discount)/100;
                
                 // Результат: Сумма всех товаров корзины без скидки
                $cart->total_price_nodiscount *= 100/100;    
                
                // Если клиент VIP (скидка на все товары)
                if(!empty($user) && $user->full_discount==1)
                {
                    // Сумма всех товаров корзины без скидки - скидка
                    $cart->total_price = $cart->total_price_nodiscount-( $cart->total_price_nodiscount / 100 * $cart->discount );
                }
                // Если обычный клиент (нет скидки на товары с акционной ценой)
                else
                {
                    // Сумма всех товаров корзины с акционной ценой + Сумма всех товаров корзины с базовой ценой со скидкой
                    $cart->total_price = $cart->total_promo_price + $cart->total_base_price;
                }
                
                // Результат: Фактическая скидка, для передачи в заказ
                $cart->actual_discount = 100-($cart->total_price*100/$cart->total_price_nodiscount);
            }
        }
        
        return $cart;
    }

Это только маленькая часть, там нужно понимать логику.

Link to post
Share on other sites

Беда вся в том, что в API  я посчитал все правильно, как задумывал, а вот значение $cart->total_price в базу записалось не то, которое передалось и показалось в корзине. Логику Ваших расчетов понять можно, тем более что комменты Вы не поленились написать! Может где-то еще кроется засада?

Link to post
Share on other sites

Беда вся в том, что в API  я посчитал все правильно, как задумывал, а вот значение $cart->total_price в базу записалось не то, которое передалось и показалось в корзине. Логику Ваших расчетов понять можно, тем более что комменты Вы не поленились написать! Может где-то еще кроется засада?

Я же написал, там много изменений, API - ключевые, что менял не помню, но много и в базу изменения вносил.

Link to post
Share on other sites

Я же написал, там много изменений, API - ключевые, что менял не помню, но много и в базу изменения вносил.

А в базе в таблице s_orders добавляли какие-нибудь поля имеющие отношение к стоимости заказа? Если не трудно посмотрите пожалуйста или напишите все поля данной таблицы!

Link to post
Share on other sites

`id`, `delivery_id`, `delivery_price`, `payment_method_id`, `paid`, `payment_date`, `closed`, `date`, `user_id`, `name`, `address`, `phone`, `email`, `comment`, `status`, `url`, `payment_details`, `ip`, `total_price`, `note`, `discount`, `modified`, `deliverynote`, `currency`, `currency_sign`, `notify_user_sms_payment_check`, `notify_user_sms_payment_true_check`, `notify_user_sms_delivery_check`, `notify_user_sms_thanks_check`
 
Link to post
Share on other sites
  • 1 year later...

Скидку пользователя не учитывать для акционных товаров

Стандартно в Simpla скидка пользователя применяется ко всем товарам в заказе.

Но часто у продавцов действует правило - при продаже применяется только одна скидка.

Разработка меняет расчет скидки заказа, скидка пользователя предоставляется только на те товары (варианты) заказа, которые не имеют старой цены, то есть на которые уже не установлена скидка.

Создавалось для версии 2.3.6.

Скорее всего, годится и для других версий 2.x

http://simpla-tuning.com/products/skidku-polzovatelya-ne-uchityvat-dlya-aktsionnyh-tovarov

40$

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...