Перейти к содержимому


Передача заказа другому покупателю

заказ перемещение

  • Вы не можете ответить в тему
Сообщений в теме: 28

#1 Juggler

    Новичок

  • Download User
  • Pip
  • 4 сообщений
Репутация: 6
Начинающий

Отправлено 01 October 2012 - 01:37 PM

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


function ordMoveOrder($orderID, $toCustomerID){
$q = db_query("select customerID from ".ORDERS_TABLE." where orderID=".(int)$orderID);
if($row = db_fetch_row($q) && ($row[0] <> (int)$toCustomerID)){ // if exists order with this ID and it's not the same as dest customerID
$q1 = db_query("select c.first_name, c.last_name, c.email, ca.city, ca.address, cn.country_name, zn.zone_name from ".CUSTOMERS_TABLE." c ".
"join ".CUSTOMER_ADDRESSES_TABLE." ca on ca.customerID=c.customerID and ca.addressID=c.addressID ".
"join ".COUNTRIES_TABLE." cn on cn.countryID=ca.countryID ".
"join ".ZONES_TABLE." zn on zn.zoneID=ca.zoneID ".
"where c.customerID=".(int)$toCustomerID
);
// get data about current customer
if($row1 = db_fetch_row($q1)){
db_query("update ".ORDERS_TABLE." set ".
"customerID=".(int)$toCustomerID.", ".
"customer_firstname='".$row1[0]."', ".
"customer_lastname='".$row1[1]."', ".
"customer_email='".$row1[2]."', ".
"shipping_firstname='".$row1[0]."', ".
"shipping_lastname='".$row1[1]."', ".
"shipping_country='".$row1[5]."', ".
"shipping_state='".$row1[6]."', ".
"shipping_city='".$row1[3]."', ".
"shipping_address='".$row1[4]."', ".
"billing_firstname='".$row1[0]."', ".
"billing_lastname='".$row1[1]."', ".
"billing_country='".$row1[5]."', ".
"billing_state='".$row1[6]."', ".
"billing_city='".$row1[3]."', ".
"billing_address='".$row1[4]."' ".
"where orderID=".(int)$orderID
);
}
}
}

  • 2

#2 makki

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 148 сообщений
Репутация: 7
Начинающий

Отправлено 12 October 2012 - 02:49 PM

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

Предлагаю готовое решение с использованием данной функции.
Проверено на ShopCMS 3.1.2.

1) Открываем файл core/functions/order_functions.php и добавляем в конце перед строкой
?>
новую функцию:
// *****************************************************************************
// Purpose	  move order to customer
// Inputs
// Remarks	vsupport.club (by Juggler)
// Returns
function ordMoveOrder($orderID, $toCustomerID)
{
		$q = db_query("select customerID FROM ".ORDERS_TABLE." WHERE orderID=".(int)$orderID);
  // if exists order with this ID and it's not the same as dest customerID	  
  if($row = db_fetch_row($q) && ($row[0] <> (int)$toCustomerID))
  {
				$q1 = db_query("select c.first_name, c.last_name, c.Email, ca.city, ca.address, cn.country_name, zn.zone_name from ".CUSTOMERS_TABLE." AS c
				INNER JOIN ".CUSTOMER_ADDRESSES_TABLE." AS ca on (ca.customerID=c.customerID AND ca.addressID=c.addressID)
				INNER JOIN ".COUNTRIES_TABLE." AS cn on (cn.countryID=ca.countryID)
				INNER JOIN ".ZONES_TABLE." zn on zn.zoneID=ca.zoneID
				WHERE c.customerID=".(int)$toCustomerID);
				// get data about current customer  
				if($row1 = db_fetch_row($q1))
				{
						db_query("update ".ORDERS_TABLE." set ".
								"customerID=".(int)$toCustomerID.", ".
								"customer_firstname='".$row1[0]."', ".
								"customer_lastname='".$row1[1]."', ".
								"customer_email='".$row1[2]."', ".
								"shipping_firstname='".$row1[0]."', ".
								"shipping_lastname='".$row1[1]."', ".
								"shipping_country='".$row1[5]."', ".
								"shipping_state='".$row1[6]."', ".
								"shipping_city='".$row1[3]."', ".
								"shipping_address='".$row1[4]."', ".
								"billing_firstname='".$row1[0]."', ".
								"billing_lastname='".$row1[1]."', ".
								"billing_country='".$row1[5]."', ".
								"billing_state='".$row1[6]."', ".
								"billing_city='".$row1[3]."', ".
								"billing_address='".$row1[4]."' ".
								"WHERE orderID=".(int)$orderID);
				}
				return 1;								
		}
return 0;
}

2) Открываем файл core/includes/admin/sub/custord_custlist.php и находим строку:
$navigatorHtml = GetNavigatorHtml( _getUrlToNavigate_ORDER_HISTORY(), 20,'ordGetOrders', $callBackParam, $orders, $offset, $count );

