Пример #1
0
 function CancelOrder($ID, $val, $description = "")
 {
     global $DB, $USER;
     $ID = IntVal($ID);
     $val = $val != "Y" ? "N" : "Y";
     $description = Trim($description);
     if ($ID <= 0) {
         $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGO_NO_ORDER_ID1"), "NO_ORDER_ID");
         return False;
     }
     $arOrder = CSaleOrder::GetByID($ID);
     if (!$arOrder) {
         $GLOBALS["APPLICATION"]->ThrowException(str_replace("#ID#", $ID, GetMessage("SKGO_NO_ORDER")), "NO_ORDER");
         return False;
     }
     if ($arOrder["CANCELED"] == $val) {
         $GLOBALS["APPLICATION"]->ThrowException(str_replace("#ID#", $ID, GetMessage("SKGO_DUB_CANCEL")), "ALREADY_FLAG");
         return False;
     }
     foreach (GetModuleEvents("sale", "OnSaleBeforeCancelOrder", true) as $arEvent) {
         if (ExecuteModuleEventEx($arEvent, array($ID, $val)) === false) {
             return false;
         }
     }
     if ($val == "Y") {
         if ($arOrder["PAYED"] == "Y") {
             if (!CSaleOrder::PayOrder($ID, "N", True, True)) {
                 return False;
             }
         } else {
             $arOrder["SUM_PAID"] = DoubleVal($arOrder["SUM_PAID"]);
             if ($arOrder["SUM_PAID"] > 0) {
                 if (!CSaleUserAccount::UpdateAccount($arOrder["USER_ID"], $arOrder["SUM_PAID"], $arOrder["CURRENCY"], "ORDER_CANCEL_PART", $ID)) {
                     return False;
                 }
             }
         }
         if ($arOrder["ALLOW_DELIVERY"] == "Y") {
             if (!CSaleOrder::DeliverOrder($ID, "N")) {
                 return False;
             }
         }
     }
     $arFields = array("CANCELED" => $val, "=DATE_CANCELED" => $DB->GetNowFunction(), "REASON_CANCELED" => strlen($description) > 0 ? $description : false, "EMP_CANCELED_ID" => IntVal($USER->GetID()) > 0 ? IntVal($USER->GetID()) : false);
     $res = CSaleOrder::Update($ID, $arFields);
     unset($GLOBALS["SALE_ORDER"]["SALE_ORDER_CACHE_" . $ID]);
     //this method is used only for catalogs without reservation and deduction support
     CSaleBasket::OrderCanceled($ID, $val == "Y" ? True : False);
     foreach (GetModuleEvents("sale", "OnSaleCancelOrder", true) as $arEvent) {
         ExecuteModuleEventEx($arEvent, array($ID, $val, $description));
     }
     if ($val == "Y") {
         CTimeZone::Disable();
         $arOrder = CSaleOrder::GetByID($ID);
         CTimeZone::Enable();
         $userEmail = "";
         $dbOrderProp = CSaleOrderPropsValue::GetList(array(), array("ORDER_ID" => $ID, "PROP_IS_EMAIL" => "Y"));
         if ($arOrderProp = $dbOrderProp->Fetch()) {
             $userEmail = $arOrderProp["VALUE"];
         }
         if (strlen($userEmail) <= 0) {
             $dbUser = CUser::GetByID($arOrder["USER_ID"]);
             if ($arUser = $dbUser->Fetch()) {
                 $userEmail = $arUser["EMAIL"];
             }
         }
         $event = new CEvent();
         $arFields = array("ORDER_ID" => $ID, "ORDER_DATE" => $arOrder["DATE_INSERT_FORMAT"], "EMAIL" => $userEmail, "ORDER_CANCEL_DESCRIPTION" => $description, "SALE_EMAIL" => COption::GetOptionString("sale", "order_email", "order@" . $_SERVER["SERVER_NAME"]));
         $eventName = "SALE_ORDER_CANCEL";
         $bSend = true;
         foreach (GetModuleEvents("sale", "OnOrderCancelSendEmail", true) as $arEvent) {
             if (ExecuteModuleEventEx($arEvent, array($ID, &$eventName, &$arFields)) === false) {
                 $bSend = false;
             }
         }
         if ($bSend) {
             $event = new CEvent();
             $event->Send($eventName, $arOrder["LID"], $arFields, "N");
         }
         if (CModule::IncludeModule("statistic")) {
             CStatEvent::AddByEvents("eStore", "order_cancel", $ID, "", $arOrder["STAT_GID"]);
         }
     }
     if ($val == "Y") {
         if ($arOrder["DEDUCTED"] == "Y") {
             $rs = CSaleOrder::DeductOrder($ID, "N");
             if (!$rs) {
                 return false;
             }
         }
         if ($arOrder["RESERVED"] == "Y") {
             if (!CSaleOrder::ReserveOrder($ID, "N")) {
             }
             return false;
         }
     } else {
         if (COption::GetOptionString("sale", "product_reserve_condition", "O") == "O" && $arOrder["RESERVED"] != "Y") {
             if (!CSaleOrder::ReserveOrder($ID, "Y")) {
             }
             return false;
         }
     }
     return $res;
 }
