Перейти к содержанию
lavka

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

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

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

Поделиться сообщением


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

catalog/model/shipping/

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

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



]

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

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

Поделиться сообщением


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

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

Поделиться сообщением


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

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

 

Товар стоит 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') {

Поделиться сообщением


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

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

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