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

Discussion in 'Управление товарами, атрибутами, свойствами и цена' started by Disdain, Jan 26, 2016.

  1. Offline

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

    Joined:
    Jan 26, 2016
    Messages:
    2
    Likes Received:
    0
    Gender:
    Male
    Добрый день! 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 Staff Member ⇒ Профи ⇐

    Joined:
    Jan 17, 2011
    Messages:
    7,812
    Likes Received:
    771
    Gender:
    Male
    Получи значение группы
    Код (PHP):
    1. $auth["shopper_group_discount"]
    и добавь в условие
    А вообще Вирт до 1.1.9 содержит уязвимость
     
  4. Offline

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

    Joined:
    Jan 26, 2016
    Messages:
    2
    Likes Received:
    0
    Gender:
    Male
    А можно подробнее? Как я понимаю, $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)

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

Share This Page

Loading...