Пример #2
0
 function CancelOrder($ID, $val, $description = "")
 {
     global $DB, $USER, $APPLICATION;
     $isOrderConverted = \Bitrix\Main\Config\Option::get("main", "~sale_converted_15", 'N');
     $ID = IntVal($ID);
     $val = $val != "Y" ? "N" : "Y";
     $description = Trim($description);
     if ($ID <= 0) {
         $APPLICATION->ThrowException(Loc::getMessage("SKGO_NO_ORDER_ID1"), "NO_ORDER_ID");
         return false;
     }
     $arOrder = CSaleOrder::GetByID($ID);
     if (!$arOrder) {
         $APPLICATION->ThrowException(str_replace("#ID#", $ID, Loc::getMessage("SKGO_NO_ORDER")), "NO_ORDER");
         return false;
     }
     if ($arOrder["CANCELED"] == $val) {
         $APPLICATION->ThrowException(str_replace("#ID#", $ID, Loc::getMessage("SKGO_DUB_CANCEL")), "ALREADY_FLAG");
         return false;
     }
     if ($isOrderConverted == "Y") {
         $r = \Bitrix\Sale\Compatible\OrderCompatibility::cancel($ID, $val, $description);
         if ($r->isSuccess(true)) {
             $res = true;
         } else {
             $errorMessage = "";
             foreach ($r->getErrorMessages() as $error) {
                 $errorMessage .= " " . $error;
             }
             $APPLICATION->ThrowException(Loc::getMessage("SKGO_CANCEL_ERROR", array("#MESSAGE#" => $errorMessage)), "CANCEL_ERROR");
             return false;
         }
     } else {
         foreach (GetModuleEvents("sale", "OnSaleBeforeCancelOrder", true) as $arEvent) {
             if (ExecuteModuleEventEx($arEvent, array($ID, $val)) === false) {
                 return false;
             }
         }
         if ($val == "Y") {
             if ($arOrder["DEDUCTED"] == "Y") {
                 if (!CSaleOrder::DeductOrder($ID, "N")) {
                     return false;
                 }
             }
             if ($arOrder["RESERVED"] == "Y") {
                 if (!CSaleOrder::ReserveOrder($ID, "N")) {
                     return false;
                 }
             }
             if ($arOrder["PAYED"] == "Y") {
                 if (!CSaleOrder::PayOrder($ID, "N", True, True)) {
                     return False;
                 }
             } else {
                 $arOrder["SUM_PAID"] = DoubleVal($arOrder["SUM_PAID"]);
                 if ($arOrder["SUM_PAID"] > 0) {
                     if (!CSaleUserAccount::UpdateAccount($arOrder["USER_ID"], $arOrder["SUM_PAID"], $arOrder["CURRENCY"], "ORDER_CANCEL_PART", $ID)) {
                         return False;
                     }
                     CSaleOrder::Update($arOrder["ID"], array("SUM_PAID" => 0));
                 }
             }
             if ($arOrder["ALLOW_DELIVERY"] == "Y") {
                 if (!CSaleOrder::DeliverOrder($ID, "N")) {
                     return False;
                 }
             }
         } else {
             if (COption::GetOptionString("sale", "product_reserve_condition", "O") == "O" && $arOrder["RESERVED"] != "Y") {
                 if (!CSaleOrder::ReserveOrder($ID, "Y")) {
                     return false;
                 }
             }
         }
         $arFields = array("CANCELED" => $val, "=DATE_CANCELED" => $DB->GetNowFunction(), "REASON_CANCELED" => strlen($description) > 0 ? $description : false, "EMP_CANCELED_ID" => IntVal($USER->GetID()) > 0 ? IntVal($USER->GetID()) : false);
         $res = CSaleOrder::Update($ID, $arFields);
     }
     unset($GLOBALS["SALE_ORDER"]["SALE_ORDER_CACHE_" . $ID]);
     if ($isOrderConverted != "Y") {
         //this method is used only for catalogs without reservation and deduction support
         CSaleBasket::OrderCanceled($ID, $val == "Y" ? True : False);
         foreach (GetModuleEvents("sale", "OnSaleCancelOrder", true) as $arEvent) {
             ExecuteModuleEventEx($arEvent, array($ID, $val, $description));
         }
     }
     if ($val == "Y") {
         CTimeZone::Disable();
         $arOrder = CSaleOrder::GetByID($ID);
         CTimeZone::Enable();
         $userEmail = "";
         $dbOrderProp = CSaleOrderPropsValue::GetList(array(), array("ORDER_ID" => $ID, "PROP_IS_EMAIL" => "Y"));
         if ($arOrderProp = $dbOrderProp->Fetch()) {
             $userEmail = $arOrderProp["VALUE"];
         }
         if (strlen($userEmail) <= 0) {
             $dbUser = CUser::GetByID($arOrder["USER_ID"]);
             if ($arUser = $dbUser->Fetch()) {
                 $userEmail = $arUser["EMAIL"];
             }
         }
         if (CModule::IncludeModule("statistic")) {
             CStatEvent::AddByEvents("eStore", "order_cancel", $ID, "", $arOrder["STAT_GID"]);
         }
     }
     return $res;
 }
