Куда идем?

Скидка группы на товар, имеющий специальную цену для этой группы

Больше
8 года 8 мес. назад #7553 от Дмитрий
Добрый день! VirtueMart 1.1.2. При создании группы покупателей и скидки для неё подсказка гласит: "Положительное значение Х означает: если товару не назначена цена для ЭТОЙ группы покупателей, то цена по умолчанию уменьшается на Х %". Однако, в реальности магазин берёт специальную цену товара для группы и применяет к ней скидку для этой группы.
Пример: Цена товара 100, группа "А" имеет скидку на все товары 10%, на данный товар нужна фиксированная цена для всех постоянных клиентов - 95, вне зависимости от размера их постоянной скидки, поэтому мы создаём специальную цену на данный товар для группы "А" - 95, но магазин берёт цену для группы 95 и применяет к ней групповую скидку 10%, результат - 85,5.
Как я понимаю, нужно внести дополнительную проверку на наличие у товара спец цены для группы.
В Ps_product.php в районе 1720 строки происходит подсчет цены со скидкой группы, уже задано условие для проверки нет ли на товар обычной скидки, чтобы не суммировалась со скидкой группы. Работает замечательно. Как правильно добавить условие на наличие спец цены для группы? "Если на товар есть цена для данной группы, то"
В представленном фрагменте кода, насколько я понимаю, как раз проверяется наличие цены на товар для данной группы.
ВНИМАНИЕ: Спойлер!

Похоже, что тут проверка на наличие цены идёт
Code:
if( !isset($resultcache[$sig]))
Пытаюсь понять, куда надо вставить
Code:
$price_info["product_price"]= $db->f("product_price") * ((100 - $auth["shopper_group_discount"])/100)
чтобы групповая скидка работала избирательно.
Очень прошу помочь!

Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.

Больше
8 года 8 мес. назад #7554 от Wedal
Дмитрий, тяжело разобраться без отладки, но похоже, что код верный и логика правильная. Код:
Code:
$discount_info = $this->get_discount( $product_id ); if ($discount_info [amount] > 0 ) { $price_info["product_price"]= $db->f("product_price"); } else { $price_info["product_price"]= $db->f("product_price") * ((100 - $auth["shopper_group_discount"])/100); }
на первый взгляд бессмысленный: если скидка есть, то оставляем цену неизменной, а если ее нет, то добавляем скидку для группы. Но на самом деле $price_info["product_price"] - это уже цена для группы. Т.е. та самая, которую вы ищите. В этом случае код обретает смысл в логике: "Не учитываем скидку для товара из группы, если для него задана цена."

Но заметьте, ниже есть еще строчка:
Code:
$price_info["product_base_price"]= $db->f("product_price") * ((100 - $auth["shopper_group_discount"])/100);
Т.е. здесь в переменную базовой цены записывается цена для группы со скидкой группы. Видимо на сайте у вас используется именно базовая цена, а не основная.
Если все так, то нужно убрать эту строчку ниже и перенести ее в код вот так:
Code:
$discount_info = $this->get_discount( $product_id ); if ($discount_info [amount] > 0 ) { $price_info["product_price"]= $db->f("product_price"); $price_info["product_base_price"]= $db->f("product_price"); } else { $price_info["product_price"]= $db->f("product_price") * ((100 - $auth["shopper_group_discount"])/100); $price_info["product_base_price"]= $db->f("product_price") * ((100 - $auth["shopper_group_discount"])/100); }

Не представляю, будет ли это работать и что сломает где-нибудь в другом месте, но попробовать стоит =).

Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.

Больше
8 года 8 мес. назад - 8 года 8 мес. назад #7555 от Дмитрий
Вариант с базовой ценой ничего не изменил.
Дело в том, что $discount_info - это скидка на сам товар (с перечеркнутой ценой) безотносительно группы покупателей, она не имеет отношения в групповой скидке.
условие
Code:
if ($discount_info [amount] > 0
вставлено с другой целью - не применять групповую скидку, если на товар уже есть скидка.
Как я понимаю, для решения моей задачи нужно найти в какой момент происходит проверка на наличие цены для группы, но не хватает знаний. Возможно в предыдущей секции :
"Получение цены для группы"
ВНИМАНИЕ: Спойлер!

Она идёт непосредственно перед секцией расчёта цены:
ВНИМАНИЕ: Спойлер!


Как можно выполнить отладку, чтобы проследить на каком этапе какое значение принимает цена?
Последнее редактирование: 8 года 8 мес. назад пользователем Дмитрий.

Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.

Больше
8 года 8 мес. назад #7557 от Wedal
Дмитрий,
Code:
$db->f("product_price");
это уже цена со скидкой, которая получена из базы данных. Важно понять, применена ли к ней уже скидка для группы.

Для отладки вы можете вставить в нужном месте кода конструкцию:
Code:
print_r($ПЕРЕМЕННАЯ_PHP);
Где-то на странице товара рядом с ценой при этом должно появиться значение переменной.

Но меня не покидает мысль: а стоило ли вообще трогать код? Может быть можно задать скидки в админке так, чтобы они покрывали ваши требования?

Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.

Больше
8 года 8 мес. назад #7559 от Дмитрий

Но меня не покидает мысль: а стоило ли вообще трогать код? Может быть можно задать скидки в админке так, чтобы они покрывали ваши требования?

Поскольку магазин не может задавать групповую скидку для отдельных категорий товара, придётся каждому товару назначать цены для группы с таким расчетом, чтобы после вычитания групповой скидки получался нужный результат. То есть, если нужно дать скидку 5% группе "10%", то цена_для_группы=0,95*цена_товара/0,9=1,05*цена_товара.
Поскольку товаров таких более 200, это выливается в муторную работу, потому и хотел заставить магазин работать как положено. :)
Виталий, или вы знаете более простой способ задать скидки на определенные категории?

Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.

Больше
8 года 8 мес. назад #7561 от Wedal
Дмитрий, я уже давно не работал с Vm 1.1.x и плохо помню настройки в админке. В VM 2-3 ваша задача решается в пару кликов. Я тут вспомнил, что писал статью, которая может вам пригодиться:
wedal.ru/rasshireniya-joomla/virtuemart-internet-magazin-na-joomla-chast-28-fast-data-processing.html
Посмотрите в ней блок: "Скидка определенной категории товаров". Может быть вам это подойдет. Вариант, конечно, не идеальный, но в принципе приемлемый.
Спасибо сказали: Дмитрий

Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.

Больше
8 года 8 мес. назад #7563 от Дмитрий
Спасибо! Изучу статью!

Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.