После нее вставляем следующий код:
if (isset($_POST["move_order"]))
{
	   $move_result = ordMoveOrder($_POST["move_order"], $_GET["customerID"]);
	   if ((int)$move_result == 1)
	   {
			   Redirect(ADMIN_FILE."?dpt=custord&sub=custlist&customer_details=contact_info&customerID=
			   ".$_GET["customerID"]."&encodedReturnUrl=".$_GET["encodedReturnUrl"]."" );
		}
		else {$smarty->assign( "move_result", "Заказ не найден!" );}
}

3) В файле core/tpl/admin/admin_order_history.tpl.html в конце кода добавляем следующее:

<form action="{$smarty.const.ADMIN_FILE}" method=post>
<table class="adn"><tr><td class="se6"></td></tr></table>
<table class="adn">
<tr class="lineb">
<td align="left">Переместить заказ от другого покупателя</td>
</tr>
<tr class="lins">
<td>Номер заказа: <input type="text" name="move_order" class="textp" size="15">{if $move_result}&nbsp;&nbsp;&nbsp;{$move_result}{/if}</td>
</tr>
</table>
<table class="adn"><tr><td class="separ"><img src="data/admin/pixel.gif" alt="" class="sep"></td></tr><tr><td class="se5"></td></tr></table>
<input type="submit"/>
<table class="adn"><tr><td class="se6"></td></tr></table>
</form>

Готово!

Прикрепленные файлы

  • Прикрепленный файл  move_order.jpg   82.94К   54 Количество загрузок:

  • 1

#3 makki

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 148 сообщений
Репутация: 7
Начинающий

Отправлено 16 October 2012 - 10:08 PM

UPDATE. Для того, чтобы была возможность перемещать заказы в пустой аккаунт (без заказов), нужно в файле core/tpl/admin/custord_custlist.tpl.html вместо

{if $customer_details == 'order_history'}
{if $orders}
  <form action='{$urlToSubmit}' method=POST>
   {include file='admin/admin_order_history.tpl.html'}
  </form>
{else}
&lt; {$smarty.const.ADMIN_NO_RECORD_FOUND} &gt;
{/if}
{/if}

Добавить следующий код

{if $customer_details == 'order_history'}
{if $orders}
  <form action='{$urlToSubmit}' method=POST>
   {include file='admin/admin_order_history.tpl.html'}
  </form>
{else}
&lt; {$smarty.const.ADMIN_NO_RECORD_FOUND} &gt;
<form action='{$urlToSubmit}' method=POST>
  <table class="adn"><tr><td class="se6"></td></tr></table>
   <table class="adn">
    <tr class="lineb"><td align="left">Переместить заказ от другого покупателя</td></tr>
    <tr class="lins"><td>Номер заказа: <input type="text" name="move_order" class="textp" size="15">
    {if $move_result}&nbsp;&nbsp;&nbsp;{$move_result}{/if}</td></tr>
   </table>
  <table class="adn">
   <tr><td class="separ"><img src="data/admin/pixel.gif" alt="" class="sep"></td></tr>
   <tr><td class="se5"></td></tr>
  </table>
  <input type="submit"/>
  <table class="adn"><tr><td class="se6"></td></tr></table>
</form>
{/if}
{/if}

  • 0

#4 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 17 October 2012 - 10:28 AM

Удобнее таки не номер вводить для "забираемого" чужого заказа, а выпадающий список "Номер заказа/логин клиента" с сортировкой по логину.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#5 makki

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 148 сообщений
Репутация: 7
Начинающий

