Доброго времени суток.
В 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
JoomShopping: 4.18.9



