/** * <p>Метод применяет к цене <i>price</i> в валюте <i>currency</i> цепочку скидок из массива <i>arDiscounts</i>.</p> <p><b>Примечание:</b> до версии модуля <b>12.0</b> метод применял к цене <i>price</i> в валюте <i>currency</i> наибольшую скидку из массива <i>arDiscounts</i>.</p> * * * * * @param double $price Цена. * * * * @param string $currency Валюта цены. * * * * @param array $arDiscounts массив ассоциативных массивов скидок. Имеет вид: <pre class="syntax">array( * array( "VALUE_TYPE" => "тип скидки (P - в процентах, F - фиксированная сумма)", * "VALUE" => "величина скидки", "CURRENCY" => "валюта", "MAX_DISCOUNT" => * "максимальный размер скидки" ), array( "VALUE_TYPE" => "тип скидки (P - в * процентах, F - фиксированная сумма)", "VALUE" => "величина скидки", * "CURRENCY" => "валюта", "MAX_DISCOUNT" => "максимальный размер скидки" ), * * * ) * </pre> * * * * @return array <p>Метод возвращает цену, получившуюся после применения цепочки * скидок.</p><p><b>Примечание:</b> до версии модуля <b>12.0.0</b> метод * возвращал наименьшую цену, которую можно было получить с помощью * наибольшей скидки.</p><a name="examples"></a> * * * <h4>Example</h4> * <pre> * <? * // Для товара с кодом $ID выведем различные цены (по типу и количеству), по * // которым данный товар может быть куплен текущим пользователем * * $dbPrice = CPrice::GetList( * array("QUANTITY_FROM" => "ASC", "QUANTITY_TO" => "ASC", "SORT" => "ASC"), * array("PRODUCT_ID" => $ID), * false, * false, * array("ID", "CATALOG_GROUP_ID", "PRICE", "CURRENCY", "QUANTITY_FROM", "QUANTITY_TO") * ); * while ($arPrice = $dbPrice->Fetch()) * { * $arDiscounts = CCatalogDiscount::GetDiscountByPrice( * $arPrice["ID"], * $USER->GetUserGroupArray(), * "N", * SITE_ID * ); * $discountPrice = CCatalogProduct::CountPriceWithDiscount( * $arPrice["PRICE"], * $arPrice["CURRENCY"], * $arDiscounts * ); * $arPrice["DISCOUNT_PRICE"] = $discountPrice; * * echo "<pre>"; * print_r($arPrice); * echo "</pre>"; * } * ?> * </pre> * * * @static * @link http://dev.1c-bitrix.ru/api_help/catalog/classes/ccatalogproduct/ccatalogproduct__countpricewithdiscount.9c16046d.php * @author Bitrix */ public static function CountPriceWithDiscount($price, $currency, $arDiscounts) { $mxResult = true; foreach (GetModuleEvents("catalog", "OnCountPriceWithDiscount", true) as $arEvent) { $mxResult = ExecuteModuleEventEx($arEvent, array($price, $currency, $arDiscounts)); if (true !== $mxResult) return $mxResult; } if (strlen($currency) <= 0) return false; $price = doubleval($price); if ($price <= 0) return 0.0; if (!is_array($arDiscounts) || empty($arDiscounts)) return $price; $arDiscSave = array(); $arPriceDiscount = array(); $arResultPrice = array( 'PRICE' => $price, 'CURRENCY' => $currency, ); CCatalogProduct::__PrimaryDiscountFilter($arDiscounts, $arPriceDiscount, $arDiscSave, $arResultPrice); if (!empty($arPriceDiscount)) { foreach ($arPriceDiscount as &$arOnePriority) { $boolResultPriority = CCatalogProduct::__CalcOnePriority($arOnePriority, $arDiscountApply, $arResultPrice); if (!$boolResultPriority) { return $price; } else { if (isset($arResultPrice['LAST_DISCOUNT']) && 'Y' == $arResultPrice['LAST_DISCOUNT']) break; } } if (isset($arOnePriority)) unset($arOnePriority); } if (!empty($arDiscSave)) { switch($strDiscSaveApply) { case 'R': $arDiscSaveResult = array( 'PRICE' => $price, 'CURRENCY' => $currency, ); $arDiscSaveApply = array(); $boolResultDiscSave = CCatalogProduct::__CalcDiscSave($arDiscSave, $arDiscSaveApply, $arDiscSaveResult); if (!$boolResultDiscSave) { return $price; } else { if ($arDiscSaveResult['PRICE'] < $arResultPrice['PRICE']) { $arResultPrice = $arDiscSaveResult; $arDiscountApply = $arDiscSaveApply; } } break; case 'A': $boolResultDiscSave = CCatalogProduct::__CalcDiscSave($arDiscSave, $arDiscountApply, $arResultPrice); if (!$boolResultDiscSave) { return $price; } break; case 'D': if (empty($arDiscountApply)) { $boolResultDiscSave = CCatalogProduct::__CalcDiscSave($arDiscSave, $arDiscountApply, $arResultPrice); if (!$boolResultDiscSave) { return $price; } } break; } } $currentPrice_min = $arResultPrice['PRICE']; foreach (GetModuleEvents("catalog", "OnCountPriceWithDiscountResult", true) as $arEvent) { if (ExecuteModuleEventEx($arEvent, array(&$currentPrice_min))===false) return false; } return $currentPrice_min; }