Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Обнуление стоимостей доставки при сумме заказа > XXX руб


lavka

Recommended Posts

Подскажите, пожалуйста, как сделать, чтобы при определенной сумме товаров в корзине все способы доставки становились бесплатными, с ценой 0 рублей.

 

Модуль "бесплатная доставка" не подходит, поскольку клиенту нужно предоставить именно выбор способа - курьер, почта или терминал и соответственно, для каждого способа свои поля для заполнения.

 

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

Надіслати
Поділитися на інших сайтах


catalog/model/shipping/

открываем нужный метод доставки и оборачиваем данные внутри функции в такое условие:

 

if ($this->cart->getSubTotal() < сумма) {



]

посмотрите как это работает в бесплатной доставке, не помню точно

  • +1 1
Надіслати
Поділитися на інших сайтах


catalog/model/shipping/

открываем нужный метод доставки и оборачиваем данные внутри функции в такое условие:

if ($this->cart->getSubTotal() < сумма) {



]

посмотрите как это работает в бесплатной доставке, не помню точно

 

Благодарю, именно так и работает, как вы написали.

 

Но остается проблема - в шапке, в корзине все равно плюсуется стоимость доставки. Не могу найти, где же она берется, если я добавил предложенное вами условие в модуль конкретной доставки и в итоговой корзине стоимость доставки = 0

Надіслати
Поділитися на інших сайтах


Оказалось, модуль корзины в шапке берет информацию о стоимости доставки не из переменной $method_data, которую модуль доставки возвращает, а из $quote_data

 

Итоговая функция в файле конкретного способа доставки будет примерно такая (здесь пример для фиксированной стоимости доставки):

		if ($status) {
			if ($this->cart->getSubTotal() < 3000) {
				$quote_data = array();
			
				$quote_data['flat'] = array(
					'code'         => 'flat.flat',
					'title'        => $this->language->get('text_description'),
					'cost'         => $this->config->get('flat_cost'),
					'tax_class_id' => $this->config->get('flat_tax_class_id'),
					'text'         => $this->currency->format($this->tax->calculate($this->config->get('flat_cost'), $this->config->get('flat_tax_class_id'), $this->config->get('config_tax')))
				);

				$method_data = array(
					'code'       => 'flat',
					'title'      => $this->language->get('text_title'),
					'quote'      => $quote_data,
					'sort_order' => $this->config->get('flat_sort_order'),
					'error'      => false
				);
			} else {
				$quote_data = array();
			
				$quote_data['flat'] = array(
					'code'         => 'flat.flat',
					'title'        => $this->language->get('text_description'),
					'cost'         => '0', //Это как раз сумма доставки
					'tax_class_id' => $this->config->get('flat_tax_class_id'),
					'text'         => $this->currency->format('0') //Это значение для суммы в названии способа доставки
				);

				$method_data = array(
					'code'       => 'flat',
					'title'      => $this->language->get('text_title'),
					'quote'      => $quote_data,
					'sort_order' => $this->config->get('flat_sort_order'),
					'error'      => false
				);
			}
		}
Надіслати
Поділитися на інших сайтах


  • 1 month later...

catalog/model/shipping/

открываем нужный метод доставки и оборачиваем данные внутри функции в такое условие:

if ($this->cart->getSubTotal() < сумма) {



]

посмотрите как это работает в бесплатной доставке, не помню точно

сумма - как её отображить здесь?

Надіслати
Поділитися на інших сайтах


  • 2 weeks later...

