Jump to content
Sign in to follow this  
lavka

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

Recommended Posts

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

 

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

 

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

Share this post


Link to post
Share on other sites

catalog/model/shipping/

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

 

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



]

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

  • +1 1

Share this post


Link to post
Share on other sites

catalog/model/shipping/

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

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



]

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

 

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

catalog/model/shipping/

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

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



]

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Благодарю за тему - очень пригодилась. 

Share this post


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

Share this post


Link to post
Share on other sites

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

 

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

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

 

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

 

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

Share this post


Link to post
Share on other sites

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

		$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, которое потом и использую для расчета.

Share this post


Link to post
Share on other sites

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

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

 

Заменить

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

на

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.