public function GetDiscount($intProductID, $intIBlockID, $arCatalogGroups = array(), $arUserGroups = array(), $strRenewal = "N", $siteID = false, $arDiscountCoupons = false, $boolSKU = true, $boolGetIDS = false) { global $DB; global $APPLICATION; global $stackCacheManager; foreach (GetModuleEvents("catalog", "OnGetDiscount", true) as $arEvent) { $mxResult = ExecuteModuleEventEx($arEvent, array($intProductID, $intIBlockID, $arCatalogGroups, $arUserGroups, $strRenewal, $siteID, $arDiscountCoupons, $boolSKU, $boolGetIDS)); if (true !== $mxResult) { return $mxResult; } } $boolSKU = true === $boolSKU ? true : false; $boolGetIDS = true === $boolGetIDS ? true : false; $intProductID = intval($intProductID); if (0 >= $intProductID) { $APPLICATION->ThrowException(GetMessage("BT_MOD_CATALOG_DISC_ERR_PRODUCT_ID_ABSENT"), "NO_PRODUCT_ID"); return false; } $intIBlockID = intval($intIBlockID); if (0 >= $intIBlockID) { $APPLICATION->ThrowException(GetMessage("BT_MOD_CATALOG_DISC_ERR_IBLOCK_ID_ABSENT"), "NO_IBLOCK_ID"); return false; } if (isset($arCatalogGroups)) { if (is_array($arCatalogGroups)) { array_walk($arCatalogGroups, create_function("&\$item", "\$item=intval(\$item);")); $arCatalogGroups = array_unique($arCatalogGroups); } else { if (intval($arCatalogGroups) . "|" == $arCatalogGroups . "|") { $arCatalogGroups = array(intval($arCatalogGroups)); } else { $arCatalogGroups = array(); } } } else { $arCatalogGroups = array(); } if (!is_array($arUserGroups) && intval($arUserGroups) . "|" == $arUserGroups . "|") { $arUserGroups = array(intval($arUserGroups)); } if (!is_array($arUserGroups)) { $arUserGroups = array(); } if (!in_array(2, $arUserGroups)) { $arUserGroups[] = 2; } $strRenewal = $strRenewal == "Y" ? "Y" : "N"; if ($siteID === false) { $siteID = SITE_ID; } if ($arDiscountCoupons === false) { $arDiscountCoupons = CCatalogDiscountCoupon::GetCoupons(); } $arSKU = false; if ($boolSKU) { $arSKU = CCatalogSKU::GetProductInfo($intProductID, $intIBlockID); if (!is_array($arSKU)) { $boolSKU = false; } } $arResult = array(); $arResultID = array(); $arFilter = array('PRICE_TYPE_ID' => $arCatalogGroups, 'USER_GROUP_ID' => $arUserGroups); $arDiscountIDs = CCatalogDiscount::__GetDiscountID($arFilter); if (!empty($arDiscountIDs)) { $boolGenerate = false; $arSelect = array("ID", "TYPE", "SITE_ID", "ACTIVE", "ACTIVE_FROM", "ACTIVE_TO", "RENEWAL", "NAME", "SORT", "MAX_DISCOUNT", "VALUE_TYPE", "VALUE", "CURRENCY", "PRIORITY", "LAST_DISCOUNT", "COUPON", "COUPON_ONE_TIME", "COUPON_ACTIVE", 'UNPACK'); $strDate = date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL"))); $arFilter = array("ID" => $arDiscountIDs, "SITE_ID" => $siteID, "TYPE" => DISCOUNT_TYPE_STANDART, "ACTIVE" => "Y", "RENEWAL" => $strRenewal, "+<=ACTIVE_FROM" => $strDate, "+>=ACTIVE_TO" => $strDate); if (is_array($arDiscountCoupons)) { $arFilter["+COUPON"] = $arDiscountCoupons; } $rsPriceDiscounts = CCatalogDiscount::GetList(array(), $arFilter, false, false, $arSelect); while ($arPriceDiscount = $rsPriceDiscounts->Fetch()) { if ($arPriceDiscount['COUPON_ACTIVE'] != 'N') { if (!$boolGenerate) { $arProduct = array('ID' => $intProductID, 'IBLOCK_ID' => $intIBlockID); if (!self::__GenerateFields($arProduct)) { return false; } $boolGenerate = true; } if (CCatalogDiscount::__Unpack($arProduct, $arPriceDiscount['UNPACK'])) { unset($arPriceDiscount['UNPACK']); $arResult[] = $arPriceDiscount; $arResultID[] = $arPriceDiscount['ID']; } } } } if ($boolSKU) { $arDiscountParent = CCatalogDiscount::GetDiscount($arSKU['ID'], $arSKU['IBLOCK_ID'], $arCatalogGroups, $arUserGroups, $strRenewal, $siteID, $arDiscountCoupons, false, false); if (!empty($arDiscountParent)) { if (empty($arResult)) { $arResult = $arDiscountParent; } else { foreach ($arDiscountParent as &$arOneParentDiscount) { if (in_array($arOneParentDiscount['ID'], $arResultID)) { continue; } $arResult[] = $arOneParentDiscount; $arResultID[] = $arOneParentDiscount['ID']; } if (isset($arOneParentDiscount)) { unset($arOneParentDiscount); } } } } if (!$boolGetIDS) { $arDiscSave = CCatalogDiscountSave::GetDiscount(array('USER_ID' => 0, 'USER_GROUPS' => $arUserGroups, 'SITE_ID' => $siteID)); if (!empty($arDiscSave)) { $arResult = !empty($arResult) ? array_merge($arResult, $arDiscSave) : $arDiscSave; } } else { $arResult = $arResultID; } foreach (GetModuleEvents("catalog", "OnGetDiscountResult", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array(&$arResult)); } return $arResult; }
/** * <p>Метод возвращает параметры наименьшей цены товара productID в количестве quantity для посетителя, входящего в группы пользователей arUserGroups.</p> * * * * * @param int $productID Код товара. * * * * @param $int Приобретаемое количество. * * * * @param quantit $y = 1[ массив групп, которым принадлежит пользователь. Для текущего * пользователя он возвращается методом $USER->GetUserGroupArray() * * * * @param array $arUserGroups = array()[ "Y", если вычисляется для продления товара (продажа контента), "N" в * остальных случаях. * * * * @param string $renewal = "N"[ Массив цен. Если он установлен, то пересчет идет не по ценам из * базы данных, а по ценам из этого массива. Представляет собой * массив ассоциативных массивов с ключами: <ul> <li> <b>ID</b> - код цены;</li> * <li> <b>PRICE</b> - цена;</li> <li> <b>CURRENCY</b> - валюта;</li> <li> <b>CATALOG_GROUP_ID</b> - код * типа цен.</li> </ul> * * * * @param array $arPrices = array()[ Сайт, для которого производится вычисление. Если парамерт равен * <i>false</i>, то берется текущий сайт. * * * * @param string $siteID = false]]]]] * * * * @return array <p>Массив вида:</p><pre class="syntax">array( "PRICE" => * массив_параметров_минимальной_цены, "DISCOUNT_PRICE" => * минимальная_цена_в_базовой_валюте, "DISCOUNT" => * массив_параметров_максимальной_доступной_скидки )</pre><p><b>Обратите * внимание, что</b> <i>DISCOUNT_PRICE</i> это минимальная цена в <b>базовой * валюте</b>. Чтобы перевести эту цену в валюту товара, * необходимо:</p><pre class="syntax">array( $baseCurrency = CCurrency::GetBaseCurrency(); * $arPrice["DISCOUNT_PRICE"] = CCurrencyRates::ConvertCurrency($arPrice['DISCOUNT_PRICE'], $baseCurrency, * $arPrice["PRICE"]["CURRENCY"]); )</pre><a name="examples"></a> * * * <h4>Example</h4> * <pre> * <? * $arPrice = CCatalogProduct::GetOptimalPrice($productID, $quantity, $USER->GetUserGroupArray(), $renewal); * if (!$arPrice || count($arPrice) <= 0) * { * if ($nearestQuantity = CCatalogProduct::GetNearestQuantityPrice($productID, $quantity, $USER->GetUserGroupArray())) * { * $quantity = $nearestQuantity; * $arPrice = CCatalogProduct::GetOptimalPrice($productID, $quantity, $USER->GetUserGroupArray(), $renewal); * } * } * echo "<pre>"; * print_r($arPrice); * echo "</pre>"; * ?> * </pre> * * * @static * @link http://dev.1c-bitrix.ru/api_help/catalog/classes/ccatalogproduct/ccatalogproduct__getoptimalprice.7c16046d.php * @author Bitrix */ public static function GetOptimalPrice($intProductID, $quantity = 1, $arUserGroups = array(), $renewal = "N", $arPrices = array(), $siteID = false, $arDiscountCoupons = false) { global $APPLICATION; $mxResult = true; foreach (GetModuleEvents("catalog", "OnGetOptimalPrice", true) as $arEvent) { $mxResult = ExecuteModuleEventEx($arEvent, array($intProductID, $quantity, $arUserGroups, $renewal, $arPrices, $siteID, $arDiscountCoupons)); if (true !== $mxResult) return $mxResult; } $intProductID = intval($intProductID); if (0 >= $intProductID) { $APPLICATION->ThrowException(GetMessage("BT_MOD_CATALOG_PROD_ERR_PRODUCT_ID_ABSENT"), "NO_PRODUCT_ID"); return false; } $quantity = doubleval($quantity); if (0 >= $quantity) { $APPLICATION->ThrowException(GetMessage("BT_MOD_CATALOG_PROD_ERR_QUANTITY_ABSENT"), "NO_QUANTITY"); return false; } if (!is_array($arUserGroups) && intval($arUserGroups)."|" == $arUserGroups."|") $arUserGroups = array(intval($arUserGroups)); if (!is_array($arUserGroups)) $arUserGroups = array(); if (!in_array(2, $arUserGroups)) $arUserGroups[] = 2; $rsVAT = CCatalogProduct::GetVATInfo($intProductID); if ($arVAT = $rsVAT->Fetch()) { $arVAT['RATE'] = doubleval($arVAT['RATE'] * 0.01); } else { $arVAT = array('RATE' => 0.0, 'VAT_INCLUDED' => 'N'); } $renewal = (($renewal == "N") ? "N" : "Y"); if (false === $siteID) $siteID = SITE_ID; if (false === $arDiscountCoupons) $arDiscountCoupons = CCatalogDiscountCoupon::GetCoupons(); $strBaseCurrency = CCurrency::GetBaseCurrency(); if (empty($strBaseCurrency)) { $APPLICATION->ThrowException(GetMessage("BT_MOD_CATALOG_PROD_ERR_NO_BASE_CURRENCY"), "NO_BASE_CURRENCY"); return false; } $intIBlockID = intval(CIBlockElement::GetIBlockByID($intProductID)); if (0 >= $intIBlockID) { $APPLICATION->ThrowException(str_replace("#ID#", $intProductID, GetMessage('BT_MOD_CATALOG_PROD_ERR_ELEMENT_ID_NOT_FOUND')), "NO_ELEMENT"); return false; } if (!isset($arPrices) || !is_array($arPrices)) $arPrices = array(); if (empty($arPrices)) { $arPrices = array(); $dbPriceList = CPrice::GetListEx( array(), array( "PRODUCT_ID" => $intProductID, "GROUP_GROUP_ID" => $arUserGroups, "GROUP_BUY" => "Y", "+<=QUANTITY_FROM" => $quantity, "+>=QUANTITY_TO" => $quantity ), false, false, array("ID", "CATALOG_GROUP_ID", "PRICE", "CURRENCY") ); while ($arPriceList = $dbPriceList->Fetch()) { $arPriceList['ELEMENT_IBLOCK_ID'] = $intIBlockID; $arPrices[] = $arPriceList; } } else { foreach ($arPrices as &$arOnePrice) { $arOnePrice['ELEMENT_IBLOCK_ID'] = $intIBlockID; } if (isset($arOnePrice)) unset($arOnePrice); } if (empty($arPrices)) return false; // $boolDiscountVat = ('N' != COption::GetOptionString('catalog', 'discount_vat', 'Y')); $boolDiscountVat = true; $strDiscSaveApply = COption::GetOptionString('catalog', 'discsave_apply', 'R'); $dblMinPrice = -1; $arMinPrice = array(); $arMinDiscounts = array(); foreach ($arPrices as &$arPriceList) { $arPriceList['VAT_RATE'] = $arVAT['RATE']; $arPriceList['VAT_INCLUDED'] = $arVAT['VAT_INCLUDED']; $arPriceList['ORIG_VAT_INCLUDED'] = $arPriceList['VAT_INCLUDED']; if ($boolDiscountVat) { if ('N' == $arPriceList['VAT_INCLUDED']) { $arPriceList['PRICE'] *= (1 + $arPriceList['VAT_RATE']); $arPriceList['VAT_INCLUDED'] = 'Y'; } } else { if ('Y' == $arPriceList['VAT_INCLUDED']) { $arPriceList['PRICE'] /= (1 + $arPriceList['VAT_RATE']); $arPriceList['VAT_INCLUDED'] = 'N'; } } if ($arPriceList["CURRENCY"] == $strBaseCurrency) $dblCurrentPrice = $arPriceList["PRICE"]; else $dblCurrentPrice = CCurrencyRates::ConvertCurrency($arPriceList["PRICE"], $arPriceList["CURRENCY"], $strBaseCurrency); $arDiscounts = CCatalogDiscount::GetDiscount($intProductID, $intIBlockID, $arPriceList["CATALOG_GROUP_ID"], $arUserGroups, $renewal, $siteID, $arDiscountCoupons); $arDiscSave = array(); $arPriceDiscount = array(); $arResultPrice = array( 'PRICE' => $dblCurrentPrice, 'CURRENCY' => $strBaseCurrency, ); $arDiscountApply = array(); if (!empty($arDiscounts)) { CCatalogProduct::__PrimaryDiscountFilter($arDiscounts, $arPriceDiscount, $arDiscSave, $arResultPrice); if (!empty($arPriceDiscount)) { foreach ($arPriceDiscount as &$arOnePriority) { $boolResultPriority = CCatalogProduct::__CalcOnePriority($arOnePriority, $arDiscountApply, $arResultPrice); if (!$boolResultPriority) { return false; } 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' => $dblCurrentPrice, 'CURRENCY' => $strBaseCurrency, ); $arDiscSaveApply = array(); $boolResultDiscSave = CCatalogProduct::__CalcDiscSave($arDiscSave, $arDiscSaveApply, $arDiscSaveResult); if (!$boolResultDiscSave) { return false; } else { if ($arDiscSaveResult['PRICE'] < $arResultPrice['PRICE']) { $arResultPrice = $arDiscSaveResult; $arDiscountApply = $arDiscSaveApply; } } break; case 'A': $boolResultDiscSave = CCatalogProduct::__CalcDiscSave($arDiscSave, $arDiscountApply, $arResultPrice); if (!$boolResultDiscSave) { return false; } break; case 'D': if (empty($arDiscountApply)) { $boolResultDiscSave = CCatalogProduct::__CalcDiscSave($arDiscSave, $arDiscountApply, $arResultPrice); if (!$boolResultDiscSave) { return false; } } break; } } } if (-1 == $dblMinPrice || $dblMinPrice > $arResultPrice['PRICE']) { $dblMinPrice = $arResultPrice['PRICE']; $arMinPrice = $arPriceList; $arMinDiscounts = $arDiscountApply; } } if (isset($arPriceList)) unset($arPriceList); if ($boolDiscountVat) { if ('N' == $arMinPrice['ORIG_VAT_INCLUDED']) { $arMinPrice['PRICE'] /= (1 + $arMinPrice['VAT_RATE']); $arMinPrice['VAT_INCLUDED'] = $arMinPrice['ORIG_VAT_INCLUDED']; } } else { if ('Y' == $arMinPrice['ORIG_VAT_INCLUDED']) { $arMinPrice['PRICE'] *= (1 + $arMinPrice['VAT_RATE']); $arMinPrice['VAT_INCLUDED'] = $arMinPrice['ORIG_VAT_INCLUDED']; } } unset($arMinPrice['ORIG_VAT_INCLUDED']); $dblMinPrice = roundEx($dblMinPrice, CATALOG_VALUE_PRECISION); $arResult = array( 'PRICE' => $arMinPrice, 'DISCOUNT_PRICE' => $dblMinPrice, 'DISCOUNT' => array(), 'DISCOUNT_LIST' => array(), ); if (!empty($arMinDiscounts)) { reset($arMinDiscounts); $arResult['DISCOUNT'] = current($arMinDiscounts); $arResult['DISCOUNT_LIST'] = $arMinDiscounts; } foreach (GetModuleEvents("catalog", "OnGetOptimalPriceResult", true) as $arEvent) { if (ExecuteModuleEventEx($arEvent, array(&$arResult))===false) return false; } return $arResult; }
public static function GetDiscount($intProductID, $intIBlockID, $arCatalogGroups = array(), $arUserGroups = array(), $strRenewal = "N", $siteID = false, $arDiscountCoupons = false, $boolSKU = true, $boolGetIDS = false) { global $DB; global $APPLICATION; foreach (GetModuleEvents("catalog", "OnGetDiscount", true) as $arEvent) { $mxResult = ExecuteModuleEventEx($arEvent, array($intProductID, $intIBlockID, $arCatalogGroups, $arUserGroups, $strRenewal, $siteID, $arDiscountCoupons, $boolSKU, $boolGetIDS)); if ($mxResult !== true) { return $mxResult; } } $boolSKU = $boolSKU === true; $boolGetIDS = $boolGetIDS === true; $intProductID = (int) $intProductID; if ($intProductID <= 0) { $APPLICATION->ThrowException(GetMessage("BT_MOD_CATALOG_DISC_ERR_PRODUCT_ID_ABSENT"), "NO_PRODUCT_ID"); return false; } $intIBlockID = (int) $intIBlockID; if ($intIBlockID <= 0) { $APPLICATION->ThrowException(GetMessage("BT_MOD_CATALOG_DISC_ERR_IBLOCK_ID_ABSENT"), "NO_IBLOCK_ID"); return false; } if (!is_array($arCatalogGroups)) { $arCatalogGroups = array($arCatalogGroups); } if (!empty($arCatalogGroups)) { CatalogClearArray($arCatalogGroups); } if (!is_array($arUserGroups)) { $arUserGroups = array($arUserGroups); } $arUserGroups[] = 2; if (!empty($arUserGroups)) { CatalogClearArray($arUserGroups); } $strRenewal = $strRenewal == "Y" ? "Y" : "N"; if ($siteID === false) { $siteID = SITE_ID; } if ($arDiscountCoupons === false) { $arDiscountCoupons = CCatalogDiscountCoupon::GetCoupons(); } $arSKU = false; $arSKUExt = false; if ($boolSKU) { $arSKUExt = CCatalogSKU::GetInfoByOfferIBlock($intIBlockID); $boolSKU = !empty($arSKUExt); } $arResult = array(); $arResultID = array(); $strCacheKey = md5('C' . implode('_', $arCatalogGroups) . '-' . 'U' . implode('_', $arUserGroups)); if (!isset(self::$arCacheDiscountFilter[$strCacheKey])) { $arFilter = array('PRICE_TYPE_ID' => $arCatalogGroups, 'USER_GROUP_ID' => $arUserGroups); $arDiscountIDs = CCatalogDiscount::__GetDiscountID($arFilter); if (!empty($arDiscountIDs)) { sort($arDiscountIDs); } self::$arCacheDiscountFilter[$strCacheKey] = $arDiscountIDs; } else { $arDiscountIDs = self::$arCacheDiscountFilter[$strCacheKey]; } $arProduct = array(); if (!empty($arDiscountIDs)) { $boolGenerate = false; if (empty(self::$cacheDiscountHandlers)) { self::$cacheDiscountHandlers = CCatalogDiscount::getDiscountHandlers($arDiscountIDs); } else { $needDiscountHandlers = array(); foreach ($arDiscountIDs as &$discountID) { if (!isset(self::$cacheDiscountHandlers[$discountID])) { $needDiscountHandlers[] = $discountID; } } unset($discountID); if (!empty($needDiscountHandlers)) { $discountHandlersList = CCatalogDiscount::getDiscountHandlers($needDiscountHandlers); if (!empty($discountHandlersList)) { foreach ($discountHandlersList as $discountID => $discountHandlers) { self::$cacheDiscountHandlers[$discountID] = $discountHandlers; } unset($discountHandlers, $discountID); } unset($discountHandlersList); } unset($needDiscountHandlers); } $strCacheKey = 'D' . implode('_', $arDiscountIDs) . '-' . 'S' . $siteID . '-R' . $strRenewal; if (!empty($arDiscountCoupons)) { $strCacheKey .= '-C' . implode('|', $arDiscountCoupons); } $strCacheKey = md5($strCacheKey); if (!isset(self::$arCacheDiscountResult[$strCacheKey])) { $arSelect = array('ID', 'TYPE', 'SITE_ID', 'ACTIVE', 'ACTIVE_FROM', 'ACTIVE_TO', 'RENEWAL', 'NAME', 'SORT', 'MAX_DISCOUNT', 'VALUE_TYPE', 'VALUE', 'CURRENCY', 'PRIORITY', 'LAST_DISCOUNT', 'COUPON', 'COUPON_ONE_TIME', 'COUPON_ACTIVE', 'UNPACK'); $strDate = date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL"))); $arFilter = array('ID' => $arDiscountIDs, 'SITE_ID' => $siteID, 'TYPE' => self::ENTITY_ID, 'RENEWAL' => $strRenewal, '+<=ACTIVE_FROM' => $strDate, '+>=ACTIVE_TO' => $strDate); if (is_array($arDiscountCoupons)) { $arFilter["+COUPON"] = $arDiscountCoupons; } $arDiscountList = array(); CTimeZone::Disable(); $rsPriceDiscounts = CCatalogDiscount::GetList(array(), $arFilter, false, false, $arSelect); CTimeZone::Enable(); while ($arPriceDiscount = $rsPriceDiscounts->Fetch()) { $arPriceDiscount['HANDLERS'] = array(); $arDiscountList[] = $arPriceDiscount; } self::$arCacheDiscountResult[$strCacheKey] = $arDiscountList; } else { $arDiscountList = self::$arCacheDiscountResult[$strCacheKey]; } if (!empty($arDiscountList)) { $discountApply = array(); foreach ($arDiscountList as &$arPriceDiscount) { if (!isset($discountApply[$arPriceDiscount['ID']]) && $arPriceDiscount['COUPON_ACTIVE'] != 'N') { if (!$boolGenerate) { if (!isset(self::$arCacheProduct[$intProductID])) { $arProduct = array('ID' => $intProductID, 'IBLOCK_ID' => $intIBlockID); if (!self::__GenerateFields($arProduct)) { return false; } if ($boolSKU) { if (!self::__GenerateParent($arProduct, $arSKUExt)) { $boolSKU = false; } } $boolGenerate = true; self::$arCacheProduct[$intProductID] = $arProduct; } else { $boolGenerate = true; $arProduct = self::$arCacheProduct[$intProductID]; } } $discountApply[$arPriceDiscount['ID']] = true; $applyFlag = true; if (isset(self::$cacheDiscountHandlers[$arPriceDiscount['ID']])) { $arPriceDiscount['HANDLERS'] = self::$cacheDiscountHandlers[$arPriceDiscount['ID']]; $moduleList = self::$cacheDiscountHandlers[$arPriceDiscount['ID']]['MODULES']; if (!empty($moduleList)) { foreach ($moduleList as &$moduleID) { if (!isset(self::$usedModules[$moduleID])) { self::$usedModules[$moduleID] = Loader::includeModule($moduleID); } if (!self::$usedModules[$moduleID]) { $applyFlag = false; break; } } unset($moduleID); } unset($moduleList); } if ($applyFlag && CCatalogDiscount::__Unpack($arProduct, $arPriceDiscount['UNPACK'])) { unset($arPriceDiscount['UNPACK']); $arResult[] = $arPriceDiscount; $arResultID[] = $arPriceDiscount['ID']; } } } if (isset($arPriceDiscount)) { unset($arPriceDiscount); } unset($discountApply); } } if (!$boolGetIDS) { $arDiscSave = CCatalogDiscountSave::GetDiscount(array('USER_ID' => 0, 'USER_GROUPS' => $arUserGroups, 'SITE_ID' => $siteID)); if (!empty($arDiscSave)) { $arResult = !empty($arResult) ? array_merge($arResult, $arDiscSave) : $arDiscSave; } } else { $arResult = $arResultID; } foreach (GetModuleEvents("catalog", "OnGetDiscountResult", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array(&$arResult)); } return $arResult; }
public function GetCoupons() { return CCatalogDiscountCoupon::GetCoupons(); }
/** * @param array $arParams * @return array|false */ public static function OrderProduct($arParams) { $arParams['RENEWAL'] = (isset($arParams['RENEWAL']) && $arParams['RENEWAL'] == 'Y' ? 'Y' : 'N'); $arParams['CHECK_QUANTITY'] = (isset($arParams['CHECK_QUANTITY']) && $arParams['CHECK_QUANTITY'] == 'N' ? 'N' : 'Y'); $arParams['CHECK_DISCOUNT'] = (isset($arParams['CHECK_DISCOUNT']) && $arParams['CHECK_DISCOUNT'] == 'N' ? 'N' : 'Y'); $arParams['USER_ID'] = (isset($arParams['USER_ID']) ? (int)$arParams['USER_ID'] : 0); if ($arParams['USER_ID'] < 0) $arParams['USER_ID'] = 0; $arParams['SITE_ID'] = (isset($arParams['SITE_ID']) ? $arParams['SITE_ID'] : false); $strSiteID = $arParams['SITE_ID']; $arParams['BASKET_ID'] = (string)(isset($arParams['BASKET_ID']) ? $arParams['BASKET_ID'] : '0'); if (isset($arParams['CURRENCY'])) $arParams['CURRENCY'] = CCurrency::checkCurrencyID($arParams['CURRENCY']); if ($arParams['CURRENCY'] === false) $arParams['CURRENCY'] = CSaleLang::GetLangCurrency($strSiteID ? $strSiteID : SITE_ID); global $USER; $productID = (int)$arParams['PRODUCT_ID']; $quantity = (float)$arParams['QUANTITY']; $renewal = $arParams['RENEWAL']; $intUserID = (int)$arParams['USER_ID']; $arResult = array(); static $arUserCache = array(); if (0 < $intUserID) { if (!isset($arUserCache[$intUserID])) { $by = 'ID'; $order = 'DESC'; $rsUsers = CUser::GetList($by, $order, array("ID_EQUAL_EXACT"=>$intUserID),array('FIELDS' => array('ID'))); if ($arUser = $rsUsers->Fetch()) { $arUser['ID'] = intval($arUser['ID']); $arUserCache[$arUser['ID']] = CUser::GetUserGroup($arUser['ID']); } else { $intUserID = 0; return $arResult; } } $dbIBlockElement = CIBlockElement::GetList( array(), array( "ID" => $productID, "ACTIVE" => "Y", "ACTIVE_DATE" => "Y", "CHECK_PERMISSION" => "N", ), false, false, array('ID', 'IBLOCK_ID', 'NAME', 'DETAIL_PAGE_URL') ); if(!($arProduct = $dbIBlockElement->GetNext())) return $arResult; if ('E' == CIBlock::GetArrayByID($arProduct['IBLOCK_ID'], "RIGHTS_MODE")) { $arUserRights = CIBlockElementRights::GetUserOperations($productID,$intUserID); if (empty($arUserRights)) { return $arResult; } elseif (!is_array($arUserRights) || !array_key_exists('element_read',$arUserRights)) { return $arResult; } } else { if ('R' > CIBlock::GetPermission($arProduct['IBLOCK_ID'], $intUserID)) { return $arResult; } } } else { $dbIBlockElement = CIBlockElement::GetList( array(), array( "ID" => $productID, "ACTIVE" => "Y", "ACTIVE_DATE" => "Y", "CHECK_PERMISSIONS" => "Y", "MIN_PERMISSION" => "R", ), false, false, array('ID', 'IBLOCK_ID', 'NAME', 'DETAIL_PAGE_URL') ); if(!($arProduct = $dbIBlockElement->GetNext())) return $arResult; } $rsProducts = CCatalogProduct::GetList( array(), array('ID' => $productID), false, false, array( 'ID', 'CAN_BUY_ZERO', 'QUANTITY_TRACE', 'QUANTITY', 'WEIGHT', 'WIDTH', 'HEIGHT', 'LENGTH', 'BARCODE_MULTI', 'TYPE' ) ); if ($arCatalogProduct = $rsProducts->Fetch()) { $arCatalogProduct["QUANTITY"] = (double)$arCatalogProduct["QUANTITY"]; if ($arParams["CHECK_QUANTITY"] == "Y") { if ( 'Y' != $arCatalogProduct["CAN_BUY_ZERO"] && 'Y' == $arCatalogProduct["QUANTITY_TRACE"] && ($arCatalogProduct["QUANTITY"] <= 0 || $quantity > $arCatalogProduct["QUANTITY"]) ) { return $arResult; } } } else { return $arResult; } if (0 < $intUserID) { $arCoupons = CCatalogDiscountCoupon::GetCouponsByManage($intUserID); CCatalogDiscountSave::SetDiscountUserID($intUserID); } else { $arCoupons = CCatalogDiscountCoupon::GetCoupons(); } $userGroups = ($intUserID > 0 ? $arUserCache[$intUserID] : $USER->GetUserGroupArray()); $currentVatMode = CCatalogProduct::getPriceVatIncludeMode(); $currentUseDiscount = CCatalogProduct::getUseDiscount(); CCatalogProduct::setUseDiscount($arParams['CHECK_DISCOUNT'] == 'Y'); CCatalogProduct::setPriceVatIncludeMode(true); CCatalogProduct::setUsedCurrency($arParams['CURRENCY']); $arPrice = CCatalogProduct::GetOptimalPrice($productID, $quantity, $userGroups, $renewal, array(), (0 < $intUserID ? $strSiteID : false), $arCoupons); if (empty($arPrice)) { if ($nearestQuantity = CCatalogProduct::GetNearestQuantityPrice($productID, $quantity, $userGroups)) { $quantity = $nearestQuantity; $arPrice = CCatalogProduct::GetOptimalPrice($productID, $quantity, $userGroups, $renewal, array(), (0 < $intUserID ? $strSiteID : false), $arCoupons); } } CCatalogProduct::clearUsedCurrency(); CCatalogProduct::setPriceVatIncludeMode($currentVatMode); CCatalogProduct::setUseDiscount($currentUseDiscount); unset($userGroups, $currentUseDiscount, $currentVatMode); if (0 < $intUserID) { CCatalogDiscountSave::ClearDiscountUserID(); } if (empty($arPrice)) { return $arResult; } $arDiscountList = array(); $arCouponList = array(); if (!empty($arPrice["DISCOUNT_LIST"])) { foreach ($arPrice["DISCOUNT_LIST"] as &$arOneDiscount) { $arOneList = array( 'ID' => $arOneDiscount['ID'], 'NAME' => $arOneDiscount['NAME'], 'COUPON' => '', 'COUPON_TYPE' => '', 'MODULE_ID' => (isset($oneDiscount['MODULE_ID']) ? $oneDiscount['MODULE_ID'] : 'catalog'), 'TYPE' => $arOneDiscount['TYPE'], 'VALUE' => $arOneDiscount['VALUE'], 'VALUE_TYPE' => $arOneDiscount['VALUE_TYPE'], 'CURRENCY' => $arOneDiscount['CURRENCY'], 'HANDLERS' => (isset($arOneDiscount['HANDLERS']) ? $arOneDiscount['HANDLERS'] : array()) ); if ($arOneDiscount['COUPON']) { $arOneList['COUPON'] = $arOneDiscount['COUPON']; $arOneList['COUPON_TYPE'] = $arOneDiscount['COUPON_ONE_TIME']; $arCouponList[] = $arOneDiscount['COUPON']; } $arDiscountList[] = $arOneList; } unset($arOneList, $arOneDiscount); } if (empty($arPrice["PRICE"]["CATALOG_GROUP_NAME"])) { if (!empty($arPrice["PRICE"]["CATALOG_GROUP_ID"])) { $rsCatGroups = CCatalogGroup::GetListEx(array(),array('ID' => $arPrice["PRICE"]["CATALOG_GROUP_ID"]),false,false,array('ID','NAME','NAME_LANG')); if ($arCatGroup = $rsCatGroups->Fetch()) { $arPrice["PRICE"]["CATALOG_GROUP_NAME"] = (!empty($arCatGroup['NAME_LANG']) ? $arCatGroup['NAME_LANG'] : $arCatGroup['NAME']); } } } $arResult = array( "PRODUCT_PRICE_ID" => $arPrice["PRICE"]["ID"], 'BASE_PRICE' => $arPrice['RESULT_PRICE']['BASE_PRICE'], "PRICE" => $arPrice['RESULT_PRICE']['DISCOUNT_PRICE'], "VAT_RATE" => $arPrice['PRICE']['VAT_RATE'], "CURRENCY" => $arPrice['RESULT_PRICE']['CURRENCY'], "WEIGHT" => (float)$arCatalogProduct["WEIGHT"], "DIMENSIONS" => serialize(array( "WIDTH" => $arCatalogProduct["WIDTH"], "HEIGHT" => $arCatalogProduct["HEIGHT"], "LENGTH" => $arCatalogProduct["LENGTH"] )), "NAME" => $arProduct["~NAME"], "CAN_BUY" => "Y", "DETAIL_PAGE_URL" => $arProduct['~DETAIL_PAGE_URL'], "NOTES" => $arPrice["PRICE"]["CATALOG_GROUP_NAME"], "DISCOUNT_PRICE" => $arPrice['RESULT_PRICE']['DISCOUNT'], "TYPE" => ($arCatalogProduct["TYPE"] == CCatalogProduct::TYPE_SET) ? CCatalogProductSet::TYPE_SET : NULL, "DISCOUNT_VALUE" => ($arPrice['RESULT_PRICE']['PERCENT'] > 0 ? $arPrice['RESULT_PRICE']['PERCENT'].'%' : 0), "DISCOUNT_NAME" => "", "DISCOUNT_COUPON" => "", "DISCOUNT_LIST" => array() ); if ($arParams["CHECK_QUANTITY"] == "Y") $arResult["QUANTITY"] = $quantity; else $arResult["QUANTITY"] = $arParams["QUANTITY"]; if (!empty($arPrice["DISCOUNT_LIST"])) { $arResult['DISCOUNT_LIST'] = $arDiscountList; $arResult["DISCOUNT_NAME"] = "[".$arPrice["DISCOUNT"]["ID"]."] ".$arPrice["DISCOUNT"]["NAME"]; if (!empty($arPrice["DISCOUNT"]["COUPON"])) { $arResult["DISCOUNT_COUPON"] = $arPrice["DISCOUNT"]["COUPON"]; } if (!empty($arCouponList)) { $mxApply = CCatalogDiscountCoupon::CouponApply($intUserID, $arCouponList); } } return $arResult; }
unset($arOneItem); } $arResult["ITEMS"]["AnDelCanBuy"] = $arOrder['BASKET_ITEMS']; //$DISCOUNT_PRICE_ALL += $arResult["DISCOUNT_PRICE"]; $arResult["allSum"] = $allSum; $arResult["allWeight"] = $allWeight; $arResult["allWeight_FORMATED"] = roundEx(DoubleVal($allWeight / $arParams["WEIGHT_KOEF"]), SALE_VALUE_PRECISION) . " " . $arParams["WEIGHT_UNIT"]; $arResult["allSum_FORMATED"] = SaleFormatCurrency($allSum, $allCurrency); $arResult["DISCOUNT_PRICE_FORMATED"] = SaleFormatCurrency($arResult["DISCOUNT_PRICE"], $allCurrency); if ($arParams['PRICE_VAT_SHOW_VALUE'] == 'Y') { $arResult["allVATSum"] = $allVATSum; $arResult["allVATSum_FORMATED"] = SaleFormatCurrency($allVATSum, $allCurrency); $arResult["allNOVATSum_FORMATED"] = SaleFormatCurrency(DoubleVal($arResult["allSum"] - $allVATSum), $allCurrency); } if ($arParams["HIDE_COUPON"] != "Y") { $arCoupons = CCatalogDiscountCoupon::GetCoupons(); } if (count($arCoupons) > 0) { $arResult["COUPON"] = htmlspecialcharsbx($arCoupons[0]); } if (count($arBasketItems) <= 0) { $arResult["ERROR_MESSAGE"] = GetMessage("SALE_EMPTY_BASKET"); } $arResult["DISCOUNT_PRICE_ALL"] = $DISCOUNT_PRICE_ALL; $arResult["DISCOUNT_PRICE_ALL_FORMATED"] = SaleFormatCurrency($DISCOUNT_PRICE_ALL, $allCurrency); if (strlen($_REQUEST["BasketRefresh"]) > 0 || strlen($_REQUEST["action"]) > 0) { unset($_REQUEST["BasketRefresh"]); unset($_REQUEST["BasketOrder"]); $APPLICATION->RestartBuffer(); $data = array(); $data["price"] = $arResult["allSum_FORMATED"];
function CatalogBasketOrderCallback($productID, $quantity, $renewal = "N", $intUserID = 0, $strSiteID = false) { global $USER; global $DB; $productID = intval($productID); $quantity = doubleval($quantity); $renewal = $renewal == "Y" ? "Y" : "N"; $intUserID = intval($intUserID); if (0 > $intUserID) { $intUserID = 0; } $arResult = array(); static $arUserCache = array(); if (0 < $intUserID) { if (!array_key_exists($intUserID, $arUserCache)) { $rsUsers = CUser::GetList($by = 'ID', $order = 'DESC', array("ID_EQUAL_EXACT" => $intUserID), array('FIELDS' => array('ID'))); if ($arUser = $rsUsers->Fetch()) { $arUserCache[$arUser['ID']] = CUser::GetUserGroup($arUser['ID']); } else { $intUserID = 0; return $arResult; } } $dbIBlockElement = CIBlockElement::GetList(array(), array("ID" => $productID, "ACTIVE" => "Y", "ACTIVE_DATE" => "Y", "CHECK_PERMISSION" => "N"), false, false, array('ID', 'IBLOCK_ID', 'NAME', 'DETAIL_PAGE_URL')); if (!($arProduct = $dbIBlockElement->GetNext())) { return $arResult; } if ('E' == CIBlock::GetArrayByID($arProduct['IBLOCK_ID'], "RIGHTS_MODE")) { $arUserRights = CIBlockElementRights::GetUserOperations($productID, $intUserID); if (empty($arUserRights)) { return $arResult; } elseif (!is_array($arUserRights) || !array_key_exists('element_read', $arUserRights)) { return $arResult; } } else { if ('R' > CIBlock::GetPermission($arProduct['IBLOCK_ID'], $intUserID)) { return $arResult; } } } else { $dbIBlockElement = CIBlockElement::GetList(array(), array("ID" => $productID, "ACTIVE" => "Y", "ACTIVE_DATE" => "Y", "CHECK_PERMISSIONS" => "Y", "MIN_PERMISSION" => "R"), false, false, array('ID', 'IBLOCK_ID', 'NAME', 'DETAIL_PAGE_URL')); if (!($arProduct = $dbIBlockElement->GetNext())) { return $arResult; } } if ($arCatalogProduct = CCatalogProduct::GetByID($productID)) { if ($arCatalogProduct["CAN_BUY_ZERO"] != "Y" && ($arCatalogProduct["QUANTITY_TRACE"] == "Y" && doubleval($arCatalogProduct["QUANTITY"]) < doubleVal($quantity))) { return $arResult; } } else { return $arResult; } if (0 < $intUserID) { $arCoupons = CCatalogDiscountCoupon::GetCouponsByManage($intUserID); CCatalogDiscountSave::SetDiscountUserID($intUserID); } else { $arCoupons = CCatalogDiscountCoupon::GetCoupons(); } $arPrice = CCatalogProduct::GetOptimalPrice($productID, $quantity, 0 < $intUserID ? $arUserCache[$intUserID] : $USER->GetUserGroupArray(), $renewal, array(), 0 < $intUserID ? $strSiteID : false, $arCoupons); if (empty($arPrice)) { if ($nearestQuantity = CCatalogProduct::GetNearestQuantityPrice($productID, $quantity, 0 < $intUserID ? $arUserCache[$intUserID] : $USER->GetUserGroupArray())) { $quantity = $nearestQuantity; $arPrice = CCatalogProduct::GetOptimalPrice($productID, $quantity, 0 < $intUserID ? $arUserCache[$intUserID] : $USER->GetUserGroupArray(), $renewal, array(), 0 < $intUserID ? $strSiteID : false, $arCoupons); } } if (empty($arPrice)) { if (0 < $intUserID) { CCatalogDiscountSave::ClearDiscountUserID(); } return $arResult; } $boolDiscountVat = 'N' != COption::GetOptionString('catalog', 'discount_vat', 'Y'); $currentPrice = $arPrice["PRICE"]["PRICE"]; $currentDiscount = 0.0; if ($boolDiscountVat) { if ('N' == $arPrice['PRICE']['VAT_INCLUDED']) { $currentPrice *= 1 + $arPrice['PRICE']['VAT_RATE']; $arPrice['PRICE']['VAT_INCLUDED'] = 'Y'; } } else { if ('Y' == $arPrice['PRICE']['VAT_INCLUDED']) { $currentPrice /= 1 + $arPrice['PRICE']['VAT_RATE']; $arPrice['PRICE']['VAT_INCLUDED'] = 'N'; } } $arDiscountList = array(); $arCouponList = array(); if (!empty($arPrice["DISCOUNT_LIST"])) { $dblStartPrice = $currentPrice; foreach ($arPrice["DISCOUNT_LIST"] as &$arOneDiscount) { switch ($arOneDiscount['VALUE_TYPE']) { case 'F': if ($arOneDiscount['CURRENCY'] == $arPrice["PRICE"]["CURRENCY"]) { $currentDiscount = $arOneDiscount['VALUE']; } else { $currentDiscount = CCurrencyRates::ConvertCurrency($arOneDiscount["VALUE"], $arOneDiscount["CURRENCY"], $arPrice["PRICE"]["CURRENCY"]); } $currentPrice = $currentPrice - $currentDiscount; break; case 'P': $currentDiscount = $currentPrice * $arOneDiscount["VALUE"] / 100.0; if (0 < $arOneDiscount['MAX_DISCOUNT']) { if ($arOneDiscount['CURRENCY'] == $arPrice["PRICE"]["CURRENCY"]) { $dblMaxDiscount = $arOneDiscount['MAX_DISCOUNT']; } else { $dblMaxDiscount = CCurrencyRates::ConvertCurrency($arOneDiscount['MAX_DISCOUNT'], $arOneDiscount["CURRENCY"], $arPrice["PRICE"]["CURRENCY"]); } if ($currentDiscount > $dblMaxDiscount) { $currentDiscount = $dblMaxDiscount; } } $currentPrice = $currentPrice - $currentDiscount; break; case 'S': if ($arOneDiscount['CURRENCY'] == $arPrice["PRICE"]["CURRENCY"]) { $currentPrice = $arOneDiscount['VALUE']; } else { $currentPrice = CCurrencyRates::ConvertCurrency($arOneDiscount['VALUE'], $arOneDiscount["CURRENCY"], $arPrice["PRICE"]["CURRENCY"]); } break; } $arOneList = array('ID' => $arOneDiscount['ID'], 'NAME' => $arOneDiscount['NAME'], 'COUPON' => '', 'MODULE_ID' => 'catalog'); if ($arOneDiscount['COUPON']) { $arOneList['COUPON'] = $arOneDiscount['COUPON']; $arCouponList[] = $arOneDiscount['COUPON']; } $arDiscountList[] = $arOneList; } if (isset($arOneDiscount)) { unset($arOneDiscount); } $currentDiscount = $dblStartPrice - $currentPrice; } if (empty($arPrice["PRICE"]["CATALOG_GROUP_NAME"])) { if (!empty($arPrice["PRICE"]["CATALOG_GROUP_ID"])) { $rsCatGroups = CCatalogGroup::GetList(array(), array('ID' => $arPrice["PRICE"]["CATALOG_GROUP_ID"]), false, array('nTopCount' => 1), array('ID', 'NAME', 'NAME_LANG')); if ($arCatGroup = $rsCatGroups->Fetch()) { $arPrice["PRICE"]["CATALOG_GROUP_NAME"] = !empty($arCatGroup['NAME_LANG']) ? $arCatGroup['NAME_LANG'] : $arCatGroup['NAME']; } } } if (!$boolDiscountVat) { $currentPrice *= 1 + $arPrice['PRICE']['VAT_RATE']; $currentDiscount *= 1 + $arPrice['PRICE']['VAT_RATE']; $arPrice['PRICE']['VAT_INCLUDED'] = 'Y'; } $arResult = array("PRODUCT_PRICE_ID" => $arPrice["PRICE"]["ID"], "PRICE" => $currentPrice, "VAT_RATE" => $arPrice['PRICE']['VAT_RATE'], "CURRENCY" => $arPrice["PRICE"]["CURRENCY"], "QUANTITY" => $quantity, "WEIGHT" => 0, "NAME" => $arProduct["~NAME"], "CAN_BUY" => "Y", "DETAIL_PAGE_URL" => $arProduct['DETAIL_PAGE_URL'], "NOTES" => $arPrice["PRICE"]["CATALOG_GROUP_NAME"], "DISCOUNT_PRICE" => $currentDiscount); if (!empty($arPrice["DISCOUNT_LIST"])) { $arResult["DISCOUNT_VALUE"] = 100 * $currentDiscount / ($currentDiscount + $currentPrice) . "%"; $arResult["DISCOUNT_NAME"] = "[" . $arPrice["DISCOUNT"]["ID"] . "] " . $arPrice["DISCOUNT"]["NAME"]; $arResult['DISCOUNT_LIST'] = $arDiscountList; if (strlen($arPrice["DISCOUNT"]["COUPON"]) > 0) { $arResult["DISCOUNT_COUPON"] = $arPrice["DISCOUNT"]["COUPON"]; } if (!empty($arCouponList)) { foreach ($arCouponList as &$strOneCoupon) { $mxApply = CCatalogDiscountCoupon::CouponApply($intUserID, $strOneCoupon); } if (isset($strOneCoupon)) { unset($strOneCoupon); } } } if ($arCatalogProduct) { $arResult["WEIGHT"] = intval($arCatalogProduct["WEIGHT"]); } CCatalogProduct::QuantityTracer($productID, $quantity); if (0 < $intUserID) { CCatalogDiscountSave::ClearDiscountUserID(); } return $arResult; }
/** * <p>Метод возвращает параметры наименьшей цены товара productID в количестве quantity для посетителя, входящего в группы пользователей arUserGroups. Метод динамичный.</p> * * * @param int $intProductID Код товара.<br><br> До версии <b>12.0.0</b> параметр назывался <b>productID</b>. * * @param $int Приобретаемое количество. * * @param quantit $y = 1[ массив групп, которым принадлежит пользователь. Для текущего * пользователя он возвращается методом $USER->GetUserGroupArray() * * @param array $arUserGroups = array()[ "Y", если вычисляется для продления товара (продажа контента), "N" в * остальных случаях. * * @param string $renewal = "N"[ Массив цен. Если он установлен, то пересчет идет не по ценам из * базы данных, а по ценам из этого массива. Представляет собой * массив ассоциативных массивов с ключами: <ul> <li> <b>ID</b> - код цены;</li> * <li> <b>PRICE</b> - цена;</li> <li> <b>CURRENCY</b> - валюта;</li> <li> <b>CATALOG_GROUP_ID</b> - код * типа цен.</li> </ul> * * @param array $arPrices = array()[ Сайт, для которого производится вычисление. Если парамерт равен * <i>false</i>, то берется текущий сайт. * * @param string $siteID = false[ Массив купонов, которые влияют на выборку скидок. Если задано * значение <i>false</i>, то массив купонов будет взят из * <b>CCatalogDiscountCoupon::GetCoupons</b> * * @param array $arDiscountCoupons = false]]]]]] * * @return array <p>Массив вида:</p> <pre class="syntax">array( "PRICE" => * массив_параметров_минимальной_цены, "DISCOUNT_PRICE" => * минимальная_цена_в_базовой_валюте, "DISCOUNT" => * массив_параметров_первой_из_примененных_скидок_торгового_каталога, * "DISCOUNT_LIST" => * массив_скидок_действующих_на_товар_в_порядке_применения, "RESULT_PRICE" * => array( "BASE_PRICE" => полная (без скидок) цена товара, "DISCOUNT_PRICE" => * цена со скидками, "DISCOUNT" => итоговая скидка (разница между BASE_PRICE и * DISCOUNT_PRICE) "PERCENT" => итоговая скидка в процентах "CURRENCY" => валюта * результата ) )</pre> <p></p><div class="note"> <b>Примечание</b>. С версии 15.0.6 ключ * RESULT_PRICE заполняется данными и в том случае, когда использованы * обработчики события <a * href="http://dev.1c-bitrix.ru/api_help/catalog/events/ongetoptimalprice.php">OnGetOptimalPrice</a>. Параметры * заданные методами <a * href="http://dev.1c-bitrix.ru/api_help/catalog/classes/ccatalogproduct/setusedcurrency.php">CCatalogProduct::setUsedCurrency</a> * и <a * href="http://dev.1c-bitrix.ru/api_help/catalog/classes/ccatalogproduct/setpricevatincludemode.php">CCatalogProduct::setPriceVatIncludeMode</a> * при этом учитываются, параметры заданные методом <a * href="http://dev.1c-bitrix.ru/api_help/catalog/classes/ccatalogproduct/setusediscount.php">CCatalogProduct::setUseDiscount</a> * - нет. </div> <p></p><div class="note"> <b>Обратите внимание, что</b> <i>DISCOUNT_PRICE</i> это * минимальная цена в <b>базовой валюте</b>. Чтобы перевести эту цену в * валюту товара, необходимо: <pre class="syntax">array( $baseCurrency = * CCurrency::GetBaseCurrency(); $arPrice["DISCOUNT_PRICE"] = CCurrencyRates::ConvertCurrency($arPrice['DISCOUNT_PRICE'], * $baseCurrency, $arPrice["PRICE"]["CURRENCY"]); )</pre> </div> <a name="examples"></a> * * <h4>Example</h4> * <pre> * <? * $arPrice = CCatalogProduct::GetOptimalPrice($productID, $quantity, $USER->GetUserGroupArray(), $renewal); * if (!$arPrice || count($arPrice) <= 0) * { * if ($nearestQuantity = CCatalogProduct::GetNearestQuantityPrice($productID, $quantity, $USER->GetUserGroupArray())) * { * $quantity = $nearestQuantity; * $arPrice = CCatalogProduct::GetOptimalPrice($productID, $quantity, $USER->GetUserGroupArray(), $renewal); * } * } * echo "<pre>"; * print_r($arPrice); * echo "</pre>"; * ?> * </pre> * * * @static * @link http://dev.1c-bitrix.ru/api_help/catalog/classes/ccatalogproduct/ccatalogproduct__getoptimalprice.7c16046d.php * @author Bitrix */ public static function GetOptimalPrice($intProductID, $quantity = 1, $arUserGroups = array(), $renewal = "N", $arPrices = array(), $siteID = false, $arDiscountCoupons = false) { static $eventOnGetExists = null; static $eventOnResultExists = null; global $APPLICATION; if ($eventOnGetExists === true || $eventOnGetExists === null) { foreach (GetModuleEvents('catalog', 'OnGetOptimalPrice', true) as $arEvent) { $eventOnGetExists = true; $mxResult = ExecuteModuleEventEx($arEvent, array($intProductID, $quantity, $arUserGroups, $renewal, $arPrices, $siteID, $arDiscountCoupons)); if ($mxResult !== true) { self::updateUserHandlerOptimalPrice($mxResult); return $mxResult; } } if ($eventOnGetExists === null) { $eventOnGetExists = false; } } $intProductID = (int) $intProductID; if ($intProductID <= 0) { $APPLICATION->ThrowException(Loc::getMessage("BT_MOD_CATALOG_PROD_ERR_PRODUCT_ID_ABSENT"), "NO_PRODUCT_ID"); return false; } $quantity = (double) $quantity; if ($quantity <= 0) { $APPLICATION->ThrowException(Loc::getMessage("BT_MOD_CATALOG_PROD_ERR_QUANTITY_ABSENT"), "NO_QUANTITY"); return false; } if (!is_array($arUserGroups) && (int) $arUserGroups . '|' == (string) $arUserGroups . '|') { $arUserGroups = array((int) $arUserGroups); } if (!is_array($arUserGroups)) { $arUserGroups = array(); } if (!in_array(2, $arUserGroups)) { $arUserGroups[] = 2; } $renewal = $renewal == 'Y' ? 'Y' : 'N'; if ($siteID === false) { $siteID = SITE_ID; } $resultCurrency = CCurrency::GetBaseCurrency(); if (empty($resultCurrency)) { $APPLICATION->ThrowException(Loc::getMessage("BT_MOD_CATALOG_PROD_ERR_NO_BASE_CURRENCY"), "NO_BASE_CURRENCY"); return false; } if (self::$usedCurrency !== null) { $resultCurrency = self::$usedCurrency; } $intIBlockID = (int) CIBlockElement::GetIBlockByID($intProductID); if ($intIBlockID <= 0) { $APPLICATION->ThrowException(Loc::getMessage('BT_MOD_CATALOG_PROD_ERR_ELEMENT_ID_NOT_FOUND', array('#ID#' => $intProductID)), 'NO_ELEMENT'); return false; } if (!isset($arPrices) || !is_array($arPrices)) { $arPrices = array(); } if (empty($arPrices)) { $arPrices = array(); $dbPriceList = CPrice::GetListEx(array(), array("PRODUCT_ID" => $intProductID, "GROUP_GROUP_ID" => $arUserGroups, "GROUP_BUY" => "Y", "+<=QUANTITY_FROM" => $quantity, "+>=QUANTITY_TO" => $quantity), false, false, array("ID", "CATALOG_GROUP_ID", "PRICE", "CURRENCY")); while ($arPriceList = $dbPriceList->Fetch()) { $arPriceList['ELEMENT_IBLOCK_ID'] = $intIBlockID; $arPrices[] = $arPriceList; } unset($arPriceList, $dbPriceList); } else { foreach ($arPrices as &$arOnePrice) { $arOnePrice['ELEMENT_IBLOCK_ID'] = $intIBlockID; } unset($arOnePrice); } if (empty($arPrices)) { return false; } $rsVAT = CCatalogProduct::GetVATInfo($intProductID); if ($arVAT = $rsVAT->Fetch()) { $arVAT['RATE'] = (double) $arVAT['RATE'] * 0.01; } else { $arVAT = array('RATE' => 0.0, 'VAT_INCLUDED' => 'N'); } unset($rsVAT); if (self::getUseDiscount()) { if ($arDiscountCoupons === false) { $arDiscountCoupons = CCatalogDiscountCoupon::GetCoupons(); } } // $boolDiscountVat = ('N' != COption::GetOptionString('catalog', 'discount_vat', 'Y')); $boolDiscountVat = true; $minPrice = false; $basePrice = false; $arMinPrice = array(); $arMinDiscounts = array(); foreach ($arPrices as &$arPriceList) { $arPriceList['VAT_RATE'] = $arVAT['RATE']; $arPriceList['VAT_INCLUDED'] = $arVAT['VAT_INCLUDED']; $dblCurrentPrice = $arPriceList['PRICE']; if ($boolDiscountVat) { if ('N' == $arPriceList['VAT_INCLUDED']) { $dblCurrentPrice *= 1 + $arPriceList['VAT_RATE']; } } else { if ('Y' == $arPriceList['VAT_INCLUDED']) { $dblCurrentPrice /= 1 + $arPriceList['VAT_RATE']; } } if ($arPriceList['CURRENCY'] != $resultCurrency) { $dblCurrentPrice = CCurrencyRates::ConvertCurrency($arPriceList['PRICE'], $arPriceList['CURRENCY'], $resultCurrency); } $dblCurrentPrice = roundEx($dblCurrentPrice, CATALOG_VALUE_PRECISION); $arDiscounts = array(); if (self::getUseDiscount()) { $arDiscounts = CCatalogDiscount::GetDiscount($intProductID, $intIBlockID, $arPriceList["CATALOG_GROUP_ID"], $arUserGroups, $renewal, $siteID, $arDiscountCoupons); } $result = CCatalogDiscount::applyDiscountList($dblCurrentPrice, $resultCurrency, $arDiscounts); if ($result === false) { return false; } if ($minPrice === false || $minPrice > $result['PRICE']) { $basePrice = $dblCurrentPrice; $minPrice = $result['PRICE']; $arMinPrice = $arPriceList; $arMinDiscounts = $result['DISCOUNT_LIST']; } } unset($arPriceList); if ($boolDiscountVat) { if (!self::$optimalPriceWithVat) { $minPrice /= 1 + $arMinPrice['VAT_RATE']; $basePrice /= 1 + $arMinPrice['VAT_RATE']; $minPrice = roundEx($minPrice, CATALOG_VALUE_PRECISION); $basePrice = roundEx($basePrice, CATALOG_VALUE_PRECISION); } } else { if (self::$optimalPriceWithVat) { $minPrice *= 1 + $arMinPrice['VAT_RATE']; $basePrice *= 1 + $arMinPrice['VAT_RATE']; $minPrice = roundEx($minPrice, CATALOG_VALUE_PRECISION); $basePrice = roundEx($basePrice, CATALOG_VALUE_PRECISION); } } $arResult = array('PRICE' => $arMinPrice, 'RESULT_PRICE' => array('BASE_PRICE' => $basePrice, 'DISCOUNT_PRICE' => $minPrice, 'DISCOUNT' => $basePrice - $minPrice, 'PERCENT' => $basePrice > 0 ? 100 * ($basePrice - $minPrice) / $basePrice : 0, 'CURRENCY' => $resultCurrency, 'VAT_RATE' => $arMinPrice['VAT_RATE'], 'VAT_INCLUDED' => self::$optimalPriceWithVat ? 'Y' : 'N'), 'DISCOUNT_PRICE' => $minPrice, 'DISCOUNT' => array(), 'DISCOUNT_LIST' => array()); if (!empty($arMinDiscounts)) { reset($arMinDiscounts); $arResult['DISCOUNT'] = current($arMinDiscounts); $arResult['DISCOUNT_LIST'] = $arMinDiscounts; } if ($eventOnResultExists === true || $eventOnResultExists === null) { foreach (GetModuleEvents('catalog', 'OnGetOptimalPriceResult', true) as $arEvent) { $eventOnResultExists = true; if (ExecuteModuleEventEx($arEvent, array(&$arResult)) === false) { return false; } } if ($eventOnResultExists === null) { $eventOnResultExists = false; } } return $arResult; }
public function getBasketItems() { global $APPLICATION; $bUseCatalog = CModule::IncludeModule("catalog"); $bUseIblock = $bUseCatalog; CSaleBasket::UpdateBasketPrices(CSaleBasket::GetBasketUserID(), SITE_ID); $bShowReady = False; $bShowDelay = False; $bShowSubscribe = False; $bShowNotAvail = False; $allSum = 0; $allWeight = 0; $allCurrency = CSaleLang::GetLangCurrency(SITE_ID); $allVATSum = 0; $arParents = array(); $arResult["ITEMS"]["AnDelCanBuy"] = array(); $arResult["ITEMS"]["DelDelCanBuy"] = array(); $arResult["ITEMS"]["nAnCanBuy"] = array(); $arResult["ITEMS"]["ProdSubscribe"] = array(); $DISCOUNT_PRICE_ALL = 0; // BASKET PRODUCTS (including measures, ratio, iblock properties data) $arImgFields = array("PREVIEW_PICTURE", "DETAIL_PICTURE"); $arBasketItems = array(); $arSku2Parent = array(); $arSetParentWeight = array(); $dbItems = CSaleBasket::GetList( array("ID" => "ASC"), array( "FUSER_ID" => CSaleBasket::GetBasketUserID(), "LID" => SITE_ID, "ORDER_ID" => "NULL" ), false, false, array( "ID", "NAME", "CALLBACK_FUNC", "MODULE", "PRODUCT_ID", "QUANTITY", "DELAY", "CAN_BUY", "PRICE", "WEIGHT", "DETAIL_PAGE_URL", "NOTES", "CURRENCY", "VAT_RATE", "CATALOG_XML_ID", "PRODUCT_XML_ID", "SUBSCRIBE", "DISCOUNT_PRICE", "PRODUCT_PROVIDER_CLASS", "TYPE", "SET_PARENT_ID" ) ); while ($arItem = $dbItems->GetNext()) { $arBasketItems[] = $arItem; if (CSaleBasketHelper::isSetItem($arItem)) continue; $arElementId[] = $arItem["PRODUCT_ID"]; if ($bUseCatalog) { $arParent = CCatalogSku::GetProductInfo($arItem["PRODUCT_ID"]); if ($arParent) { $arElementId[] = $arParent["ID"]; $arSku2Parent[$arItem["PRODUCT_ID"]] = $arParent["ID"]; $arParents[$arItem["PRODUCT_ID"]]["PRODUCT_ID"] = $arParent["ID"]; $arParents[$arItem["PRODUCT_ID"]]["IBLOCK_ID"] = $arParent["IBLOCK_ID"]; } } } // get measures, ratio, sku props data and available quantity if (!empty($arBasketItems) && $bUseCatalog) { $arBasketItems = getMeasures($arBasketItems); $arBasketItems = getRatio($arBasketItems); $arBasketItems = $this->getAvailableQuantity($arBasketItems); } // get product properties data $arProductData = getProductProps($arElementId, array_merge(array("ID"), $arImgFields, $this->arCustomSelectFields)); foreach ($arBasketItems as &$arItem) { $quantityIsFloat = false; if (number_format(doubleval($arItem['QUANTITY']), 2, '.', '') != intval($arItem['QUANTITY'])) { $quantityIsFloat = true; } $arItem["QUANTITY"] = ($quantityIsFloat === false && $this->quantityFloat != "Y") ? intval($arItem['QUANTITY']) : number_format(doubleval($arItem['QUANTITY']), 2, '.', ''); $arItem["PROPS"] = array(); $dbProp = CSaleBasket::GetPropsList( array("SORT" => "ASC", "ID" => "ASC"), array("BASKET_ID" => $arItem["ID"], "!CODE" => array("CATALOG.XML_ID", "PRODUCT.XML_ID")) ); while ($arProp = $dbProp->GetNext()) $arItem["PROPS"][] = $arProp; $arItem["PRICE_VAT_VALUE"] = (($arItem["PRICE"] / ($arItem["VAT_RATE"] +1)) * $arItem["VAT_RATE"]); $arItem["PRICE_FORMATED"] = SaleFormatCurrency($arItem["PRICE"], $arItem["CURRENCY"]); $arItem["WEIGHT"] = doubleval($arItem["WEIGHT"]); $arItem["WEIGHT_FORMATED"] = roundEx(doubleval($arItem["WEIGHT"] / $this->weightKoef), SALE_WEIGHT_PRECISION)." ".$this->weightUnit; if (CSaleBasketHelper::isSetItem($arItem)) $arSetParentWeight[$arItem["SET_PARENT_ID"]] += $arItem["WEIGHT"] * $arItem["QUANTITY"]; if (array_key_exists($arItem["PRODUCT_ID"], $arProductData) && is_array($arProductData[$arItem["PRODUCT_ID"]])) { foreach ($arProductData[$arItem["PRODUCT_ID"]] as $key => $value) { if (strpos($key, "PROPERTY_") !== false || in_array($key, $arImgFields)) $arItem[$key] = $value; } } if (array_key_exists($arItem["PRODUCT_ID"], $arSku2Parent)) // if sku element doesn't have value of some property - we'll show parent element value instead { $arFieldsToFill = array_merge($this->arCustomSelectFields, $arImgFields); // fields to be filled with parents' values if empty foreach ($arFieldsToFill as $field) { $fieldVal = (in_array($field, $arImgFields)) ? $field : $field."_VALUE"; $parentId = $arSku2Parent[$arItem["PRODUCT_ID"]]; if ((!isset($arItem[$fieldVal]) || (isset($arItem[$fieldVal]) && strlen($arItem[$fieldVal]) == 0)) && (isset($arProductData[$parentId][$fieldVal]) && !empty($arProductData[$parentId][$fieldVal]))) // can be array or string { $arItem[$fieldVal] = $arProductData[$parentId][$fieldVal]; } } } foreach ($arItem as $key => $value) // format properties' values { if ((strpos($key, "PROPERTY_", 0) === 0) && (strrpos($key, "_VALUE") == strlen($key) - 6)) { $code = str_replace(array("PROPERTY_", "_VALUE"), "", $key); $propData = $this->arIblockProps[$code]; $arItem[$key] = CSaleHelper::getIblockPropInfo($value, $propData); } } $arItem["PREVIEW_PICTURE_SRC"] = ""; if (isset($arItem["PREVIEW_PICTURE"]) && intval($arItem["PREVIEW_PICTURE"]) > 0) { $arImage = CFile::GetFileArray($arItem["PREVIEW_PICTURE"]); if ($arImage) { $arFileTmp = CFile::ResizeImageGet( $arImage, array("width" => "110", "height" =>"110"), BX_RESIZE_IMAGE_PROPORTIONAL, true ); $arItem["PREVIEW_PICTURE_SRC"] = $arFileTmp["src"]; } } $arItem["DETAIL_PICTURE_SRC"] = ""; if (isset($arItem["DETAIL_PICTURE"]) && intval($arItem["DETAIL_PICTURE"]) > 0) { $arImage = CFile::GetFileArray($arItem["DETAIL_PICTURE"]); if ($arImage) { $arFileTmp = CFile::ResizeImageGet( $arImage, array("width" => "110", "height" =>"110"), BX_RESIZE_IMAGE_PROPORTIONAL, true ); $arItem["DETAIL_PICTURE_SRC"] = $arFileTmp["src"]; } } } unset($arItem); // get sku props data if (!empty($arBasketItems) && $bUseCatalog && isset($this->offersProps) && !empty($this->offersProps)) { $arBasketItems = $this->getSkuPropsData($arBasketItems, $arParents, $this->offersProps); } // count weight for set parent products foreach ($arBasketItems as &$arItem) { if (CSaleBasketHelper::isSetParent($arItem)) { $arItem["WEIGHT"] = $arSetParentWeight[$arItem["ID"]] / $arItem["QUANTITY"]; $arItem["WEIGHT_FORMATED"] = roundEx(doubleval($arItem["WEIGHT"] / $this->weightKoef), SALE_WEIGHT_PRECISION)." ".$this->weightUnit; } } if (isset($arItem)) { unset($arItem); } // fill item arrays for old templates foreach ($arBasketItems as &$arItem) { if (CSaleBasketHelper::isSetItem($arItem)) continue; if ($arItem["CAN_BUY"] == "Y" && $arItem["DELAY"] == "N") { $allSum += ($arItem["PRICE"] * $arItem["QUANTITY"]); $allWeight += ($arItem["WEIGHT"] * $arItem["QUANTITY"]); $allVATSum += roundEx($arItem["PRICE_VAT_VALUE"] * $arItem["QUANTITY"], SALE_VALUE_PRECISION); $bShowReady = True; if(doubleval($arItem["DISCOUNT_PRICE"]) > 0) { if (0 < doubleval($arItem["DISCOUNT_PRICE"] + $arItem["PRICE"])) { $arItem["DISCOUNT_PRICE_PERCENT"] = $arItem["DISCOUNT_PRICE"]*100 / ($arItem["DISCOUNT_PRICE"] + $arItem["PRICE"]); } else { $arItem["DISCOUNT_PRICE_PERCENT"] = 0; } $arItem["DISCOUNT_PRICE_PERCENT_FORMATED"] = roundEx($arItem["DISCOUNT_PRICE_PERCENT"], SALE_VALUE_PRECISION)."%"; $DISCOUNT_PRICE_ALL += $arItem["DISCOUNT_PRICE"] * $arItem["QUANTITY"]; } $arResult["ITEMS"]["AnDelCanBuy"][] = $arItem; } elseif ($arItem["CAN_BUY"] == "Y" && $arItem["DELAY"] == "Y") { $bShowDelay = True; $arResult["ITEMS"]["DelDelCanBuy"][] = $arItem; } elseif ($arItem["CAN_BUY"] == "N" && $arItem["SUBSCRIBE"] == "Y") { $bShowSubscribe = True; $arResult["ITEMS"]["ProdSubscribe"][] = $arItem; } else { $bShowNotAvail = True; $arItem["NOT_AVAILABLE"] = true; $arResult["ITEMS"]["nAnCanBuy"][] = $arItem; } } unset($arItem); $arResult["ShowReady"] = (($bShowReady)?"Y":"N"); $arResult["ShowDelay"] = (($bShowDelay)?"Y":"N"); $arResult["ShowNotAvail"] = (($bShowNotAvail)?"Y":"N"); $arResult["ShowSubscribe"] = (($bShowSubscribe)?"Y":"N"); $arOrder = array( 'SITE_ID' => SITE_ID, 'USER_ID' => $GLOBALS["USER"]->GetID(), 'ORDER_PRICE' => $allSum, 'ORDER_WEIGHT' => $allWeight, 'BASKET_ITEMS' => $arResult["ITEMS"]["AnDelCanBuy"] ); $arOptions = array( 'COUNT_DISCOUNT_4_ALL_QUANTITY' => $this->countDiscount4AllQuantity, ); $arErrors = array(); CSaleDiscount::DoProcessOrder($arOrder, $arOptions, $arErrors); $allSum = 0; $allWeight = 0; $allVATSum = 0; $DISCOUNT_PRICE_ALL = 0; $priceWithoutDiscount = 0; foreach ($arOrder["BASKET_ITEMS"] as &$arOneItem) { $allWeight += ($arOneItem["WEIGHT"] * $arOneItem["QUANTITY"]); $allSum += ($arOneItem["PRICE"] * $arOneItem["QUANTITY"]); if (array_key_exists('VAT_VALUE', $arOneItem)) $arOneItem["PRICE_VAT_VALUE"] = $arOneItem["VAT_VALUE"]; $allVATSum += roundEx($arOneItem["PRICE_VAT_VALUE"] * $arOneItem["QUANTITY"], SALE_VALUE_PRECISION); $arOneItem["PRICE_FORMATED"] = SaleFormatCurrency($arOneItem["PRICE"], $arOneItem["CURRENCY"]); $arOneItem["FULL_PRICE"] = $arOneItem["PRICE"] + $arOneItem["DISCOUNT_PRICE"]; $arOneItem["FULL_PRICE_FORMATED"] = SaleFormatCurrency($arOneItem["FULL_PRICE"], $arOneItem["CURRENCY"]); $arOneItem["SUM"] = SaleFormatCurrency($arOneItem["PRICE"] * $arOneItem["QUANTITY"], $arOneItem["CURRENCY"]); if (0 < doubleval($arOneItem["DISCOUNT_PRICE"] + $arOneItem["PRICE"])) { $arOneItem["DISCOUNT_PRICE_PERCENT"] = $arOneItem["DISCOUNT_PRICE"]*100 / ($arOneItem["DISCOUNT_PRICE"] + $arOneItem["PRICE"]); } else { $arOneItem["DISCOUNT_PRICE_PERCENT"] = 0; } $arOneItem["DISCOUNT_PRICE_PERCENT_FORMATED"] = roundEx($arOneItem["DISCOUNT_PRICE_PERCENT"], SALE_VALUE_PRECISION)."%"; $DISCOUNT_PRICE_ALL += $arOneItem["DISCOUNT_PRICE"] * $arOneItem["QUANTITY"]; } unset($arOneItem); $arResult["ITEMS"]["AnDelCanBuy"] = $arOrder["BASKET_ITEMS"]; // fill grid data (for new templates with custom columns) foreach ($arResult["ITEMS"] as $type => $arItems) { foreach ($arItems as $k => $arItem) { $arResult["GRID"]["ROWS"][$arItem["ID"]] = $arItem; } } $arResult["allSum"] = $allSum; $arResult["allWeight"] = $allWeight; $arResult["allWeight_FORMATED"] = roundEx(doubleval($allWeight/$this->weightKoef), SALE_WEIGHT_PRECISION)." ".$this->weightUnit; $arResult["allSum_FORMATED"] = SaleFormatCurrency($allSum, $allCurrency); $arResult["DISCOUNT_PRICE_FORMATED"] = SaleFormatCurrency($arResult["DISCOUNT_PRICE"], $allCurrency); $arResult["PRICE_WITHOUT_DISCOUNT"] = SaleFormatCurrency($allSum + $DISCOUNT_PRICE_ALL, $allCurrency); if ($this->priceVatShowValue == 'Y') { $arResult["allVATSum"] = $allVATSum; $arResult["allVATSum_FORMATED"] = SaleFormatCurrency($allVATSum, $allCurrency); $arResult["allSum_wVAT_FORMATED"] = SaleFormatCurrency(doubleval($arResult["allSum"]-$allVATSum), $allCurrency); } if ($this->hideCoupon != "Y") $arCoupons = CCatalogDiscountCoupon::GetCoupons(); if (!empty($arCoupons)) $arResult["COUPON"] = htmlspecialcharsbx($arCoupons[0]); if(count($arBasketItems)<=0) $arResult["ERROR_MESSAGE"] = GetMessage("SALE_EMPTY_BASKET"); $arResult["DISCOUNT_PRICE_ALL"] = $DISCOUNT_PRICE_ALL; $arResult["DISCOUNT_PRICE_ALL_FORMATED"] = SaleFormatCurrency($DISCOUNT_PRICE_ALL, $allCurrency); if($this->usePrepayment == "Y") { if(doubleval($arResult["allSum"]) > 0) { $personType = array(); $dbPersonType = CSalePersonType::GetList(array("SORT" => "ASC", "NAME" => "ASC"), array("LID" => SITE_ID, "ACTIVE" => "Y")); while($arPersonType = $dbPersonType->Fetch()) { $personType[] = $arPersonType["ID"]; } if(!empty($personType)) { $dbPaySysAction = CSalePaySystemAction::GetList( array(), array( "PS_ACTIVE" => "Y", "HAVE_PREPAY" => "Y", "PERSON_TYPE_ID" => $personType, ), false, false, array("ID", "PAY_SYSTEM_ID", "PERSON_TYPE_ID", "NAME", "ACTION_FILE", "RESULT_FILE", "NEW_WINDOW", "PARAMS", "ENCODING", "LOGOTIP") ); if ($arPaySysAction = $dbPaySysAction->Fetch()) { CSalePaySystemAction::InitParamarrays(false, false, $arPaySysAction["PARAMS"]); $pathToAction = $_SERVER["DOCUMENT_ROOT"].$arPaySysAction["ACTION_FILE"]; $pathToAction = str_replace("\\", "/", $pathToAction); while (substr($pathToAction, strlen($pathToAction) - 1, 1) == "/") $pathToAction = substr($pathToAction, 0, strlen($pathToAction) - 1); if (file_exists($pathToAction)) { if (is_dir($pathToAction) && file_exists($pathToAction."/pre_payment.php")) $pathToAction .= "/pre_payment.php"; include_once($pathToAction); $psPreAction = new CSalePaySystemPrePayment; if($psPreAction->init()) { $orderData = array( "PATH_TO_ORDER" => $this->pathToOrder, "AMOUNT" => $arResult["allSum"], "BASKET_ITEMS" => $arResult["ITEMS"]["AnDelCanBuy"], ); if(!$psPreAction->BasketButtonAction($orderData)) { if($e = $APPLICATION->GetException()) $arResult["WARNING_MESSAGE"][] = $e->GetString(); } $arResult["PREPAY_BUTTON"] = $psPreAction->BasketButtonShow(); } } } } } } return $arResult; }
public static function OrderProduct($arParams) { if (!is_set($arParams, "RENEWAL") || $arParams["RENEWAL"] != "Y") $arParams["RENEWAL"] = "N"; if (!is_set($arParams, "USER_ID") || IntVal($arParams["USER_ID"]) <= 0) $arParams["USER_ID"] = 0; if (!is_set($arParams["SITE_ID"])) $arParams["SITE_ID"] = false; if (!is_set($arParams["CHECK_QUANTITY"]) || $arParams["CHECK_QUANTITY"] != "N") $arParams["CHECK_QUANTITY"] = "Y"; global $USER; $productID = intval($arParams["PRODUCT_ID"]); $quantity = doubleval($arParams["QUANTITY"]); $renewal = (($arParams["RENEWAL"] == "Y") ? "Y" : "N"); $strSiteID = $arParams["SITE_ID"]; $intUserID = intval($arParams["USER_ID"]); if (0 > $intUserID) $intUserID = 0; $arResult = array(); static $arUserCache = array(); if (0 < $intUserID) { if (!isset($arUserCache[$intUserID])) { $by = 'ID'; $order = 'DESC'; $rsUsers = CUser::GetList($by, $order, array("ID_EQUAL_EXACT"=>$intUserID),array('FIELDS' => array('ID'))); if ($arUser = $rsUsers->Fetch()) { $arUser['ID'] = intval($arUser['ID']); $arUserCache[$arUser['ID']] = CUser::GetUserGroup($arUser['ID']); } else { $intUserID = 0; return $arResult; } } $dbIBlockElement = CIBlockElement::GetList( array(), array( "ID" => $productID, "ACTIVE" => "Y", "ACTIVE_DATE" => "Y", "CHECK_PERMISSION" => "N", ), false, false, array('ID', 'IBLOCK_ID', 'NAME', 'DETAIL_PAGE_URL') ); if(!($arProduct = $dbIBlockElement->GetNext())) return $arResult; if ('E' == CIBlock::GetArrayByID($arProduct['IBLOCK_ID'], "RIGHTS_MODE")) { $arUserRights = CIBlockElementRights::GetUserOperations($productID,$intUserID); if (empty($arUserRights)) { return $arResult; } elseif (!is_array($arUserRights) || !array_key_exists('element_read',$arUserRights)) { return $arResult; } } else { if ('R' > CIBlock::GetPermission($arProduct['IBLOCK_ID'], $intUserID)) { return $arResult; } } } else { $dbIBlockElement = CIBlockElement::GetList( array(), array( "ID" => $productID, "ACTIVE" => "Y", "ACTIVE_DATE" => "Y", "CHECK_PERMISSIONS" => "Y", "MIN_PERMISSION" => "R", ), false, false, array('ID', 'IBLOCK_ID', 'NAME', 'DETAIL_PAGE_URL') ); if(!($arProduct = $dbIBlockElement->GetNext())) return $arResult; } $rsProducts = CCatalogProduct::GetList( array(), array('ID' => $productID), false, false, array( 'ID', 'CAN_BUY_ZERO', 'QUANTITY_TRACE', 'QUANTITY', 'WEIGHT', 'WIDTH', 'HEIGHT', 'LENGTH', 'BARCODE_MULTI', 'TYPE' ) ); if ($arCatalogProduct = $rsProducts->Fetch()) { $arCatalogProduct["QUANTITY"] = (double)$arCatalogProduct["QUANTITY"]; if ($arParams["CHECK_QUANTITY"] == "Y") { if ( 'Y' != $arCatalogProduct["CAN_BUY_ZERO"] && 'Y' == $arCatalogProduct["QUANTITY_TRACE"] && ($arCatalogProduct["QUANTITY"] <= 0 || $quantity > $arCatalogProduct["QUANTITY"]) ) { return $arResult; } } } else { return $arResult; } if (0 < $intUserID) { $arCoupons = CCatalogDiscountCoupon::GetCouponsByManage($intUserID); CCatalogDiscountSave::SetDiscountUserID($intUserID); } else { $arCoupons = CCatalogDiscountCoupon::GetCoupons(); } $arPrice = CCatalogProduct::GetOptimalPrice($productID, $quantity, (0 < $intUserID ? $arUserCache[$intUserID] : $USER->GetUserGroupArray()), $renewal, array(), (0 < $intUserID ? $strSiteID : false), $arCoupons); if (empty($arPrice)) { if ($nearestQuantity = CCatalogProduct::GetNearestQuantityPrice($productID, $quantity, (0 < $intUserID ? $arUserCache[$intUserID] : $USER->GetUserGroupArray()))) { $quantity = $nearestQuantity; $arPrice = CCatalogProduct::GetOptimalPrice($productID, $quantity, (0 < $intUserID ? $arUserCache[$intUserID] : $USER->GetUserGroupArray()), $renewal, array(), (0 < $intUserID ? $strSiteID : false), $arCoupons); } } if (empty($arPrice)) { if (0 < $intUserID) { CCatalogDiscountSave::ClearDiscountUserID(); } return $arResult; } $boolDiscountVat = ('N' != COption::GetOptionString('catalog', 'discount_vat', 'Y')); $currentPrice = $arPrice["PRICE"]["PRICE"]; $currentDiscount = 0.0; if ($boolDiscountVat) { if ('N' == $arPrice['PRICE']['VAT_INCLUDED']) { $currentPrice *= (1 + $arPrice['PRICE']['VAT_RATE']); $arPrice['PRICE']['VAT_INCLUDED'] = 'Y'; } } else { if ('Y' == $arPrice['PRICE']['VAT_INCLUDED']) { $currentPrice /= (1 + $arPrice['PRICE']['VAT_RATE']); $arPrice['PRICE']['VAT_INCLUDED'] = 'N'; } } $arDiscountList = array(); $arCouponList = array(); if (!empty($arPrice["DISCOUNT_LIST"])) { $dblStartPrice = $currentPrice; foreach ($arPrice["DISCOUNT_LIST"] as &$arOneDiscount) { switch ($arOneDiscount['VALUE_TYPE']) { case CCatalogDiscount::TYPE_FIX: if ($arOneDiscount['CURRENCY'] == $arPrice["PRICE"]["CURRENCY"]) $currentDiscount = $arOneDiscount['VALUE']; else $currentDiscount = CCurrencyRates::ConvertCurrency($arOneDiscount["VALUE"], $arOneDiscount["CURRENCY"], $arPrice["PRICE"]["CURRENCY"]); $currentPrice = $currentPrice - $currentDiscount; break; case CCatalogDiscount::TYPE_PERCENT: $currentDiscount = $currentPrice*$arOneDiscount["VALUE"]/100.0; if (0 < $arOneDiscount['MAX_DISCOUNT']) { if ($arOneDiscount['CURRENCY'] == $arPrice["PRICE"]["CURRENCY"]) $dblMaxDiscount = $arOneDiscount['MAX_DISCOUNT']; else $dblMaxDiscount = CCurrencyRates::ConvertCurrency($arOneDiscount['MAX_DISCOUNT'], $arOneDiscount["CURRENCY"], $arPrice["PRICE"]["CURRENCY"]);; if ($currentDiscount > $dblMaxDiscount) $currentDiscount = $dblMaxDiscount; } $currentPrice = $currentPrice - $currentDiscount; break; case CCatalogDiscount::TYPE_SALE: if ($arOneDiscount['CURRENCY'] == $arPrice["PRICE"]["CURRENCY"]) $currentPrice = $arOneDiscount['VALUE']; else $currentPrice = CCurrencyRates::ConvertCurrency($arOneDiscount['VALUE'], $arOneDiscount["CURRENCY"], $arPrice["PRICE"]["CURRENCY"]); break; } $arOneList = array( 'ID' => $arOneDiscount['ID'], 'NAME' => $arOneDiscount['NAME'], 'COUPON' => '', 'COUPON_TYPE' => '', 'MODULE_ID' => 'catalog', 'TYPE' => $arOneDiscount['TYPE'], 'VALUE' => $arOneDiscount['VALUE'], 'VALUE_TYPE' => $arOneDiscount['VALUE_TYPE'], 'CURRENCY' => $arOneDiscount['CURRENCY'], 'HANDLERS' => (isset($arOneDiscount['HANDLERS']) ? $arOneDiscount['HANDLERS'] : array()) ); if ($arOneDiscount['COUPON']) { $arOneList['COUPON'] = $arOneDiscount['COUPON']; $arOneList['COUPON_TYPE'] = $arOneDiscount['COUPON_ONE_TIME']; $arCouponList[] = $arOneDiscount['COUPON']; } $arDiscountList[] = $arOneList; } if (isset($arOneDiscount)) unset($arOneDiscount); $currentDiscount = $dblStartPrice - $currentPrice; } if (empty($arPrice["PRICE"]["CATALOG_GROUP_NAME"])) { if (!empty($arPrice["PRICE"]["CATALOG_GROUP_ID"])) { $rsCatGroups = CCatalogGroup::GetListEx(array(),array('ID' => $arPrice["PRICE"]["CATALOG_GROUP_ID"]),false,false,array('ID','NAME','NAME_LANG')); if ($arCatGroup = $rsCatGroups->Fetch()) { $arPrice["PRICE"]["CATALOG_GROUP_NAME"] = (!empty($arCatGroup['NAME_LANG']) ? $arCatGroup['NAME_LANG'] : $arCatGroup['NAME']); } } } if (!$boolDiscountVat) { $currentPrice *= (1 + $arPrice['PRICE']['VAT_RATE']); $currentDiscount *= (1 + $arPrice['PRICE']['VAT_RATE']); $arPrice['PRICE']['VAT_INCLUDED'] = 'Y'; } $arResult = array( "PRODUCT_PRICE_ID" => $arPrice["PRICE"]["ID"], "PRICE" => $currentPrice, "VAT_RATE" => $arPrice['PRICE']['VAT_RATE'], "CURRENCY" => $arPrice["PRICE"]["CURRENCY"], "WEIGHT" => floatval($arCatalogProduct["WEIGHT"]), "DIMENSIONS" => serialize(array( "WIDTH" => $arCatalogProduct["WIDTH"], "HEIGHT" => $arCatalogProduct["HEIGHT"], "LENGTH" => $arCatalogProduct["LENGTH"] )), "NAME" => $arProduct["~NAME"], "CAN_BUY" => "Y", "DETAIL_PAGE_URL" => $arProduct['~DETAIL_PAGE_URL'], "NOTES" => $arPrice["PRICE"]["CATALOG_GROUP_NAME"], "DISCOUNT_PRICE" => $currentDiscount, "TYPE" => ($arCatalogProduct["TYPE"] == CCatalogProduct::TYPE_SET) ? CCatalogProductSet::TYPE_SET : NULL, "DISCOUNT_VALUE" => 0, "DISCOUNT_NAME" => "", "DISCOUNT_COUPON" => "", "DISCOUNT_LIST" => array() ); if ($arParams["CHECK_QUANTITY"] == "Y") $arResult["QUANTITY"] = $quantity; else $arResult["QUANTITY"] = $arParams["QUANTITY"]; if (!empty($arPrice["DISCOUNT_LIST"])) { $arResult['DISCOUNT_LIST'] = $arDiscountList; $arResult["DISCOUNT_VALUE"] = (100*$currentDiscount/($currentDiscount+$currentPrice))."%"; $arResult["DISCOUNT_NAME"] = "[".$arPrice["DISCOUNT"]["ID"]."] ".$arPrice["DISCOUNT"]["NAME"]; if (!empty($arPrice["DISCOUNT"]["COUPON"])) { $arResult["DISCOUNT_COUPON"] = $arPrice["DISCOUNT"]["COUPON"]; } if (!empty($arCouponList)) { $mxApply = CCatalogDiscountCoupon::CouponApply($intUserID, $arCouponList); } } if (0 < $intUserID) { CCatalogDiscountSave::ClearDiscountUserID(); } return $arResult; }
static public function GetDiscount($intProductID, $intIBlockID, $arCatalogGroups = array(), $arUserGroups = array(), $strRenewal = "N", $siteID = false, $arDiscountCoupons = false, $boolSKU = true, $boolGetIDS = false) { global $DB; global $APPLICATION; global $stackCacheManager; foreach (GetModuleEvents("catalog", "OnGetDiscount", true) as $arEvent) { $mxResult = ExecuteModuleEventEx($arEvent, array($intProductID, $intIBlockID, $arCatalogGroups, $arUserGroups, $strRenewal, $siteID, $arDiscountCoupons, $boolSKU, $boolGetIDS)); if (true !== $mxResult) return $mxResult; } $boolSKU = (true === $boolSKU ? true : false); $boolGetIDS = (true === $boolGetIDS ? true : false); $intProductID = intval($intProductID); if (0 >= $intProductID) { $APPLICATION->ThrowException(GetMessage("BT_MOD_CATALOG_DISC_ERR_PRODUCT_ID_ABSENT"), "NO_PRODUCT_ID"); return false; } $intIBlockID = intval($intIBlockID); if (0 >= $intIBlockID) { $APPLICATION->ThrowException(GetMessage("BT_MOD_CATALOG_DISC_ERR_IBLOCK_ID_ABSENT"), "NO_IBLOCK_ID"); return false; } if (!empty($arCatalogGroups)) { if (!is_array($arCatalogGroups)) { $arCatalogGroups = (intval($arCatalogGroups)."|" == $arCatalogGroups."|" ? array($arCatalogGroups) : array()); } } else { $arCatalogGroups = array(); } if (!empty($arCatalogGroups)) { CatalogClearArray($arCatalogGroups); } if (!is_array($arUserGroups)) { $arUserGroups = (intval($arUserGroups)."|" == $arUserGroups."|" ? array($arUserGroups) : array()); } $arUserGroups[] = 2; if (!empty($arUserGroups)) { CatalogClearArray($arUserGroups); } $strRenewal = (($strRenewal == "Y") ? "Y" : "N"); if ($siteID === false) $siteID = SITE_ID; if ($arDiscountCoupons === false) $arDiscountCoupons = CCatalogDiscountCoupon::GetCoupons(); $arSKU = false; $arResult = array(); $arResultID = array(); $strCacheKey = md5('C'.implode('_', $arCatalogGroups).'-'.'U'.implode('_', $arUserGroups)); if (!array_key_exists($strCacheKey, self::$arCacheDiscountFilter)) { $arFilter = array( 'PRICE_TYPE_ID' => $arCatalogGroups, 'USER_GROUP_ID' => $arUserGroups, ); $arDiscountIDs = CCatalogDiscount::__GetDiscountID($arFilter); if (!empty($arDiscountIDs)) { sort($arDiscountIDs); } self::$arCacheDiscountFilter[$strCacheKey] = $arDiscountIDs; } else { $arDiscountIDs = self::$arCacheDiscountFilter[$strCacheKey]; } $arProduct = array(); if (!empty($arDiscountIDs)) { $boolGenerate = false; $strCacheKey = 'D'.implode('_', $arDiscountIDs).'-'.'S'.$siteID.'-R'.$strRenewal; if (!empty($arDiscountCoupons)) { $strCacheKey .= '-C'.implode('|', $arDiscountCoupons); } $strCacheKey = md5($strCacheKey); if (!array_key_exists($strCacheKey, self::$arCacheDiscountResult)) { $arSelect = array( "ID", "TYPE", "SITE_ID", "ACTIVE", "ACTIVE_FROM", "ACTIVE_TO", "RENEWAL", "NAME", "SORT", "MAX_DISCOUNT", "VALUE_TYPE", "VALUE", "CURRENCY", "PRIORITY", "LAST_DISCOUNT", "COUPON", "COUPON_ONE_TIME", "COUPON_ACTIVE", 'UNPACK' ); $strDate = date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL"))); $arFilter = array( "ID" => $arDiscountIDs, "SITE_ID" => $siteID, "TYPE" => DISCOUNT_TYPE_STANDART, "ACTIVE" => "Y", "RENEWAL" => $strRenewal, "+<=ACTIVE_FROM" => $strDate, "+>=ACTIVE_TO" => $strDate, ); if (is_array($arDiscountCoupons)) { $arFilter["+COUPON"] = $arDiscountCoupons; } $arDiscountList = array(); $rsPriceDiscounts = CCatalogDiscount::GetList( array(), $arFilter, false, false, $arSelect ); while ($arPriceDiscount = $rsPriceDiscounts->Fetch()) { $arDiscountList[] = $arPriceDiscount; } self::$arCacheDiscountResult[$strCacheKey] = $arDiscountList; } else { $arDiscountList = self::$arCacheDiscountResult[$strCacheKey]; } if (!empty($arDiscountList)) { foreach ($arDiscountList as &$arPriceDiscount) { if ($arPriceDiscount['COUPON_ACTIVE'] != 'N') { if (!$boolGenerate) { if (!array_key_exists($intProductID, self::$arCacheProduct)) { $arProduct = array('ID' => $intProductID, 'IBLOCK_ID' => $intIBlockID); if (!self::__GenerateFields($arProduct)) return false; $boolGenerate = true; self::$arCacheProduct[$intProductID] = $arProduct; } else { $arProduct = self::$arCacheProduct[$intProductID]; } } if (CCatalogDiscount::__Unpack($arProduct, $arPriceDiscount['UNPACK'])) { unset($arPriceDiscount['UNPACK']); $arResult[] = $arPriceDiscount; $arResultID[] = $arPriceDiscount['ID']; } } } if (isset($arPriceDiscount)) unset($arPriceDiscount); } } if ($boolSKU) { $boolSKU = false; $arSKU = false; $arSKUExt = false; $arSKUExt = CCatalogSKU::GetInfoByOfferIBlock($intIBlockID); if (!empty($arSKUExt) && is_array($arSKUExt) && 0 < intval($arSKUExt['SKU_PROPERTY_ID']) && 0 < intval($arSKUExt['PRODUCT_IBLOCK_ID'])) { if (array_key_exists('PROPERTY_'.$arSKUExt['SKU_PROPERTY_ID'].'_VALUE', $arProduct)) { $arVal = $arProduct['PROPERTY_'.$arSKUExt['SKU_PROPERTY_ID'].'_VALUE']; $arSKU = array( 'ID' => $arVal[0], 'IBLOCK_ID' => $arSKUExt['PRODUCT_IBLOCK_ID'], ); $boolSKU = true; } } } if ($boolSKU) { $arDiscountParent = CCatalogDiscount::GetDiscount($arSKU['ID'], $arSKU['IBLOCK_ID'], $arCatalogGroups, $arUserGroups, $strRenewal, $siteID, $arDiscountCoupons, false, false); if (!empty($arDiscountParent)) { if (empty($arResult)) { $arResult = $arDiscountParent; } else { foreach ($arDiscountParent as &$arOneParentDiscount) { if (in_array($arOneParentDiscount['ID'], $arResultID)) continue; $arResult[] = $arOneParentDiscount; $arResultID[] = $arOneParentDiscount['ID']; } if (isset($arOneParentDiscount)) unset($arOneParentDiscount); } } } if (!$boolGetIDS) { $arDiscSave = CCatalogDiscountSave::GetDiscount(array( 'USER_ID' => 0, 'USER_GROUPS' => $arUserGroups, 'SITE_ID' => $siteID )); if (!empty($arDiscSave)) { $arResult = (!empty($arResult) ? array_merge($arResult, $arDiscSave) : $arDiscSave); } } else { $arResult = $arResultID; } foreach (GetModuleEvents("catalog", "OnGetDiscountResult", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array(&$arResult)); } return $arResult; }