Пример #3
0
 /**
  * <p>Функция привязывает к заказу с кодом OrderID товары из корзины, которые доступны к покупке и не являются отложенными. Эта функция выполняется при оформлении заказа на товары корзины. </p>
  *
  *
  *
  *
  * @param int $orderID  Код заказа, к которому привязываются товары из корзины.
  *
  *
  *
  * @param int $fuserID = 0 Внутренний код владельца корзины. Если не установлен (равен нулю)
  * или текущий пользователь не имеет прав на запись на модуль
  * Интернет-магазина, то берется внутренний код для текущего
  * пользователя.
  *
  *
  *
  * @param string $strLang = SITE_ID Сайт, корзина которого отправляется в заказ. Если не установлен,
  * то берется текущий сайт.
  *
  *
  *
  * @param array $arDiscounts = False Массив скидок на товары.
  *
  *
  *
  * @return mixed 
  *
  *
  * <h4>Example</h4> 
  * <pre>
  * &lt;?
  * // Привяжем записи корзины текущего пользователя на текущем сайте к заказу с кодом $ORDER_ID
  * // Здесь создаем заказ
  * // * * *
  * // Теперь в $ORDER_ID записан код заказа
  * 
  * CSaleBasket::OrderBasket($ORDER_ID, $_SESSION["SALE_USER_ID"], SITE_ID);
  * ?&gt;
  * </pre>
  *
  *
  * @static
  * @link http://dev.1c-bitrix.ru/api_help/sale/classes/csalebasket/csalebasket__orderbasket.2ba66ff5.php
  * @author Bitrix
  */
 public static function OrderBasket($orderID, $fuserID = 0, $strLang = LANG, $arDiscounts = False)
 {
     $orderID = IntVal($orderID);
     if ($orderID <= 0) {
         return false;
     }
     $fuserID = IntVal($fuserID);
     if ($fuserID <= 0) {
         $fuserID = CSaleBasket::GetBasketUserID();
     }
     $arOrder = array();
     if (empty($arOrder)) {
         $rsOrders = CSaleOrder::GetList(array(), array('ID' => $orderID), false, false, array('ID', 'USER_ID', 'RECURRING_ID', 'LID', 'RESERVED'));
         if (!($arOrder = $rsOrders->Fetch())) {
             return false;
         }
         $arOrder['RECURRING_ID'] = intval($arOrder['RECURRING_ID']);
     }
     $boolRecurring = 0 < $arOrder['RECURRING_ID'];
     $findEmptyBasket = false;
     $dbBasketList = CSaleBasket::GetList(array("PRICE" => "DESC"), array("FUSER_ID" => $fuserID, "LID" => $strLang, "ORDER_ID" => 0));
     while ($arBasket = $dbBasketList->Fetch()) {
         $findEmptyBasket = true;
         $arFields = array();
         if ($arBasket["DELAY"] == "N" && $arBasket["CAN_BUY"] == "Y") {
             if (!empty($arBasket["ORDER_CALLBACK_FUNC"]) || !empty($arBasket["PRODUCT_PROVIDER_CLASS"])) {
                 /** @var $productProvider IBXSaleProductProvider */
                 if ($productProvider = CSaleBasket::GetProductProvider($arBasket)) {
                     $arQuery = array("PRODUCT_ID" => $arBasket["PRODUCT_ID"], "QUANTITY" => $arBasket["QUANTITY"]);
                     if ($boolRecurring) {
                         $arQuery['RENEWAL'] = 'Y';
                         $arQuery['USER_ID'] = $arOrder['USER_ID'];
                         $arQuery['SITE_ID'] = $strLang;
                     }
                     $arFields = $productProvider::OrderProduct($arQuery);
                 } else {
                     if ($boolRecurring) {
                         $arFields = CSaleBasket::ExecuteCallbackFunction($arBasket["ORDER_CALLBACK_FUNC"], $arBasket["MODULE"], $arBasket["PRODUCT_ID"], $arBasket["QUANTITY"], 'Y', $arOrder['USER_ID'], $strLang);
                     } else {
                         $arFields = CSaleBasket::ExecuteCallbackFunction($arBasket["ORDER_CALLBACK_FUNC"], $arBasket["MODULE"], $arBasket["PRODUCT_ID"], $arBasket["QUANTITY"]);
                     }
                 }
                 if ($arFields && is_array($arFields) && !empty($arFields)) {
                     $arFields["CAN_BUY"] = "Y";
                 } elseif (is_array($arFields) && empty($arFields)) {
                     unset($arFields);
                     $arFields["CAN_BUY"] = "N";
                 }
             }
             if ($arFields["CAN_BUY"] == "Y" || empty($arFields) && $arBasket["CAN_BUY"] == "Y") {
                 $arFields["ORDER_ID"] = $orderID;
             }
             if (!empty($arFields)) {
                 if (CSaleBasket::Update($arBasket["ID"], $arFields)) {
                     $_SESSION["SALE_BASKET_NUM_PRODUCTS"][SITE_ID]--;
                 }
             }
         }
     }
     //end of while
     if (!$findEmptyBasket) {
         $dbBasketList = CSaleBasket::GetList(array("PRICE" => "DESC"), array("FUSER_ID" => $fuserID, "LID" => $strLang, "ORDER_ID" => $orderID));
         while ($arBasket = $dbBasketList->Fetch()) {
             $arFields = array();
             if ($arBasket["DELAY"] == "N" && $arBasket["CAN_BUY"] == "Y") {
                 if (!empty($arBasket["ORDER_CALLBACK_FUNC"]) || !empty($arBasket["PRODUCT_PROVIDER_CLASS"])) {
                     /** @var $productProvider IBXSaleProductProvider */
                     if ($productProvider = CSaleBasket::GetProductProvider($arBasket)) {
                         $arQuery = array("PRODUCT_ID" => $arBasket["PRODUCT_ID"], "QUANTITY" => $arBasket["QUANTITY"]);
                         if ($boolRecurring) {
                             $arQuery['RENEWAL'] = 'Y';
                             $arQuery['USER_ID'] = $arOrder['USER_ID'];
                             $arQuery['SITE_ID'] = $strLang;
                         }
                         $arFields = $productProvider::OrderProduct($arQuery);
                     } else {
                         if ($boolRecurring) {
                             $arFields = CSaleBasket::ExecuteCallbackFunction($arBasket["ORDER_CALLBACK_FUNC"], $arBasket["MODULE"], $arBasket["PRODUCT_ID"], $arBasket["QUANTITY"], 'Y', $arOrder['USER_ID'], $strLang);
                         } else {
                             $arFields = CSaleBasket::ExecuteCallbackFunction($arBasket["ORDER_CALLBACK_FUNC"], $arBasket["MODULE"], $arBasket["PRODUCT_ID"], $arBasket["QUANTITY"]);
                         }
                     }
                     if ($arFields && is_array($arFields) && !empty($arFields)) {
                         $arFields["CAN_BUY"] = "Y";
                     } elseif (is_array($arFields) && empty($arFields)) {
                         unset($arFields);
                         $arFields["CAN_BUY"] = "N";
                     }
                 }
                 if ($arFields["CAN_BUY"] == "Y" || empty($arFields) && $arBasket["CAN_BUY"] == "Y") {
                     $arFields["ORDER_ID"] = $orderID;
                 }
                 if (!empty($arFields)) {
                     $_SESSION["SALE_BASKET_NUM_PRODUCTS"][SITE_ID]--;
                 }
             }
         }
         //end of while
     }
     if ($_SESSION["SALE_BASKET_NUM_PRODUCTS"][SITE_ID] < 0) {
         $_SESSION["SALE_BASKET_NUM_PRODUCTS"][SITE_ID] = 0;
     }
     foreach (GetModuleEvents("sale", "OnBasketOrder", true) as $arEvent) {
         ExecuteModuleEventEx($arEvent, array($orderID, $fuserID, $strLang, $arDiscounts));
     }
     //reservation
     if ($arOrder['RESERVED'] != "Y" && COption::GetOptionString("sale", "product_reserve_condition", "O") == "O") {
         if (!CSaleOrder::ReserveOrder($orderID, "Y")) {
             return false;
         }
     }
 }