Короче, продолжение. Оказывается, функция $this->cart->getSubTotal() возвращает стоимость товаров в корзине без учета примененного купона. К примеру, если бесплатная доставка от 10000 рублей, и корзина стоила 10500 рублей, а после купона стала 9500, то доставка все равно остается бесплатной. Я сделал следующее решение, но выглядит, как костыль:

		//код для получения цены и сравнения с порогом бесплатной доставки
		$this->load->model('checkout/coupon'); // грузим модуль чтобы пользовать getCoupon
		$couponvalue = $this->model_checkout_coupon->getCoupon($this->session->data['coupon']); //получаем значение скидки купона
		// получаем какой-то sub_total, он нужен ниже
		if (!$couponvalue['product']) {
			$sub_total = $this->cart->getSubTotal();
		} else {
			$sub_total = 0;
				
			foreach ($this->cart->getProducts() as $product) {
				if (in_array($product['product_id'], $couponvalue['product'])) {
					$sub_total += $product['total'];
				}
			}					
		}
		//получаем размер скидки в зависимости от типа дисконта (процент или фикс)
		if ($couponvalue['type'] == 'F') {
			$discount1 = $couponvalue['discount'] * ($this->cart->getSubTotal() / $sub_total);
		} elseif ($couponvalue['type'] == 'P') {
			$discount1 = floor($this->cart->getSubTotal() / 100 * $couponvalue['discount']);}
		//вычитаем из корзины размер скидки
		$pricecheck = ($this->cart->getSubTotal() - $discount1);
		//конец кода
		if ($status) {
			if ($pricecheck < 10000) {

Может быть, кто знает функцию в Опенкарте, которая вернет стоимость корзины с вычтенным купоном?

Надіслати
Поділитися на інших сайтах


На здоровье, я буду представлять здесь антикоммерческое направление бесплатных ответов)
 
Малость доработал, чтобы в логе не сыпались ошибки, если купон не задан. После строчки $this->load->model('checkout/coupon');
Дописать условие
if (isset($this->session->data['coupon'])) { ***сюда засунуть всю функцию***
} else {
$pricecheck = $this->cart->getSubTotal();
}
//конец кода
        if ($status) {
            if ($pricecheck < 10000) {
  • +1 1
Надіслати
Поділитися на інших сайтах


  • 4 months later...

Обнаружилась проблема:

 

Товар стоит 15000 рублей, но сейчас акция - 10500 рублей. Бесплатная доставка по методу выше - от 10000 рублей.

Дополнительно установлен модуль управления купонами (Coupon Filter) - он, к примеру, не дает скидку по купону на товары с акцией. И наш товар не должен подешеветь от купона.

 

Кладем товар, применяем купон: в корзине цена не изменилась и по-прежнему указано, что доставка будет бесплатно. Но при оформлении мы видим, что доставка стала платной.

 

Опытным путем установил, что купон словно принудительно применяется при расчете доставки, хотя цена на экране не меняется. Куда копать, пока не пойму...

Надіслати
Поділитися на інших сайтах


Короче, снова решил. Прошу высказать мнение - совсем костыль или нормально получилось:
 

		$results = $this->model_setting_extension->getExtensions('total');
		foreach ($results as $result) {
			if ($this->config->get($result['code'] . '_status') && $result['code'] != 'shipping') {
				$this->load->model('total/' . $result['code']);
				$this->{'model_total_' . $result['code']}->getTotal($total_data, $total, $taxes);
				if ($result['code'] == 'coupon') {$pricecheck = $total;}
			}
		}
		// дальше как и было
		if ($status) {
			if ($pricecheck < 10000) {

Не смог напрямую обратиться к модулю total/coupon.php, поэтому взял кусок из controller/checkout/cart.php, который обращается к /total/ модулям. 

И в момент, когда цикл работает с total/coupon, забираю в переменную значение total, которое потом и использую для расчета.

Надіслати
Поділитися на інших сайтах


Благодаря автору Simple оформления удалось решить последнюю, надеюсь, проблему:

в случае, если в корзине товара на 9600, а доставка стоит 500, то на последнем шаге оформления доставка становилась бесплатной. Происходило из-за плюсования стоимости доставки к корзине - условие срабатывало в пользу бесплатной доставки.

 

Заменить

if ($this->config->get($result['code'] . '_status')) {

на

if ($this->config->get($result['code'] . '_status') && $result['code'] != 'shipping') {

Надіслати
Поділитися на інших сайтах


  • 6 years later...

Очень интересное решение, спасибо за консультации.

А можно ли, на базе этого решения, вычесть цену доставки из итоговой стоимости заказа?

 

Opencart 2.1.x: установлены модули онлайн-оплаты и доставки транспортной компанией.

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

Надіслати
Поділитися на інших сайтах


В 08.12.2020 в 23:17, andrey231983 сказал:

Очень интересное решение, спасибо за консультации.

А можно ли, на базе этого решения, вычесть цену доставки из итоговой стоимости заказа?

 

Opencart 2.1.x: установлены модули онлайн-оплаты и доставки транспортной компанией.

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

а такое?

 

Надіслати
Поділитися на інших сайтах


Спасибо, но это не подходит. Во-первых, там нет версии для 2.1.x. Во-вторых, этот модуль позволяет создавать свои методы доставки, но не работает с модулями транспортных компаний.

Надіслати
Поділитися на інших сайтах


В 08.12.2020 в 22:17, andrey231983 сказав:

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

По идее, достаточно будет в модулях тоталов (Учитывать в заказе) поставить доставку после итого.

 

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

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.