Новости Joomla

0 Пользователей и 1 Гость просматривают эту тему.
  • 2 Ответов
  • 3085 Просмотров
*

hudoy

  • Захожу иногда
  • 136
  • 5 / 0
Добрый день! Заказчик попросил накопительную систему скидок, с автоматическим изменением % скидки если сумма по доставленным заказам у клиента перешла очередной порог. Почитал темы на форуме и в инете, но законченного бесплатного варианта как-то не встретил, тогда решил допилить тот вариант ,что рассматривался здесь http://www.redsimple.ru/blog/63-skidka , на основе групп пользователей. Суть в том, что пользователь перемещается в другую группу, не при оформлении очередного заказа , а только когда в админке меняется статус заказа на Shipped(Доставлен) и общая сумма заказов с таким-же статусом переваливает за очередной порог.
Что нужно сделать:
1. Создать группы пользователей и запомнить их ID (можно увидеть ID в URL когда вы находитесь в редактировании этой группы (что-то типа &shopper_group_id=9), или через phpmyadmin)
для каждой группы проставляем % скидки
2. Редактируем файл /administrator/components/com_virtuemart/classes/ps_order.php
Находим кусок кода:
Код
if( ($curr_order_status=="P" || $curr_order_status=="C") && $d["order_status"]=="S") {
$q = "SELECT order_number,payment_class,order_payment_trans_id FROM #__{vm}_payment_method,#__{vm}_order_payment,#__{vm}_orders WHERE ";
$q .= "#__{vm}_order_payment.order_id='".$db->getEscaped($d['order_id'])."' ";
$q .= "AND #__{vm}_orders.order_id='".$db->getEscaped($d['order_id'])."' ";
$q .= "AND #__{vm}_order_payment.payment_method_id=#__{vm}_payment_method.payment_method_id";
$db->query( $q );
$db->next_record();
$payment_class = $db->f("payment_class");
if( $payment_class=="payflow_pro" ) {
require_once( CLASSPATH."payment/payflow_pro.cfg.php");
if( PFP_TYPE == 'A' ) {
require_once( CLASSPATH."payment/payflow_pro.php");
$pfp = new ps_pfp();
$d["order_number"] = $db->f("order_number");
if( !$pfp->capture_payment( $d )) {
return false;
}
}
}
}

Прежде чем продолжить нужно понимать ,что представляет из себя этот код:
Его суть в том , что если происходит смена статуса заказа из P(pending(ожидание)) или C(Confirmed(обработан)) на S(Shipped(Доставлен)), то выполняются некоторые действия. Соответственно мы добавим к тем действиям которые выполняются по умолчанию, те которые нужны нам для расчета скидки. А именно перед последней } вставим следующий код
Код
//Определяем user_id и сумму текущего заказа по текущему order_id  
$dbu = new ps_DB;
$q = "SELECT user_id,order_total FROM #__{vm}_orders WHERE ";
$q .= "#__{vm}_orders.order_id='".$db->getEscaped($d['order_id'])."' ";
$dbu->query($q);
$dbu->next_record();
//заносим то что определили в соответствующие переменные
$userid = $dbu->f("user_id");
$sumzakaz = $dbu->f("order_total");
//Определяем сумму заказов со статусом S у текущего пользователя
$database = & JFactory::getDBO();
$query = "SELECT sum(order_total) FROM jos_vm_orders WHERE ";
$query .= "jos_vm_orders.user_id='".$userid."' ";
$query .= "AND jos_vm_orders.order_status='S' ";
$database->setQuery($query);
$summa = $database->loadResult();
//Прибавляем сумму текущего заказа к тем что уже есть
$summa = $summa+$sumzakaz;

//далее идет перенос пользователя в соответствующую группу, в данном случае 8 если сумма заказов от 100 до 5000 рублей
if ($summa>=100 && $summa<5001) {
$query = "UPDATE #__vm_shopper_vendor_xref SET shopper_group_id=8 WHERE user_id=".$userid;
$database->setQuery($query);
//вывод уведомления для администратора
echo  "<strong>Сумма заказов ($summa). Предоставляется постаянная скидка в размере 3%.</strong>";
//описание ошибки запроса если она произошла
if (!$database->query()) { JError::raiseError( 500, $database->stderr()); }
}

//проверка на следующий порог скидки и таких проверок столько сколько нужно порогов скидки
if ($summa>=5001 && $summa<9001) {
$query = "UPDATE #__vm_shopper_vendor_xref SET shopper_group_id=9 WHERE user_id=".$userid;
$database->setQuery($query);

echo  "<strong>Сумма заказов ($summa). Предоставляется постаянная скидка в размере 4%.</strong>";

if (!$database->query()) { JError::raiseError( 500, $database->stderr()); }
}
Ну вроде все! Если у данного решения имеются известные минусы просьба отписать. Спасибо.
*

msv1975

  • Новичок
  • 1
  • 0 / 0
Подскажите, пжста, а как задать условие проверки текущей группы покупателя. У меня есть покупатели уже с высокой скидкой и меньшей суммой покупок. Не хотелось бы чтобы при следующем заказе их перенесли в группу с более низким % скидки. Заранее спасибо.
*

hudoy

  • Захожу иногда
  • 136
  • 5 / 0
Нужно для начала правильно завести группы пользователей, т.е. с повышением скидки группа бы тоже повышалась , а не в разнобой. Далее в следующем моменте "//Определяем user_id и сумму текущего заказа по текущему order_id" добавить :
Код
$dbj = new ps_DB;
$q2 = "SELECT shopper_group_id FROM #__vm_shopper_vendor_xref  WHERE user_id=".$userid;
$dbj->query($q2);
$dbj->next_record();
$usergroup = $dbj->f("shopper_group_id");
и далее в проверках добавлять  $usergroup<какой-то вашей группы
Код
//проверка на следующий порог скидки и таких проверок столько сколько нужно порогов скидки 
if ($summa>=5001 && $summa<9001 && $usergroup<какой-то ) {
$query = "UPDATE #__vm_shopper_vendor_xref SET shopper_group_id=9 WHERE user_id=".$userid;
$database->setQuery($query);

echo  "<strong>Сумма заказов ($summa). Предоставляется постаянная скидка в размере 4%.</strong>";

if (!$database->query()) { JError::raiseError( 500, $database->stderr()); }
}
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Запретить суммирование скидок в VirtueMart.

Автор orsy

Ответов: 0
Просмотров: 2070
Последний ответ 27.02.2012, 15:18:00
от orsy
Отключить суммирование скидок

Автор TyT

Ответов: 1
Просмотров: 1115
Последний ответ 25.06.2011, 20:57:55
от Mr. Brightside
Система управления товарами off-line

Автор riamax

Ответов: 9
Просмотров: 3376
Последний ответ 12.01.2011, 15:25:35
от Aleks_El_Dia
Накопительная система скидок.

Автор Даша

Ответов: 13
Просмотров: 6730
Последний ответ 25.03.2010, 08:28:58
от a3market