Usergroup discount for category (допиливание для опта)

21.10.2025 10:41
#1
xcasperssss
Joomshopping forum user no avatar
Name: Alex
18.03.2017
Posts: 18
Quote
Usergroup discount for category (допиливание для опта)

Доброго времени суток.
В Usergroup discount for category 1.2.1 реализован функционал наценки.
Если магазин оптово-розничный, хорошо бы для гостей без логина отображать 2 цены, чтобы каждый тип клиента без входа на сайт видел цену для своей категории, допустим опт - базовая цена, розница - наценка 50%.

По умолчанию скидка-наценка отображается только для залогиненных пользователей.
Может кому будет полезен код - я не программист, пои познания средние, где-то какие-то средние функции могу заменить.

Через GPT чат сделал код, который выводит дополнительную цену для гостей (в данном случае розница, это группа клиентов id6) Розница - группа клиентов id6 в моем случае выведена через
administrator/index.php?option=com_jshopping&controller=usergroups

Сейчас получается в карточке товара и в списке товаров, если клиент находится гостем, он сразу видит 2 цены, как только залогинется, то все штатно, отображается цена, в зависимости от его группы. Код учитывает глобальную наценку через группу пользователей. Если есть наценка на группу товаров через категорию, то учитывает ее, а не глобальную.

Не знаю, на сколько код грамотно составлен, но работает. Может кто посмотрит, на сколько грамотно сделан код (наверно вопрос больше к разработчикам т.к. они очень хорошо знают конструктив)


КОД ДЛЯ ДОПОЛНИТЕЛЬНОЙ ЦЕНЫ В КАРТОЧКЕ ТОВАРА
/components/com_jshopping/templates/ВАШ_ШАБЛОН/product/product_default.php
------------------------------------------------------------------------------------------------------------------

<?php
$user = JFactory::getUser();

// Только для гостей (неавторизованных)
if ($user->guest) {
$db = JFactory::getDbo();
$group_id = 6; // ID группы "розничный клиент"
$product_id = (int)$this->product->product_id;

// Получаем категории товара
$db->setQuery("SELECT category_id FROM #__jshopping_products_to_categories WHERE product_id = {$product_id}");
$categories = $db->loadColumn();

$markup = 0;

// Проверяем наценку для категорий
if (!empty($categories)) {
$cat_ids = implode(',', array_map('intval', $categories));
$db->setQuery("SELECT MAX(percent) FROM #__jshopping_category_prices_group WHERE category_id IN ({$cat_ids}) AND group_id = {$group_id}");
$markup = (float)$db->loadResult();
}

// Если нет наценки в категории — берём глобальную
if (!$markup) {
$db->setQuery("SELECT usergroup_discount FROM #__jshopping_usergroups WHERE usergroup_id = {$group_id}");
$markup = (float)$db->loadResult();
}

// Если задана скидка/наценка — применяем её
if ($markup != 0) {
if ($markup > 0) {
// положительное значение — скидка
$final_price = $this->product->getPriceCalculate() * (1 - $markup / 100);
$label = JText::_('Цена со скидкой для зарегистрированных: ');
} else {
// отрицательное значение — наценка
$final_price = $this->product->getPriceCalculate() * (1 + abs($markup) / 100);
$label = JText::_('Розничная цена: ');
}

echo '<div class="price_bt_rc">';
echo $label . formatprice($final_price);
echo '</div>';
}
}
?>

------------------------------------------------------------------------------------------------------------------


КОД ДЛЯ ОТОБРАЖЕНИЯ ВТОРОЙ ЦЕНЫ В СПИСКЕ ТОВАРОВ
components/com_jshopping/templates/ВАШ_ШАБЛОН/list_products/product.php
------------------------------------------------------------------------------------------------------------------

<?php
$user = JFactory::getUser();
if ($user->guest) {
$db = JFactory::getDbo();
$group_id = 6; // ID группы "розничный клиент"
$product_id = (int)$product->product_id; // используем $product в списке

// Получаем категории товара
$query = $db->getQuery(true)
->select($db->quoteName('category_id'))
->from($db->quoteName('#__jshopping_products_to_categories'))
->where($db->quoteName('product_id') . ' = ' . (int)$product_id);
$db->setQuery($query);
$categories = $db->loadColumn();

$markup = 0;

// Проверяем наценку для категорий (берём максимум)
if (!empty($categories)) {
$catIds = array_map('intval', $categories);
$query = $db->getQuery(true)
->select('MAX(' . $db->quoteName('percent') . ')')
->from($db->quoteName('#__jshopping_category_prices_group'))
->where($db->quoteName('category_id') . ' IN (' . implode(',', $catIds) . ')')
->where($db->quoteName('group_id') . ' = ' . (int)$group_id);
$db->setQuery($query);
$res = $db->loadResult();
$markup = $res !== null ? (float)$res : 0;
}

// Если нет наценки в категории — берём глобальную из usergroups
if (!$markup) {
$query = $db->getQuery(true)
->select($db->quoteName('usergroup_discount'))
->from($db->quoteName('#__jshopping_usergroups'))
->where($db->quoteName('usergroup_id') . ' = ' . (int)$group_id);
$db->setQuery($query);
$res = $db->loadResult();
$markup = $res !== null ? (float)$res : 0;
}

// Если задана скидка/наценка — применяем её
if ($markup != 0) {
// БАЗОВАЯ ЦЕНА В СПИСКЕ - берем product_price (не метод)
$basePrice = isset($product->product_price) ? (float)$product->product_price : 0;

if ($basePrice > 0) {
if ($markup > 0) {
// положительное значение — скидка %
$final_price = $basePrice * (1 - $markup / 100);
$label = 'Цена со скидкой для зарегистрированных: ';
} else {
// отрицательное значение — наценка (например -50 → +50%)
$final_price = $basePrice * (1 + abs($markup) / 100);
$label = 'Розничная цена: ';
}

echo '<div class="retail_price">';
echo $label . formatprice($final_price);
echo '</div>';
}
}
}
?>

------------------------------------------------------------------------------------------------------------------



1.Все эти вставки рабочие, но может можно как-то сделать код более оптимальный и более правильней.

2.Бывают случаи, когда на сайте глобальная валюта USD, а цены выводятся в РУБ, тогда:

В списке товаров - дополнительная цена (гость) - цена 99,97, в карточке товара 99,98. Видимо в коде не учтено округление в какую-то сторону.
В списке товаров - дополнительная цена (логин) - цена 99,97, в карточке товара 99,97. Тут все нормально т.к. код дополнительной цены не выводится, а работает все через стандартные функции.

Разница хоть и минимальная в цене, но визуально раздражает))) Эта разница не всегда встречается, зависит от базовой цены и перерасчета.

Берите, пользуйтесь, за помощь в допиливании буду благодарен))

Подобрал ценник на один товар ( цена 0,84$ и 0,91$ выдает с разницей. 0,85-0,90 все отображается четко), чтобы сумма была разная, прикрепил 2 скрина (карточка товара и список товаров.)

Я не знаю в какую сторону сейчас стоит округление и от какого % в карточке товара. Но вроде как делал до ближайшего целого числа, тоже разница была, возможно проблема в другом.
downloads.zip


Joomla: 3.10.12
JoomShopping: 4.18.9
 


Copyrights MAXXmarketing GmbH. Alle Rechte vorbehalten
Durch die Nutzung dieser Website stimme ich zu, dass Cookies zur optimalen Gestaltung der Website sowie zur Analyse der Nutzung der Website verwendet werden. Weiterführende Informationen finden Sie hier. OK, einverstanden.