Bitrix - Получить финальную цену товара с учетом скидок

Bitrix - Получить финальную цену товара с учетом скидок


/***Как посчитать стоимость товара или предложения со всеми скидками***/
function getFinalPriceInCurrency($item_id, $cnt = 1, $getName="N", $sale_currency = 'RUB') {
CModule::IncludeModule("iblock");
CModule::IncludeModule("catalog");
CModule::IncludeModule("sale");
global $USER;

// Проверяем, имеет ли товар торговые предложения?
if(CCatalogSku::IsExistOffers($item_id)) {

// Пытаемся найти цену среди торговых предложений
$res = CIBlockElement::GetByID($item_id);

if($ar_res = $res->GetNext()) {
$productName = $ar_res["NAME"];
if(isset($ar_res['IBLOCK_ID']) && $ar_res['IBLOCK_ID']) {

// Ищем все тогровые предложения
$offers = CIBlockPriceTools::GetOffersArray(array(
'IBLOCK_ID' => $ar_res['IBLOCK_ID'],
'HIDE_NOT_AVAILABLE' => 'Y',
'CHECK_PERMISSIONS' => 'Y'
), array($item_id), null, null, null, null, null, null, array('CURRENCY_ID' => $sale_currency), $USER->getId(), null);

foreach($offers as $offer) {

$price = CCatalogProduct::GetOptimalPrice($offer['ID'], $cnt, $USER->GetUserGroupArray(), 'N');
if(isset($price['PRICE'])) {

$final_price = $price['PRICE']['PRICE'];
$currency_code = $price['PRICE']['CURRENCY'];

// Ищем скидки и высчитываем стоимость с учетом найденных
$arDiscounts = CCatalogDiscount::GetDiscountByProduct($item_id, $USER->GetUserGroupArray(), "N");
if(is_array($arDiscounts) && sizeof($arDiscounts) > 0) {
$final_price = CCatalogProduct::CountPriceWithDiscount($final_price, $currency_code, $arDiscounts);
}

// Конец цикла, используем найденные значения
break;
}

}
}
}

} else {

// Простой товар, без торговых предложений (для количества равному $cnt)
$price = CCatalogProduct::GetOptimalPrice($item_id, $cnt, $USER->GetUserGroupArray(), 'N');

// Получили цену?
if(!$price || !isset($price['PRICE'])) {
return false;
}

// Меняем код валюты, если нашли
if(isset($price['CURRENCY'])) {
$currency_code = $price['CURRENCY'];
}
if(isset($price['PRICE']['CURRENCY'])) {
$currency_code = $price['PRICE']['CURRENCY'];
}

// Получаем итоговую цену
$final_price = $price['PRICE']['PRICE'];

// Ищем скидки и пересчитываем цену товара с их учетом
$arDiscounts = CCatalogDiscount::GetDiscountByProduct($item_id, $USER->GetUserGroupArray(), "N", 2);
if(is_array($arDiscounts) && sizeof($arDiscounts) > 0) {
$final_price = CCatalogProduct::CountPriceWithDiscount($final_price, $currency_code, $arDiscounts);
}

if($getName=="Y"){
$res = CIBlockElement::GetByID($item_id);
$ar_res = $res->GetNext();
$productName = $ar_res["NAME"];
}

}

// Если необходимо, конвертируем в нужную валюту
if($currency_code != $sale_currency) {
$final_price = CCurrencyRates::ConvertCurrency($final_price, $currency_code, $sale_currency);
}

$arRes = array(
"PRICE"=>$price['PRICE']['PRICE'],
"FINAL_PRICE"=>$final_price,
"CURRENCY"=>$sale_currency,
"DISCOUNT"=>$arDiscounts,
);

if($productName!="")
$arRes['NAME']= $productName;

return $arRes;

}

Функция принимает в качестве параметра ID товара, для какого кол-ва товаров рассчитывать скидку, возвращать ли название товарра, код валюты магазина(по-умолчанию 'RUB'). После чего проверяет, есть ли у него торговое предложение. Если оно есть, то идет пересчет его цены. Если же его нет, то идет пересчет самого товара.
Возвращается массив.
Поделиться ссылкой:
ВКонтакт Facebook Одноклассники Twitter Mail.Ru

Также читают

Вывод постраничной навигации в битриксе для массива
Как записать результат формы в Битрикс?
Частые вопросы пользователей о Битриксе

Возврат к списку