может кому пригодится, получение скидки (в том числе и наценки) по ID товара с кешированием запросов
Код |
---|
use Bitrix\Catalog; use Bitrix\Sale; use Bitrix\Main\Loader; use Bitrix\Sale\Discount\Context; /** * Получает стоимость со скидкой по id товара * @param int $productId * @return array */ public static function getDiscountPriceByProduct(int $productId): array { $calcResults = []; if (Loader::IncludeModule('sale') && Loader::includeModule('catalog')) { $cacheId = 'product_discount_' . $productId; $cache = \Bitrix\Main\Application::getInstance()->getManagedCache(); if ($cache->read(36000, $cacheId)) { $calcResults = $cache->get($cacheId); } else { $product = [ 'ID' => $productId, 'MODULE' => 'catalog', ]; $registry = Sale\Registry::getInstance(Sale\Registry::REGISTRY_TYPE_ORDER); $basketClass = $registry->getBasketClassName(); $basket = $basketClass::create(SITE_ID); $basketItem = $basket->createItem($product['MODULE'], $product['ID']); $priceRow = Catalog\Discount\DiscountManager::getPriceDataByProductId($product['ID'], 1); $fields = array( 'PRODUCT_ID' => $product['ID'], 'QUANTITY' => 1, 'LID' => SITE_ID, 'PRODUCT_PRICE_ID' => $priceRow['ID'], 'PRICE' => $priceRow['PRICE'], 'BASE_PRICE' => $priceRow['PRICE'], 'DISCOUNT_PRICE' => 0, 'CURRENCY' => $priceRow['CURRENCY'], 'CAN_BUY' => 'Y', 'DELAY' => 'N', 'PRICE_TYPE_ID' => (int)$priceRow['CATALOG_GROUP_ID'] ); $basketItem->setFieldsNoDemand($fields); $discount = Sale\Discount::buildFromBasket($basket, new Context\UserGroup([2])); $discount->setExecuteModuleFilter(array('all', 'catalog')); $discount->calculate(); $calcResults = $discount->getApplyResult(true); if (isset($calcResults['PRICES']['BASKET']) && !empty($calcResults['PRICES']['BASKET'])) { $calcResults = current($calcResults['PRICES']['BASKET']); } else { $calcResults = []; } $cache->set($cacheId, $calcResults); } } return $calcResults; } |