Добрый день! Заказчик попросил накопительную систему скидок, с автоматическим изменением % скидки если сумма по доставленным заказам у клиента перешла очередной порог. Почитал темы на форуме и в инете, но законченного бесплатного варианта как-то не встретил, тогда решил допилить тот вариант ,что рассматривался здесь
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()); }
}
Ну вроде все! Если у данного решения имеются известные минусы просьба отписать. Спасибо.