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

Разделенный заказ в корзине


Recommended Posts

Всем привет! Как думаете, как можно реализовать такую идею,

Например в корзине лежат товары трех производителей, при оформлении заказа выходит один заказ №120, а мне нужно чтобы было три разных заказа №121, №122, №123.То есть заказ разделился бы.

У меня пал глаз на реализацию в model/checkout/order.php То есть добавила в insert  "manufacture_id = '".(int)$product['manufacture_id']."'," и переместила запрос в foreach

<?php
class ModelCheckoutOrder extends Model {
	public function addOrder($data) {
		// Products
		if (isset($data['products'])) {
			foreach ($data['products'] as $product) {
                /*мои доработки*/
                $this->db->query("INSERT INTO `" . DB_PREFIX . "order` SET invoice_prefix = '" . $this->db->escape($data['invoice_prefix']) . "', store_id = '" . (int)$data['store_id'] . "', manufacture_id = '".(int)$product['manufacture_id']."', store_name = '" . $this->db->escape($data['store_name']) . "', store_url = '" . $this->db->escape($data['store_url']) . "', customer_id = '" . (int)$data['customer_id'] . "', customer_group_id = '" . (int)$data['customer_group_id'] . "', firstname = '" . $this->db->escape($data['firstname']) . "', lastname = '" . $this->db->escape($data['lastname']) . "', email = '" . $this->db->escape($data['email']) . "', telephone = '" . $this->db->escape($data['telephone']) . "', custom_field = '" . $this->db->escape(isset($data['custom_field']) ? json_encode($data['custom_field']) : '') . "', payment_firstname = '" . $this->db->escape($data['payment_firstname']) . "', payment_lastname = '" . $this->db->escape($data['payment_lastname']) . "', payment_company = '" . $this->db->escape($data['payment_company']) . "', payment_address_1 = '" . $this->db->escape($data['payment_address_1']) . "', payment_address_2 = '" . $this->db->escape($data['payment_address_2']) . "', payment_city = '" . $this->db->escape($data['payment_city']) . "', payment_postcode = '" . $this->db->escape($data['payment_postcode']) . "', payment_country = '" . $this->db->escape($data['payment_country']) . "', payment_country_id = '" . (int)$data['payment_country_id'] . "', payment_zone = '" . $this->db->escape($data['payment_zone']) . "', payment_zone_id = '" . (int)$data['payment_zone_id'] . "', payment_address_format = '" . $this->db->escape($data['payment_address_format']) . "', payment_custom_field = '" . $this->db->escape(isset($data['payment_custom_field']) ? json_encode($data['payment_custom_field']) : '') . "', payment_method = '" . $this->db->escape($data['payment_method']) . "', payment_code = '" . $this->db->escape($data['payment_code']) . "', shipping_firstname = '" . $this->db->escape($data['shipping_firstname']) . "', shipping_lastname = '" . $this->db->escape($data['shipping_lastname']) . "', shipping_company = '" . $this->db->escape($data['shipping_company']) . "', shipping_address_1 = '" . $this->db->escape($data['shipping_address_1']) . "', shipping_address_2 = '" . $this->db->escape($data['shipping_address_2']) . "', shipping_city = '" . $this->db->escape($data['shipping_city']) . "', shipping_postcode = '" . $this->db->escape($data['shipping_postcode']) . "', shipping_country = '" . $this->db->escape($data['shipping_country']) . "', shipping_country_id = '" . (int)$data['shipping_country_id'] . "', shipping_zone = '" . $this->db->escape($data['shipping_zone']) . "', shipping_zone_id = '" . (int)$data['shipping_zone_id'] . "', shipping_address_format = '" . $this->db->escape($data['shipping_address_format']) . "', shipping_custom_field = '" . $this->db->escape(isset($data['shipping_custom_field']) ? json_encode($data['shipping_custom_field']) : '') . "', shipping_method = '" . $this->db->escape($data['shipping_method']) . "', shipping_code = '" . $this->db->escape($data['shipping_code']) . "', comment = '" . $this->db->escape($data['comment']) . "', total = '" . (float)$data['total'] . "', affiliate_id = '" . (int)$data['affiliate_id'] . "', commission = '" . (float)$data['commission'] . "', marketing_id = '" . (int)$data['marketing_id'] . "', tracking = '" . $this->db->escape($data['tracking']) . "', language_id = '" . (int)$data['language_id'] . "', currency_id = '" . (int)$data['currency_id'] . "', currency_code = '" . $this->db->escape($data['currency_code']) . "', currency_value = '" . (float)$data['currency_value'] . "', ip = '" . $this->db->escape($data['ip']) . "', forwarded_ip = '" .  $this->db->escape($data['forwarded_ip']) . "', user_agent = '" . $this->db->escape($data['user_agent']) . "', accept_language = '" . $this->db->escape($data['accept_language']) . "', date_added = NOW(), date_modified = NOW()");
                /*end*/
                $order_id = $this->db->getLastId();
				$this->db->query("INSERT INTO " . DB_PREFIX . "order_product SET order_id = '" . (int)$order_id . "', product_id = '" . (int)$product['product_id'] . "', name = '" . $this->db->escape($product['name']) . "', model = '" . $this->db->escape($product['model']) . "', quantity = '" . (int)$product['quantity'] . "', price = '" . (float)$product['price'] . "', total = '" . (float)$product['total'] . "', tax = '" . (float)$product['tax'] . "', reward = '" . (int)$product['reward'] . "'");
				$order_product_id = $this->db->getLastId();

				foreach ($product['option'] as $option) {
					$this->db->query("INSERT INTO " . DB_PREFIX . "order_option SET order_id = '" . (int)$order_id . "', order_product_id = '" . (int)$order_product_id . "', product_option_id = '" . (int)$option['product_option_id'] . "', product_option_value_id = '" . (int)$option['product_option_value_id'] . "', name = '" . $this->db->escape($option['name']) . "', `value` = '" . $this->db->escape($option['value']) . "', `type` = '" . $this->db->escape($option['type']) . "'");
				}

			}
		}

		// Gift Voucher
		$this->load->model('extension/total/voucher');

Либо что-то в контроллере делать controller/checkout/simplechekout.php

  private function order() {
// ....
    $this->load->model('checkout/order');

        $order_id = 0;

        $customInfo = $this->simplecheckout->getCustomFields(array('customer', 'payment_address', 'payment', 'shipping_address', 'shipping'), 'order');

        $data = array_merge($customInfo, $data);


        if ($version < 152) {
            $order_id = $this->model_checkout_order->create($data);

            // Gift Voucher
            if (isset($this->session->data['vouchers']) && is_array($this->session->data['vouchers'])) {
                $this->load->model('checkout/voucher');

                foreach ($this->session->data['vouchers'] as $voucher) {
                    $this->model_checkout_voucher->addVoucher($order_id, $voucher);
                }
            }
        } elseif ($version >= 152) {
            $order_id = $this->model_checkout_order->addOrder($data);
        }

        $this->session->data['order_id'] = $order_id;

        $this->simplecheckout->saveCustomFields(array('customer', 'payment_address', 'payment', 'shipping_address', 'shipping'), 'order', $order_id);

        $simple_cart_id = !empty($this->session->data['simple_cart_id']) ? $this->session->data['simple_cart_id'] : 0;

        if ($simple_cart_id) {
            $this->load->model('tool/simpleapi');
            $this->model_tool_simpleapi->deleteAbandonedCart($simple_cart_id);
        }

        return $order_id;

    }

В $order_id = $this->model_checkout_order->addOrder($data); здесь как раз вызывается метод, и я думаю может быть здесь можно разделить заказы по производителям.

На этом все мои догадки кончились. Буду благодарна услышать подсказку.

OpenCart 3.0.2

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


Да, это реально сделать и даже я делал такое, но много нюансов есть.

Как минимум это методы оплаты, их нужно потом научить менять статусы заказы не только последнему, но и всем остальным.

Если это метод оплаты связан с эквайрингом тут все сложнее + надо не забывать что может быть применен купон/скидка и т.д. т.е. разные методы что меняют итоговую стоимость заказа.

 

 

По симпле так же не забывайте про существование clearOrder() именно симплы метода, иначе много левака в базе будет при разбивке. 

 

UPD:

12 минут назад, AnnaBez сказал:

В $order_id = $this->model_checkout_order->addOrder($data); здесь как раз вызывается метод, и я думаю может быть здесь можно разделить заказы по производителям.

В своей реализации делал разделение до вызова функции.

Вернее она вызывалось столько раз сколько было "продавцов" собирался массив данных по товару и там шел перерасчет итого заказа и потом в базу добавлялись заказы

  

 

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

4 минуты назад, Bn174uk сказал:

Да, это реально сделать и даже я делал такое, но много нюансов есть.

Как минимум это методы оплаты, их нужно потом научить менять статусы заказы не только последнему, но и всем остальным.

Если это метод оплаты связан с эквайрингом тут все сложнее + надо не забывать что может быть применен купон/скидка и т.д. т.е. разные методы что меняют итоговую стоимость заказа.

 

 

По симпле так же не забывайте про существование clearOrder() именно симплы метода, иначе много левака в базе будет при разбивке. 

А если оплата только по счету для юр.лиц будет? То есть выставлен общий счет, покупатель оплачивает и 1С по всем заказам меняет статус "оплачено". Нюанс не отпадает?

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


4 минуты назад, AnnaBez сказал:

А если оплата только по счету для юр.лиц будет? То есть выставлен общий счет, покупатель оплачивает и 1С по всем заказам меняет статус "оплачено". Нюанс не отпадает?

Заказы в системе создаются без статуса, чтобы заказ хоть появился в системе + клиенту и Вам ушло уведомление нужно ему проставить первый статус.

Тут больше вопрос как вы решите это, можно конечно сразу заказа лепить какой-то статус и все.

 

В общем, все можно сделать, просили подсказку я ее дал.

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

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

17 минут назад, AnnaBez сказал:

А если оплата только по счету для юр.лиц будет? То есть выставлен общий счет, покупатель оплачивает и 1С по всем заказам меняет статус "оплачено". Нюанс не отпадает?

Может проще разделять заказы уже при передаче информации на сторону 1С?

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

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

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

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

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

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

Вхід

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

Вхід зараз

×
×
  • Створити...

Important Information

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