Штатно в ShopCMS скидку можно задать только либо для группы клиентов, либо по сумме заказа, либо комбинируя эти две скидки (сумма скидок или максимальная из них).
Это дополнение при использовании варианта Системы скидок "Скидка группы пользователя" (т.е. без комбинирования) дает возможность задать скидку отдельно для каждой категории товаров. Задается штатная скидка для группы, но можно задать категории товаров с другой скидкой.
В ShopCMS исходно алгоритм таков, что скидка во всех вариантах считается от общей суммы заказа, т.е. уже на этапе оформления корзины в заказ. При этом клиент везде видит цены "как для всех", а свою скидку только при оформлении заказа. Это в чем-то удобно, в чем-то нет.
В случае разной скидки по разным категориям такой вариант не подходит, т.к. скидку надо считать для каждого товара по отдельности и наиболее простым показалось изначально работать с ценой, куда уже заложена скидка. Это привело к некоторому (в результате не особо и большому) усложнению алгоритма. Бонусом идут "свои цены для каждого клиента". Другими словами, зарегистрировавшийся клиент сразу и везде видит именно свою цену. Хотя, конечно, если разная скидка в разных категориях не нужна, то то же самое можно сделать куда проще.
Собственно, это все вводная для понимания. Общий алгоритм прост:
1. Пишем функцию, принимающую переменные ("цена","категория") и возвращающую исправленную в соответствии с клиентом (клиент есть в элементе массива $_SESSION['log']) новую цену. Используем эту функцию везде, где из SQL-таблицы товаров считываются параметры товара (цена и прочее). Что-то типа цена=функция("цена","категория"). В большинстве случаев это
$row['Price']=функция($row['Price'],$row['categoryID']);
Обычно для получения информации о товаре используется функция GetProduct(),
куда и надо первым делом вставить эту строку сразу после
while ($row = db_fetch_assoc($g)) {
2. Не везде используется GetProduct. Очень много где (например, в home.php, да и в большинстве сторонних модулей) делается прямой запрос к SQL-таблице продуктов за ценой и прочими атрибутами товара. В каждом таком месте надо сделать ровно то же самое. Например, в home.php аж четыре раза - для спецпредложений, для новинок, для популярных и для случайных. Причем для популярных и случайных еще и categoryID придется в SQL-запрос добавить, т.к. штатно его там нет, а он нужен для вычисления скидки на продукт.
3. аналогичные действия надо проделать и с доп.характеристиками, чтобы добавка к цене от варианта характеристики зависела от скидки.
Конкретика:
0. переписываем файлы
custord_custgroup.php -> core/includes/admin/sub/
custord_custgroup.tpl.html -> core/tpl/admin/
После этого уже можно (да и нужно) попробовать зайти в админку в "Группы покупателей" и попробовать посоздавать разные скидки у разных групп для разных категорий.
1. В файле discount_functions.php
1.1. в функции dscCalculateDiscount
заменяем
case 2:
if ( !is_bool($customerID=regGetIdByLogin($log)) )
{
$customer_group = GetCustomerGroupByCustomerId( $customerID );
if ( $customer_group )
$discount["discount_percent"] = $customer_group["custgroup_discount"];
else
$discount["discount_percent"] = 0;
}
else
return $discount;
break;
на
case 2:
return $discount;
break;
1.2 в конец файла (до ?> естественно) дописываем
function CatDiscount ($price,$categoryID)
{
if (CONF_DISCOUNT_TYPE == 2 && !strpos($_SERVER['REQUEST_URI'],ADMIN_FILE) && isset($_SESSION["log"]) && !is_bool($customerID=regGetIdByLogin($_SESSION["log"])) && $customer_group = GetCustomerGroupByCustomerId( $customerID ))
{
if ($row = db_fetch_assoc(db_query("SELECT discount FROM ".DB_PRFX."custgroups_category WHERE categoryID=$categoryID AND custgroupID=".$customer_group['custgroupID']." LIMIT 1")))
return $price*(1-$row['discount']/100);
else
return $price*(1-$customer_group['custgroup_discount']/100);
}
else
return $price;
}
2. в файле product_functions.php
2.1 в функции GetProduct
перед строкой
$product['date_added']=format_datetime( $product['date_added'] );
вставляем
$product['Price'] = CatDiscount($product['Price'],$product['categoryID']);
2.2 в функции GetExtraParametrs
перед строкой
while( $_Rowue = db_fetch_assoc($q2) ){
вставляем
if (CONF_DISCOUNT_TYPE == 2 && isset($_SESSION["log"]) && !is_bool($customerID=regGetIdByLogin($_SESSION["log"])) && $customer_group = GetCustomerGroupByCustomerId( $customerID ))
{
$change = ($row = db_fetch_assoc(db_query("SELECT discount FROM ".PRODUCTS_TABLE.
" JOIN ".DB_PRFX."custgroups_category USING (categoryID)
WHERE productID=".$_Row['productID']." AND custgroupID=".$customer_group['custgroupID'].
" LIMIT 1"))) ? (1-$row['discount']/100) : 1;
}
else $change=1;
строку
$_Row['values_to_select'][$i]['price_surplus'] = show_priceWithOutUnit($_Rowue['price_surplus']);
заменяем на
$_Row['values_to_select'][$i]['price_surplus'] = show_priceWithOutUnit((float)$_Rowue['price_surplus']*$change);
2.3 в функции prdSearchProductByTemplate
перед ВТОРЫМ вхождением строки
if ( isset($callBackParam["extraParametrsTemplate"]) ){
вставляем
$row["Price"] = CatDiscount ($row["Price"],$row["categoryID"]);
3. в файле cart_functions.php в функции GetPriceProductWithOption
вместо строк
$q=db_query("select Price from ".PRODUCTS_TABLE." where productID=".(int)$productID);
$r=db_fetch_row($q);
$base_price = (float)$r[0];
вставляем
$q=db_query("select Price, categoryID from ".PRODUCTS_TABLE." where productID=".(int)$productID);
$r=db_fetch_assoc($q);
$base_price = CatDiscount ((float)$r['Price'],$r['categoryID']);
$change = $base_price/(float)$r['Price'];
вместо строки
$full_price += $r1["price_surplus"];
вставляем
$full_price += $r1["price_surplus"]*$change;
4. в файле home.php
4.1 в коде под строкой
//special offers
ниже строк
while ($row = db_fetch_row($q))
{
вставляем
$row[3] = CatDiscount($row[3],$row['categoryID']);
4.2 в коде под строкой
$cifra = 8; //количество последних товаров для выбора
строку
$q = db_query("select s.productID, s.name, s.Price, s.enabled, t.filename FROM ".PRODUCTS_TABLE." AS s LEFT JOIN ".PRODUCT_PICTURES."
заменяем на
$q = db_query("select s.productID, s.name, s.Price, s.enabled, t.filename, s.categoryID FROM ".PRODUCTS_TABLE." AS s LEFT JOIN ".PRODUCT_PICTURES."
ниже строк
while ($row = db_fetch_row($q))
{
вставляем
$row['Price'] = CatDiscount($row['Price'],$row['categoryID']);
4.3 в коде под следующей строкой
$cifra = 8; //количество последних товаров для выбора
строку
$q = db_query("select s.productID, s.name, s.Price, s.enabled, t.filename FROM ".PRODUCTS_TABLE." AS s LEFT JOIN ".PRODUCT_PICTURES."
заменяем на
$q = db_query("select s.productID, s.name, s.Price, s.enabled, t.filename, s.categoryID FROM ".PRODUCTS_TABLE." AS s LEFT JOIN ".PRODUCT_PICTURES."
ниже строк
while ($row = db_fetch_row($q))
{
вставляем
$row['Price'] = CatDiscount($row['Price'],$row['categoryID']);
5. в файле pricelist.php
перед строкой
if ($row1[2] < 0){
вставляем
$row1[2] = CatDiscount($row1[2],$row[0]);
6. Аналогичные действия проделываем и в других блоках-модулях, если вдруг у зарегистрированного пользователя где-то вылезет цена без скидки. Или пишем в соответствующую тему форума.