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

Тема в разделе "Управление товарами, атрибутами, свойствами и цена", создана пользователем Disdain, 26.01.2016.

  1. Offline

    Disdain Недавно здесь

    Регистрация:
    26.01.2016
    Сообщения:
    2
    Симпатии:
    0
    Пол:
    Мужской
    Добрый день! VirtueMart 1.1.2. При создании группы покупателей и скидки для неё подсказка гласит: "Положительное значение Х означает: если товару не назначена цена для ЭТОЙ группы покупателей, то цена по умолчанию уменьшается на Х %". Однако, в реальности магазин берёт специальную цену товара для группы и применяет к ней скидку для этой группы.
    Пример:
    Цена товара 100,
    группа "А" имеет скидку на все товары 10%,
    на данный товар нужна фиксированная цена для всех постоянных клиентов - 95, вне зависимости от размера их постоянной скидки,
    поэтому мы создаём специальную цену на данный товар для группы "А" - 95,
    но магазин берёт цену для группы 95 и применяет к ней групповую скидку 10%, результат - 85,5.

    Как я понимаю, нужно внести дополнительную проверку на наличие у товара спец цены для группы.
    В Ps_product.php в районе 1720 строки происходит подсчет цены со скидкой группы, уже задано условие для проверки нет ли на товар обычной скидки, чтобы не суммировалась со скидкой группы. Работает замечательно. Как правильно добавить условие на наличие спец цены для группы? "Если на товар есть цена для данной группы, то"

    $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);
    }
     
  2.  
  3. OlegK
    Offline

    OlegK Russian Joomla! Team Команда форума ⇒ Профи ⇐

    Регистрация:
    17.01.2011
    Сообщения:
    7 813
    Симпатии:
    771
    Пол:
    Мужской
    Получи значение группы
    Код (PHP):
    1. $auth["shopper_group_discount"]
    и добавь в условие
    А вообще Вирт до 1.1.9 содержит уязвимость
     
  4. Offline

    Disdain Недавно здесь

    Регистрация:
    26.01.2016
    Сообщения:
    2
    Симпатии:
    0
    Пол:
    Мужской
    А можно подробнее? Как я понимаю, $auth["shopper_group_discount"] выдаёт скидку группы, как нам это поможет? Нужно, чтобы на товар имеющий фиксированную цену для группы не применялась групповая скидка, а на остальные товары применялась. От проверки наличия цены для группы не уйти. В представленном фрагменте кода, насколько я понимаю, как раз проверяется наличие цены на товар для данной группы.
    Код (PHP):
    1. /**
    2.     * Returns the price for a specific shopper group,
    3.     * Returns nothing, when the shopper group has no price
    4.     *
    5.     * @param int $product_id
    6.     * @param int $shopper_group_id
    7.     * @param boolean $check_multiple_prices
    8.     * @param string $additionalSQL
    9.     * @return mixed
    10.     */
    11.     function getPriceByShopperGroup( $product_id, $shopper_group_id, $check_multiple_prices=false, $additionalSQL='' )
    12.     {
    13.         global $auth;
    14.         static $resultcache = array();
    15.         $db = new ps_DB;
    16.         $vendor_id = $_SESSION['ps_vendor_id'];
    17.         if( empty( $shopper_group_id )) {
    18.             ps_shopper_group::makeDefaultShopperGroupInfo();
    19.             $shopper_group_id = $GLOBALS['vendor_info'][$vendor_id]['default_shopper_group_id'];
    20.         }
    21.    
    22.         $whereClause='WHERE product_id=%s AND shopper_group_id=%s ';
    23.         $whereClause = sprintf( $whereClause, intval($product_id), intval($shopper_group_id) );
    24.  
    25.         $q = "SELECT `product_price`, `product_price_id`, `product_currency` FROM `#__{vm}_product_price` $whereClause $additionalSQL";
    26.        
    27.         $sig = sprintf("%u\n", crc32($q));
    28.  
    29.         if( !isset($resultcache[$sig]))
    30.         {
    31.             $db->query($q);
    32.             if( !$db->next_record() ) return false;
    33.                        
    34.             $discount_info = $this->get_discount( $product_id );
    35.             if ($discount_info [amount] > 0 )
    36.             {
    37.             $price_info["product_price"]= $db->f("product_price");
    38.             }
    39.             else
    40.             {
    41.             $price_info["product_price"]= $db->f("product_price") * ((100 - $auth["shopper_group_discount"])/100);
    42.             }      
    43.             $price_info["product_currency"] = $db->f("product_currency");
    44.             $price_info["product_base_price"]= $db->f("product_price") * ((100 - $auth["shopper_group_discount"])/100);
    45.             $price_info["product_has_multiple_prices"] = $db->num_rows() > 1;
    46.             $price_info["product_price_id"] = $db->f("product_price_id");                  
    47.             $price_info["item"]=true;
    48.             $GLOBALS['product_info'][$product_id]['price'] = $price_info;
    49.             // Store the result for later
    50.             $resultcache[$sig] = $price_info;
    51.            
    52.             return $GLOBALS['product_info'][$product_id]['price'];
    53.         }
    54.         else
    55.         {
    56.         return $resultcache[$sig];
    57.         }
    58.     }
    Похоже, что тут проверка на наличие цены идёт
    Код (PHP):
    1. if( !isset($resultcache[$sig]))


    Пытаюсь понять, куда надо вставить
    Код (PHP):
    1. $price_info["product_price"]= $db->f("product_price") * ((100 - $auth["shopper_group_discount"])/100)

    чтобы групповая скидка работала избирательно.
     

Поделиться этой страницей

Загрузка...