creatonio Posted October 4, 2013 Report Share Posted October 4, 2013 Добрый день. Нужно сделать, чтобы скидка пользователя не учитывалась для товаров у которых уже акционная цена. Думаю нужно править этот кусок кода в 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$. Quote Link to post Share on other sites
Ogybil Posted October 4, 2013 Report Share Posted October 4, 2013 Там очень много изменений, я себе сделал что на товары со скидкой нет скидки пользователя и скидки от суммы заказа.Но скажу сразу на форуме есть специалисты, которые сделают то что Вы хотите, но точно не за те деньги которые предлагаете. Quote Link to post Share on other sites
creatonio Posted October 4, 2013 Author Report Share Posted October 4, 2013 Раз там много изменений, может кто из специалистов оценит сколько будет стоить похожее? Quote Link to post Share on other sites
Glauder Posted October 7, 2013 Report Share Posted October 7, 2013 Мне тоже необходима помощь в данной доработке!В Симпле скидка пользователя считается таким образом: сначала складываются все товары в корзине и полученная сумма умножается на скидку пользователя. Исходя из этого начал пробовать решать данную проблему правильного расчета скидок на "акционные" товары.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_sale6. Далее в расчете пользовательской скидки изменим на: // Пользовательская скидка $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 НЕ правильная, а та которая рассчитывалась ранее, до внесенных изменений, т.е. скидка посчиталась на все товары. Видимо расчет корзины есть где-то ещё, либо моя логика расчета в корне не правильная! Буду рад если спецы поделятся соображениями по данному вопросу. Quote Link to post Share on other sites
Ogybil Posted October 7, 2013 Report Share Posted October 7, 2013 Здесь расчет скидки тесно связан с ценой, мне пришлось добавить еще 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; }Это только маленькая часть, там нужно понимать логику. Quote Link to post Share on other sites
Glauder Posted October 7, 2013 Report Share Posted October 7, 2013 Беда вся в том, что в API я посчитал все правильно, как задумывал, а вот значение $cart->total_price в базу записалось не то, которое передалось и показалось в корзине. Логику Ваших расчетов понять можно, тем более что комменты Вы не поленились написать! Может где-то еще кроется засада? Quote Link to post Share on other sites
Ogybil Posted October 9, 2013 Report Share Posted October 9, 2013 Беда вся в том, что в API я посчитал все правильно, как задумывал, а вот значение $cart->total_price в базу записалось не то, которое передалось и показалось в корзине. Логику Ваших расчетов понять можно, тем более что комменты Вы не поленились написать! Может где-то еще кроется засада?Я же написал, там много изменений, API - ключевые, что менял не помню, но много и в базу изменения вносил. Quote Link to post Share on other sites
Glauder Posted October 13, 2013 Report Share Posted October 13, 2013 Я же написал, там много изменений, API - ключевые, что менял не помню, но много и в базу изменения вносил.А в базе в таблице s_orders добавляли какие-нибудь поля имеющие отношение к стоимости заказа? Если не трудно посмотрите пожалуйста или напишите все поля данной таблицы! Quote Link to post Share on other sites
Ogybil Posted October 14, 2013 Report Share Posted October 14, 2013 `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` Quote Link to post Share on other sites
Kors Posted March 27, 2015 Report Share Posted March 27, 2015 Скидку пользователя не учитывать для акционных товаров Стандартно в Simpla скидка пользователя применяется ко всем товарам в заказе. Но часто у продавцов действует правило - при продаже применяется только одна скидка. Разработка меняет расчет скидки заказа, скидка пользователя предоставляется только на те товары (варианты) заказа, которые не имеют старой цены, то есть на которые уже не установлена скидка. Создавалось для версии 2.3.6. Скорее всего, годится и для других версий 2.x http://simpla-tuning.com/products/skidku-polzovatelya-ne-uchityvat-dlya-aktsionnyh-tovarov 40$ Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.