Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...

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


lavka
 Поделиться

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

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

catalog/model/shipping/

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

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



]

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

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

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


  • 2 недели спустя...

Короче, продолжение. Оказывается, функция $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 месяца спустя...

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

 

Товар стоит 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 лет спустя...

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

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

 

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

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

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


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

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

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

 

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

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

а такое?

 

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


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

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


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

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

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

 

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

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


Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
 Поделиться

  • Сейчас на странице   0 пользователей

    • Нет пользователей, просматривающих эту страницу.
×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.