Перейти к содержанию
Официальный форум поддержки Simpla

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


Рекомендуемые сообщения

Добрый день. Нужно сделать, чтобы скидка пользователя не учитывалась для товаров у которых уже акционная цена. Думаю нужно править этот кусок кода в 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$.

Ссылка на сообщение
Поделиться на другие сайты

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

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

Ссылка на сообщение
Поделиться на другие сайты

Мне тоже необходима помощь в данной доработке!
В Симпле скидка пользователя считается таким образом: сначала складываются все товары в корзине и полученная сумма умножается на скидку пользователя. Исходя из этого начал пробовать решать данную проблему правильного расчета скидок на "акционные" товары.
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 НЕ правильная, а та которая рассчитывалась ранее, до внесенных изменений, т.е. скидка посчиталась на все товары. Видимо расчет корзины есть где-то ещё, либо моя логика расчета в корне не правильная! Буду рад если спецы поделятся соображениями по данному вопросу.

Ссылка на сообщение
Поделиться на другие сайты

Здесь расчет скидки тесно связан с ценой, мне пришлось добавить еще 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;
    }

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

Ссылка на сообщение
Поделиться на другие сайты

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

Ссылка на сообщение
Поделиться на другие сайты

`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`
 
Ссылка на сообщение
Поделиться на другие сайты
  • 1 год спустя...

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

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

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

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

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

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

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

40$

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...