示例#1
0
 public static function DoGetUserShoppingCart($siteId, $userId, $shoppingCart, &$arErrors, $arCoupons = array(), $orderId = 0, $enableCustomCurrency = false)
 {
     $siteId = trim($siteId);
     if (empty($siteId)) {
         $arErrors[] = array("CODE" => "PARAM", "TEXT" => Loc::getMessage('SKGB_PARAM_SITE_ERROR'));
         return null;
     }
     $userId = intval($userId);
     if (!is_array($shoppingCart)) {
         if (intval($shoppingCart) . "|" != $shoppingCart . "|") {
             $arErrors[] = array("CODE" => "PARAM", "TEXT" => Loc::getMessage('SKGB_PARAM_SK_ERROR'));
             return null;
         }
         $shoppingCart = intval($shoppingCart);
         $dbShoppingCartItems = CSaleBasket::GetList(array("NAME" => "ASC"), array("FUSER_ID" => $shoppingCart, "LID" => $siteId, "ORDER_ID" => "NULL", "DELAY" => "N"), false, false, array("ID", "LID", "CALLBACK_FUNC", "MODULE", "PRODUCT_ID", "QUANTITY", "DELAY", "CAN_BUY", "PRICE", "WEIGHT", "NAME", "CURRENCY", "CATALOG_XML_ID", "VAT_RATE", "NOTES", "DISCOUNT_PRICE", "DETAIL_PAGE_URL", "PRODUCT_PROVIDER_CLASS", "RESERVED", "DEDUCTED", "RESERVE_QUANTITY", "DIMENSIONS", "TYPE", "SET_PARENT_ID"));
         $arTmp = array();
         while ($arShoppingCartItem = $dbShoppingCartItems->Fetch()) {
             $arTmp[] = $arShoppingCartItem;
         }
         $shoppingCart = $arTmp;
     }
     $arOldShoppingCart = array();
     if ($orderId != 0) {
         $dbs = CSaleBasket::GetList(array("NAME" => "ASC"), array("LID" => $siteId, "ORDER_ID" => $orderId, "DELAY" => "N"), false, false, array("ID", "LID", "CALLBACK_FUNC", "MODULE", "PRODUCT_ID", "PRODUCT_PRICE_ID", "PRICE", "QUANTITY", "DELAY", "CAN_BUY", "PRICE", "WEIGHT", "NAME", "CURRENCY", "CATALOG_XML_ID", "VAT_RATE", "NOTES", "DISCOUNT_PRICE", "DETAIL_PAGE_URL", "PRODUCT_PROVIDER_CLASS", "RESERVED", "DEDUCTED", "BARCODE_MULTI", "DIMENSIONS", "TYPE", "SET_PARENT_ID"));
         while ($arOldShoppingCartItem = $dbs->Fetch()) {
             $arOldShoppingCart[$arOldShoppingCartItem["ID"]] = $arOldShoppingCartItem;
         }
     }
     if (CSaleHelper::IsAssociativeArray($shoppingCart)) {
         $shoppingCart = array($shoppingCart);
     }
     if (!empty($arCoupons)) {
         if (!is_array($arCoupons)) {
             $arCoupons = array($arCoupons);
         }
         foreach (GetModuleEvents("sale", "OnSetCouponList", true) as $arEvent) {
             ExecuteModuleEventEx($arEvent, array($userId, $arCoupons, array()));
         }
         foreach ($arCoupons as &$coupon) {
             $couponResult = DiscountCouponsManager::add($coupon);
         }
         unset($coupon);
     }
     if (!is_bool($enableCustomCurrency)) {
         $enableCustomCurrency = false;
     }
     $arResult = array();
     $emptyID = 1;
     foreach ($shoppingCart as &$arShoppingCartItem) {
         if (array_key_exists("CALLBACK_FUNC", $arShoppingCartItem) && !empty($arShoppingCartItem["CALLBACK_FUNC"]) || array_key_exists("PRODUCT_PROVIDER_CLASS", $arShoppingCartItem) && !empty($arShoppingCartItem["PRODUCT_PROVIDER_CLASS"])) {
             // get quantity difference to check its availability
             if ($orderId != 0) {
                 $quantity = $arShoppingCartItem["QUANTITY"] - $arOldShoppingCart[$arShoppingCartItem["ID_TMP"]]["QUANTITY"];
             } else {
                 $quantity = $arShoppingCartItem["QUANTITY"];
             }
             $customPrice = isset($arShoppingCartItem['CUSTOM_PRICE']) && $arShoppingCartItem['CUSTOM_PRICE'] == 'Y';
             $existBasketID = array_key_exists('ID', $arShoppingCartItem) && (int) $arShoppingCartItem['ID'] > 0;
             /** @var $productProvider IBXSaleProductProvider */
             if ($productProvider = CSaleBasket::GetProductProvider($arShoppingCartItem)) {
                 if ($existBasketID) {
                     $basketID = $arShoppingCartItem['ID'];
                 } elseif (isset($arShoppingCartItem["ID_TMP"])) {
                     $basketID = $arShoppingCartItem["ID_TMP"];
                 } else {
                     $basketID = 'tmp_' . $emptyID;
                     $emptyID++;
                 }
                 $providerParams = array("PRODUCT_ID" => $arShoppingCartItem["PRODUCT_ID"], "QUANTITY" => $quantity > 0 ? $quantity : $arShoppingCartItem["QUANTITY"], "RENEWAL" => "N", "USER_ID" => $userId, "SITE_ID" => $siteId, "BASKET_ID" => $basketID, "CHECK_QUANTITY" => $quantity > 0 ? "Y" : "N", "CHECK_COUPONS" => 'Y' == $arShoppingCartItem['CAN_BUY'] && (!array_key_exists('DELAY', $arShoppingCartItem) || 'Y' != $arShoppingCartItem['DELAY']) ? 'Y' : 'N', "CHECK_PRICE" => $customPrice ? "N" : "Y");
                 if (isset($arShoppingCartItem['NOTES'])) {
                     $providerParams['NOTES'] = $arShoppingCartItem['NOTES'];
                 }
                 $arFieldsTmp = $productProvider::GetProductData($providerParams);
                 unset($providerParams);
             } else {
                 $arFieldsTmp = CSaleBasket::ExecuteCallbackFunction($arShoppingCartItem["CALLBACK_FUNC"], $arShoppingCartItem["MODULE"], $arShoppingCartItem["PRODUCT_ID"], $quantity, "N", $userId, $siteId);
                 if (!empty($arFieldsTmp) && is_array($arFieldsTmp)) {
                     if ($customPrice) {
                         unset($arFieldsTmp['PRICE']);
                         unset($arFieldsTmp['CURRENCY']);
                     }
                 }
             }
             if (!empty($arFieldsTmp) && is_array($arFieldsTmp)) {
                 $arFieldsTmp["CAN_BUY"] = "Y";
                 $arFieldsTmp["SUBSCRIBE"] = "N";
                 $arFieldsTmp['TYPE'] = (int) $arShoppingCartItem['TYPE'];
                 $arFieldsTmp['SET_PARENT_ID'] = $arShoppingCartItem['SET_PARENT_ID'];
                 $arFieldsTmp['LID'] = $siteId;
             } else {
                 $arFieldsTmp = array("CAN_BUY" => "N");
             }
             if ($existBasketID) {
                 $arFieldsTmp["IGNORE_CALLBACK_FUNC"] = "Y";
                 CSaleBasket::Update($arShoppingCartItem["ID"], $arFieldsTmp);
                 $dbTmp = CSaleBasket::GetList(array(), array("ID" => $arShoppingCartItem["ID"]), false, false, array("ID", "CALLBACK_FUNC", "MODULE", "PRODUCT_ID", "QUANTITY", "DELAY", "CAN_BUY", "PRICE", "TYPE", "SET_PARENT_ID", "WEIGHT", "NAME", "CURRENCY", "CATALOG_XML_ID", "VAT_RATE", "NOTES", "DISCOUNT_PRICE", "DETAIL_PAGE_URL", "PRODUCT_PROVIDER_CLASS", "DIMENSIONS"));
                 $arTmp = $dbTmp->Fetch();
                 foreach ($arTmp as $key => $val) {
                     $arShoppingCartItem[$key] = $val;
                 }
             } else {
                 foreach ($arFieldsTmp as $key => $val) {
                     // update returned quantity for the product if quantity difference is available
                     if ($orderId != 0 && $key == "QUANTITY" && $arOldShoppingCart[$arShoppingCartItem["ID_TMP"]]["RESERVED"] == "Y" && $quantity > 0) {
                         $arShoppingCartItem[$key] = $val + $arOldShoppingCart[$arShoppingCartItem["ID_TMP"]]["QUANTITY"];
                     } else {
                         $arShoppingCartItem[$key] = $val;
                     }
                 }
             }
         }
         if ($arShoppingCartItem["CAN_BUY"] == "Y") {
             if (!$enableCustomCurrency) {
                 $baseLangCurrency = CSaleLang::GetLangCurrency($siteId);
                 if ($baseLangCurrency != $arShoppingCartItem["CURRENCY"]) {
                     $arShoppingCartItem["PRICE"] = CCurrencyRates::ConvertCurrency($arShoppingCartItem["PRICE"], $arShoppingCartItem["CURRENCY"], $baseLangCurrency);
                     if (is_set($arShoppingCartItem, "DISCOUNT_PRICE")) {
                         $arShoppingCartItem["DISCOUNT_PRICE"] = CCurrencyRates::ConvertCurrency($arShoppingCartItem["DISCOUNT_PRICE"], $arShoppingCartItem["CURRENCY"], $baseLangCurrency);
                     }
                     $arShoppingCartItem["CURRENCY"] = $baseLangCurrency;
                 }
             }
             $arShoppingCartItem["PRICE"] = roundEx($arShoppingCartItem["PRICE"], SALE_VALUE_PRECISION);
             $arShoppingCartItem["QUANTITY"] = floatval($arShoppingCartItem["QUANTITY"]);
             $arShoppingCartItem["WEIGHT"] = floatval($arShoppingCartItem["WEIGHT"]);
             $arShoppingCartItem["DIMENSIONS"] = unserialize($arShoppingCartItem["DIMENSIONS"]);
             $arShoppingCartItem["VAT_RATE"] = floatval($arShoppingCartItem["VAT_RATE"]);
             $arShoppingCartItem["DISCOUNT_PRICE"] = roundEx($arShoppingCartItem["DISCOUNT_PRICE"], SALE_VALUE_PRECISION);
             if ($arShoppingCartItem["VAT_RATE"] > 0) {
                 $arShoppingCartItem["VAT_VALUE"] = $arShoppingCartItem["PRICE"] / ($arShoppingCartItem["VAT_RATE"] + 1) * $arShoppingCartItem["VAT_RATE"];
             }
             //$arShoppingCartItem["VAT_VALUE"] = roundEx((($arShoppingCartItem["PRICE"] / ($arShoppingCartItem["VAT_RATE"] + 1)) * $arShoppingCartItem["VAT_RATE"]), SALE_VALUE_PRECISION);
             if ($arShoppingCartItem["DISCOUNT_PRICE"] > 0) {
                 $arShoppingCartItem["DISCOUNT_PRICE_PERCENT"] = $arShoppingCartItem["DISCOUNT_PRICE"] * 100 / ($arShoppingCartItem["DISCOUNT_PRICE"] + $arShoppingCartItem["PRICE"]);
             }
             $arResult[] = $arShoppingCartItem;
         }
     }
     if (isset($arShoppingCartItem)) {
         unset($arShoppingCartItem);
     }
     if (!empty($arCoupons) && is_array($arCoupons)) {
         foreach (GetModuleEvents("sale", "OnClearCouponList", true) as $arEvent) {
             ExecuteModuleEventEx($arEvent, array($userId, $arCoupons, array()));
         }
     }
     return $arResult;
 }
