Перейти к содержанию
Официальный форум поддержки Simpla

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

В файле simpla\design\html\orders.tpl добавляем в выпадающий список новое действие - Объединить:

<span id="select">
<select name="action">
	<option value="delete">Удалить</option>
	<option value="merge">Объединить</option>
</select>
</span>

Далее в файле simpla\OrdersAdmin.php находим выполнение действия удаления:

case 'delete':
{
   ....
}

и после него вставляем:

case 'merge':
{
    sort($ids); //сортируем массив отчекбошеных заказов по возрастанию, что бы первым был "первый" (более ранний) заказ
    $count_ids=0; //счетчик на нуль, начинаем отчет
    foreach($ids as $id) //перебираем сортированный массив заказов
    {
        if ($count_ids==0) //тут у нас должен быть первый заказ, который станет основным...
        {
            $main_id = $id; // ... берем его айди, этот заказ будет главным!
        }
        else
        {    //далее идут следующие заказы, получаем товары присоединяемого заказа
            $purchases = $this->orders->get_purchases(array('order_id'=>$id));
            foreach($purchases as $purchase) // разбираем их
            {    // ищем такой же товар в главном (основном) заказе, куда объединяются другие
                $query = $this->db->placehold("SELECT * FROM __purchases WHERE order_id=$main_id and product_id=".$purchase->product_id." and variant_id=".$purchase->variant_id." LIMIT 1");
                $this->db->query($query);
                $main_purchases = $this->db->result();    
                if(!empty($main_purchases))
                {    // если в главном заказе товар найден, то апдейтим у него кол-во на ту величину, что у присоединяемого заказа
                    $update_purchase = $this->db->placehold("UPDATE __purchases SET amount=amount+".$purchase->amount." WHERE order_id=$main_id and product_id=".$purchase->product_id." and variant_id=".$purchase->variant_id."");
                    $this->db->query($update_purchase);        
                    // после удаляем этот товар из присоединяемого заказа
                    $delete_purchase = $this->db->placehold("DELETE FROM __purchases WHERE order_id=$id and product_id=".$purchase->product_id." and variant_id=".$purchase->variant_id." LIMIT 1");
                    $this->db->query($delete_purchase);                                    
                }
                else
                {    // если в главном заказе не было товара из присоединяемого заказа, то мы товар переносим, сменив ему ID-заказа
                    $move_purchase = $this->db->placehold("UPDATE __purchases SET order_id=$main_id WHERE order_id=$id and product_id=".$purchase->product_id." and variant_id=".$purchase->variant_id."");
                    $this->db->query($move_purchase);
                }
            }
            $this->orders->delete_order($id); //после чего, удаляем присоединяемый заказ
        }

        $count_ids++; //увеличиваем счетчик
    }
    //после всех переносов товаров в основной заказ, нужно проапдейтить итоговую стоимость заказа
    $upd_order_price = $this->db->placehold("UPDATE __orders o SET o.total_price=IFNULL((SELECT SUM(p.price*p.amount)*(100-o.discount)/100 FROM __purchases p WHERE p.order_id=o.id), 0)+o.delivery_price*(1-o.separate_delivery)-o.coupon_discount, modified=NOW() WHERE o.id=$main_id LIMIT 1");
    $this->db->query($upd_order_price);                    
    break;
}

Это простое, но возможно кривое решение работает нормально :) Может кому пригодится...

 

Да, кстати... объединяя заказ №1, №2, №3 у вас останется тольк заказ №1, в него перенесутся все товары из заказов №2 и №3, после чего они удалятся. Информация о покупателе и другая инфа по заказам №2 и №3 так же удалится. Переносятся ТОЛЬКО товары из заказов!

Изменено пользователем Gloobus
Ссылка на сообщение
Поделиться на другие сайты

Есть ньюанс один в этом решении:

если в объединяемых заказах есть одинаковые позиции товаров - они не объединяются, в результате одинаковые позиции в итоговом заказе будут как разные. В свободное время попробую доработать. Комплектации заказа на складе по распечатанной накладной это не мешает.

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