Пример #4
0
 function OrderBasket($orderID, $fuserID = 0, $strLang = SITE_ID, $arDiscounts = False)
 {
     $orderID = (int) $orderID;
     if ($orderID <= 0) {
         return false;
     }
     $fuserID = (int) $fuserID;
     if ($fuserID <= 0) {
         $fuserID = (int) CSaleBasket::GetBasketUserID(true);
     }
     if ($fuserID <= 0) {
         return false;
     }
     $arOrder = array();
     if (empty($arOrder)) {
         $rsOrders = CSaleOrder::GetList(array(), array('ID' => $orderID), false, false, array('ID', 'USER_ID', 'RECURRING_ID', 'LID', 'RESERVED'));
         if (!($arOrder = $rsOrders->Fetch())) {
             return false;
         }
         $arOrder['RECURRING_ID'] = (int) $arOrder['RECURRING_ID'];
     }
     $boolRecurring = $arOrder['RECURRING_ID'] > 0;
     $needSaveCoupons = false;
     $dbBasketList = CSaleBasket::GetList(array("PRICE" => "DESC"), array("FUSER_ID" => $fuserID, "LID" => $strLang, "ORDER_ID" => 0), false, false, array('ID', 'ORDER_ID', 'PRODUCT_ID', 'MODULE', 'CAN_BUY', 'DELAY', 'ORDER_CALLBACK_FUNC', 'PRODUCT_PROVIDER_CLASS', 'QUANTITY'));
     while ($arBasket = $dbBasketList->Fetch()) {
         $arFields = array();
         if ($arBasket["DELAY"] == "N" && $arBasket["CAN_BUY"] == "Y") {
             if (!empty($arBasket["ORDER_CALLBACK_FUNC"]) || !empty($arBasket["PRODUCT_PROVIDER_CLASS"])) {
                 /** @var $productProvider IBXSaleProductProvider */
                 if ($productProvider = CSaleBasket::GetProductProvider($arBasket)) {
                     $arQuery = array("PRODUCT_ID" => $arBasket["PRODUCT_ID"], "QUANTITY" => $arBasket["QUANTITY"], 'BASKET_ID' => $arBasket['ID']);
                     if ($boolRecurring) {
                         $arQuery['RENEWAL'] = 'Y';
                         $arQuery['USER_ID'] = $arOrder['USER_ID'];
                         $arQuery['SITE_ID'] = $strLang;
                     }
                     $arFields = $productProvider::OrderProduct($arQuery);
                 } else {
                     if ($boolRecurring) {
                         $arFields = CSaleBasket::ExecuteCallbackFunction($arBasket["ORDER_CALLBACK_FUNC"], $arBasket["MODULE"], $arBasket["PRODUCT_ID"], $arBasket["QUANTITY"], 'Y', $arOrder['USER_ID'], $strLang);
                     } else {
                         $arFields = CSaleBasket::ExecuteCallbackFunction($arBasket["ORDER_CALLBACK_FUNC"], $arBasket["MODULE"], $arBasket["PRODUCT_ID"], $arBasket["QUANTITY"]);
                     }
                 }
                 if (!empty($arFields) && is_array($arFields)) {
                     $arFields["CAN_BUY"] = "Y";
                     $arFields["ORDER_ID"] = $orderID;
                     $needSaveCoupons = true;
                 } else {
                     $arFields = array('CAN_BUY' => 'N');
                     $removeCoupon = DiscountCouponsManager::deleteApplyByProduct(array('MODULE' => $arBasket['MODULE'], 'PRODUCT_ID' => $arBasket['PRODUCT_ID'], 'BASKET_ID' => $arBasket['ID']));
                 }
             } else {
                 $arFields["ORDER_ID"] = $orderID;
                 $needSaveCoupons = true;
             }
             if (!empty($arFields)) {
                 if (CSaleBasket::Update($arBasket["ID"], $arFields)) {
                     $_SESSION["SALE_BASKET_NUM_PRODUCTS"][SITE_ID]--;
                 }
             }
         }
     }
     //end of while
     if ($_SESSION["SALE_BASKET_NUM_PRODUCTS"][SITE_ID] < 0) {
         $_SESSION["SALE_BASKET_NUM_PRODUCTS"][SITE_ID] = 0;
     }
     foreach (GetModuleEvents("sale", "OnBasketOrder", true) as $arEvent) {
         ExecuteModuleEventEx($arEvent, array($orderID, $fuserID, $strLang, $arDiscounts));
     }
     if ($needSaveCoupons) {
         DiscountCouponsManager::finalApply();
         DiscountCouponsManager::saveApplied();
     }
     //reservation
     if ($arOrder['RESERVED'] != "Y" && COption::GetOptionString("sale", "product_reserve_condition") == "O") {
         if (!CSaleOrder::ReserveOrder($orderID, "Y")) {
             return false;
         }
     }
     return true;
 }
