public static function DoProcessOrder(&$arOrder, $arOptions, &$arErrors) { global $DB; if (!array_key_exists("COUNT_DISCOUNT_4_ALL_QUANTITY", $arOptions)) { $arOptions["COUNT_DISCOUNT_4_ALL_QUANTITY"] = COption::GetOptionString("sale", "COUNT_DISCOUNT_4_ALL_QUANTITY", "N"); } $arIDS = array(); $rsDiscountIDs = CSaleDiscount::GetDiscountGroupList(array(), array('GROUP_ID' => CUser::GetUserGroup($arOrder["USER_ID"])), false, false, array('DISCOUNT_ID')); while ($arDiscountID = $rsDiscountIDs->Fetch()) { $arDiscountID['DISCOUNT_ID'] = intval($arDiscountID['DISCOUNT_ID']); if (0 < $arDiscountID['DISCOUNT_ID']) { $arIDS[] = $arDiscountID['DISCOUNT_ID']; } } if (!empty($arIDS)) { $arIDS = array_values(array_unique($arIDS)); $rsDiscounts = CSaleDiscount::GetList(array("PRIORITY" => "DESC", "SORT" => "ASC"), array('ID' => $arIDS, "LID" => $arOrder["SITE_ID"], "ACTIVE" => "Y", "!>ACTIVE_FROM" => date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL"))), "!<ACTIVE_TO" => date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")))), false, false, array("ID", "PRIORITY", "LAST_DISCOUNT", "UNPACK", "APPLICATION")); while ($arDiscount = $rsDiscounts->Fetch()) { if (self::__Unpack($arOrder, $arDiscount['UNPACK'])) { self::__ApplyActions($arOrder, $arDiscount['APPLICATION']); } if ('Y' == $arDiscount['LAST_DISCOUNT']) { break; } } $arOrder["ORDER_PRICE"] = 0; $arOrder["ORDER_WEIGHT"] = 0; $arOrder["USE_VAT"] = false; $arOrder["VAT_RATE"] = 0; $arOrder["VAT_SUM"] = 0; $arOrder["DISCOUNT_PRICE"] = 0.0; $arOrder["DISCOUNT_VALUE"] = $arOrder["DISCOUNT_PRICE"]; $arOrder["DELIVERY_PRICE"] = $arOrder["PRICE_DELIVERY"]; foreach ($arOrder['BASKET_ITEMS'] as &$arShoppingCartItem) { $arOrder["ORDER_PRICE"] += $arShoppingCartItem["PRICE"] * $arShoppingCartItem["QUANTITY"]; $arOrder["ORDER_WEIGHT"] += $arShoppingCartItem["WEIGHT"] * $arShoppingCartItem["QUANTITY"]; if ($arShoppingCartItem["VAT_RATE"] > 0) { $arOrder["USE_VAT"] = true; if ($arShoppingCartItem["VAT_RATE"] > $arOrder["VAT_RATE"]) { $arOrder["VAT_RATE"] = $arShoppingCartItem["VAT_RATE"]; } $arOrder["VAT_SUM"] += $arShoppingCartItem["VAT_VALUE"] * $arShoppingCartItem["QUANTITY"]; } } if (isset($arShoppingCartItem)) { unset($arShoppingCartItem); } } }
$arDefaultValues = array('LID' => '', 'NAME' => '', 'CURRENCY' => '', 'DISCOUNT_VALUE' => '', 'DISCOUNT_TYPE' => 'P', 'ACTIVE' => 'Y', 'SORT' => '100', 'ACTIVE_FROM' => '', 'ACTIVE_TO' => '', 'PRIORITY' => 1, 'LAST_DISCOUNT' => 'Y', 'CONDITIONS' => '', 'XML_ID' => '', 'ACTIONS' => ''); if (isset($_REQUEST['LID'])) { $arDefaultValues['LID'] = trim($_REQUEST['LID']); } if ('' == $arDefaultValues['LID']) { $arDefaultValues['LID'] = 's1'; } $arSelect = array_merge(array('ID'), array_keys($arDefaultValues)); $arDiscount = array(); $arDiscountGroupList = array(); $rsDiscounts = CSaleDiscount::GetList(array(), array("ID" => $ID), false, false, $arSelect); if (!($arDiscount = $rsDiscounts->Fetch())) { $ID = 0; $arDiscount = $arDefaultValues; } else { $rsDiscountGroups = CSaleDiscount::GetDiscountGroupList(array(), array('DISCOUNT_ID' => $ID), false, false, array('GROUP_ID')); while ($arDiscountGroup = $rsDiscountGroups->Fetch()) { $arDiscountGroupList[] = intval($arDiscountGroup['GROUP_ID']); } } if ($bVarsFromForm) { if ($boolCondParseError || $boolActParseError) { $mxTempo = $arDiscount['CONDITIONS']; $mxTempo2 = $arDiscount['ACTIONS']; $arDiscount = $arFields; if ($boolCondParseError) { $arDiscount['CONDITIONS'] = $mxTempo; } if ($boolActParseError) { $arDiscount['ACTIONS'] = $mxTempo2; }
public static function DoProcessOrder(&$arOrder, $arOptions, &$arErrors) { global $DB; $arIDS = array(); $rsDiscountIDs = CSaleDiscount::GetDiscountGroupList(array(), array('GROUP_ID' => CUser::GetUserGroup($arOrder['USER_ID'])), false, false, array('DISCOUNT_ID')); while ($arDiscountID = $rsDiscountIDs->Fetch()) { $arDiscountID['DISCOUNT_ID'] = (int) $arDiscountID['DISCOUNT_ID']; if (0 < $arDiscountID['DISCOUNT_ID']) { $arIDS[$arDiscountID['DISCOUNT_ID']] = true; } } if (!empty($arIDS)) { if (isset($arOrder['BASKET_ITEMS']) && !empty($arOrder['BASKET_ITEMS']) && is_array($arOrder['BASKET_ITEMS'])) { $arExtend = array('catalog' => array('fields' => true, 'props' => true)); foreach (GetModuleEvents('sale', 'OnExtendBasketItems', true) as $arEvent) { ExecuteModuleEventEx($arEvent, array(&$arOrder['BASKET_ITEMS'], $arExtend)); } foreach ($arOrder['BASKET_ITEMS'] as &$arOneItem) { if (array_key_exists('PRODUCT_PROVIDER_CLASS', $arOneItem) && empty($arOneItem['PRODUCT_PROVIDER_CLASS']) && array_key_exists('CALLBACK_FUNC', $arOneItem) && empty($arOneItem['CALLBACK_FUNC'])) { if (isset($arOneItem['DISCOUNT_PRICE'])) { $arOneItem['PRICE'] += $arOneItem['DISCOUNT_PRICE']; $arOneItem['DISCOUNT_PRICE'] = 0; } } } if (isset($arOneItem)) { unset($arOneItem); } } $arIDS = array_keys($arIDS); if (empty(self::$cacheDiscountHandlers)) { self::$cacheDiscountHandlers = CSaleDiscount::getDiscountHandlers($arIDS); } else { $needDiscountHandlers = array(); foreach ($arIDS as &$discountID) { if (!isset(self::$cacheDiscountHandlers[$discountID])) { $needDiscountHandlers[] = $discountID; } } unset($discountID); if (!empty($needDiscountHandlers)) { $discountHandlersList = CSaleDiscount::getDiscountHandlers($needDiscountHandlers); if (!empty($discountHandlersList)) { foreach ($discountHandlersList as $discountID => $discountHandlers) { self::$cacheDiscountHandlers[$discountID] = $discountHandlers; } unset($discountHandlers, $discountID); } unset($discountHandlersList); } unset($needDiscountHandlers); } $strDate = date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL"))); CTimeZone::Disable(); $rsDiscounts = CSaleDiscount::GetList(array('PRIORITY' => 'DESC', 'SORT' => 'ASC', 'ID' => 'ASC'), array('ID' => $arIDS, 'LID' => $arOrder['SITE_ID'], 'ACTIVE' => 'Y', '!>ACTIVE_FROM' => $strDate, '!<ACTIVE_TO' => $strDate), false, false, array('ID', 'PRIORITY', 'SORT', 'LAST_DISCOUNT', 'UNPACK', 'APPLICATION')); CTimeZone::Enable(); $discountApply = array(); $resultDiscountList = array(); $resultDiscountKeys = array(); $resultDiscountIndex = 0; while ($arDiscount = $rsDiscounts->Fetch()) { if (!isset($discountApply[$arDiscount['ID']])) { $discountApply[$arDiscount['ID']] = true; $applyFlag = true; if (isset(self::$cacheDiscountHandlers[$arDiscount['ID']])) { $moduleList = self::$cacheDiscountHandlers[$arDiscount['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 && self::__Unpack($arOrder, $arDiscount['UNPACK'])) { $oldOrder = $arOrder; self::__ApplyActions($arOrder, $arDiscount['APPLICATION']); $discountResult = self::getDiscountResult($oldOrder, $arOrder, false); if (!empty($discountResult)) { $resultDiscountList[$resultDiscountIndex] = array('ID' => $arDiscount['ID'], 'PRIORITY' => $arDiscount['PRIORITY'], 'SORT' => $arDiscount['SORT'], 'LAST_DISCOUNT' => $arDiscount['LAST_DISCOUNT'], 'UNPACK' => $arDiscount['UNPACK'], 'APPLICATION' => $arDiscount['APPLICATION'], 'RESULT' => $discountResult, 'HANDLERS' => self::$cacheDiscountHandlers[$arDiscount['ID']]); $resultDiscountKeys[$arDiscount['ID']] = $resultDiscountIndex; $resultDiscountIndex++; if ($arDiscount['LAST_DISCOUNT'] == 'Y') { break; } } unset($discountResult); } } } unset($arDiscount, $rsDiscounts); if ($resultDiscountIndex > 0) { $rsDiscounts = CSaleDiscount::GetList(array(), array('ID' => array_keys($resultDiscountKeys)), false, false, array('ID', 'NAME', 'CONDITIONS', 'ACTIONS')); while ($arDiscount = $rsDiscounts->Fetch()) { $arDiscount['ID'] = (int) $arDiscount['ID']; if (isset($resultDiscountKeys[$arDiscount['ID']])) { $key = $resultDiscountKeys[$arDiscount['ID']]; $resultDiscountList[$key]['NAME'] = $arDiscount['NAME']; $resultDiscountList[$key]['CONDITIONS'] = $arDiscount['CONDITIONS']; $resultDiscountList[$key]['ACTIONS'] = $arDiscount['ACTIONS']; } } } $arOrder["ORDER_PRICE"] = 0; $arOrder["ORDER_WEIGHT"] = 0; $arOrder["USE_VAT"] = false; $arOrder["VAT_RATE"] = 0; $arOrder["VAT_SUM"] = 0; $arOrder["DISCOUNT_PRICE"] = 0.0; $arOrder["DISCOUNT_VALUE"] = $arOrder["DISCOUNT_PRICE"]; $arOrder["DELIVERY_PRICE"] = $arOrder["PRICE_DELIVERY"]; foreach ($arOrder['BASKET_ITEMS'] as &$arShoppingCartItem) { if (!CSaleBasketHelper::isSetItem($arShoppingCartItem)) { $arOrder["ORDER_PRICE"] += doubleval($arShoppingCartItem["PRICE"]) * doubleval($arShoppingCartItem["QUANTITY"]); $arOrder["ORDER_WEIGHT"] += $arShoppingCartItem["WEIGHT"] * $arShoppingCartItem["QUANTITY"]; $arShoppingCartItem["PRICE_FORMATED"] = CCurrencyLang::CurrencyFormat($arShoppingCartItem["PRICE"], $arShoppingCartItem["CURRENCY"], true); $arShoppingCartItem["DISCOUNT_PRICE_PERCENT"] = $arShoppingCartItem["DISCOUNT_PRICE"] * 100 / ($arShoppingCartItem["DISCOUNT_PRICE"] + $arShoppingCartItem["PRICE"]); $arShoppingCartItem["DISCOUNT_PRICE_PERCENT_FORMATED"] = roundEx($arShoppingCartItem["DISCOUNT_PRICE_PERCENT"], SALE_VALUE_PRECISION) . "%"; if ($arShoppingCartItem["VAT_RATE"] > 0) { $arOrder["USE_VAT"] = true; if ($arShoppingCartItem["VAT_RATE"] > $arOrder["VAT_RATE"]) { $arOrder["VAT_RATE"] = $arShoppingCartItem["VAT_RATE"]; } $arOrder["VAT_SUM"] += $arShoppingCartItem["VAT_VALUE"] * $arShoppingCartItem["QUANTITY"]; } } } if (isset($arShoppingCartItem)) { unset($arShoppingCartItem); } } }
public static function DoProcessOrder(&$arOrder, $arOptions, &$arErrors) { global $DB; $arIDS = array(); $rsDiscountIDs = CSaleDiscount::GetDiscountGroupList( array(), array('GROUP_ID' => CUser::GetUserGroup($arOrder["USER_ID"])), false, false, array('DISCOUNT_ID') ); while ($arDiscountID = $rsDiscountIDs->Fetch()) { $arDiscountID['DISCOUNT_ID'] = intval($arDiscountID['DISCOUNT_ID']); if (0 < $arDiscountID['DISCOUNT_ID']) $arIDS[$arDiscountID['DISCOUNT_ID']] = true; } if (!empty($arIDS)) { if (array_key_exists('BASKET_ITEMS', $arOrder) && !empty($arOrder['BASKET_ITEMS']) && is_array($arOrder['BASKET_ITEMS'])) { $arExtend = array( 'catalog' => array( 'fields' => true, 'props' => true, ), ); foreach (GetModuleEvents("sale", "OnExtendBasketItems", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array(&$arOrder['BASKET_ITEMS'], $arExtend)); } } $arIDS = array_keys($arIDS); $rsDiscounts = CSaleDiscount::GetList( array("PRIORITY" => "DESC", "SORT" => "ASC"), array( 'ID' => $arIDS, "LID" => $arOrder["SITE_ID"], "ACTIVE" => "Y", "!>ACTIVE_FROM" => date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL"))), "!<ACTIVE_TO" => date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL"))), ), false, false, array("ID", "PRIORITY", "LAST_DISCOUNT", "UNPACK", "APPLICATION") ); while ($arDiscount = $rsDiscounts->Fetch()) { if (self::__Unpack($arOrder, $arDiscount['UNPACK'])) { self::__ApplyActions($arOrder, $arDiscount['APPLICATION']); if ('Y' == $arDiscount['LAST_DISCOUNT']) break; } } $arOrder["ORDER_PRICE"] = 0; $arOrder["ORDER_WEIGHT"] = 0; $arOrder["USE_VAT"] = false; $arOrder["VAT_RATE"] = 0; $arOrder["VAT_SUM"] = 0; $arOrder["DISCOUNT_PRICE"] = 0.0; $arOrder["DISCOUNT_VALUE"] = $arOrder["DISCOUNT_PRICE"]; $arOrder["DELIVERY_PRICE"] = $arOrder["PRICE_DELIVERY"]; foreach ($arOrder['BASKET_ITEMS'] as &$arShoppingCartItem) { $arOrder["ORDER_PRICE"] += $arShoppingCartItem["PRICE"] * $arShoppingCartItem["QUANTITY"]; $arOrder["ORDER_WEIGHT"] += $arShoppingCartItem["WEIGHT"] * $arShoppingCartItem["QUANTITY"]; if ($arShoppingCartItem["VAT_RATE"] > 0) { $arOrder["USE_VAT"] = true; if ($arShoppingCartItem["VAT_RATE"] > $arOrder["VAT_RATE"]) $arOrder["VAT_RATE"] = $arShoppingCartItem["VAT_RATE"]; $arOrder["VAT_SUM"] += $arShoppingCartItem["VAT_VALUE"] * $arShoppingCartItem["QUANTITY"]; } } if (isset($arShoppingCartItem)) unset($arShoppingCartItem); } }