• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/general/comp_pricetools.php
  • Класс: CIBlockPriceTools
  • Вызов: CIBlockPriceTools::GetItemPrices
static function GetItemPrices(
	/** @noinspection PhpUnusedParameterInspection */$IBLOCK_ID,
	$arCatalogPrices,
	$arItem, $bVATInclude = true,
	$arCurrencyParams = array(),
	$USER_ID = 0,
	$LID = SITE_ID
)
{
	$arPrices = array();

	if (empty($arCatalogPrices) || !is_array($arCatalogPrices))
		return $arPrices;

	global $USER;
	static $arCurUserGroups = array();
	static $strBaseCurrency = '';

	if (self::$catalogIncluded === null)
		self::$catalogIncluded = Loader::includeModule('catalog');
	if (self::$catalogIncluded)
	{
		$existUser = (isset($USER) && $USER instanceof CUser);
		$USER_ID = (int)$USER_ID;
		$intUserID = ($USER_ID > 0 ? $USER_ID : 0);
		if ($intUserID == 0 && $existUser)
			$intUserID = (int)$USER->GetID();
		if (!isset($arCurUserGroups[$intUserID]))
		{
			$arUserGroups = array(2);
			if ($intUserID > 0)
				$arUserGroups = CUser::GetUserGroup($intUserID);
			elseif ($existUser)
				$arUserGroups = $USER->GetUserGroupArray();
			MainTypeCollection::normalizeArrayValuesByInt($arUserGroups);
			$arCurUserGroups[$intUserID] = $arUserGroups;
			unset($arUserGroups);
		}
		$arUserGroups = $arCurUserGroups[$intUserID];

		$boolConvert = false;
		$resultCurrency = '';
		if (isset($arCurrencyParams['CURRENCY_ID']) && !empty($arCurrencyParams['CURRENCY_ID']))
		{
			$boolConvert = true;
			$resultCurrency = $arCurrencyParams['CURRENCY_ID'];
		}
		if (!$boolConvert && '' == $strBaseCurrency)
			$strBaseCurrency = CurrencyCurrencyManager::getBaseCurrency();

		$percentVat = $arItem['CATALOG_VAT'] * 0.01;
		$percentPriceWithVat = 1 + $arItem['CATALOG_VAT'] * 0.01;

		$strMinCode = '';
		$boolStartMin = true;
		$dblMinPrice = 0;
		$strMinCurrency = ($boolConvert ? $resultCurrency : $strBaseCurrency);
		CCatalogDiscountSave::Disable();
		foreach ($arCatalogPrices as $key => $value)
		{
			$catalogPriceValue = 'CATALOG_PRICE_'.$value['ID'];
			$catalogCurrencyValue = 'CATALOG_CURRENCY_'.$value['ID'];
			if (
				!$value['CAN_VIEW']
				|| !isset($arItem[$catalogPriceValue])
				|| $arItem[$catalogPriceValue] == ''
			)
				continue;

			$arItem[$catalogPriceValue] = (float)$arItem[$catalogPriceValue];
			// get final price with VAT included.
			if ($arItem['CATALOG_VAT_INCLUDED'] != 'Y')
				$arItem[$catalogPriceValue] *= $percentPriceWithVat;

			$originalCurrency = $arItem[$catalogCurrencyValue];
			$calculateCurrency = $arItem[$catalogCurrencyValue];
			$calculatePrice = $arItem[$catalogPriceValue];
			$cnangeCurrency = ($boolConvert && $resultCurrency != $calculateCurrency);
			if ($cnangeCurrency)
			{
				$calculateCurrency = $resultCurrency;
				$calculatePrice = CCurrencyRates::ConvertCurrency($calculatePrice, $originalCurrency, $resultCurrency);
			}

			// so discounts will include VAT
			$discounts = array();
			if (self::isEnabledCalculationDiscounts())
			{
				$discounts = CCatalogDiscount::GetDiscount(
					$arItem['ID'],
					$arItem['IBLOCK_ID'],
					array($value['ID']),
					$arUserGroups,
					'N',
					$LID,
					array()
				);
			}
			$discountPrice = CCatalogProduct::CountPriceWithDiscount(
				$calculatePrice,
				$calculateCurrency,
				$discounts
			);
			unset($discounts);
			if ($discountPrice === false)
				continue;

			$originalPriceWithVat = $arItem[$catalogPriceValue];
			$priceWithVat = $calculatePrice;
			$discountPriceWithVat = $discountPrice;

			if ($cnangeCurrency)
				$originalDiscountPrice = CCurrencyRates::ConvertCurrency($discountPrice, $calculateCurrency, $arItem[$catalogCurrencyValue]);
			else
				$originalDiscountPrice = $discountPrice;
			$originalDiscountPriceWithVat = $originalDiscountPrice;

			$arItem[$catalogPriceValue] /= $percentPriceWithVat;
			$calculatePrice /= $percentPriceWithVat;
			$originalDiscountPrice /= $percentPriceWithVat;
			$discountPrice /= $percentPriceWithVat;

			$originalVatValue = $originalPriceWithVat - $arItem[$catalogPriceValue];
			$vatValue = $priceWithVat - $calculatePrice;
			$originalDiscountVatValue = $originalDiscountPriceWithVat - $originalDiscountPrice;
			$discountVatValue = $discountPriceWithVat - $discountPrice;

			$roundPriceWithVat = CatalogProductPrice::roundPrice($value['ID'], $discountPriceWithVat, $calculateCurrency);
			$roundPrice = CatalogProductPrice::roundPrice($value['ID'], $discountPrice, $calculateCurrency);

			$priceResult = array(
				'VALUE_NOVAT' => $calculatePrice,
				'PRINT_VALUE_NOVAT' => CCurrencyLang::CurrencyFormat($calculatePrice, $calculateCurrency, true),

				'VALUE_VAT' => $priceWithVat,
				'PRINT_VALUE_VAT' => CCurrencyLang::CurrencyFormat($priceWithVat, $calculateCurrency, true),

				'VATRATE_VALUE' => $vatValue,
				'PRINT_VATRATE_VALUE' => CCurrencyLang::CurrencyFormat($vatValue, $calculateCurrency, true),

				'DISCOUNT_VALUE_NOVAT' => $discountPrice,
				'PRINT_DISCOUNT_VALUE_NOVAT' => CCurrencyLang::CurrencyFormat($discountPrice, $calculateCurrency, true),

				'DISCOUNT_VALUE_VAT' => $discountPriceWithVat,
				'PRINT_DISCOUNT_VALUE_VAT' => CCurrencyLang::CurrencyFormat($discountPriceWithVat, $calculateCurrency, true),

				'DISCOUNT_VATRATE_VALUE' => $discountVatValue,
				'PRINT_DISCOUNT_VATRATE_VALUE' => CCurrencyLang::CurrencyFormat($discountVatValue, $calculateCurrency, true),

				'CURRENCY' => $calculateCurrency,

				'ROUND_VALUE_VAT' => $roundPriceWithVat,
				'ROUND_VALUE_NOVAT' => $roundPrice,
				'ROUND_VATRATE_VALUE' => $roundPriceWithVat - $roundPrice,
			);

			if ($cnangeCurrency)
			{
				$priceResult['ORIG_VALUE_NOVAT'] = $arItem[$catalogPriceValue];
				$priceResult['ORIG_VALUE_VAT'] = $originalPriceWithVat;
				$priceResult['ORIG_VATRATE_VALUE'] = $originalVatValue;
				$priceResult['ORIG_DISCOUNT_VALUE_NOVAT'] = $originalDiscountPrice;
				$priceResult['ORIG_DISCOUNT_VALUE_VAT'] = $originalDiscountPriceWithVat;
				$priceResult['ORIG_DISCOUNT_VATRATE_VALUE'] = $originalDiscountVatValue;
				$priceResult['ORIG_CURRENCY'] = $originalCurrency;
			}

			$priceResult['PRICE_ID'] = $value['ID'];
			$priceResult['ID'] = $arItem['CATALOG_PRICE_ID_'.$value['ID']];
			$priceResult['CAN_ACCESS'] = $arItem['CATALOG_CAN_ACCESS_'.$value['ID']];
			$priceResult['CAN_BUY'] = $arItem['CATALOG_CAN_BUY_'.$value['ID']];
			$priceResult['MIN_PRICE'] = 'N';

			if ($bVATInclude)
			{
				$priceResult['VALUE'] = $priceWithVat;
				$priceResult['PRINT_VALUE'] = $priceResult['PRINT_VALUE_VAT'];
				$priceResult['UNROUND_DISCOUNT_VALUE'] = $discountPriceWithVat;
				$priceResult['DISCOUNT_VALUE'] = $roundPriceWithVat;
				$priceResult['PRINT_DISCOUNT_VALUE'] = CCurrencyLang::CurrencyFormat(
					$roundPriceWithVat,
					$calculateCurrency,
					true
				);
			}
			else
			{
				$priceResult['VALUE'] = $calculatePrice;
				$priceResult['PRINT_VALUE'] = $priceResult['PRINT_VALUE_NOVAT'];
				$priceResult['UNROUND_DISCOUNT_VALUE'] = $discountPrice;
				$priceResult['DISCOUNT_VALUE'] = $roundPrice;
				$priceResult['PRINT_DISCOUNT_VALUE'] = CCurrencyLang::CurrencyFormat(
					$roundPrice,
					$calculateCurrency,
					true
				);;
			}

			if ((roundEx($priceResult['VALUE'], 2) - roundEx($priceResult['UNROUND_DISCOUNT_VALUE'], 2)) < 0.01)
			{
				$priceResult['VALUE'] = $priceResult['DISCOUNT_VALUE'];
				$priceResult['PRINT_VALUE'] = $priceResult['PRINT_DISCOUNT_VALUE'];
				$priceResult['DISCOUNT_DIFF'] = 0;
				$priceResult['DISCOUNT_DIFF_PERCENT'] = 0;
			}
			else
			{
				$priceResult['DISCOUNT_DIFF'] = $priceResult['VALUE'] - $priceResult['DISCOUNT_VALUE'];
				$priceResult['DISCOUNT_DIFF_PERCENT'] = roundEx(100*$priceResult['DISCOUNT_DIFF']/$priceResult['VALUE'], 0);
			}
			$priceResult['PRINT_DISCOUNT_DIFF'] = CCurrencyLang::CurrencyFormat(
				$priceResult['DISCOUNT_DIFF'],
				$calculateCurrency,
				true
			);

			if ($boolStartMin)
			{
				$dblMinPrice = ($boolConvert || ($calculateCurrency == $strMinCurrency)
					? $priceResult['DISCOUNT_VALUE']
					: CCurrencyRates::ConvertCurrency($priceResult['DISCOUNT_VALUE'], $calculateCurrency, $strMinCurrency)
				);
				$strMinCode = $key;
				$boolStartMin = false;
			}
			else
			{
				$dblComparePrice = ($boolConvert || ($calculateCurrency == $strMinCurrency)
					? $priceResult['DISCOUNT_VALUE']
					: CCurrencyRates::ConvertCurrency($priceResult['DISCOUNT_VALUE'], $calculateCurrency, $strMinCurrency)
				);
				if ($dblMinPrice > $dblComparePrice)
				{
					$dblMinPrice = $dblComparePrice;
					$strMinCode = $key;
				}
			}
			unset($calculateCurrency);
			unset($originalCurrency);

			$arPrices[$key] = $priceResult;
			unset($priceResult);
		}
		if ($strMinCode != '')
			$arPrices[$strMinCode]['MIN_PRICE'] = 'Y';
		CCatalogDiscountSave::Enable();

		unset($percentPriceWithVat);
		unset($percentVat);
	}
	else
	{
		$strMinCode = '';
		$boolStartMin = true;
		$dblMinPrice = 0;
		foreach($arCatalogPrices as $key => $value)
		{
			if (!$value['CAN_VIEW'])
				continue;

			$dblValue = round(doubleval($arItem["PROPERTY_".$value["ID"]."_VALUE"]), 2);
			if ($boolStartMin)
			{
				$dblMinPrice = $dblValue;
				$strMinCode = $key;
				$boolStartMin = false;
			}
			else
			{
				if ($dblMinPrice > $dblValue)
				{
					$dblMinPrice = $dblValue;
					$strMinCode = $key;
				}
			}
			$arPrices[$key] = array(
				"ID" => $arItem["PROPERTY_".$value["ID"]."_VALUE_ID"],
				"VALUE" => $dblValue,
				"PRINT_VALUE" => $dblValue." ".$arItem["PROPERTY_".$value["ID"]."_DESCRIPTION"],
				"DISCOUNT_VALUE" => $dblValue,
				"PRINT_DISCOUNT_VALUE" => $dblValue." ".$arItem["PROPERTY_".$value["ID"]."_DESCRIPTION"],
				"CURRENCY" => $arItem["PROPERTY_".$value["ID"]."_DESCRIPTION"],
				"CAN_ACCESS" => true,
				"CAN_BUY" => false,
				'DISCOUNT_DIFF_PERCENT' => 0,
				'DISCOUNT_DIFF' => 0,
				'PRINT_DISCOUNT_DIFF' => '0 '.$arItem["PROPERTY_".$value["ID"]."_DESCRIPTION"],
				"MIN_PRICE" => "N",
				'PRICE_ID' => $value['ID']
			);
		}
		if ($strMinCode != '')
			$arPrices[$strMinCode]['MIN_PRICE'] = 'Y';
	}
	return $arPrices;
}