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


Простая накопительная скидка

накопительная скидка

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

#1 Juggler

    Новичок

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

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

По аналогии с существующим модулем "Накопительная скидка", только проще. Добавляем новые типы скидок к существующим, в которых используется еще один параметр - общая сумма заказов покупателя.

Вносим изменения в файлы (пути даю по версии ShopCMS 3.0.1 и 3.1.2 VIP):

Добавляем в languages/russian.php (3.0.1) или core/languages/russian.php (3.1.2)

define('ADMIN_DISCOUNT_GENERAL_ORDER_PRICE_TOTAL_ORDERS', 'Скидка вычисляется исходя из общей стоимости всех заказов пользователя');
define('ADMIN_DISCOUNT_CUSTOMER_GROUP_PLUS_GENERAL_ORDER_PRICE_TOTAL_ORDERS', 'Скидка вычисляется как сумма скидки группы пользователя и скидки от суммы всех его заказов');
define('ADMIN_DISCOUNT_MAX_CUSTOMER_GROUP_TOTAL_ORDERS', 'Скидка вычисляется как максимальная из скидки группы пользователя и скидки от суммы всех его заказов');
define('ADMIN_DISCOUNT_MAX_CUSTOMER_GROUP_GENERAL_ORDER_PRICE_TOTAL_ORDERS', 'Скидка вычисляется как максимальная из скидки группы пользователя, скидки от суммы заказа и общей суммы всех заказов пользователя');


Заменяем существующую функцию в functions/setting_functions.php (3.0.1) или core/functions/setting_functions.php (3.1.2)

function settingCONF_DISCOUNT_TYPE()
{
if ( isset($_POST["save"]) )
_setSettingOptionValue( "CONF_DISCOUNT_TYPE", $_POST["settingCONF_DISCOUNT_TYPE"] );
$value = _getSettingOptionValue("CONF_DISCOUNT_TYPE");
$value_go = _getSettingOptionValue("CONF_USER_SYSTEM");
if ($value_go == 1){
$res = "";
$res .= "<table class=and>";
$res .= _CONF_DISCOUNT_TYPE_radio_button( "1", ADMIN_DISCOUNT_IS_SWITCHED_OFF, $value=="1"?1:0, 0 );
$res .= _CONF_DISCOUNT_TYPE_radio_button( "2", ADMIN_DISCOUNT_CUSTOMER_GROUP, $value=="2"?1:0, 1 );
$res .= _CONF_DISCOUNT_TYPE_radio_button( "3", ADMIN_DISCOUNT_GENERAL_ORDER_PRICE, $value=="3"?1:0, 0 );
$res .= _CONF_DISCOUNT_TYPE_radio_button( "7", ADMIN_DISCOUNT_GENERAL_ORDER_PRICE_TOTAL_ORDERS, $value=="7"?1:0, 0 );
$res .= _CONF_DISCOUNT_TYPE_radio_button( "4", ADMIN_DISCOUNT_CUSTOMER_GROUP_PLUS_GENERAL_ORDER_PRICE,$value=="4"?1:0, 0 );
$res .= _CONF_DISCOUNT_TYPE_radio_button( "8", ADMIN_DISCOUNT_CUSTOMER_GROUP_PLUS_GENERAL_ORDER_PRICE_TOTAL_ORDERS, $value=="8"?1:0, 0 );
$res .= _CONF_DISCOUNT_TYPE_radio_button( "5", ADMIN_DISCOUNT_MAX_CUSTOMER_GROUP_GENERAL_ORDER_PRICE, $value=="5"?1:0, 0 );
$res .= _CONF_DISCOUNT_TYPE_radio_button( "9", ADMIN_DISCOUNT_MAX_CUSTOMER_GROUP_TOTAL_ORDERS, $value=="9"?1:0, 0 );
$res .= _CONF_DISCOUNT_TYPE_radio_button( "6", ADMIN_DISCOUNT_MAX_CUSTOMER_GROUP_GENERAL_ORDER_PRICE_TOTAL_ORDERS, $value=="6"?1:0, 0 );
$res .= "</table>";
}else{
$res = "";
$res .= "<table class=and>";
$res .= _CONF_DISCOUNT_TYPE_radio_button( "1", ADMIN_DISCOUNT_IS_SWITCHED_OFF, $value=="1"?1:0, 0 );
$res .= _CONF_DISCOUNT_TYPE_radio_button( "3", ADMIN_DISCOUNT_GENERAL_ORDER_PRICE, $value=="3"?1:0, 0 );
$res .= "</table>";
}
return $res;
}


Добавляем в functions/order_amount_functions.php (3.0.1) или core/functions/order_amount_functions.php (3.1.2)

function oaGetTotalPrice( $log )
{
$q = db_query("select sum(ot.order_amount-ot.shipping_cost) from ".ORDERS_TABLE." ot, ".ORDER_STATUES_TABLE.
" st where ot.statusID=st.statusID and st.statusID=".CONF_COMPLETED_ORDER_STATUS." and ot.customerID=".(int)regGetIdByLogin($log));
$row=db_fetch_row($q);
return $row[0];
}


Заменяем в functions/discount_functions.php (3.0.1) или core/functions/discount_functions.php (3.1.2)

