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;
}