Пример #5
0
 function OrderBasket($orderID, $fuserID = 0, $strLang = LANG, $arDiscounts = False)
 {
     global $DB, $APPLICATION;
     $orderID = IntVal($orderID);
     if ($orderID <= 0) {
         return False;
     }
     $fuserID = IntVal($fuserID);
     if ($fuserID <= 0) {
         $fuserID = CSaleBasket::GetBasketUserID();
     }
     $dbBasketList = CSaleBasket::GetList(array("PRICE" => "DESC"), array("FUSER_ID" => $fuserID, "LID" => $strLang, "ORDER_ID" => 0));
     while ($arBasket = $dbBasketList->Fetch()) {
         /*
         if (strlen($arBasket["CALLBACK_FUNC"]) > 0)
         {
         	CSaleBasket::UpdatePrice($arBasket["ID"], $arBasket["CALLBACK_FUNC"], $arBasket["MODULE"], $arBasket["PRODUCT_ID"], $arBasket["QUANTITY"]);
         	$arBasket = CSaleBasket::GetByID($arBasket["ID"]);
         }
         */
         $arFields = array();
         if ($arBasket["DELAY"] == "N" && $arBasket["CAN_BUY"] == "Y") {
             if (strlen($arBasket["ORDER_CALLBACK_FUNC"]) > 0 || strlen($arBasket["PRODUCT_PROVIDER_CLASS"])) {
                 /** @var $productProvider IBXSaleProductProvider */
                 if ($productProvider = CSaleBasket::GetProductProvider($arBasket)) {
                     $arFields = $productProvider::OrderProduct(array("PRODUCT_ID" => $arBasket["PRODUCT_ID"], "QUANTITY" => $arBasket["QUANTITY"]));
                 } else {
                     $arFields = CSaleBasket::ExecuteCallbackFunction($arBasket["ORDER_CALLBACK_FUNC"], $arBasket["MODULE"], $arBasket["PRODUCT_ID"], $arBasket["QUANTITY"], $orderID);
                 }
                 if ($arFields && is_array($arFields) && count($arFields) > 0) {
                     $arFields["CAN_BUY"] = "Y";
                 } elseif (is_array($arFields) && count($arFields) <= 0) {
                     unset($arFields);
                     $arFields["CAN_BUY"] = "N";
                 }
             }
             if ($arFields["CAN_BUY"] == "Y" || empty($arFields) && $arBasket["CAN_BUY"] == "Y") {
                 $arFields["ORDER_ID"] = $orderID;
                 //if ($arDiscounts && is_array($arDiscounts) && count($arDiscounts) > 0)
                 //$arFields["DISCOUNT_PRICE"] = $arDiscounts[IntVal($arBasket["ID"])];
             }
             if (!empty($arFields)) {
                 if (CSaleBasket::Update($arBasket["ID"], $arFields)) {
                     $_SESSION["SALE_BASKET_NUM_PRODUCTS"][SITE_ID]--;
                 }
             }
         }
     }
     //end of while
     if ($_SESSION["SALE_BASKET_NUM_PRODUCTS"][SITE_ID] < 0) {
         $_SESSION["SALE_BASKET_NUM_PRODUCTS"][SITE_ID] = 0;
     }
     //reservation
     if (COption::GetOptionString("sale", "product_reserve_condition", "O") == "O") {
         if (!CSaleOrder::ReserveOrder($orderID, "Y")) {
             return false;
         }
     }
     //$_SESSION["SALE_BASKET_NUM_PRODUCTS"][SITE_ID] = 0;
     foreach (GetModuleEvents("sale", "OnBasketOrder", true) as $arEvent) {
         ExecuteModuleEventEx($arEvent, array($orderID, $fuserID, $strLang, $arDiscounts));
     }
 }