Отправлено 17 October 2012 - 11:02 AM

Удобнее таки не номер вводить для "забираемого" чужого заказа, а выпадающий список "Номер заказа/логин клиента" с сортировкой по логину.


Согласен. Это усложняет задачу в плане программирования. Буду рад если поможете это сделать.
  • 0

#6 meta-s

    Продвинутый пользователь

  • Download User
  • PipPipPip
  • 33 сообщений
Репутация: 2
Начинающий

Отправлено 18 October 2012 - 11:03 AM

Вопрос, можно доработать это дело? Сделать подобную кнопку, скажем в карточке с заказом?
Чтобы можно было в данный заказ добавить все позиции из другого? Или может кто-нибудь уже писал инспектирующий скрипт для поиска дублирующихся записей по ФИО, e-mail или контактным телефонам? Ну и само собой чтобы можно было все записи объединить в одну, а клиенту выслать уведомление на e-mail к примеру?
  • 0

#7 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 18 October 2012 - 01:45 PM

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

Вопрос, можно доработать это дело?

Если уж дорабатывать, то сторонний модуль администрирования заказов. Там изначально фишек больше.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#8 makki

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 148 сообщений
Репутация: 7
Начинающий

Отправлено 18 October 2012 - 02:11 PM

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

Нет, только администратор. Все операции производятся в админ панели. Но не только под себя. Любой заказ под любой аккаунт.

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

Что касается именно данной задачи (перемещения заказов), не вижу необходимости в стороннем модуле.
Есть идея сделать перемещение заказа по-другому. Так, как это реализовано в shop-script. В режиме администрирования, в открытом заказе добавляем кнопку (Передать заказ). При нажатии появляется строка одновременного поиска покупателя по имени, фамилии и e-mail в модальном окне, с выпадающим списком результатов "живого" поиска. Как по мне это идеал.
  • 0

#9 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 18 October 2012 - 02:44 PM

Нет, только администратор. Все операции производятся в админ панели.

А! Дошло! Это не из личного кабинета делается, а из админки "Списки/Покупатели".
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#10 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 18 October 2012 - 07:11 PM

Согласен. Это усложняет задачу в плане программирования. Буду рад если поможете это сделать.