Если вас не затруднит - может сразу реализуете и сортировку по наименованию товаров в заказе по умолчанию.

 

Это существенно облегчит задачу складским работникам. 

 

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

Ссылка на сообщение
Поделиться на другие сайты
  • 1 месяц спустя...

Gloobus

 

Вы не дорабатывали своё решение "объединение заказов" по поводу одинаковых позиций в заказах?

 

Чтобы одинаковый товар увеличивался в количестве штук, а не добавлялся ещё одной позицией.

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

Поправил шапку, дописал код :) Теперь при объединении нескольких заказов с одинаковыми товарами в них они не дублируются, а тоже объединяются :)

Раза три затестил, вроде все ОК

 

Кто хочет, погонять можно тут: http://simpla.gloobus.ru/simpla/

Логин: manager

Пароль: test

Ссылка на сообщение
Поделиться на другие сайты
  • 3 месяца спустя...

Доброго времени суток всем, спасибо больное Globus за проделанную работу.

Правда под мои цели пришлось поменять кое-что: заказы не удаляются а создается новый соответственно и товар остаётся в старых заказах.

 

Проверил, протестил все работает гуд кому надо берите)))

 

Далее в файле simpla\OrdersAdmin.php находим выполнение действия удаления:

case 'delete':
{
   ....
}

и после него вставляем:

 

case 'merge':
{	
	// Создаем пустой заказ и берем его id для дальнейшей работы с ним						
	$order_last = $this->orders->add_order($id);				
	$main_id = $order_last;
											
	rsort($ids); //сортируем массив отчекбошеных заказов по убыванию, что бы первым был "первый" (более ранний) заказ
	$count_ids=0; //счетчик на нуль, начинаем отчет
	foreach($ids as $id){ //перебираем сортированный массив заказов					{

//далее идут следующие заказы, получаем товары присоединяемого заказа
		$purchases = $this->orders->get_purchases(array('order_id'=>$id));
		foreach($purchases as $purchase) // разбираем их
		{    // ищем такой же товар в главном (основном) заказе, куда объединяются другие
			$query = $this->db->placehold("SELECT * FROM __purchases WHERE order_id=$main_id and product_id=".$purchase->product_id." and variant_id=".$purchase->variant_id." LIMIT 1");
			$this->db->query($query);
			$main_purchases = $this->db->result();    
				if(!empty($main_purchases))
					{    // если в главном заказе товар найден, то апдейтим у него кол-во на ту величину, что у присоединяемого заказа
						$update_purchase = $this->db->placehold("UPDATE __purchases SET amount=amount+".$purchase->amount." WHERE order_id=$main_id and product_id=".$purchase->product_id." and variant_id=".$purchase->variant_id."");
						$this->db->query($update_purchase);                                    
					}
				else
					{    // если в главном заказе не было товара из присоединяемого заказа, то мы товар добавляем, сменив ему ID-заказа
									
					$purchase->id = $this->orders->add_purchase(array('order_id'=>$main_id, 'product_id'=>$purchase->product_id, 'variant_id'=>$purchase->variant_id, 'product_name'=>$purchase->product_name, 'variant_name'=>$purchase->variant_name, 'variant_color'=>$purchase->variant_color, 'price'=>$purchase->price, 'amount'=>$purchase->amount, 'sku'=>$purchase->sku));
						
					$posted_purchases_ids[] = $purchase->id;
									
					}
			}					
				
			$count_ids++; //увеличиваем счетчик
		}
		//после всех переносов товаров в основной заказ, нужно проапдейтить итоговую стоимость заказа
		$upd_order_price = $this->db->placehold("UPDATE __orders o SET o.total_price=IFNULL((SELECT SUM(p.price*p.amount)*(100-o.discount)/100 FROM __purchases p WHERE p.order_id=o.id), 0)+o.delivery_price*(1-o.separate_delivery)-o.coupon_discount, modified=NOW() WHERE o.id=$main_id LIMIT 1");
		$this->db->query($upd_order_price);                    
		break;
}

 

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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...