示例#2
0
 function DoGetUserShoppingCart($siteId, $userId, $shoppingCart, &$arErrors, $arCoupons = array(), $tmpOrderId = 0)
 {
     $siteId = trim($siteId);
     if (empty($siteId)) {
         $arErrors[] = array("CODE" => "PARAM", "TEXT" => GetMessage('SKGB_PARAM_SITE_ERROR'));
         return null;
     }
     $userId = intval($userId);
     if (!is_array($shoppingCart)) {
         if (intval($shoppingCart) . "|" != $shoppingCart . "|") {
             $arErrors[] = array("CODE" => "PARAM", "TEXT" => GetMessage('SKGB_PARAM_SK_ERROR'));
             return null;
         }
         $shoppingCart = intval($shoppingCart);
         $dbShoppingCartItems = CSaleBasket::GetList(array("NAME" => "ASC"), array("FUSER_ID" => $shoppingCart, "LID" => $siteId, "ORDER_ID" => "NULL", "DELAY" => "N"), false, false, array("ID", "CALLBACK_FUNC", "MODULE", "PRODUCT_ID", "QUANTITY", "DELAY", "CAN_BUY", "PRICE", "WEIGHT", "NAME", "CURRENCY", "CATALOG_XML_ID", "VAT_RATE", "NOTES", "DISCOUNT_PRICE", "DETAIL_PAGE_URL", "PRODUCT_PROVIDER_CLASS", "RESERVED", "DEDUCTED", "RESERVE_QUANTITY"));
         $arTmp = array();
         while ($arShoppingCartItem = $dbShoppingCartItems->Fetch()) {
             $arTmp[] = $arShoppingCartItem;
         }
         $shoppingCart = $arTmp;
     }
     $arOldShoppingCart = array();
     if ($tmpOrderId != 0) {
         $dbs = CSaleBasket::GetList(array("NAME" => "ASC"), array("LID" => $siteId, "ORDER_ID" => $tmpOrderId, "DELAY" => "N"), false, false, array("ID", "CALLBACK_FUNC", "MODULE", "PRODUCT_ID", "PRODUCT_PRICE_ID", "PRICE", "QUANTITY", "DELAY", "CAN_BUY", "PRICE", "WEIGHT", "NAME", "CURRENCY", "CATALOG_XML_ID", "VAT_RATE", "NOTES", "DISCOUNT_PRICE", "DETAIL_PAGE_URL", "PRODUCT_PROVIDER_CLASS", "RESERVED", "DEDUCTED", "BARCODE_MULTI"));
         while ($arOldShoppingCartItem = $dbs->Fetch()) {
             $arOldShoppingCart[$arOldShoppingCartItem["ID"]] = $arOldShoppingCartItem;
         }
     }
     if (CSaleHelper::IsAssociativeArray($shoppingCart)) {
         $shoppingCart = array($shoppingCart);
     }
     if (is_array($arCoupons) && count($arCoupons) > 0) {
         foreach (GetModuleEvents("sale", "OnSetCouponList", true) as $arEvent) {
             ExecuteModuleEventEx($arEvent, array($userId, $arCoupons, array()));
         }
     }
     $arResult = array();
     foreach ($shoppingCart as &$arShoppingCartItem) {
         if (array_key_exists("CALLBACK_FUNC", $arShoppingCartItem) && !empty($arShoppingCartItem["CALLBACK_FUNC"]) || array_key_exists("PRODUCT_PROVIDER_CLASS", $arShoppingCartItem) && !empty($arShoppingCartItem["PRODUCT_PROVIDER_CLASS"])) {
             if (($arOldShoppingCart[$arShoppingCartItem["ID_TMP"]]["RESERVED"] == "Y" || $arOldShoppingCart[$arShoppingCartItem["ID_TMP"]]["DEDUCTED"] == "Y") && $tmpOrderId != 0) {
                 $quantity = $arShoppingCartItem["QUANTITY"] - $arOldShoppingCart[$arShoppingCartItem["ID_TMP"]]["QUANTITY"];
             } else {
                 $quantity = $arShoppingCartItem["QUANTITY"];
             }
             if ($quantity > 0) {
                 /** @var $productProvider IBXSaleProductProvider */
                 if ($productProvider = CSaleBasket::GetProductProvider($arShoppingCartItem)) {
                     $arFieldsTmp = $productProvider::GetProductData(array("PRODUCT_ID" => $arShoppingCartItem["PRODUCT_ID"], "QUANTITY" => $quantity, "RENEWAL" => "N", "USER_ID" => $userId, "SITE_ID" => $siteId));
                 } else {
                     // USER CODE ->
                     $arFieldsTmp = CSaleBasket::ExecuteCallbackFunction($arShoppingCartItem["CALLBACK_FUNC"], $arShoppingCartItem["MODULE"], $arShoppingCartItem["PRODUCT_ID"], $quantity, "N", $userId, $siteId);
                 }
             } else {
                 $arFieldsTmp = array("PRODUCT_PRICE_ID" => $arOldShoppingCart[$arShoppingCartItem["ID_TMP"]]["PRODUCT_PRICE_ID"], "PRICE" => $arOldShoppingCart[$arShoppingCartItem["ID_TMP"]]["PRICE"], "VAT_RATE" => $arOldShoppingCart[$arShoppingCartItem["ID_TMP"]]["VAT_RATE"], "CURRENCY" => $arOldShoppingCart[$arShoppingCartItem["ID_TMP"]]["CURRENCY"], "QUANTITY" => $arShoppingCartItem["QUANTITY"], "DISCOUNT_PRICE" => $arOldShoppingCart[$arShoppingCartItem["ID_TMP"]]["DISCOUNT_PRICE"], "WEIGHT" => $arOldShoppingCart[$arShoppingCartItem["ID_TMP"]]["WEIGHT"], "NAME" => $arOldShoppingCart[$arShoppingCartItem["ID_TMP"]]["NAME"], "CAN_BUY" => $arOldShoppingCart[$arShoppingCartItem["ID_TMP"]]["CAN_BUY"], "DETAIL_PAGE_URL" => $arOldShoppingCart[$arShoppingCartItem["ID_TMP"]]["DETAIL_PAGE_URL"], "NOTES" => $arOldShoppingCart[$arShoppingCartItem["ID_TMP"]]["NOTES"], "BARCODE_MULTI" => $arOldShoppingCart[$arShoppingCartItem["ID_TMP"]]["BARCODE_MULTI"]);
             }
             if (isset($arShoppingCartItem["CUSTOM_PRICE"]) && $arShoppingCartItem["CUSTOM_PRICE"] == "Y") {
                 unset($arFieldsTmp["PRICE"]);
             }
             if ($arFieldsTmp && is_array($arFieldsTmp) && count($arFieldsTmp) > 0) {
                 $arFieldsTmp["CAN_BUY"] = "Y";
                 $arFieldsTmp["SUBSCRIBE"] = "N";
             } else {
                 $arFieldsTmp = array("CAN_BUY" => "N");
             }
             if (array_key_exists("ID", $arShoppingCartItem) && intval($arShoppingCartItem["ID"]) > 0) {
                 $arFieldsTmp["IGNORE_CALLBACK_FUNC"] = "Y";
                 CSaleBasket::Update($arShoppingCartItem["ID"], $arFieldsTmp);
                 $dbTmp = CSaleBasket::GetList(array(), array("ID" => $arShoppingCartItem["ID"]), false, false, array("ID", "CALLBACK_FUNC", "MODULE", "PRODUCT_ID", "QUANTITY", "DELAY", "CAN_BUY", "PRICE", "WEIGHT", "NAME", "CURRENCY", "CATALOG_XML_ID", "VAT_RATE", "NOTES", "DISCOUNT_PRICE", "DETAIL_PAGE_URL", "PRODUCT_PROVIDER_CLASS"));
                 $arTmp = $dbTmp->Fetch();
                 foreach ($arTmp as $key => $val) {
                     $arShoppingCartItem[$key] = $val;
                 }
             } else {
                 foreach ($arFieldsTmp as $key => $val) {
                     if ($tmpOrderId != 0 && $key == "QUANTITY" && $arOldShoppingCart[$arShoppingCartItem["ID_TMP"]]["RESERVED"] == "Y" && $quantity > 0) {
                         $arShoppingCartItem[$key] = $val + $arOldShoppingCart[$arShoppingCartItem["ID_TMP"]]["QUANTITY"];
                     } else {
                         $arShoppingCartItem[$key] = $val;
                     }
                 }
             }
         }
         if ($arShoppingCartItem["CAN_BUY"] == "Y") {
             $baseLangCurrency = CSaleLang::GetLangCurrency($siteId);
             if ($baseLangCurrency != $arShoppingCartItem["CURRENCY"]) {
                 $arShoppingCartItem["PRICE"] = CCurrencyRates::ConvertCurrency($arShoppingCartItem["PRICE"], $arShoppingCartItem["CURRENCY"], $baseLangCurrency);
                 if (is_set($arShoppingCartItem, "DISCOUNT_PRICE")) {
                     $arShoppingCartItem["DISCOUNT_PRICE"] = CCurrencyRates::ConvertCurrency($arShoppingCartItem["DISCOUNT_PRICE"], $arShoppingCartItem["CURRENCY"], $baseLangCurrency);
                 }
                 $arShoppingCartItem["CURRENCY"] = $baseLangCurrency;
             }
             $arShoppingCartItem["PRICE"] = roundEx($arShoppingCartItem["PRICE"], SALE_VALUE_PRECISION);
             $arShoppingCartItem["QUANTITY"] = doubleval($arShoppingCartItem["QUANTITY"]);
             $arShoppingCartItem["WEIGHT"] = doubleval($arShoppingCartItem["WEIGHT"]);
             $arShoppingCartItem["VAT_RATE"] = doubleval($arShoppingCartItem["VAT_RATE"]);
             $arShoppingCartItem["DISCOUNT_PRICE"] = roundEx($arShoppingCartItem["DISCOUNT_PRICE"], SALE_VALUE_PRECISION);
             if ($arShoppingCartItem["VAT_RATE"] > 0) {
                 $arShoppingCartItem["VAT_VALUE"] = $arShoppingCartItem["PRICE"] / ($arShoppingCartItem["VAT_RATE"] + 1) * $arShoppingCartItem["VAT_RATE"];
             }
             //$arShoppingCartItem["VAT_VALUE"] = roundEx((($arShoppingCartItem["PRICE"] / ($arShoppingCartItem["VAT_RATE"] + 1)) * $arShoppingCartItem["VAT_RATE"]), SALE_VALUE_PRECISION);
             if ($arShoppingCartItem["DISCOUNT_PRICE"] > 0) {
                 $arShoppingCartItem["DISCOUNT_PRICE_PERCENT"] = $arShoppingCartItem["DISCOUNT_PRICE"] * 100 / ($arShoppingCartItem["DISCOUNT_PRICE"] + $arShoppingCartItem["PRICE"]);
             }
             $arResult[] = $arShoppingCartItem;
         }
     }
     unset($arShoppingCartItem);
     if (is_array($arCoupons) && count($arCoupons) > 0) {
         foreach (GetModuleEvents("sale", "OnClearCouponList", true) as $arEvent) {
             ExecuteModuleEventEx($arEvent, array($userId, $arCoupons, array()));
         }
     }
     return $arResult;
 }