function dscCalculateDiscount( $orderPrice, $log )
{
$discount = array(
"discount_percent" => 0,
"discount_standart_unit" => 0,
"discount_current_unit" => 0,
"rest_standart_unit" => 0,
"rest_current_unit" => 0,
"priceUnit" => getPriceUnit() );
$totalPrice = oaGetTotalPrice( $log );
switch( CONF_DISCOUNT_TYPE )
{
// discount is switched off
case 1:
return $discount;
break;

// discount is based on customer group
case 2:
$discount["discount_percent"] = _calculateCustomerGroupDiscount($log);
return $discount;
break;

// discount is calculated with help general order price
case 3:
$discount["discount_percent"] = _calculateGeneralPriceDiscount( $orderPrice, $log );
break;

// discount equals to discount is based on customer group plus
// discount calculated with help general order price
case 4:
$discount["discount_percent"] = _calculateCustomerGroupDiscount($log) + _calculateGeneralPriceDiscount($orderPrice, $log );
break;

// discount is calculated as MAX( discount is based on customer group,
// discount calculated with help general order price )
case 5:
$discount["discount_percent"] = max(_calculateCustomerGroupDiscount($log), _calculateGeneralPriceDiscount($orderPrice, $log ));
break;
// discount is calculated as MAX( discount is based on customer group,
// discount calculated with help general order price and discount calculated on base of all customer orders )
case 6:
$discount["discount_percent"] = max(
max(_calculateCustomerGroupDiscount($log), _calculateGeneralPriceDiscount($orderPrice, $log )),
_calculateGeneralPriceDiscount($totalPrice, $log )
);
break;
// discount is calculated with help of total customer order prices
case 7:
$discount["discount_percent"] = _calculateGeneralPriceDiscount( $totalPrice, $log );
break;

// discount equals to discount is based on customer group plus
// discount calculated with help of total customer order prices
case 8:
$discount["discount_percent"] = _calculateCustomerGroupDiscount($log) + _calculateGeneralPriceDiscount($totalPrice, $log );
break;

// discount is calculated as MAX( discount is based on customer group,
// discount calculated with help of total customer order prices )
case 9:
$discount["discount_percent"] = max(_calculateCustomerGroupDiscount($log), _calculateGeneralPriceDiscount($totalPrice, $log ));
break;
}

if(CONF_DISCOUNT_TYPE == 7 || CONF_DISCOUNT_TYPE == 8 || CONF_DISCOUNT_TYPE == 9) $orderPrice = $totalPrice;
elseif (CONF_DISCOUNT_TYPE == 6) $orderPrice = max($orderPrice, $totalPrice);

$discount["discount_standart_unit"] = ((float)$orderPrice/100)*(float)$discount["discount_percent"];
$discount["discount_current_unit"] = show_priceWithOutUnit( $discount["discount_standart_unit"] );
$discount["rest_standart_unit"] = $orderPrice - $discount["discount_standart_unit"];
$discount["rest_current_unit"] = show_priceWithOutUnit( $discount["rest_standart_unit"] );
return $discount;
}


Добавляем в functions/discount_functions.php (3.0.1) или core/functions/discount_functions.php (3.1.2)

function _calculateCustomerGroupDiscount($log)
{
$customerID = (int)regGetIdByLogin($log);
if ( !is_bool($customerID) ){
$customer_group = GetCustomerGroupByCustomerId( $customerID );
if ( !$customer_group) return 0;
else return $customer_group["custgroup_discount"];
}
else return 0;
}

  • 2

#2 jul-wern

    Новичок

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

Отправлено 12 January 2014 - 03:54 PM

Спасибо. Всё работает.
Только ещё бы сюда добавить исправленный shopping_cart.tpl.html
  • 0

#3 morfiy375

    Пользователь

  • Download User
  • PipPip
  • 14 сообщений
Репутация: 0
Начинающий

Отправлено 05 May 2014 - 11:17 AM

вообще все пропала одна скидка только осталась(((
  • 0

#4 pavelracer

    Новичок

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

Отправлено 23 November 2016 - 11:12 AM

Скажите, как сделать эту накопительную скидку для разных групп пользователей (физ лица одна накопительная скидка, для юр другая). Прошу помощи. Заранее благодарю всех откликнувшихся
  • 0

#5 badisoft

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

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

Отправлено 23 November 2016 - 01:37 PM

Скажите, как сделать эту накопительную скидку для разных групп пользователей

Сначала попробуйте установить "эту накопительную скидку" в том виде, в каком она есть :).
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#6 pavelracer

    Новичок

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

Отправлено 29 November 2016 - 04:29 PM

Скажите, как сделать эту накопительную скидку для разных групп пользователей

Сначала попробуйте установить "эту накопительную скидку" в том виде, в каком она есть :).


У меня получилось считает вроде ( у меня проект на 3.0 версии), а что не так подскажите?
  • 0

#7 badisoft

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

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

Отправлено 29 November 2016 - 07:09 PM

а что не так подскажите?

Лично мне не нравится, что для расчета процента накопительной скидки используется функция, считающая процент скидки "от стоимости заказа". Как мне кажется, суммы и проценты для отдельного заказа и для накопительной скидки будут разными. Т.е. надо четко понимать при установке этого модуля, что если мы ставим галку (точнее, радиобаттон) на одном из вариантов накопительной скидки, то всю таблицу сумм и соответствующих скидок надо будет менять. Но, в принципе, это мелочь. Просто "я бы сделал не так".

Скажите, как сделать эту накопительную скидку для разных групп пользователей (физ лица одна накопительная скидка, для юр другая).

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