{if $customer_details == 'order_history'}
{if $orders}
<form action='{$urlToSubmit}' method=POST>
{include file='admin/admin_order_history.tpl.html'}
</form>
{else}
&lt; {$smarty.const.ADMIN_NO_RECORD_FOUND} &gt;
{/if}
{*-----BEGIN OrderMove------------------*}
{php}
$data = mysql_query("
SELECT orderID, IFNULL(login,'Unregistered') AS login, IFNULL(first_name,customer_firstname) AS first, IFNULL(last_name,customer_lastname) AS last
FROM ".ORDERS_TABLE."
LEFT JOIN ".CUSTOMERS_TABLE." USING (customerID)
ORDER BY customerID,orderID");
while ($row = mysql_fetch_assoc($data)) $r[] = $row;
$this->assign("orders_list", $r);
{/php}
<form action='{$urlToSubmit}' method=POST>
<table class="adn"><tr><td class="se6"></td></tr></table>
<table class="adn">
<tr class="lineb"><td align="left">Переместить заказ от другого покупателя</td></tr>
<tr class="lins"><td>Номер заказа:
<select name="move_order">
<option value='0'>Select Order</option>
{section name=i loop=$orders_list}
<option value='{$orders_list[i].orderID}'>#{$orders_list[i].orderID} {$orders_list[i].login} ({$orders_list[i].first} {$orders_list[i].last})</option>
{/section}
</select>
{if $move_result}&nbsp;&nbsp;&nbsp;{$move_result}{/if}</td></tr>
</table>
<table class="adn">
<tr><td class="separ"><img src="data/admin/pixel.gif" alt="" class="sep"></td></tr>
<tr><td class="se5"></td></tr>
</table>
<input type="submit"/>
<table class="adn"><tr><td class="se6"></td></tr></table>
</form>
{*-----END OrderMove---------------------*}
{/if}


Ну и в редиректе (в custord_custlist.php) логично бы заменить
&customer_details=contact_info
на
&customer_details=order_history
ведь куда удобнее после перемещения заказа остаться на странице со списком заказов.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#11 makki

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 148 сообщений
Репутация: 7
Начинающий

Отправлено 18 October 2012 - 07:29 PM

badisoft, Спасибо. Попробовал. Не очень удобно, когда 2 тысячи заказов.
  • 0

#12 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 18 October 2012 - 07:59 PM

Не очень удобно, когда 2 тысячи заказов.

Итить... А я для кого SELECT прямо в шаблон вставил - редактируй-не-хочу? Понятно, что при большом количестве заказов как-то надо делать выборку. Например, по дате (за последнюю неделю, месяц, день) или еще как-то сужать выборку. Рыба есть, вот каждый сам себе и делает. Думаю, не особо сложно исхитрить (изврат, конечно) и ввод номера в том же селекте (т.е. не только выбирать из выпадающего списка, но и просто ввести номер, как было изначально).

PS. И таки да, когда Вы просили "можете помочь?" - не догадывались, что у Вас на сайте 2тыс ордеров?
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#13 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 19 October 2012 - 06:44 PM

Кстати, я тут задумался - а ведь совершенно никаких проблем сделать на ajax двухступенчатую выборку забираемого заказа. Сначала выбираем селектом пользователя, у которого хотим забрать заказ, а затем вторым селектом заказ из списка заказов этого пользователя.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#14 makki

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 148 сообщений
Репутация: 7
Начинающий

Отправлено 19 October 2012 - 08:58 PM

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


Чесно говоря тема с селектами мне не очень нравится. Логичнее делать передачу заказа не в карточке покупателя, а в редактировании заказа. И там в модальном окне делать "живой поиск" по логину, имени, e-mail. Так сделано в WebAsyst Shop-Script. Очень удобно. Посмотрите скриншот.

Прикрепленные файлы

  • Прикрепленный файл  Move_order.jpg   59.05К   41 Количество загрузок:

  • 0

#15 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 19 October 2012 - 09:06 PM

Логичнее делать передачу заказа не в карточке покупателя, а в редактировании заказа.

А где в ShopCMS штатное редактирование заказа?
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#16 makki

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 148 сообщений
Репутация: 7
Начинающий

Отправлено 19 October 2012 - 09:39 PM

А где в ShopCMS штатное редактирование заказа?


Я имел ввиду Справочник заказов / открытый заказ.
www.yourshop.com/admin.php?dpt=custord&sub=new_orders&orders_detailed=yes&orderID=

В штатном варианте, там нет редактирования, но у меня есть :)
  • 0

#17 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 19 October 2012 - 10:12 PM

В штатном варианте, там нет редактирования, но у меня есть

Это я тихой сапой подвожу под мысль, что штатно в ShopCMS ничего нет, а если уж редактировать, то сторонний модуль. Хотя, конечно, зависит от масштабов редактирования.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#18 makki

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 148 сообщений
Репутация: 7
Начинающий

Отправлено 20 October 2012 - 12:46 AM

Сделал Передачу заказа другому покупателю в Карточке заказа с использованием этой же функции. ID покупателя пока указывается вручную. Но хотелось бы его извлекать из результата поиска по фамилии имени e-mail в модальном окне как в скриншоте выше. badisoft, может поможете довести дело до конца? Я не работал с ajax окнами.

Прикрепленные файлы

  • Прикрепленный файл  Pass_Order.jpg   37.28К   20 Количество загрузок:

  • 0

#19 makki

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 148 сообщений
Репутация: 7
Начинающий

Отправлено 20 October 2012 - 01:22 PM

Чтобы не связываться с модальными окнами можно сделать поиск клиента наподобии выложенного здесь Живого поиска
  • 0

#20 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 20 October 2012 - 02:05 PM

может поможете довести дело до конца? Я не работал с ajax окнами.

AJAX - не окна :). И он в данном случае не нужен, т.к. нет последовательно выбираемых селектов, где содержимое следующего зависит от выбора в предыдущем. Все делается абсолютно аналогично тому, как я сделал "забирание" ордера селектом, только выборку надо делать не по таблице ордеров, связанной с таблицей клиентов, а просто по таблице клиентов.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)