Exemple #1
0
 /**
  * Method is called to deduct all products of the order
  *
  * @param int $orderID
  * @param bool $bUndoReservation
  * @return mixed array
  */
 function OrderDeduction($orderID, $bReturn = false, $recurringID = 0, $bAutoDeduction = true, $arStoreBarcodeOrderFormData = array())
 {
     global $DB;
     static $storesCount = NULL;
     static $bAutoDeductionAllowed = NULL;
     $bRealDeductionAllowed = true;
     $arSavedStoreBarcodeData = array();
     $arItems = array();
     $arResult = array();
     if (defined("SALE_DEBUG") && SALE_DEBUG) {
         CSaleHelper::WriteToLog("OrderDeduction: started", array("orderID" => $orderID, "bReturn" => intval($bReturn), "bAutoDeduction" => intval($bAutoDeduction), "arStoreBarcodeOrderFormData" => $arStoreBarcodeOrderFormData), "OD1");
     }
     //TODO - recurringID - ?
     $orderID = IntVal($orderID);
     if ($orderID <= 0) {
         $arResult["RESULT"] = false;
         return $arResult;
     }
     $dbBasketList = CSaleBasket::GetList(array(), array("ORDER_ID" => $orderID), false, false, array('ID', 'PRODUCT_ID', 'PRODUCT_PROVIDER_CLASS', 'MODULE', 'BARCODE_MULTI', 'QUANTITY', 'RESERVED'));
     //check and emulate deduction
     while ($arBasket = $dbBasketList->Fetch()) {
         if (defined("SALE_DEBUG") && SALE_DEBUG) {
             CSaleHelper::WriteToLog("Deducting product #" . $arBasket["PRODUCT_ID"], array(), "OD2");
         }
         /** @var $productProvider IBXSaleProductProvider */
         if ($productProvider = CSaleBasket::GetProductProvider($arBasket)) {
             if (is_null($storesCount)) {
                 $storesCount = intval($productProvider::GetStoresCount());
             }
             if (defined("SALE_DEBUG") && SALE_DEBUG) {
                 CSaleHelper::WriteToLog("stores count: " . $storesCount, array(), "OD3");
             }
             if (is_null($bAutoDeductionAllowed)) {
                 if ($storesCount == 1 || $storesCount == -1) {
                     // if stores' count = 1 or stores aren't used
                     $bAutoDeductionAllowed = true;
                 } else {
                     $bAutoDeductionAllowed = false;
                 }
             }
             if (defined("SALE_DEBUG") && SALE_DEBUG) {
                 CSaleHelper::WriteToLog("auto deduction allowed: " . intval($bAutoDeductionAllowed), array(), "OD4");
             }
             if ($bAutoDeduction && !$bAutoDeductionAllowed && !$bReturn) {
                 if (defined("SALE_DEBUG") && SALE_DEBUG) {
                     CSaleHelper::WriteToLog("DDCT_AUTO_DEDUCT_WRONG_STORES_QUANTITY", array(), "OD5");
                 }
                 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("DDCT_AUTO_DEDUCT_WRONG_STORES_QUANTITY"), "DDCT_WRONG_STORES_QUANTITY");
                 $bRealDeductionAllowed = false;
             } else {
                 if ($bAutoDeduction && $arBasket["BARCODE_MULTI"] == "Y" && !$bReturn) {
                     if (defined("SALE_DEBUG") && SALE_DEBUG) {
                         CSaleHelper::WriteToLog("DDCT_AUTO_DEDUCT_BARCODE_MULTI", array(), "OD6");
                     }
                     $GLOBALS["APPLICATION"]->ThrowException(GetMessage("DDCT_AUTO_DEDUCT_BARCODE_MULTI", array("#PRODUCT_ID#" => $arBasket["PRODUCT_ID"])), "DDCT_CANT_DEDUCT_BARCODE_MULTI");
                     $bRealDeductionAllowed = false;
                 } else {
                     //get saved store & barcode data if stores are used to know where to return products
                     if ($bReturn && $storesCount > 0) {
                         $dbStoreBarcode = CSaleStoreBarcode::GetList(array(), array("BASKET_ID" => $arBasket["ID"]), false, false, array("ID", "BASKET_ID", "BARCODE", "QUANTITY", "STORE_ID"));
                         while ($arStoreBarcode = $dbStoreBarcode->Fetch()) {
                             $arSavedStoreBarcodeData[$arBasket["ID"]][] = $arStoreBarcode;
                         }
                         if (defined("SALE_DEBUG") && SALE_DEBUG) {
                             CSaleHelper::WriteToLog("OrderDeduction: CSaleStoreBarcode data (stores) to return products to", array("arSavedStoreBarcodeData" => $arSavedStoreBarcodeData), "OD7");
                         }
                     }
                     $arFields = array("PRODUCT_ID" => $arBasket["PRODUCT_ID"], "EMULATE" => "Y", "PRODUCT_RESERVED" => $arBasket["RESERVED"], "UNDO_DEDUCTION" => $bReturn ? "Y" : "N");
                     if ($bReturn) {
                         if ($storesCount > 0) {
                             $arFields["QUANTITY"] = 0;
                             //won't be used during deduction
                             $arFields["STORE_DATA"] = $arSavedStoreBarcodeData[$arBasket["ID"]];
                         } else {
                             $arFields["QUANTITY"] = $arBasket["QUANTITY"];
                             $arFields["STORE_DATA"] = array();
                         }
                     } else {
                         if ($storesCount == 1) {
                             $arFields["QUANTITY"] = 0;
                             if ($bAutoDeduction) {
                                 if ($arProductStore = $productProvider::GetProductStores(array("PRODUCT_ID" => $arBasket["PRODUCT_ID"]))) {
                                     $arFields["STORE_DATA"] = array("0" => array("STORE_ID" => $arProductStore[0]["STORE_ID"], "QUANTITY" => $arBasket["QUANTITY"], "AMOUNT" => $arProductStore[0]["AMOUNT"]));
                                 } else {
                                     $arFields["STORE_DATA"] = array();
                                 }
                             } else {
                                 $arFields["STORE_DATA"] = $arStoreBarcodeOrderFormData[$arBasket["ID"]];
                             }
                         } else {
                             if ($storesCount > 1) {
                                 $arFields["QUANTITY"] = 0;
                                 //won't be used during deduction
                                 $arFields["STORE_DATA"] = $arStoreBarcodeOrderFormData[$arBasket["ID"]];
                             } else {
                                 $arFields["QUANTITY"] = $arBasket["QUANTITY"];
                                 $arFields["STORE_DATA"] = array();
                             }
                         }
                     }
                     if (defined("SALE_DEBUG") && SALE_DEBUG) {
                         CSaleHelper::WriteToLog("Emulating call ::DeductProduct", array("arFields" => $arFields), "OD7");
                     }
                     //emulate deduction
                     $res = $productProvider::DeductProduct($arFields);
                     if ($res["RESULT"]) {
                         $arBasket["FIELDS"] = $arFields;
                         $arItems[] = $arBasket;
                         if (defined("SALE_DEBUG") && SALE_DEBUG) {
                             CSaleHelper::WriteToLog("Emulating call ::DeductProduct - success", array(), "OD8");
                         }
                     } else {
                         $bRealDeductionAllowed = false;
                         if (defined("SALE_DEBUG") && SALE_DEBUG) {
                             CSaleHelper::WriteToLog("Emulating call ::DeductProduct - error", array(), "OD9");
                         }
                     }
                 }
             }
             if ($ex = $GLOBALS["APPLICATION"]->GetException()) {
                 $arResult["ERROR"]["MESSAGE"] = $ex->GetString();
                 $arResult["ERROR"]["CODE"] = $ex->GetID();
             }
             if (!$bRealDeductionAllowed) {
                 break;
             }
         }
     }
     //real deduction
     if ($bRealDeductionAllowed) {
         $bProductsDeductedSuccessfully = true;
         $arDeductedItems = array();
         foreach ($arItems as $arItem) {
             /** @var $productProvider IBXSaleProductProvider */
             if ($productProvider = CSaleBasket::GetProductProvider($arItem)) {
                 $arItem["FIELDS"]["EMULATE"] = "N";
                 if (defined("SALE_DEBUG") && SALE_DEBUG) {
                     CSaleHelper::WriteToLog("Call ::DeductProduct", array("fields" => $arItem["FIELDS"]), "OD10");
                 }
                 //finally real deduction
                 $res = $productProvider::DeductProduct($arItem["FIELDS"]);
                 if ($res["RESULT"]) {
                     $arDeductedItems[] = $arItem;
                     if (!$bReturn && $storesCount > 0) {
                         if ($bAutoDeduction) {
                             $arStoreBarcodeFields = array("BASKET_ID" => $arItem["ID"], "BARCODE" => "", "STORE_ID" => array_pop(array_keys($res["STORES"])), "QUANTITY" => $arItem["QUANTITY"], "CREATED_BY" => intval($GLOBALS["USER"]->GetID()) > 0 ? IntVal($GLOBALS["USER"]->GetID()) : "", "MODIFIED_BY" => intval($GLOBALS["USER"]->GetID()) > 0 ? IntVal($GLOBALS["USER"]->GetID()) : "");
                             if (defined("SALE_DEBUG") && SALE_DEBUG) {
                                 CSaleHelper::WriteToLog("Call CSaleStoreBarcode::Add (auto deduction = true)", array("arStoreBarcodeFields" => $arStoreBarcodeFields), "OD11");
                             }
                             CSaleStoreBarcode::Add($arStoreBarcodeFields);
                         }
                         // else
                         // {
                         // 	foreach ($arStoreBarcodeOrderFormData as $id => $arRecord)
                         // 	{
                         // 		$arStoreBarcodeFields = array(
                         // 			"BASKET_ID"   => $arRecord["ID"],
                         // 			"BARCODE"     => ($arItem["BARCODE_MULTI"] == "Y") ? $arRecord["BARCODE"] : "",
                         // 			"STORE_ID"    => $arRecord["STORE_ID"],
                         // 			"QUANTITY"    => $arRecord["QUANTITY"],
                         // 			"CREATED_BY"  => ((intval($GLOBALS["USER"]->GetID())>0) ? IntVal($GLOBALS["USER"]->GetID()) : ""),
                         // 			"MODIFIED_BY" => ((intval($GLOBALS["USER"]->GetID())>0) ? IntVal($GLOBALS["USER"]->GetID()) : "")
                         // 		);
                         // 		if (defined("SALE_DEBUG") && SALE_DEBUG)
                         // 			CSaleHelper::WriteToLog("Call CSaleStoreBarcode::Add", array("arStoreBarcodeFields" => $arStoreBarcodeFields), "OD11");
                         // 		CSaleStoreBarcode::Add($arStoreBarcodeFields);
                         // 	}
                         // }
                     }
                     if (defined("SALE_DEBUG") && SALE_DEBUG) {
                         CSaleHelper::WriteToLog("Call ::DeductProduct - Success (DEDUCTED = Y)", array(), "OD11");
                     }
                     CSaleBasket::Update($arItem["ID"], array("DEDUCTED" => "Y"));
                     //CSaleOrder::AddOrderHistory
                 } else {
                     CSaleBasket::Update($arItem["ID"], array("DEDUCTED" => "N"));
                     $bProductsDeductedSuccessfully = false;
                     if ($ex = $GLOBALS["APPLICATION"]->GetException()) {
                         $arResult["ERROR"]["MESSAGE"] = $ex->GetString();
                         $arResult["ERROR"]["CODE"] = $ex->GetID();
                     }
                     if (defined("SALE_DEBUG") && SALE_DEBUG) {
                         CSaleHelper::WriteToLog("Call ::DeductProduct - Error (DEDUCTED = N)", array(), "OD12");
                     }
                     break;
                 }
             }
         }
         if ($bProductsDeductedSuccessfully) {
             $arResult["RESULT"] = true;
         } else {
             $arFields = array();
             foreach ($arDeductedItems as $arItem) {
                 /** @var $productProvider IBXSaleProductProvider */
                 if ($productProvider = CSaleBasket::GetProductProvider($arItem)) {
                     if ($storesCount > 0) {
                         $arFields = array("PRODUCT_ID" => $arItem["PRODUCT_ID"], "QUANTITY" => $arItem["QUANTITY"], "UNDO_DEDUCTION" => "Y", "EMULATE" => "N", "PRODUCT_RESERVED" => $arItem["FIELDS"]["PRODUCT_RESERVED"], "STORE_DATA" => $arItem["FIELDS"]["STORE_DATA"]);
                     } else {
                         $arFields = array("PRODUCT_ID" => $arItem["PRODUCT_ID"], "QUANTITY" => $arItem["QUANTITY"], "UNDO_DEDUCTION" => "Y", "PRODUCT_RESERVED" => $arItem["FIELDS"]["PRODUCT_RESERVED"], "EMULATE" => "N");
                     }
                     if (defined("SALE_DEBUG") && SALE_DEBUG) {
                         CSaleHelper::WriteToLog("Call ::DeductProduct - Revert deduction", array("storesCount" => $storesCount, "arFields" => $arFields), "OD13");
                     }
                     $res = $productProvider::DeductProduct($arFields);
                     if ($res["RESULT"]) {
                         CSaleBasket::Update($arItem["ID"], array("DEDUCTED" => "N"));
                     }
                 }
             }
             $arResult["RESULT"] = false;
         }
     } else {
         $arResult["RESULT"] = false;
     }
     if (defined("SALE_DEBUG") && SALE_DEBUG) {
         CSaleHelper::WriteToLog("OrderDeduction - result", array("arResult" => $arResult), "OD14");
     }
     return $arResult;
 }
 function nodeHandler(CDataXML $value)
 {
     $value = $value->GetArray();
     $value = $value[GetMessage("CC_BSC1_DOCUMENT")];
     if ($value["#"][GetMessage("CC_BSC1_OPERATION")][0]["#"] == GetMessage("CC_BSC1_ORDER")) {
         $orderId = IntVal($value["#"][GetMessage("CC_BSC1_NUMBER")][0]["#"]);
         $arOrder = array();
         $arItem = array();
         $arOrder["AMOUNT"] = $value["#"][GetMessage("CC_BSC1_SUMM")][0]["#"];
         $arOrder["AMOUNT"] = str_replace($SumFormat, ".", $arOrder["AMOUNT"]);
         $arOrder["COMMENT"] = $value["#"][GetMessage("CC_BSC1_COMMENT")][0]["#"];
         foreach ($value["#"][GetMessage("CC_BSC1_REK_VALUES")][0]["#"][GetMessage("CC_BSC1_REK_VALUE")] as $val) {
             $arOrder["TRAITS"][$val["#"][GetMessage("CC_BSC1_NAME")][0]["#"]] = $val["#"][GetMessage("CC_BSC1_VALUE")][0]["#"];
         }
         $taxValue = 0;
         $taxValueTmp = 0;
         $taxName = "";
         if (is_array($value["#"][GetMessage("CC_BSC1_ITEMS")][0]["#"][GetMessage("CC_BSC1_ITEM")])) {
             foreach ($value["#"][GetMessage("CC_BSC1_ITEMS")][0]["#"][GetMessage("CC_BSC1_ITEM")] as $val) {
                 $val = $val["#"];
                 $productID = $val[GetMessage("CC_BSC1_ID")][0]["#"];
                 $bGood = false;
                 $discountPrice = "";
                 $priceAll = str_replace($SumFormat, ".", $val[GetMessage("CC_BSC1_SUMM")][0]["#"]);
                 $priceone = str_replace($SumFormat, ".", $val[GetMessage("CC_BSC1_PRICE_PER_UNIT")][0]["#"]);
                 $quantity = str_replace($QuantityFormat, ".", $val[GetMessage("CC_BSC1_QUANTITY")][0]["#"]);
                 $price = $priceAll / $quantity;
                 if ($priceone != $price) {
                     $discountPrice = $priceone - $price;
                 }
                 //DISCOUNTS!
                 $arItem[$productID] = array("NAME" => $val[GetMessage("CC_BSC1_NAME")][0]["#"], "PRICE" => $price, "QUANTITY" => $quantity, "DISCOUNT_PRICE" => $discountPrice);
                 if (is_array($val[GetMessage("CC_BSC1_PROPS_ITEMS")][0]["#"][GetMessage("CC_BSC1_PROP_ITEM")])) {
                     foreach ($val[GetMessage("CC_BSC1_PROPS_ITEMS")][0]["#"][GetMessage("CC_BSC1_PROP_ITEM")] as $val1) {
                         $arItem[$productID]["ATTRIBUTES"][$val1["#"][GetMessage("CC_BSC1_NAME")][0]["#"]] = $val1["#"][GetMessage("CC_BSC1_VALUE")][0]["#"];
                     }
                 }
                 if (is_array($val[GetMessage("CC_BSC1_REK_VALUES")][0]["#"][GetMessage("CC_BSC1_REK_VALUE")])) {
                     foreach ($val[GetMessage("CC_BSC1_REK_VALUES")][0]["#"][GetMessage("CC_BSC1_REK_VALUE")] as $val1) {
                         if ($val1["#"][GetMessage("CC_BSC1_NAME")][0]["#"] == GetMessage("CC_BSC1_ITEM_TYPE")) {
                             $arItem[$productID]["TYPE"] = $val1["#"][GetMessage("CC_BSC1_VALUE")][0]["#"];
                         }
                     }
                 }
                 if (strlen($value["#"][GetMessage("CC_BSC1_TAXES")][0]["#"][GetMessage("CC_BSC1_TAX")][0]["#"][GetMessage("CC_BSC1_NAME")][0]["#"]) > 0) {
                     $taxValueTmp = $val[GetMessage("CC_BSC1_TAXES")][0]["#"][GetMessage("CC_BSC1_TAX")][0]["#"][GetMessage("CC_BSC1_TAX_VALUE")][0]["#"];
                     $arItem[$productID]["VAT_RATE"] = $taxValueTmp / 100;
                     if (IntVal($taxValueTmp) > IntVal($taxValue)) {
                         $taxName = $val[GetMessage("CC_BSC1_TAXES")][0]["#"][GetMessage("CC_BSC1_TAX")][0]["#"][GetMessage("CC_BSC1_NAME")][0]["#"];
                         $taxValue = $taxValueTmp;
                     }
                 }
             }
         }
         if (IntVal($taxValue) > 0) {
             $price = str_replace($SumFormat, ".", $value["#"][GetMessage("CC_BSC1_TAXES")][0]["#"][GetMessage("CC_BSC1_TAX")][0]["#"][GetMessage("CC_BSC1_SUMM")][0]["#"]);
             $arOrder["TAX"] = array("NAME" => $taxName, "VALUE" => $taxValue, "IS_IN_PRICE" => $value["#"][GetMessage("CC_BSC1_TAXES")][0]["#"][GetMessage("CC_BSC1_TAX")][0]["#"][GetMessage("CC_BSC1_IN_PRICE")][0]["#"] == "true" ? "Y" : "N", "VALUE_MONEY" => $price);
         }
         $arOrder["items"] = $arItem;
         $v = $arOrder;
         if ($orderInfo = CSaleOrder::GetByID($orderId)) {
             if ($orderInfo["PAYED"] != "Y" && $orderInfo["ALLOW_DELIVERY"] != "Y" && $orderInfo["STATUS_ID"] != "F") {
                 $dbOrderTax = CSaleOrderTax::GetList(array(), array("ORDER_ID" => $orderId), false, false, array("ID", "TAX_NAME", "VALUE", "VALUE_MONEY", "CODE", "IS_IN_PRICE"));
                 $bTaxFound = false;
                 if ($arOrderTax = $dbOrderTax->Fetch()) {
                     $bTaxFound = true;
                     if (IntVal($arOrderTax["VALUE_MONEY"]) != IntVal($v["TAX"]["VALUE_MONEY"]) || IntVal($arOrderTax["VALUE"]) != IntVal($v["TAX"]["VALUE"]) || $arOrderTax["IS_IN_PRICE"] != $v["TAX"]["IS_IN_PRICE"]) {
                         if (IntVal($v["TAX"]["VALUE"]) > 0) {
                             $arFields = array("TAX_NAME" => $v["TAX"]["NAME"], "ORDER_ID" => $orderId, "VALUE" => $v["TAX"]["VALUE"], "IS_PERCENT" => "Y", "IS_IN_PRICE" => $v["TAX"]["IS_IN_PRICE"], "VALUE_MONEY" => $v["TAX"]["VALUE_MONEY"], "CODE" => "VAT1C", "APPLY_ORDER" => "100");
                             CSaleOrderTax::Update($arOrderTax["ID"], $arFields);
                             CSaleOrder::Update($orderId, array("TAX_VALUE" => $v["TAX"]["VALUE_MONEY"]));
                         } else {
                             CSaleOrderTax::Delete($arOrderTax["ID"]);
                             CSaleOrder::Update($orderId, array("TAX_VALUE" => 0));
                         }
                     }
                 }
                 if (!$bTaxFound) {
                     if (IntVal($v["TAX"]["VALUE"]) > 0) {
                         $arFields = array("TAX_NAME" => $v["TAX"]["NAME"], "ORDER_ID" => $orderId, "VALUE" => $v["TAX"]["VALUE"], "IS_PERCENT" => "Y", "IS_IN_PRICE" => $v["TAX"]["IS_IN_PRICE"], "VALUE_MONEY" => $v["TAX"]["VALUE_MONEY"]);
                         CSaleOrderTax::Add($arFields);
                         CSaleOrder::Update($orderId, array("TAX_VALUE" => $v["TAX"]["VALUE_MONEY"]));
                     }
                 }
                 $dbBasket = CSaleBasket::GetList(array("NAME" => "ASC"), array("ORDER_ID" => $orderId));
                 $basketSum = 0;
                 while ($arBasket = $dbBasket->Fetch()) {
                     $arFields = array();
                     if (!empty($v["items"][$arBasket["PRODUCT_XML_ID"]])) {
                         if ($arBasket["QUANTITY"] != $v["items"][$arBasket["PRODUCT_XML_ID"]]["QUANTITY"]) {
                             $arFields["QUANTITY"] = $v["items"][$arBasket["PRODUCT_XML_ID"]]["QUANTITY"];
                         }
                         if ($arBasket["PRICE"] != $v["items"][$arBasket["PRODUCT_XML_ID"]]["PRICE"]) {
                             $arFields["PRICE"] = $v["items"][$arBasket["PRODUCT_XML_ID"]]["PRICE"];
                         }
                         if ($arBasket["VAT_RATE"] != $v["items"][$arBasket["PRODUCT_XML_ID"]]["VAT_RATE"]) {
                             $arFields["VAT_RATE"] = $v["items"][$arBasket["PRODUCT_XML_ID"]]["VAT_RATE"];
                         }
                         if ($arBasket["DISCOUNT_PRICE"] != $v["items"][$arBasket["PRODUCT_XML_ID"]]["DISCOUNT_PRICE"]) {
                             $arFields["DISCOUNT_PRICE"] = $v["items"][$arBasket["PRODUCT_XML_ID"]]["DISCOUNT_PRICE"];
                         }
                         if (count($arFields) > 0) {
                             CSaleBasket::Update($arBasket["ID"], $arFields);
                         }
                         $v["items"][$arBasket["PRODUCT_XML_ID"]]["CHECKED"] = "Y";
                     } else {
                         CSaleBasket::Delete($arBasket["ID"]);
                     }
                 }
                 foreach ($v["items"] as $itemID => $arItem) {
                     if ($arItem["CHECKED"] != "Y") {
                         if ($arItem["TYPE"] == GetMessage("CC_BSC1_ITEM")) {
                             CModule::IncludeModule("iblock");
                             $dbIBlockElement = CIBlockElement::GetList(array(), array("XML_ID" => $itemID, "ACTIVE" => "Y", "CHECK_PERMISSIONS" => "Y"), false, false, array("ID", "IBLOCK_ID", "XML_ID", "NAME", "DETAIL_PAGE_URL"));
                             if ($arIBlockElement = $dbIBlockElement->GetNext()) {
                                 $dbIBlock = CIBlock::GetList(array(), array("ID" => $arIBlockElement["IBLOCK_ID"]));
                                 if ($arIBlock = $dbIBlock->Fetch()) {
                                     $arProps[] = array("NAME" => "Catalog XML_ID", "CODE" => "CATALOG.XML_ID", "VALUE" => $arIBlock["XML_ID"]);
                                 }
                                 $arProps[] = array("NAME" => "Product XML_ID", "CODE" => "PRODUCT.XML_ID", "VALUE" => $arIBlockElement["XML_ID"]);
                                 $arProduct = CCatalogProduct::GetByID($arIBlockElement["ID"]);
                                 $arFields = array("ORDER_ID" => $orderId, "PRODUCT_ID" => $arIBlockElement["ID"], "PRICE" => $arItem["PRICE"], "CURRENCY" => $orderInfo["CURRENCY"], "WEIGHT" => $arProduct["WEIGHT"], "QUANTITY" => $arItem["QUANTITY"], "LID" => $orderInfo["LID"], "DELAY" => "N", "CAN_BUY" => "Y", "NAME" => $arIBlockElement["~NAME"], "CALLBACK_FUNC" => "CatalogBasketCallback", "MODULE" => "catalog", "NOTES" => $arProduct["CATALOG_GROUP_NAME"], "ORDER_CALLBACK_FUNC" => "CatalogBasketOrderCallback", "CANCEL_CALLBACK_FUNC" => "CatalogBasketCancelCallback", "PAY_CALLBACK_FUNC" => "CatalogPayOrderCallback", "DETAIL_PAGE_URL" => $arIBlockElement["DETAIL_PAGE_URL"], "CATALOG_XML_ID" => $arIBlock["XML_ID"], "PRODUCT_XML_ID" => $arIBlockElement["XML_ID"], "IGNORE_CALLBACK_FUNC" => "Y", "VAT_RATE" => $arItem["VAT_RATE"]);
                                 CSaleBasket::Add($arFields);
                             } else {
                                 $this->strError .= "\n" . GetMessage("CC_BSC1_PRODUCT_NOT_FOUND") . $orderId . " - [" . $itemID . "] " . $arItem["NAME"];
                             }
                         } elseif ($arItem["TYPE"] == GetMessage("CC_BSC1_SERVICE")) {
                             if (IntVal($arItem["PRICE"]) != IntVal($orderInfo["PRICE_DELIVERY"])) {
                                 CSaleOrder::Update($orderId, array("PRICE_DELIVERY" => $arItem["PRICE"]));
                             }
                         }
                     }
                 }
                 $arOrderFields = array();
                 if ($v["AMOUNT"] != $orderInfo["PRICE"]) {
                     $arOrderFields = array("PRICE" => $v["AMOUNT"]);
                 }
                 if (DoubleVal($orderInfo["DISCOUNT_VALUE"]) > 0) {
                     $arOrderFields["DISCOUNT_VALUE"] = 0;
                 }
                 $arOrderFields["UPDATED_1C"] = "Y";
                 if (!empty($arOrderFields)) {
                     CSaleOrder::Update($orderId, $arOrderFields);
                 }
             } else {
                 $this->strError .= "\n" . GetMessage("CC_BSC1_FINAL_NOT_EDIT", array("#ID#" => $orderId));
             }
             $arAditFields = array();
             if ($v["TRAITS"][GetMessage("CC_BSC1_CANCELED")] == "true") {
                 if ($orderInfo["CANCELED"] == "N") {
                     CSaleOrder::CancelOrder($orderId, "Y", $v["COMMENT"]);
                 }
                 $arAditFields["UPDATED_1C"] = "Y";
             } else {
                 if ($orderInfo["CANCELED"] == "Y") {
                     CSaleOrder::CancelOrder($orderId, "N", $v["COMMENT"]);
                 }
                 $arAditFields["UPDATED_1C"] = "Y";
                 if (strlen($v["TRAITS"][GetMessage("CC_BSC1_1C_PAYED_DATE")]) > 1) {
                     if ($orderInfo["PAYED"] == "N") {
                         CSaleOrder::PayOrder($orderId, "Y");
                     }
                     $arAditFields["PAY_VOUCHER_DATE"] = CDatabase::FormatDate(str_replace("T", " ", $v["TRAITS"][GetMessage("CC_BSC1_1C_PAYED_DATE")]), "YYYY-MM-DD HH:MI:SS", CLang::GetDateFormat("FULL", LANG));
                     if (strlen($v["TRAITS"][GetMessage("CC_BSC1_1C_PAYED_NUM")]) > 0) {
                         $arAditFields["PAY_VOUCHER_NUM"] = $v["TRAITS"][GetMessage("CC_BSC1_1C_PAYED_NUM")];
                     }
                     $arAditFields["UPDATED_1C"] = "Y";
                 }
                 if (strlen($v["TRAITS"][GetMessage("CC_BSC1_1C_DELIVERY_DATE")]) > 1) {
                     if ($orderInfo["ALLOW_DELIVERY"] == "N") {
                         CSaleOrder::DeliverOrder($orderId, "Y");
                     }
                     $arAditFields["DATE_ALLOW_DELIVERY"] = CDatabase::FormatDate(str_replace("T", " ", $v["TRAITS"][GetMessage("CC_BSC1_1C_DELIVERY_DATE")]), "YYYY-MM-DD HH:MI:SS", CLang::GetDateFormat("FULL", LANG));
                     if (strlen($arParams["FINAL_STATUS_ON_DELIVERY"]) > 0 && $orderInfo["STATUS_ID"] != "F" && $orderInfo["STATUS_ID"] != $arParams["FINAL_STATUS_ON_DELIVERY"]) {
                         CSaleOrder::StatusOrder($orderId, $arParams["FINAL_STATUS_ON_DELIVERY"]);
                     }
                     $arAditFields["UPDATED_1C"] = "Y";
                 }
             }
             if (count($arAditFields) > 0) {
                 CSaleOrder::Update($orderId, $arAditFields);
             }
         } else {
             $this->strError .= "\n" . GetMessage("CC_BSC1_ORDER_NOT_FOUND", array("#ID#" => $orderId));
         }
     }
 }
Exemple #3
0
                 }
             }
         }
         if (!empty($arProductIDs) && Loader::includeModule('catalog')) {
             $rsProducts = CCatalogProduct::GetList(array(), array('ID' => array_keys($arProductIDs)), false, false, $arSelect);
             while ($arProduct = $rsProducts->Fetch()) {
                 if (array_key_exists($arProduct['ID'], $arProductIDs)) {
                     $key = $arProductIDs[$arProduct['ID']];
                     if ($arNewQuantity[$arProduct['ID']] > $arProduct['QUANTITY'] && 'Y' == $arProduct['QUANTITY_TRACE'] && 'N' == $arProduct['CAN_BUY_ZERO']) {
                         $arNewQuantity[$arProduct['ID']] = $arProduct['QUANTITY'];
                         $productLimit .= GetMessage("STOF_WARNING_LIMIT_PRODUCT") . " " . $arShoppingCart[$key]["NAME"] . "<br>";
                     }
                     if ($arNewQuantity[$arProduct['ID']] != $arShoppingCart[$key]['QUANTITY']) {
                         $arShoppingCart[$key]['QUANTITY'] = $arNewQuantity[$arProduct['ID']];
                         $arFields = array("QUANTITY" => $arNewQuantity[$arProduct['ID']], 'TYPE' => $arShoppingCart[$key]['TYPE'], 'SET_PARENT_ID' => $arShoppingCart[$key]['SET_PARENT_ID']);
                         CSaleBasket::Update($arShoppingCart[$key]["ID"], $arFields);
                     }
                 }
             }
         }
     }
 }
 $arBasketItems = CSaleOrder::DoCalculateOrder(SITE_ID, $currentUserId, $arShoppingCart, $PERSON_TYPE, $arPropValues, $DELIVERY_ID, $PAYSYSTEM_ID, array(), $arErrors, $arWarnings);
 if ((!empty($arErrors) || !empty($arWarnings)) && strlen($_REQUEST["AJAX_CALL"]) > 0 && !isset($_POST["BasketRefresh"])) {
     foreach ($arErrors as $val) {
         $errorMessage .= $val["TEXT"] . "<br>";
     }
     foreach ($arWarnings as $val) {
         $errorMessage .= $val["TEXT"] . "<br>";
     }
     $arErrors = array();
            //foreach ($allproducts as $product) {
            $product = intval($_REQUEST["productid"]);
            //$product = intval($_POST["add2basket"]);
            //проверим
            $res = CIBlockElement::GetByID($product);
            if ($ar_res = $res->GetNext()) {
                $arProps = array();
                $PRODUCT = $ar_res;
                $ar_res = CPrice::GetBasePrice($PRODUCT[ID]);
                $price = $ar_res["PRICE"];
                if (intval($price) == 0) {
                    $price = 0;
                    $arFields = array("PRODUCT_ID" => $PRODUCT[ID], "QUANTITY" => $quantity, "PRODUCT_XML_ID" => $PRODUCT[ID], "PRICE" => $price, "CURRENCY" => "RUB", "LID" => "s1", "NAME" => $PRODUCT[NAME]);
                    $basket_id = CSaleBasket::Add($arFields);
                    $arItem = CSaleBasket::GetByID($basket_id);
                    if ($arItem["QUANTITY"] != $quantity) {
                        $arFields = array("QUANTITY" => $arItem["QUANTITY"] + $quantity);
                        CSaleBasket::Update($basket_id, $arFields);
                    }
                } else {
                    $basket_id = Add2BasketByProductID($product, $quantity);
                }
            }
        }
        break;
    case "update":
        $arFields = array("QUANTITY" => $_REQUEST["quantity"]);
        CSaleBasket::Update($_REQUEST["id"], $arFields);
        break;
}
$APPLICATION->IncludeComponent("bitrix:sale.basket.basket.small", "hiding_basket", array("PATH_TO_BASKET" => "/personal/basket.php", "PATH_TO_ORDER" => "/personal/order.php", "SHOW_DELAY" => "Y", "SHOW_NOTAVAIL" => "Y", "SHOW_SUBSCRIBE" => "Y"), false);
Exemple #5
0
 // if action is performed
 if (strlen($_REQUEST[$arParams["ACTION_VARIABLE"]]) > 0) {
     $id = intval($_REQUEST["id"]);
     if ($id > 0) {
         $dbBasketItems = CSaleBasket::GetList(array(), array("FUSER_ID" => CSaleBasket::GetBasketUserID(), "LID" => SITE_ID, "ORDER_ID" => "NULL", "ID" => $id), false, false, array('ID', 'DELAY', 'CAN_BUY', 'SET_PARENT_ID', 'TYPE'));
         $arItem = $dbBasketItems->Fetch();
         if ($arItem && !CSaleBasketHelper::isSetItem($arItem)) {
             if ($_REQUEST[$arParams["ACTION_VARIABLE"]] == "delete" && in_array("DELETE", $arParams["COLUMNS_LIST"])) {
                 CSaleBasket::Delete($arItem["ID"]);
             } elseif ($_REQUEST[$arParams["ACTION_VARIABLE"]] == "delay" && in_array("DELAY", $arParams["COLUMNS_LIST"])) {
                 if ($arItem["DELAY"] == "N" && $arItem["CAN_BUY"] == "Y") {
                     CSaleBasket::Update($arItem["ID"], array("DELAY" => "Y"));
                 }
             } elseif ($_REQUEST[$arParams["ACTION_VARIABLE"]] == "add" && in_array("DELAY", $arParams["COLUMNS_LIST"])) {
                 if ($arItem["DELAY"] == "Y" && $arItem["CAN_BUY"] == "Y") {
                     CSaleBasket::Update($arItem["ID"], array("DELAY" => "N"));
                 }
             }
             unset($_SESSION["SALE_BASKET_NUM_PRODUCTS"][SITE_ID]);
         }
     }
     LocalRedirect($APPLICATION->GetCurPage());
 } else {
     if (isset($_REQUEST["COUPON"])) {
         $_REQUEST["coupon"] = $_REQUEST["COUPON"];
     }
     $arRes = $this->recalculateBasket($_REQUEST);
     foreach ($arRes as $key => $value) {
         $arResult[$key] = $value;
     }
     unset($_SESSION["SALE_BASKET_NUM_PRODUCTS"][SITE_ID]);
                }
            }
            $index += 1;
        }
        //dd($USER_DESCRIPTION);
        $arFields = array("LID" => "s1", "PERSON_TYPE_ID" => 1, "PAYED" => "N", "CANCELED" => "N", "STATUS_ID" => "N", "PRICE" => $totalSum, "CURRENCY" => "UAH", "USER_ID" => IntVal($USER->GetID()), "PAY_SYSTEM_ID" => 1, "PRICE_DELIVERY" => 1, "DELIVERY_ID" => 1, "DISCOUNT_VALUE" => 0.0, "TAX_VALUE" => 0.0, "USER_DESCRIPTION" => $USER_DESCRIPTION);
        $ORDER_ID = CSaleOrder::Add($arFields);
        if ($ORDER_ID) {
            global $USER;
            $arEventFields = array("EMAIL" => $USER->GetEmail(), "ORDER_ID" => $ORDER_ID, "PRICE" => $_GET['totalSum']);
            CEvent::SendImmediate("SALE_NEW_ORDER_SEST", "s1", $arEventFields);
            //привязал корзину к заказу
            CSaleBasket::OrderBasket($ORDER_ID, 0, SITE_ID);
            //$_SESSION["SALE_USER_ID"]
            foreach ($arrCleanProducts as $key => $value) {
                $res = CSaleBasket::Update($value->elementBaskId, array('QUANTITY' => $value->quantity, 'PRICE' => $value->oneSum));
            }
        } else {
            //dd(bad);
        }
    }
}
?>






<?php 
//Подгрузка брендов
Exemple #7
0
 function UpdateBasketPrices($fuserID, $siteID)
 {
     $fuserID = (int) $fuserID;
     if ($fuserID <= 0) {
         return false;
     }
     $siteID = (string) $siteID;
     if ($siteID == '') {
         $siteID = SITE_ID;
     }
     $dbBasketItems = CSaleBasket::GetList(array("ALL_PRICE" => "DESC"), array("FUSER_ID" => $fuserID, "LID" => $siteID, "ORDER_ID" => "NULL", "SUBSCRIBE" => "N"), false, false, array("ID", "MODULE", "PRODUCT_ID", "QUANTITY", "CALLBACK_FUNC", "PRODUCT_PROVIDER_CLASS", "CAN_BUY", "DELAY", "NOTES", "TYPE", "SET_PARENT_ID"));
     while ($arItem = $dbBasketItems->Fetch()) {
         $arFields = false;
         $arItem['CALLBACK_FUNC'] = (string) $arItem['CALLBACK_FUNC'];
         $arItem['PRODUCT_PROVIDER_CLASS'] = (string) $arItem['PRODUCT_PROVIDER_CLASS'];
         if ('' != $arItem['PRODUCT_PROVIDER_CLASS'] || '' != $arItem['CALLBACK_FUNC']) {
             $arItem['MODULE'] = (string) $arItem['MODULE'];
             $arItem['PRODUCT_ID'] = (int) $arItem['PRODUCT_ID'];
             $arItem['QUANTITY'] = (double) $arItem['QUANTITY'];
             if ($productProvider = CSaleBasket::GetProductProvider($arItem)) {
                 $arFields = $productProvider::GetProductData(array("PRODUCT_ID" => $arItem["PRODUCT_ID"], "QUANTITY" => $arItem["QUANTITY"], "RENEWAL" => "N", "CHECK_COUPONS" => 'Y' == $arItem['CAN_BUY'] && 'N' == $arItem['DELAY'] ? 'Y' : 'N', "BASKET_ID" => $arItem["ID"], "NOTES" => $arItem["NOTES"]));
             } else {
                 $arFields = CSaleBasket::ExecuteCallbackFunction($arItem["CALLBACK_FUNC"], $arItem["MODULE"], $arItem["PRODUCT_ID"], $arItem["QUANTITY"], "N");
             }
             if (!empty($arFields) && is_array($arFields)) {
                 $arFields['CAN_BUY'] = 'Y';
                 $arFields['TYPE'] = (int) $arItem['TYPE'];
                 $arFields['SET_PARENT_ID'] = (int) $arItem['SET_PARENT_ID'];
             } else {
                 $arFields = array('CAN_BUY' => 'N');
             }
             CSaleBasket::Update($arItem['ID'], $arFields);
         }
     }
     return true;
 }
Exemple #8
0
 /**
  * <p>Метод добавляет товар в корзину, если его ещё нет, и обновляет параметры товара с увеличением количества, если он уже находится в корзине. В массиве <b>arFields</b> перечисляются все параметры товара, которые нужны для работы модуля Интернет-магазина (т.е. этот модуль не зависит от других модулей и работает полностью самостоятельно). Метод динамичный.</p> <p>Интернет-магазин не зависит от других модулей, поэтому товары в корзину модуля продаж могут добавляться из любого места (например, из торгового каталога или со статической страницы). Для некоторых модулей существуют функции - оболочки, облегчающие добавление товара в корзину (например, для модуля <b>catalog</b> существуют функции <b>Add2Basket</b> и <b>Add2BasketByProductID</b>). </p>
  *
  *
  * @param array $arFields  Ассоциативный массив параметров элемента корзины, содержащий
  * следующие ключи: <ul> <li> <b>PRODUCT_ID</b> - уникальный в рамках модуля код
  * товара (обязательное поле);</li> <li> <b>PRODUCT_PRICE_ID</b> - ID (идентификатор)
  * конкретного ценового предложения товара, пришедшего в корзину.
  * Может быть использован в классе <a
  * href="http://dev.1c-bitrix.ru/api_help/catalog/classes/cprice/index.php">CPrice</a> модуля Catalog для
  * получения детальной информации о цене.</li> <li> <b> PRICE</b> - стоимость
  * единицы товара (обязательное поле);</li> <li> <b>CURRENCY</b> - валюта
  * стоимости единицы товара (обязательное поле), если валюта
  * отличается от базовой валюты для данного сайта, то стоимость
  * будет автоматически сконвертирована по текущему курсу;</li> <li>
  * <b>WEIGHT</b> - вес единицы товара;</li> <li> <b>QUANTITY</b> - количество единиц
  * товара;</li> <li> <b>LID</b> - сайт, на котором сделана покупка
  * (обязательное поле);</li> <li> <b>DELAY</b> - флаг "товар отложен" (Y/N);</li> <li>
  * <b>CAN_BUY</b> - флаг "товар можно купить" (Y/N) - может устанавливаться
  * автоматически про наличии функции обратного вызова для
  * поддержки актуальности корзины;</li> <li> <b>NAME</b> - название товара
  * (обязательное поле);</li> <li> <b>PRODUCT_XML_ID</b> - внешний код товара
  * (необходим при обмене заказами с 1С);</li> <li> <b>CATALOG_XML_ID</b> - внешний
  * код каталога (необходим при обмене заказами с 1С);</li> <li> <b>ORDER_ID</b> -
  * идентификатор заказа. Ключ будет пустым, если товар еще не
  * добавлен в заказ;</li> <li> <b>CALLBACK_FUNC<font color="#FF0000">*</font></b> - название
  * функции обратного вызова для поддержки актуальности корзины
  * (описание ниже);</li> <li> <b>MODULE</b> - модуль, добавляющий товар в
  * корзину;</li> <li> <b>NOTES</b> - особые заметки, например, тип цены;</li> <li>
  * <b>ORDER_CALLBACK_FUNC<font color="#FF0000">*</font></b> - название функции обратного
  * вызова для оформления заказа (описание ниже);</li> <li> <b>DETAIL_PAGE_URL</b> -
  * ссылка на страницу детального просмотра товара;</li> <li>
  * <b>CANCEL_CALLBACK_FUNC<font color="#FF0000">*</font></b> - название функции обратного
  * вызова для отмены заказа (описание ниже);</li> <li> <b>PAY_CALLBACK_FUNC<font
  * color="#FF0000">*</font></b> - название функции обратного вызова, которая
  * вызывается при установке флага "Доставка разрешена" заказа;</li> <li>
  * <b>FUSER_ID</b> - идентификатор пользователя интернет-магазина,
  * необязательный параметр, по умолчанию CSaleBasket::GetBasketUserID() (текущий
  * пользователь);</li> <li> <b>DISCOUNT_PRICE</b> - величина скидки;</li> <li>
  * <b>DISCOUNT_NAME</b> - название скидки;</li> <li> <b>DISCOUNT_VALUE</b> - размер скидки (в
  * процентах);</li> <li> <b>DISCOUNT_COUPON</b> - купон скидки;</li> <li> <b>PROPS</b> - массив
  * свойств товара, который сохраняется в корзине. Каждый элемент
  * этого массива является массивом следующего формата: <pre
  * class="syntax"><code>array("NAME" =&gt; "Название свойства", "CODE" =&gt; "Код свойства",
  * "VALUE" =&gt; "Значение свойства", "SORT" =&gt; "Индекс сортировки")</code></pre> </li>
  * <li> <b>PRODUCT_PROVIDER_CLASS<font color="#0000FF">**</font></b> - содержит имя класса,
  * реализующего интерфейс <b> IBXSaleProductProvider</b>. Торговый каталог
  * записывает в это поле имя класса <b>CCatalogProductProvider</b>. Если поле
  * пусто, то возникает попытка использовать старые поля:<b>CALLBACK_FUNC</b>,
  * <b>ORDER_CALLBACK_FUNC</b>, <b>CANCEL_CALLBACK_FUNC</b> и <b>PAY_CALLBACK_FUNC</b>.</li> </ul>
  *
  * @return int <p>Метод возвращает код элемента корзины, в который попал данный
  * товар.</p> <a name="examples"></a>
  *
  * <h4>Example</h4> 
  * <pre>
  * &lt;?<br>if (CModule::IncludeModule("sale"))<br>{<br>  $arFields = array(<br>    "PRODUCT_ID" =&gt; 51,<br>    "PRODUCT_PRICE_ID" =&gt; 0,<br>    "PRICE" =&gt; 138.54,<br>    "CURRENCY" =&gt; "RUB",<br>    "WEIGHT" =&gt; 530,<br>    "QUANTITY" =&gt; 1,<br>    "LID" =&gt; LANG,<br>    "DELAY" =&gt; "N",<br>    "CAN_BUY" =&gt; "Y",<br>    "NAME" =&gt; "Чемодан кожаный",<br>    "CALLBACK_FUNC" =&gt; "MyBasketCallback",<br>    "MODULE" =&gt; "my_module",<br>    "NOTES" =&gt; "",<br>    "ORDER_CALLBACK_FUNC" =&gt; "MyBasketOrderCallback",<br>    "DETAIL_PAGE_URL" =&gt; "/".LANG."/detail.php?ID=51"<br>  );<br><br>  $arProps = array();<br><br>  $arProps[] = array(<br>    "NAME" =&gt; "Цвет",<br>    "CODE" =&gt; "color",<br>    "VALUE" =&gt; "черный"<br>  );<br><br>  $arProps[] = array(<br>    "NAME" =&gt; "Размер",<br>    "VALUE" =&gt; "1.5 x 2.5"<br>  );<br><br>  $arFields["PROPS"] = $arProps;<br><br>  CSaleBasket::Add($arFields);<br>}<br>?&gt;<br>
  * 
  * 
  * 
  * //пример на проверку создания покупателя
  * 
  * $userId=XXX;//id пользователя
  * //получаем FUSER_ID, если покупатель для данного пользователя существует
  * $FUSER_ID=CSaleUser::GetList(array('USER_ID' =&gt; $userId));
  * //если покупателя нет - создаем его
  * if(!$FUSER_ID['ID'])                  
  *        $FUSER_ID['ID']=CSaleUser::_Add(array("USER_ID" =&gt; $userId)); //обратите внимание на нижнее подчеркивание перед Add
  * //если не получается создать покупателя - то тут уж ничего не поделаешь
  * if(!$FUSER_ID['ID']){         
  *  echo "Error while creating SaleUser";      
  *  die();      
  * }
  * $FUSER_ID=$FUSER_ID['ID'];
  * //теперь переменную $FUSER_ID можно использовать для добавления товаров в корзину пользователя с $userId.
  * 
  * 
  * Смотрите также:
  * 
  * <li><a href="/api_help/catalog/interface.php">Взаимодействие торгового каталога и магазина</a></li>
  * </pre>
  *
  *
  * @static
  * @link http://dev.1c-bitrix.ru/api_help/sale/classes/csalebasket/csalebasket__add.php
  * @author Bitrix
  */
 public static function Add($arFields)
 {
     global $DB, $APPLICATION;
     if (isset($arFields["ID"])) {
         unset($arFields["ID"]);
     }
     $isOrderConverted = \Bitrix\Main\Config\Option::get("main", "~sale_converted_15", 'N');
     CSaleBasket::Init();
     if (!CSaleBasket::CheckFields("ADD", $arFields)) {
         return false;
     }
     if (!array_key_exists('IGNORE_CALLBACK_FUNC', $arFields) || 'Y' != $arFields['IGNORE_CALLBACK_FUNC']) {
         if (array_key_exists("CALLBACK_FUNC", $arFields) && !empty($arFields["CALLBACK_FUNC"]) || array_key_exists("PRODUCT_PROVIDER_CLASS", $arFields) && !empty($arFields["PRODUCT_PROVIDER_CLASS"])) {
             /** @var $productProvider IBXSaleProductProvider */
             if ($productProvider = CSaleBasket::GetProductProvider(array("MODULE" => $arFields["MODULE"], "PRODUCT_PROVIDER_CLASS" => $arFields["PRODUCT_PROVIDER_CLASS"]))) {
                 $providerParams = array("PRODUCT_ID" => $arFields["PRODUCT_ID"], "QUANTITY" => $arFields["QUANTITY"], "RENEWAL" => $arFields["RENEWAL"], "USER_ID" => isset($arFields["USER_ID"]) ? $arFields["USER_ID"] : 0, "SITE_ID" => isset($arFields["LID"]) ? $arFields["LID"] : false);
                 if (isset($arFields['NOTES'])) {
                     $providerParams['NOTES'] = $arFields['NOTES'];
                 }
                 if (!$productProvider::GetProductData($providerParams)) {
                     return false;
                 }
             } else {
                 if (!CSaleBasket::ExecuteCallbackFunction($arFields["CALLBACK_FUNC"], $arFields["MODULE"], $arFields["PRODUCT_ID"], $arFields["QUANTITY"], $arFields["RENEWAL"], $arFields["USER_ID"], $arFields["LID"])) {
                     return false;
                 }
             }
         }
     }
     if ($isOrderConverted != "Y") {
         foreach (GetModuleEvents("sale", "OnBeforeBasketAdd", true) as $arEvent) {
             if (ExecuteModuleEventEx($arEvent, array(&$arFields)) === false) {
                 return false;
             }
         }
     }
     $bFound = false;
     $bEqAr = false;
     //TODO: is order converted?
     if ($isOrderConverted == "Y") {
         /** @var \Bitrix\Sale\BasketItem $basketItem */
         if (!($basketItem = \Bitrix\Sale\Compatible\BasketCompatibility::add($arFields))) {
             $APPLICATION->ThrowException(Localization\Loc::getMessage('BT_MOD_SALE_BASKET_ERR_ID_ABSENT'), "BASKET_ITEM");
             return false;
         }
         $ID = $basketItem->getId();
         $arFields['QUANTITY'] = $basketItem->getQuantity();
     } else {
         $boolProps = !empty($arFields["PROPS"]) && is_array($arFields["PROPS"]);
         // check if this item is already in the basket
         $arDuplicateFilter = array("FUSER_ID" => $arFields["FUSER_ID"], "PRODUCT_ID" => $arFields["PRODUCT_ID"], "LID" => $arFields["LID"], "ORDER_ID" => "NULL");
         if (!(isset($arFields["TYPE"]) && $arFields["TYPE"] == CSaleBasket::TYPE_SET)) {
             if (isset($arFields["SET_PARENT_ID"])) {
                 $arDuplicateFilter["SET_PARENT_ID"] = $arFields["SET_PARENT_ID"];
             } else {
                 $arDuplicateFilter["SET_PARENT_ID"] = "NULL";
             }
         }
         $db_res = CSaleBasket::GetList(array(), $arDuplicateFilter, false, false, array("ID", "QUANTITY"));
         while ($res = $db_res->Fetch()) {
             if (!$bEqAr) {
                 $arPropsCur = array();
                 $arPropsOld = array();
                 if ($boolProps) {
                     foreach ($arFields["PROPS"] as &$arProp) {
                         if (array_key_exists('VALUE', $arProp) && '' != $arProp["VALUE"]) {
                             $propID = '';
                             if (array_key_exists('CODE', $arProp) && '' != $arProp["CODE"]) {
                                 $propID = $arProp["CODE"];
                             } elseif (array_key_exists('NAME', $arProp) && '' != $arProp["NAME"]) {
                                 $propID = $arProp["NAME"];
                             }
                             if ('' == $propID) {
                                 continue;
                             }
                             $arPropsCur[$propID] = $arProp["VALUE"];
                         }
                     }
                     if (isset($arProp)) {
                         unset($arProp);
                     }
                 }
                 $dbProp = CSaleBasket::GetPropsList(array(), array("BASKET_ID" => $res["ID"]), false, false, array('NAME', 'VALUE', 'CODE'));
                 while ($arProp = $dbProp->Fetch()) {
                     if ('' != $arProp["VALUE"]) {
                         $propID = '';
                         if ('' != $arProp["CODE"]) {
                             $propID = $arProp["CODE"];
                         } elseif ('' != $arProp["NAME"]) {
                             $propID = $arProp["NAME"];
                         }
                         if ('' == $propID) {
                             continue;
                         }
                         $arPropsOld[$propID] = $arProp["VALUE"];
                     }
                 }
                 $bEqAr = false;
                 if (count($arPropsCur) == count($arPropsOld)) {
                     $bEqAr = true;
                     foreach ($arPropsCur as $key => $val) {
                         if (!array_key_exists($key, $arPropsOld) || $arPropsOld[$key] != $val) {
                             $bEqAr = false;
                             break;
                         }
                     }
                 }
                 if ($bEqAr) {
                     $ID = $res["ID"];
                     $arFields["QUANTITY"] += $res["QUANTITY"];
                     CSaleBasket::Update($ID, $arFields);
                     $bFound = true;
                     continue;
                 }
             }
         }
     }
     if (!$bFound) {
         //TODO: is order converted?
         if ($isOrderConverted != "Y") {
             $arInsert = $DB->PrepareInsert("b_sale_basket", $arFields);
             $strSql = "INSERT INTO b_sale_basket(" . $arInsert[0] . ", DATE_INSERT, DATE_UPDATE) VALUES(" . $arInsert[1] . ", " . $DB->GetNowFunction() . ", " . $DB->GetNowFunction() . ")";
             $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__);
             $ID = intval($DB->LastID());
             $boolOrder = false;
             if (isset($arFields['ORDER_ID'])) {
                 $boolOrder = 0 < (int) $arFields['ORDER_ID'];
             }
             if (!$boolOrder && !CSaleBasketHelper::isSetItem($arFields)) {
                 $siteID = isset($arFields["LID"]) ? $arFields["LID"] : SITE_ID;
                 $_SESSION["SALE_BASKET_NUM_PRODUCTS"][$siteID]++;
             }
             if ($boolProps) {
                 foreach ($arFields["PROPS"] as &$prop) {
                     if ('' != $prop["NAME"]) {
                         $arInsert = $DB->PrepareInsert("b_sale_basket_props", $prop);
                         $strSql = "INSERT INTO b_sale_basket_props(BASKET_ID, " . $arInsert[0] . ") VALUES(" . $ID . ", " . $arInsert[1] . ")";
                         $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__);
                     }
                 }
                 if (isset($prop)) {
                     unset($prop);
                 }
             }
             // if item is set parent
             if (isset($arFields["TYPE"]) && $arFields["TYPE"] == CSaleBasket::TYPE_SET) {
                 CSaleBasket::Update($ID, array("SET_PARENT_ID" => $ID));
                 if (!isset($arFields["MANUAL_SET_ITEMS_INSERTION"])) {
                     /** @var $productProvider IBXSaleProductProvider */
                     if ($productProvider = CSaleBasket::GetProductProvider($arFields)) {
                         if (method_exists($productProvider, "GetSetItems")) {
                             $arSets = $productProvider::GetSetItems($arFields["PRODUCT_ID"], CSaleBasket::TYPE_SET, array('BASKET_ID' => $ID));
                             if (is_array($arSets)) {
                                 foreach ($arSets as $arSetData) {
                                     foreach ($arSetData["ITEMS"] as $setItem) {
                                         $setItem["SET_PARENT_ID"] = $ID;
                                         $setItem["LID"] = $arFields["LID"];
                                         $setItem["QUANTITY"] = $setItem["QUANTITY"] * $arFields["QUANTITY"];
                                         $setItem['FUSER_ID'] = $arFields['FUSER_ID'];
                                         CSaleBasket::Add($setItem);
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         }
         if ($boolOrder) {
             CSaleOrderChange::AddRecord($arFields["ORDER_ID"], "BASKET_ADDED", array("PRODUCT_ID" => $arFields["PRODUCT_ID"], "NAME" => $arFields["NAME"], "QUANTITY" => $arFields["QUANTITY"]));
         }
     }
     if ($isOrderConverted != "Y") {
         foreach (GetModuleEvents("sale", "OnBasketAdd", true) as $arEvent) {
             ExecuteModuleEventEx($arEvent, array($ID, $arFields));
         }
     }
     return $ID;
 }
Exemple #9
0
<?php

require_once $_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/include/prolog_before.php";
CModule::IncludeModule("sale");
if (isset($_GET['delete_from_basket'])) {
    CSaleBasket::Delete(intval($_GET['delete_from_basket']));
}
if (isset($_GET['update_basket_item']) && isset($_GET['basket_item_quantity'])) {
    CSaleBasket::Update(intval($_GET['update_basket_item']), array("QUANTITY" => intval($_GET['basket_item_quantity'])));
}
$APPLICATION->IncludeComponent("bitrix:sale.basket.basket", "ajax", array("COLUMNS_LIST" => array(0 => "TYPE"), "PATH_TO_ORDER" => "/personal/order.php", "HIDE_COUPON" => "N", "PRICE_VAT_SHOW_VALUE" => "N", "COUNT_DISCOUNT_4_ALL_QUANTITY" => "N", "USE_PREPAYMENT" => "N", "QUANTITY_FLOAT" => "N", "SET_TITLE" => "Y", "ACTION_VARIABLE" => "action", "OFFERS_PROPS" => ""), false);
Exemple #10
0
 function UpdateBasketPrices($fuserID, $siteID)
 {
     $fuserID = (int) $fuserID;
     if ($fuserID <= 0) {
         return false;
     }
     $siteID = (string) $siteID;
     if ($siteID == '') {
         $siteID = SITE_ID;
     }
     $isOrderConverted = \Bitrix\Main\Config\Option::get("main", "~sale_converted_15", 'N');
     DiscountCouponsManager::clearApply(false);
     $basketItems = array();
     /*
     if (!empty($arBasketItems) && is_array($arBasketItems))
     			{
     				foreach ($arBasketItems as &$basketItemData)
     				{
     					if (array_key_exists('MEASURE_RATIO', $basketItemData))
     					{
     						$basketItemQuantity = floatval($basketItemData['QUANTITY']);
     						$basketItemRatio = floatval($basketItemData['MEASURE_RATIO']);
     
     						$mod = roundEx(($basketItemQuantity / $basketItemRatio - intval($basketItemQuantity / $basketItemRatio)), 6);
     
     						if ($mod !== 0)
     						{
     							$basketItemData['QUANTITY'] = ceil(ceil($basketItemQuantity) / $basketItemRatio)* $basketItemRatio;
     							CSaleBasket::Update($basketItemData['ID'], array('QUANTITY' => $basketItemData['QUANTITY']));
     						}
     					}
     				}
     				unset($basketItemData);
     			}
     */
     $dbBasketItems = CSaleBasket::GetList(array("ALL_PRICE" => "DESC"), array("FUSER_ID" => $fuserID, "LID" => $siteID, "ORDER_ID" => "NULL", "SUBSCRIBE" => "N"), false, false, array("ID", "MODULE", "PRODUCT_ID", "QUANTITY", "CALLBACK_FUNC", "PRODUCT_PROVIDER_CLASS", "CAN_BUY", "DELAY", "NOTES", "TYPE", "SET_PARENT_ID"));
     while ($arItem = $dbBasketItems->Fetch()) {
         $basketItems[] = $arItem;
     }
     if (!empty($basketItems) && is_array($basketItems)) {
         $basketItems = getRatio($basketItems);
         foreach ($basketItems as $basketItem) {
             $fields = array();
             $basketItem['CALLBACK_FUNC'] = (string) $basketItem['CALLBACK_FUNC'];
             $basketItem['PRODUCT_PROVIDER_CLASS'] = (string) $basketItem['PRODUCT_PROVIDER_CLASS'];
             if (strval(trim($basketItem['PRODUCT_PROVIDER_CLASS'])) !== '' || strval(trim($basketItem['CALLBACK_FUNC'])) !== '') {
                 $basketItem['MODULE'] = (string) $basketItem['MODULE'];
                 $basketItem['PRODUCT_ID'] = (int) $basketItem['PRODUCT_ID'];
                 $basketItem['QUANTITY'] = (double) $basketItem['QUANTITY'];
                 if ($productProvider = CSaleBasket::GetProductProvider($basketItem)) {
                     $fields = $productProvider::GetProductData(array("PRODUCT_ID" => $basketItem["PRODUCT_ID"], "QUANTITY" => $basketItem["QUANTITY"], "RENEWAL" => "N", "CHECK_COUPONS" => 'Y' == $basketItem['CAN_BUY'] && 'N' == $basketItem['DELAY'] ? 'Y' : 'N', "CHECK_DISCOUNT" => CSaleBasketHelper::isSetItem($basketItem) ? 'N' : 'Y', "BASKET_ID" => $basketItem["ID"], "NOTES" => $basketItem["NOTES"]));
                 } else {
                     $fields = CSaleBasket::ExecuteCallbackFunction($basketItem["CALLBACK_FUNC"], $basketItem["MODULE"], $basketItem["PRODUCT_ID"], $basketItem["QUANTITY"], "N");
                 }
                 if (!empty($fields) && is_array($fields)) {
                     if ($isOrderConverted == 'Y' && $basketItem['DELAY'] == 'N') {
                         if (!Sale\Compatible\DiscountCompatibility::isInited()) {
                             Sale\Compatible\DiscountCompatibility::init();
                         }
                         if (Sale\Compatible\DiscountCompatibility::usedByClient()) {
                             Sale\Compatible\DiscountCompatibility::setBasketItemData($basketItem['ID'], $fields);
                         }
                     }
                     $fields['CAN_BUY'] = 'Y';
                     $fields['TYPE'] = (int) $basketItem['TYPE'];
                     $fields['SET_PARENT_ID'] = (int) $basketItem['SET_PARENT_ID'];
                 } else {
                     $fields = array('CAN_BUY' => 'N');
                 }
             }
             if (array_key_exists('MEASURE_RATIO', $basketItem)) {
                 $basketItemQuantity = floatval($basketItem['QUANTITY']);
                 $basketItemRatio = floatval($basketItem['MEASURE_RATIO']);
                 $mod = roundEx($basketItemQuantity / $basketItemRatio - intval($basketItemQuantity / $basketItemRatio), 6);
                 if ($mod != 0) {
                     $fields['QUANTITY'] = floor(ceil($basketItemQuantity) / $basketItemRatio) * $basketItemRatio;
                 }
             }
             if (!empty($fields) && is_array($fields)) {
                 CSaleBasket::Update($basketItem['ID'], $fields);
             }
         }
     }
     return true;
 }
                 $quantityCatalog = $arParams['QUANTITY_FLOAT'] == 'Y' ? DoubleVal($arElement["CATALOG_QUANTITY"]) : IntVal($arElement["CATALOG_QUANTITY"]);
                 if ($quantityUser > $quantityCatalog) {
                     $arShoppingCart[$key]["LIMIT_QUANTITY"] = "Y";
                     $productLimit = GetMessage("STOF_WARNING_LIMIT_PRODUCT") . " " . $val["NAME"] . "<br>";
                     $val["QUANTITY"] = $quantityCatalog;
                     $quantityUser = $quantityCatalog;
                 } else {
                     $val["QUANTITY"] = $quantityUser;
                 }
             }
             $val["QUANTITY"] = $quantityUser;
             $arShoppingCart[$key] = $val;
             if ($arShoppingCart["QUANTITY"] != $quantityUser && in_array("QUANTITY", $arParams["COLUMNS_LIST"]) && $quantityUser > 0) {
                 $arFields = array();
                 $arFields["QUANTITY"] = $quantityUser;
                 CSaleBasket::Update($val["ID"], $arFields);
             }
         }
     }
 }
 $arBasketItems = CSaleOrder::DoCalculateOrder(SITE_ID, $USER->GetID(), $arShoppingCart, $PERSON_TYPE, $arPropValues, $DELIVERY_ID, $PAYSYSTEM_ID, array(), $arErrors, $arWarnings);
 if ((count($arErrors) > 0 || count($arWarnings) > 0) && strlen($_REQUEST["AJAX_CALL"]) > 0 && !isset($_POST["BasketRefresh"])) {
     foreach ($arErrors as $val) {
         $errorMessage .= $val["TEXT"] . "<br>";
     }
     foreach ($arWarnings as $val) {
         $errorMessage .= $val["TEXT"] . "<br>";
     }
     $arErrors = array();
     $arWarnings = array();
     $DELIVERY_ID = "";
Exemple #12
0
	public function recalculateBasket($arPost)
	{
		global $USER;
		$arRes = array();

		if ($this->hideCoupon != "Y")
		{
			if (isset($arPost["coupon"]) && !empty($arPost["coupon"]))
			{
				$arRes["VALID_COUPON"] = CCatalogDiscountCoupon::SetCoupon($arPost["coupon"]);
			}

			if (!isset($arRes["VALID_COUPON"]) || (isset($arRes["VALID_COUPON"]) && $arRes["VALID_COUPON"] === false))
			{
				CCatalogDiscountCoupon::ClearCoupon();
			}
		}

		$arTmpItems = array();
		$dbItems = CSaleBasket::GetList(
			array("PRICE" => "DESC"),
			array(
				"FUSER_ID" => CSaleBasket::GetBasketUserID(),
				"LID" => SITE_ID,
				"ORDER_ID" => "NULL"
			),
			false,
			false,
			array(
				"ID", "NAME", "PRODUCT_PROVIDER_CLASS", "CALLBACK_FUNC", "MODULE", "PRODUCT_ID",
				"QUANTITY", "DELAY", "CAN_BUY", "CURRENCY", "SUBSCRIBE", "TYPE", "SET_PARENT_ID", "NOTES"
			)
		);
		while ($arItem = $dbItems->Fetch())
		{
			if (CSaleBasketHelper::isSetItem($arItem))
				continue;

			$arTmpItems[] = $arItem;
		}

		if (!empty($arTmpItems) && CModule::IncludeModule("catalog"))
			$arTmpItems = getRatio($arTmpItems);

		foreach ($arTmpItems as $arItem)
		{
			$isFloatQuantity = ((isset($arItem["MEASURE_RATIO"]) && floatval($arItem["MEASURE_RATIO"]) > 0 && $arItem["MEASURE_RATIO"] != 1)
				|| $this->quantityFloat == "Y") ? true : false;

			if (!isset($arPost["QUANTITY_".$arItem["ID"]]) || floatval($arPost["QUANTITY_".$arItem["ID"]]) <= 0)
			{
				$quantityTmp = ($isFloatQuantity === true) ? floatval($arItem["QUANTITY"]) : intval($arItem["QUANTITY"]);
			}
			else
			{
				$quantityTmp = ($isFloatQuantity === true) ? floatval($arPost["QUANTITY_".$arItem["ID"]]) : intval($arPost["QUANTITY_".$arItem["ID"]]);
			}

			$deleteTmp = ($arPost["DELETE_".$arItem["ID"]] == "Y") ? "Y" : "N";
			$delayTmp = ($arPost["DELAY_".$arItem["ID"]] == "Y") ? "Y" : "N";

			if ($arItem["CAN_BUY"] == "Y")
			{
				$res = $this->checkQuantity($arItem, $quantityTmp);

				if (!empty($res))
					$arRes["WARNING_MESSAGE"][] = $res["ERROR"];
			}

			if ($deleteTmp == "Y" && in_array("DELETE", $this->columns))
			{
				if ($arItem["SUBSCRIBE"] == "Y" && is_array($_SESSION["NOTIFY_PRODUCT"][$USER->GetID()]))
					unset($_SESSION["NOTIFY_PRODUCT"][$USER->GetID()][$arItem["PRODUCT_ID"]]);

				CSaleBasket::Delete($arItem["ID"]);
			}
			elseif ($arItem["DELAY"] == "N" && $arItem["CAN_BUY"] == "Y")
			{
				unset($arFields);
				$arFields = array();

				if (in_array("QUANTITY", $this->columns))
					$arFields["QUANTITY"] = $quantityTmp;
				if (in_array("DELAY", $this->columns))
					$arFields["DELAY"] = $delayTmp;

				if (count($arFields) > 0
					&&
						($arItem["QUANTITY"] != $arFields["QUANTITY"] && in_array("QUANTITY", $this->columns)
							|| $arItem["DELAY"] != $arFields["DELAY"] && in_array("DELAY", $this->columns))
					)
					CSaleBasket::Update($arItem["ID"], $arFields);
			}
			elseif ($arItem["DELAY"] == "Y" && $arItem["CAN_BUY"] == "Y")
			{
				unset($arFields);
				$arFields = array();

				if (in_array("DELAY", $this->columns))
					$arFields["DELAY"] = $delayTmp;

				if (count($arFields) > 0
					&&
						($arItem["DELAY"] != $arFields["DELAY"] && in_array("DELAY", $this->columns))
					)
					CSaleBasket::Update($arItem["ID"], $arFields);
			}
		}

		return $arRes;
	}
Exemple #13
0
 private static function __fGetUserShoppingCart($arProduct, $LID, $recalcOrder)
 {
     if (!CModule::IncludeModule('sale')) {
         return false;
     }
     $arOrderProductPrice = array();
     foreach ($arProduct as $key => $val) {
         //$arSortNum[] = $val['PRICE_DEFAULT'];
         $arProduct[$key]["PRODUCT_ID"] = intval($val["PRODUCT_ID"]);
         $arProduct[$key]["TABLE_ROW_ID"] = $key;
     }
     //if (count($arProduct) > 0 && count($arSortNum) > 0)
     //	array_multisort($arSortNum, SORT_DESC, $arProduct);
     $i = 0;
     foreach ($arProduct as $key => $val) {
         $val["QUANTITY"] = abs(str_replace(",", ".", $val["QUANTITY"]));
         $val["QUANTITY_DEFAULT"] = $val["QUANTITY"];
         $val["PRICE"] = str_replace(",", ".", $val["PRICE"]);
         // Y is used when custom price was set in the admin form
         if ($val["CALLBACK_FUNC"] == "Y") {
             $val["CALLBACK_FUNC"] = false;
             $val["CUSTOM_PRICE"] = "Y";
             if (isset($val["BASKET_ID"]) || intval($val["BASKET_ID"]) > 0) {
                 CSaleBasket::Update($val["BASKET_ID"], array("CUSTOM_PRICE" => "Y"));
             }
             //$val["DISCOUNT_PRICE"] = $val["PRICE_DEFAULT"] - $val["PRICE"];
         }
         $arOrderProductPrice[$i] = $val;
         $arOrderProductPrice[$i]["TABLE_ROW_ID"] = $val["TABLE_ROW_ID"];
         $arOrderProductPrice[$i]["PRODUCT_ID"] = intval($val["PRODUCT_ID"]);
         $arOrderProductPrice[$i]["NAME"] = htmlspecialcharsback($val["NAME"]);
         $arOrderProductPrice[$i]["LID"] = $LID;
         $arOrderProductPrice[$i]["CAN_BUY"] = "Y";
         if (!isset($val["BASKET_ID"]) || $val["BASKET_ID"] == "") {
             /*if ($val["CALLBACK_FUNC"] == "Y")
             		{
             			$arOrderProductPrice[$i]["CALLBACK_FUNC"] = '';
             			$arOrderProductPrice[$i]["DISCOUNT_PRICE"] = 0;
             		}*/
         } else {
             $arOrderProductPrice[$i]["ID"] = intval($val["BASKET_ID"]);
             if ($recalcOrder != "Y" && $arOrderProductPrice[$i]["CALLBACK_FUNC"] != false) {
                 unset($arOrderProductPrice[$i]["CALLBACK_FUNC"]);
             }
             $arNewProps = array();
             if (is_array($val["PROPS"])) {
                 foreach ($val["PROPS"] as $k => $v) {
                     if ($v["NAME"] != "" and $v["VALUE"] != "") {
                         $arNewProps[$k] = $v;
                     }
                 }
             } else {
                 $arNewProps = array("NAME" => "", "VALUE" => "", "CODE" => "", "SORT" => "");
             }
             $arOrderProductPrice[$i]["PROPS"] = $arNewProps;
         }
         $i++;
     }
     //endforeach $arProduct
     return $arOrderProductPrice;
 }
Exemple #14
0
 function Add($arFields)
 {
     global $DB;
     if (isset($arFields["ID"])) {
         unset($arFields["ID"]);
     }
     CSaleBasket::Init();
     if (!CSaleBasket::CheckFields("ADD", $arFields)) {
         return false;
     }
     $db_events = GetModuleEvents("sale", "OnBeforeBasketAdd");
     while ($arEvent = $db_events->Fetch()) {
         if (ExecuteModuleEventEx($arEvent, array(&$arFields)) === false) {
             return false;
         }
     }
     $bFound = false;
     $bEqAr = false;
     $db_res = CSaleBasket::GetList(array("LID" => "ASC"), array("FUSER_ID" => $arFields["FUSER_ID"], "PRODUCT_ID" => $arFields["PRODUCT_ID"], "LID" => $arFields["LID"], "ORDER_ID" => "NULL"), false, false, array("ID", "QUANTITY"));
     while ($res = $db_res->Fetch()) {
         if (!$bEqAr) {
             $arPropsCur = array();
             $arPropsOld = array();
             //$dbProp = CSaleBasket::GetPropsList(Array("ID" => "DESC"), Array("BASKET_ID" => $ID));
             if (is_array($arFields["PROPS"])) {
                 foreach ($arFields["PROPS"] as $arProp) {
                     if (strlen($arProp["VALUE"]) > 0) {
                         if (strlen($arProp["CODE"]) > 0) {
                             $propID = $arProp["CODE"];
                         } else {
                             $propID = $arProp["NAME"];
                         }
                         $arPropsCur[$propID] = $arProp["VALUE"];
                     }
                 }
             }
             $dbProp = CSaleBasket::GetPropsList(array("ID" => "DESC"), array("BASKET_ID" => $res["ID"]));
             while ($arProp = $dbProp->Fetch()) {
                 if (strlen($arProp["VALUE"]) > 0) {
                     if (strlen($arProp["CODE"]) > 0) {
                         $propID = $arProp["CODE"];
                     } else {
                         $propID = $arProp["NAME"];
                     }
                     $arPropsOld[$propID] = $arProp["VALUE"];
                 }
             }
             $bEqAr = false;
             if (count($arPropsCur) == count($arPropsOld)) {
                 $bEqAr = true;
                 foreach ($arPropsCur as $key => $val) {
                     if ($bEqAr && (strlen($arPropsOld[$key]) <= 0 || $arPropsOld[$key] != $val)) {
                         $bEqAr = false;
                     }
                 }
             }
             if ($bEqAr) {
                 $ID = $res["ID"];
                 $arFields["QUANTITY"] += $res["QUANTITY"];
                 CSaleBasket::Update($ID, $arFields);
                 $bFound = true;
                 continue;
             }
         }
     }
     if (!$bFound) {
         $arInsert = $DB->PrepareInsert("b_sale_basket", $arFields);
         $strSql = "INSERT INTO b_sale_basket(" . $arInsert[0] . ", DATE_INSERT, DATE_UPDATE) " . "VALUES(" . $arInsert[1] . ", " . $DB->GetNowFunction() . ", " . $DB->GetNowFunction() . ")";
         $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__);
         $ID = IntVal($DB->LastID());
         $_SESSION["SALE_BASKET_NUM_PRODUCTS"][SITE_ID]++;
         if (is_array($arFields["PROPS"]) && count($arFields["PROPS"]) > 0) {
             foreach ($arFields["PROPS"] as $prop) {
                 if (strlen($prop["NAME"]) > 0) {
                     $arInsert = $DB->PrepareInsert("b_sale_basket_props", $prop);
                     $strSql = "INSERT INTO b_sale_basket_props(BASKET_ID, " . $arInsert[0] . ") " . "VALUES(" . $ID . ", " . $arInsert[1] . ")";
                     $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__);
                 }
             }
         }
     }
     $events = GetModuleEvents("sale", "OnBasketAdd");
     while ($arEvent = $events->Fetch()) {
         ExecuteModuleEventEx($arEvent, array($ID, $arFields));
     }
     return $ID;
 }
Exemple #15
0
	function UpdateBasketPrices($fuserID, $siteID)
	{
		$fuserID = intval($fuserID);
		if (0 >= $fuserID)
			return false;
		if(strlen($siteID) <= 0)
			$siteID = SITE_ID;

		$dbBasketItems = CSaleBasket::GetList(
			array("ALL_PRICE" => "DESC"),
			array(
				"FUSER_ID" => $fuserID,
				"LID" => $siteID,
				"ORDER_ID" => "NULL",
				"SUBSCRIBE" => "N"
			),
			false,
			false,
			array("ID", "CALLBACK_FUNC", "MODULE", "PRODUCT_ID", "QUANTITY", "PRODUCT_PROVIDER_CLASS", "CAN_BUY", "DELAY", "NOTES")
		);
		while ($arItem = $dbBasketItems->Fetch())
		{
			$arFields = false;
			$arItem['CALLBACK_FUNC'] = strval($arItem['CALLBACK_FUNC']);
			$arItem['PRODUCT_PROVIDER_CLASS'] = strval($arItem['PRODUCT_PROVIDER_CLASS']);
			if ('' != $arItem['PRODUCT_PROVIDER_CLASS'] || '' != $arItem['CALLBACK_FUNC'])
			{
				$arItem["MODULE"] = strval($arItem["MODULE"]);
				$arItem['PRODUCT_ID'] = intval($arItem['PRODUCT_ID']);
				$arItem['QUANTITY'] = floatval($arItem['QUANTITY']);

				if ($productProvider = CSaleBasket::GetProductProvider($arItem))
				{
					$arFields = $productProvider::GetProductData(array(
						"PRODUCT_ID" => $arItem["PRODUCT_ID"],
						"QUANTITY"   => $arItem["QUANTITY"],
						"RENEWAL"    => "N",
						"CHECK_COUPONS" => ('Y' == $arItem['CAN_BUY'] && 'N' == $arItem['DELAY'] ? 'Y' : 'N'),
						"BASKET_ID" => $arItem["ID"],
						"NOTES" => $arItem["NOTES"]
					));
				}
				else
				{
					$arFields = CSaleBasket::ExecuteCallbackFunction(
						$arItem["CALLBACK_FUNC"],
						$arItem["MODULE"],
						$arItem["PRODUCT_ID"],
						$arItem["QUANTITY"],
						"N"
					);
				}

				if (!empty($arFields) && is_array($arFields))
				{
					$arFields["CAN_BUY"] = "Y";
				}
				else
				{
					$arFields = array('CAN_BUY' => 'N');
				}

				CSaleBasket::Update($arItem['ID'], $arFields);
			}
		}
	}
             exit;
         }
     } else {
         if (isset($_REQUEST['basket_apply']) && isset($_REQUEST['BASKET_ID'])) {
             $basketError = GetMessage('BUYER_BASKET_MESS_NULL');
         }
     }
     break;
 case "delay_y":
 case "delay_n":
     $arFields["DELAY"] = $_REQUEST['action'] == "delay_y" ? "Y" : "N";
     if (is_array($arID[$LID])) {
         foreach ($arID[$LID] as $PRODUCT_ID) {
             $dbBasketEl = \Bitrix\Sale\Internals\BasketTable::getList(array('filter' => array("LID" => $LID, "FUSER_ID" => $arFields["FUSER_ID"], "PRODUCT_ID" => $PRODUCT_ID, "ORDER_ID" => "NULL"), 'select' => array('ID')));
             $arBasketEl = $dbBasketEl->fetch();
             if (!CSaleBasket::Update($arBasketEl["ID"], $arFields)) {
                 $basketError = GetMessage('BUYER_BASKET_ADD_ERROR');
             }
         }
         //end foreach
     }
     break;
 case "delete_basket":
     if (is_array($arID[$LID])) {
         foreach ($arID[$LID] as $PRODUCT_ID) {
             $dbBasketEl = \Bitrix\Sale\Internals\BasketTable::getList(array('filter' => array("LID" => $LID, "FUSER_ID" => $arFields["FUSER_ID"], "PRODUCT_ID" => $PRODUCT_ID, "ORDER_ID" => "NULL"), 'select' => array('ID')));
             $arBasketEl = $dbBasketEl->fetch();
             CSaleBasket::Delete($arBasketEl["ID"]);
         }
     }
     break;
Exemple #17
0
 function UpdateBasketPrices($fuserID, $siteID)
 {
     $fuserID = (int) $fuserID;
     if ($fuserID <= 0) {
         return false;
     }
     $siteID = (string) $siteID;
     if ($siteID == '') {
         $siteID = SITE_ID;
     }
     $isOrderConverted = \Bitrix\Main\Config\Option::get("main", "~sale_converted_15", 'N');
     $dbBasketItems = CSaleBasket::GetList(array("ALL_PRICE" => "DESC"), array("FUSER_ID" => $fuserID, "LID" => $siteID, "ORDER_ID" => "NULL", "SUBSCRIBE" => "N"), false, false, array("ID", "MODULE", "PRODUCT_ID", "QUANTITY", "CALLBACK_FUNC", "PRODUCT_PROVIDER_CLASS", "CAN_BUY", "DELAY", "NOTES", "TYPE", "SET_PARENT_ID"));
     while ($arItem = $dbBasketItems->Fetch()) {
         if ($arItem['CAN_BUY'] != 'Y') {
             continue;
         }
         $arFields = false;
         $arItem['CALLBACK_FUNC'] = (string) $arItem['CALLBACK_FUNC'];
         $arItem['PRODUCT_PROVIDER_CLASS'] = (string) $arItem['PRODUCT_PROVIDER_CLASS'];
         if ('' != $arItem['PRODUCT_PROVIDER_CLASS'] || '' != $arItem['CALLBACK_FUNC']) {
             $arItem['MODULE'] = (string) $arItem['MODULE'];
             $arItem['PRODUCT_ID'] = (int) $arItem['PRODUCT_ID'];
             $arItem['QUANTITY'] = (double) $arItem['QUANTITY'];
             if ($productProvider = CSaleBasket::GetProductProvider($arItem)) {
                 $arFields = $productProvider::GetProductData(array("PRODUCT_ID" => $arItem["PRODUCT_ID"], "QUANTITY" => $arItem["QUANTITY"], "RENEWAL" => "N", "CHECK_COUPONS" => 'Y' == $arItem['CAN_BUY'] && 'N' == $arItem['DELAY'] ? 'Y' : 'N', "CHECK_DISCOUNT" => CSaleBasketHelper::isSetItem($arItem) ? 'N' : 'Y', "BASKET_ID" => $arItem["ID"], "NOTES" => $arItem["NOTES"]));
             } else {
                 $arFields = CSaleBasket::ExecuteCallbackFunction($arItem["CALLBACK_FUNC"], $arItem["MODULE"], $arItem["PRODUCT_ID"], $arItem["QUANTITY"], "N");
             }
             if (!empty($arFields) && is_array($arFields)) {
                 if ($isOrderConverted == 'Y' && $arItem['DELAY'] == 'N') {
                     if (!Sale\Compatible\DiscountCompatibility::isInited()) {
                         Sale\Compatible\DiscountCompatibility::init();
                     }
                     if (Sale\Compatible\DiscountCompatibility::usedByClient()) {
                         if (isset($arFields['BASE_PRICE']) && isset($arFields['CURRENCY'])) {
                             Sale\Compatible\DiscountCompatibility::setBasketItemBasePrice($arItem['ID'], $arFields['BASE_PRICE'], $arFields['CURRENCY']);
                         }
                         if (!empty($arFields['DISCOUNT_LIST'])) {
                             Sale\Compatible\DiscountCompatibility::setBasketItemDiscounts($arItem['ID'], $arFields['DISCOUNT_LIST']);
                         }
                     }
                 }
                 $arFields['CAN_BUY'] = 'Y';
                 $arFields['TYPE'] = (int) $arItem['TYPE'];
                 $arFields['SET_PARENT_ID'] = (int) $arItem['SET_PARENT_ID'];
             } else {
                 $arFields = array('CAN_BUY' => 'N');
             }
             CSaleBasket::Update($arItem['ID'], $arFields);
         }
     }
     return true;
 }
Exemple #18
0
<?php

require $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php";
?>

<?php 
CModule::IncludeModule("sale");
CModule::IncludeModule("catalog");
/* Addition of the goods in a basket at addition in a basket */
if ($_POST["ajaxaddid"] && $_POST["ajaxaction"] == 'add') {
    Add2BasketByProductID($_POST["ajaxaddid"], 1, array());
    $arFields = array("QUANTITY" => $_POST["ajaxbasketcount"]);
    CSaleBasket::Update($_POST["ajaxbasketcountid"], $arFields);
}
/* Changes of quantity of the goods after receipt of inquiry from a small basket */
if ($_POST["ajaxbasketcountid"] && $_POST["ajaxbasketcount"] && $_POST["ajaxaction"] == 'update') {
    $arFields = array("QUANTITY" => $_POST["ajaxbasketcount"]);
    CSaleBasket::Update($_POST["ajaxbasketcountid"], $arFields);
}
?>

<?php 
$APPLICATION->IncludeComponent("bitrix:sale.basket.basket.line", "agray_basket_line_template", array("COMPONENT_TEMPLATE" => ".default", "PATH_TO_BASKET" => SITE_DIR . "personal/cart/", "PATH_TO_PERSONAL" => SITE_DIR . "personal/", "PATH_TO_PROFILE" => SITE_DIR . "personal/", "PATH_TO_REGISTER" => SITE_DIR . "login/", "POSITION_FIXED" => "N", "SHOW_AUTHOR" => "N", "SHOW_EMPTY_VALUES" => "Y", "SHOW_NUM_PRODUCTS" => "Y", "SHOW_PERSONAL_LINK" => "N", "SHOW_PRODUCTS" => "N", "SHOW_TOTAL_PRICE" => "Y"));
?>

         }
     }
 }
 if (strlen($errorMessage) <= 0) {
     $arOldBasketList = array();
     $dbBasket = CSaleBasket::GetList(array("NAME" => "ASC"), array("ORDER_ID" => $ID), false, false, array("ID", "NAME", "CANCEL_CALLBACK_FUNC", "MODULE", "PRODUCT_ID", "QUANTITY"));
     while ($arBasket = $dbBasket->Fetch()) {
         $arOldBasketList[IntVal($arBasket["ID"])] = $arBasket;
     }
     for ($i = 0; $i < count($ids); $i++) {
         for ($j = 0; $j < count($arBasketList[$i]); $j++) {
             $arFields = array("ORDER_ID" => $arIDs[$i], "PRODUCT_ID" => $arBasketList[$i][$j]["PRODUCT_ID"], "PRODUCT_PRICE_ID" => $arBasketList[$i][$j]["PRODUCT_PRICE_ID"], "PRICE" => $arBasketList[$i][$j]["PRICE"], "CURRENCY" => $arBasketList[$i][$j]["CURRENCY"], "WEIGHT" => $arBasketList[$i][$j]["WEIGHT"], "QUANTITY" => $arBasketList[$i][$j]["QUANTITY"], "LID" => $LID, "NAME" => $arBasketList[$i][$j]["NAME"], "MODULE" => $arBasketList[$i][$j]["MODULE"], "NOTES" => $arBasketList[$i][$j]["NOTES"], "DETAIL_PAGE_URL" => $arBasketList[$i][$j]["DETAIL_PAGE_URL"], "DISCOUNT_PRICE" => $arBasketList[$i][$j]["PRICE"] - $arBasketList[$i][$j]["REAL_PRICE"], "PROPS" => $arBasketList[$i][$j]["PROPS"], "CALLBACK_FUNC" => $arBasketList[$i][$j]["CALLBACK_FUNC"], "ORDER_CALLBACK_FUNC" => $arBasketList[$i][$j]["ORDER_CALLBACK_FUNC"], "CANCEL_CALLBACK_FUNC" => $arBasketList[$i][$j]["CANCEL_CALLBACK_FUNC"], "PAY_CALLBACK_FUNC" => $arBasketList[$i][$j]["PAY_CALLBACK_FUNC"], "CATALOG_XML_ID" => $arBasketList[$i][$j]["CATALOG_XML_ID"], "PRODUCT_XML_ID" => $arBasketList[$i][$j]["PRODUCT_XML_ID"], "VAT_RATE" => $arBasketList[$i][$j]["VAT_RATE"], "IGNORE_CALLBACK_FUNC" => "Y");
             $res = False;
             if ($arBasketList[$i][$j]["ID"] > 0) {
                 if (array_key_exists($arBasketList[$i][$j]["ID"], $arOldBasketList)) {
                     $res = CSaleBasket::Update($arBasketList[$i][$j]["ID"], $arFields);
                     if ($arOldBasketList[$arBasketList[$i][$j]["ID"]]["QUANTITY"] > $arFields["QUANTITY"]) {
                         if (strlen($arFields["CANCEL_CALLBACK_FUNC"]) > 0) {
                             $arFields = CSaleBasket::ExecuteCallbackFunction($arFields["CANCEL_CALLBACK_FUNC"], $arFields["MODULE"], $arFields["PRODUCT_ID"], $arOldBasketList[$arBasketList[$i][$j]["ID"]]["QUANTITY"] - $arFields["QUANTITY"], true);
                         }
                     } elseif ($arOldBasketList[$arBasketList[$i][$j]["ID"]]["QUANTITY"] < $arFields["QUANTITY"]) {
                         if (strlen($arFields["ORDER_CALLBACK_FUNC"]) > 0) {
                             $arFields = CSaleBasket::ExecuteCallbackFunction($arFields["ORDER_CALLBACK_FUNC"], $arFields["MODULE"], $arFields["PRODUCT_ID"], $arFields["QUANTITY"] - $arOldBasketList[$arBasketList[$i][$j]["ID"]]["QUANTITY"]);
                         }
                     }
                     unset($arOldBasketList[$arBasketList[$i][$j]["ID"]]);
                 } else {
                     $errorMessage .= GetMessage("SOE_INTERNAL_RFITH67") . ". ";
                 }
             } else {
                 $res = CSaleBasket::Add($arFields) > 0;
Exemple #20
0
function fGetUserShoppingCart($arProduct, $LID, $recalcOrder)
{
    $arOrderProductPrice = array();
    $i = 0;
    foreach ($arProduct as $key => $val) {
        $arSortNum[] = $val['PRICE_DEFAULT'];
        $arProduct[$key]["PRODUCT_ID"] = intval($val["PRODUCT_ID"]);
        $arProduct[$key]["TABLE_ROW_ID"] = $key;
    }
    if (count($arProduct) > 0 && count($arSortNum) > 0) {
        array_multisort($arSortNum, SORT_DESC, $arProduct);
    }
    $arBasketIds = array();
    foreach ($arProduct as $key => $val) {
        $val["QUANTITY"] = abs(str_replace(",", ".", $val["QUANTITY"]));
        $val["QUANTITY_DEFAULT"] = $val["QUANTITY"];
        $val["PRICE"] = str_replace(",", ".", $val["PRICE"]);
        // Y is used when custom price was set in the admin form
        if ($val["CALLBACK_FUNC"] == "Y") {
            $val["CALLBACK_FUNC"] = false;
            $val["CUSTOM_PRICE"] = "Y";
            if (isset($val["BASKET_ID"]) || intval($val["BASKET_ID"]) > 0) {
                CSaleBasket::Update($val["BASKET_ID"], array("CUSTOM_PRICE" => "Y"));
            }
            //$val["DISCOUNT_PRICE"] = $val["PRICE_DEFAULT"] - $val["PRICE"];
        }
        $arOrderProductPrice[$i] = $val;
        $arOrderProductPrice[$i]["TABLE_ROW_ID"] = $val["TABLE_ROW_ID"];
        $arOrderProductPrice[$i]["PRODUCT_ID"] = intval($val["PRODUCT_ID"]);
        $arOrderProductPrice[$i]["NAME"] = htmlspecialcharsback($val["NAME"]);
        $arOrderProductPrice[$i]["LID"] = $LID;
        $arOrderProductPrice[$i]["CAN_BUY"] = "Y";
        if (!isset($val["BASKET_ID"]) || $val["BASKET_ID"] == "") {
            /*if ($val["CALLBACK_FUNC"] == "Y")
            		{
            			$arOrderProductPrice[$i]["CALLBACK_FUNC"] = '';
            			$arOrderProductPrice[$i]["DISCOUNT_PRICE"] = 0;
            		}*/
        } else {
            $arOrderProductPrice[$i]["ID"] = intval($val["BASKET_ID"]);
            $arBasketIds[] = intval($val["BASKET_ID"]);
            if ($recalcOrder != "Y" && $arOrderProductPrice[$i]["CALLBACK_FUNC"] != false) {
                unset($arOrderProductPrice[$i]["CALLBACK_FUNC"]);
            }
            $arNewProps = array();
            if (is_array($val["PROPS"])) {
                foreach ($val["PROPS"] as $k => $v) {
                    if ($v["NAME"] != "" and $v["VALUE"] != "") {
                        $arNewProps[$k] = $v;
                    }
                }
            } else {
                $arNewProps = array("NAME" => "", "VALUE" => "", "CODE" => "", "SORT" => "");
            }
            $arOrderProductPrice[$i]["PROPS"] = $arNewProps;
        }
        $i++;
    }
    //endforeach $arProduct
    // collect status of reservation elements basket
    if (is_array($arBasketIds) && sizeof($arBasketIds) > 0) {
        $rsBasketItems = CSaleBasket::GetList(array(), array("ID" => $arBasketIds), false, false, array("ID", "RESERVED"));
        while ($arBasketItems = $rsBasketItems->Fetch()) {
            foreach ($arOrderProductPrice as &$arOrderProductPriceDat) {
                if (isset($arOrderProductPriceDat['ID']) && $arOrderProductPriceDat['ID'] == $arBasketItems['ID'] && $arBasketItems['RESERVED'] == "Y") {
                    $arOrderProductPriceDat['RESERVED'] = "Y";
                    break;
                } else {
                    $arOrderProductPriceDat['RESERVED'] = "N";
                }
            }
            unset($arOrderProductPriceDat);
        }
    }
    return $arOrderProductPrice;
}
Exemple #21
0
        if ($action == "ADD2BASKET") {
            $PRODUCT_ID = intval($_GET["id"]);
            $QUANTITY = intval($_GET["QUANTITY"]);
            if ($action == "ADD2BASKET" && intval($PRODUCT_ID) > 0 && intval($QUANTITY) > 0) {
                $arPropItem = getItemCart($arItem["PRODUCT_ID"]);
                $arProps = array();
                $arProps = array(array("NAME" => "Артикул", "CODE" => "ARTIKUL", "VALUE" => $arPropItem["PROPERTY_ARTIKUL_VALUE"], "SORT" => 100), array("NAME" => "Наличие", "CODE" => "DEPOSIT", "VALUE" => $arPropItem["CATALOG_PROP"]["QUANTITY"] < 2 ? "N" : "Y", "SORT" => 200));
                if (!Add2BasketByProductID($PRODUCT_ID, $QUANTITY, array(), $arProps)) {
                    exit;
                }
            }
        } elseif ($action == "UPDATE2BASKET") {
            if (is_array($_GET["items"])) {
                foreach ($_GET["items"] as $key => $arItems) {
                    $PRODUCT_ID = intval($arItems["id"]);
                    $QUANTITY = intval($arItems["count"]);
                    $arFields = array("QUANTITY" => $QUANTITY);
                    if (!CSaleBasket::Update($PRODUCT_ID, $arFields)) {
                        exit;
                    }
                }
            }
        } elseif ($action == "DEL2BASKET") {
            $DELETE = intval($_GET["id"]);
            if (!CSaleBasket::Delete($DELETE)) {
                exit;
            }
        }
    }
    $APPLICATION->IncludeComponent("bitrix:sale.basket.basket.small", "footer_cart", array("PATH_TO_BASKET" => "/personal/cart/", "PATH_TO_ORDER" => "/personal/order/make/", "SHOW_DELAY" => "Y", "SHOW_NOTAVAIL" => "Y", "SHOW_SUBSCRIBE" => "Y"));
}
Exemple #22
0
                CCatalogDiscountCoupon::SetCoupon($COUPON);
            } else {
                CCatalogDiscountCoupon::ClearCoupon();
            }
        }
        $dbBasketItems = CSaleBasket::GetList(array("NAME" => "ASC"), array("FUSER_ID" => CSaleBasket::GetBasketUserID(), "LID" => SITE_ID, "ORDER_ID" => "NULL"), false, false, array("ID", "CALLBACK_FUNC", "MODULE", "PRODUCT_ID", "QUANTITY", "DELAY", "CAN_BUY", "PRICE", "QUANTITY", "CURRENCY", "SUBSCRIBE", "PRODUCT_PROVIDER_CLASS"));
        while ($arBasketItems = $dbBasketItems->Fetch()) {
            $arBasketItems['QUANTITY'] = $arParams['QUANTITY_FLOAT'] == 'Y' ? DoubleVal($arBasketItems['QUANTITY']) : IntVal($arBasketItems['QUANTITY']);
            $quantityTmp = $arParams['QUANTITY_FLOAT'] == 'Y' ? DoubleVal($_REQUEST["QUANTITY_" . $arBasketItems["ID"]]) : IntVal($_REQUEST["QUANTITY_" . $arBasketItems["ID"]]);
            if ($arBasketItems["DELAY"] == "N" && $arBasketItems["CAN_BUY"] == "Y") {
                $arFields = array();
                if (in_array("QUANTITY", $arParams["COLUMNS_LIST"])) {
                    $arFields["QUANTITY"] = $quantityTmp;
                }
                if (count($arFields) > 0 && ($arBasketItems["QUANTITY"] != $arFields["QUANTITY"] && in_array("QUANTITY", $arParams["COLUMNS_LIST"]))) {
                    CSaleBasket::Update($arBasketItems["ID"], $arFields);
                }
            }
        }
    }
}
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;
$arResult["ITEMS"]["AnDelCanBuy"] = array();
Exemple #23
0
 //выбираем товары по текущему заказу с сайта
 $bItms = array();
 $p = CSaleBasket::GetList(array(), array('ORDER_ID' => $order['externalId']));
 while($bItm = $p->Fetch()){
     $bItms[$bItm['PRODUCT_ID']] = $bItm;
 }
 
 //перебираем хистори
 $CrmItms = array();      
 foreach($order['items'] as $item) {
     $CrmItms[] = $item['id'];
     //если такой товар есть
     if(in_array($item['offer']['externalId'], $bItms)){
         if ((int) $item['quantity'] != (int) $bItms[$item['offer']['externalId']]['QUANTITY']) {
             $arProduct['QUANTITY'] = $item['quantity'];                    
             $g = CSaleBasket::Update($bItms[$item['offer']['externalId']]['ID'], $arProduct);
             //резерв
             $ar_res = CCatalogProduct::GetByID($item['offer']['externalId']);                   
             $arFields = array(
                 'QUANTITY' => (int)$ar_res['QUANTITY'] + (int)$bItms[$item['offer']['externalId']]['QUANTITY'] - (int) $item['quantity'],
                 'QUANTITY_RESERVED' => (int)$ar_res['QUANTITY_RESERVED'] - (int)$bItms[$item['offer']['externalId']]['QUANTITY'] + (int) $item['quantity'],
             );
             $d = CCatalogProduct::Update($item['offer']['externalId'], $arFields);
         }
     }//если нет, добавляем
     else{
         $p = CIBlockElement::GetByID($item['offer']['externalId'])->Fetch();
         $iblock = CIBlock::GetByID($p['IBLOCK_ID'])->Fetch();
         $p['CATALOG_XML_ID'] = $iblock['XML_ID'];
         $p['PRODUCT_XML_ID'] = $p['XML_ID'];
         $arProduct = array(
Exemple #24
0
 public function checkQuantity($arBasketItem, $desiredQuantity)
 {
     global $USER;
     $arResult = array();
     CSaleBasket::Update($arBasketItem["ID"], array('QUANTITY' => $desiredQuantity));
     /** @var $productProvider IBXSaleProductProvider */
     if ($productProvider = CSaleBasket::GetProductProvider($arBasketItem)) {
         $arFieldsTmp = $productProvider::GetProductData(array("PRODUCT_ID" => $arBasketItem["PRODUCT_ID"], "QUANTITY" => $desiredQuantity, "RENEWAL" => "N", "USER_ID" => $USER->GetID(), "SITE_ID" => SITE_ID, "BASKET_ID" => $arBasketItem["ID"], "CHECK_QUANTITY" => "Y", "CHECK_PRICE" => "N", "NOTES" => $arBasketItem["NOTES"]));
     } elseif (isset($arBasketItem["CALLBACK_FUNC"]) && !empty($arBasketItem["CALLBACK_FUNC"])) {
         $arFieldsTmp = CSaleBasket::ExecuteCallbackFunction($arBasketItem["CALLBACK_FUNC"], $arBasketItem["MODULE"], $arBasketItem["PRODUCT_ID"], $desiredQuantity, "N", $USER->GetID(), SITE_ID);
     } else {
         return $arResult;
     }
     if (empty($arFieldsTmp) || !isset($arFieldsTmp["QUANTITY"])) {
         $arResult["ERROR"] = Loc::getMessage("SBB_PRODUCT_NOT_AVAILABLE", array("#PRODUCT#" => $arBasketItem["NAME"]));
     } elseif ($desiredQuantity > doubleval($arFieldsTmp["QUANTITY"])) {
         $arResult["ERROR"] = Loc::getMessage("SBB_PRODUCT_NOT_ENOUGH_QUANTITY", array("#PRODUCT#" => $arBasketItem["NAME"], "#NUMBER#" => $desiredQuantity));
     }
     return $arResult;
 }
Exemple #25
0
require $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php";
//file_put_contents("test.txt",print_r($_SERVER,true));
$action = strtoupper($_REQUEST["action"]);
$id = intval($_REQUEST["id"]);
$backurl = $_REQUEST["backurl"];
$quantity = doubleval($_REQUEST["quantity"]);
$delay = strtoupper($_REQUEST["delay"]) == "Y" ? true : false;
if ($quantity <= 0) {
    $quantity = 1;
}
if (CModule::IncludeModule("catalog")) {
    if (($action == "ADD2BASKET" || $action == "BUY") && $id > 0) {
        $r_id = Add2BasketByProductID($id, $quantity, array());
        if ($delay) {
            CSaleBasket::Update($r_id, array("DELAY" => "Y"));
        }
        // if ajax return some info about cart
        if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
            /* special ajax here */
            //header('Content-Type: application/json');
            $cntBasketItems = CSaleBasket::GetList(array(), array("FUSER_ID" => CSaleBasket::GetBasketUserID(), "LID" => SITE_ID, "ORDER_ID" => "NULL"), array());
            echo "{'id': {$r_id} , 'count': {$cntBasketItems}}";
            exit(0);
        }
        if ($action == "BUY") {
            LocalRedirect("/personal/cart");
        }
        if ($backurl) {
            LocalRedirect($backurl);
        } elseif ($_SERVER["HTTP_REFERER"]) {
Exemple #26
0
 public function save()
 {
     return \CSaleBasket::Update($this['ID'], array('PRICE' => $this['PRICE'], 'QUANTITY' => $this['QUANTITY'], 'CURRENCY' => $this['CURRENCY']));
     $cart->setTainted(true);
 }
Exemple #27
0
function fGetUserShoppingCart($arProduct, $LID, $recalcOrder)
{
	$arOrderProductPrice = array();
	$i = 0;

	$arSortNum = array();
	foreach($arProduct as $key => $val)
	{
		$arSortNum[] = $val['PRICE_DEFAULT'];
		$arProduct[$key]["PRODUCT_ID"] = (int)$val["PRODUCT_ID"];
		$arProduct[$key]["TABLE_ROW_ID"] = $key;
	}
	if (!empty($arProduct) && !empty($arSortNum))
		array_multisort($arSortNum, SORT_DESC, $arProduct);

	$arBasketIds = array();
	$basketMap = array();
	foreach($arProduct as $key => $val)
	{
		$val["QUANTITY"] = abs(str_replace(",", ".", $val["QUANTITY"]));
		$val["QUANTITY_DEFAULT"] = $val["QUANTITY"];
		$val["PRICE"] = str_replace(",", ".", $val["PRICE"]);

		// Y is used when custom price was set in the admin form
		if ($val["CALLBACK_FUNC"] == "Y")
		{
			$val["CALLBACK_FUNC"] = false;
			$val["CUSTOM_PRICE"] = "Y";

			if (isset($val["BASKET_ID"]) && (int)$val["BASKET_ID"] > 0)
			{
				CSaleBasket::Update($val["BASKET_ID"], array("CUSTOM_PRICE" => "Y"));
			}

			//$val["DISCOUNT_PRICE"] = $val["PRICE_DEFAULT"] - $val["PRICE"];
		}

		$arOrderProductPrice[$i] = $val;
		$arOrderProductPrice[$i]["TABLE_ROW_ID"] = $val["TABLE_ROW_ID"];
		$arOrderProductPrice[$i]["NAME"] = htmlspecialcharsback($val["NAME"]);
		$arOrderProductPrice[$i]["LID"] = $LID;
		$arOrderProductPrice[$i]["CAN_BUY"] = "Y";
		$arOrderProductPrice[$i]['RESERVED'] = 'N';

		if (isset($val["BASKET_ID"]) && (int)$val["BASKET_ID"] > 0)
		{
			$basketId = (int)$val["BASKET_ID"];
			$arOrderProductPrice[$i]["ID"] = $basketId;

			$arBasketIds[] = $basketId;
			$basketMap[$basketId] = &$arOrderProductPrice[$i];

			if ($recalcOrder != "Y" && $arOrderProductPrice[$i]["CALLBACK_FUNC"] != false)
				unset($arOrderProductPrice[$i]["CALLBACK_FUNC"]);

			$arNewProps = array();
			if (is_array($val["PROPS"]))
			{
				foreach($val["PROPS"] as $k => $v)
				{
					if ($v["NAME"] != "" AND $v["VALUE"] != "")
						$arNewProps[$k] = $v;
				}
			}
			else
				$arNewProps = array("NAME" => "", "VALUE" => "", "CODE" => "", "SORT" => "");

			$arOrderProductPrice[$i]["PROPS"] = $arNewProps;
		}
		$i++;
	}//endforeach $arProduct

	// collect status of reservation elements basket
	if (!empty($arBasketIds))
	{
		$rsBasketItems = CSaleBasket::GetList(
			array(),
			array("ID" => $arBasketIds),
			false,
			false,
			array(
				"ID",
				"RESERVED",
			)
		);
		while ($arBasketItems = $rsBasketItems->Fetch())
		{
			$arBasketItems['ID'] = (int)$arBasketItems['ID'];
			if (!isset($basketMap[$arBasketItems['ID']]))
				continue;
			$basketMap[$arBasketItems['ID']]['RESERVED'] = $arBasketItems['RESERVED'];
		}
		unset($arBasketItems, $rsBasketItems);
	}
	unset($basketMap, $arBasketIds);

	return $arOrderProductPrice;
}
Exemple #28
0
             $bFieldExists = false;
             foreach ($strOffersProps as $existingSkuProp) {
                 if ($existingSkuProp == $productSkuProp["CODE"]) {
                     $bFieldExists = true;
                     break;
                 }
             }
             if ($bFieldExists === true) {
                 $newValues[] = array("NAME" => $productSkuProp["NAME"], "CODE" => $productSkuProp["CODE"], "VALUE" => $productSkuProp["VALUE"], "SORT" => $productSkuProp["SORT"]);
             }
         }
         $newValues[] = array("NAME" => "Product XML_ID", "CODE" => "PRODUCT.XML_ID", "VALUE" => $newProductId["XML_ID"]);
         $arFields['PROPS'] = isset($arItem['PROPS']) ? updateBasketOffersProps($arItem['PROPS'], $newValues) : $newValues;
         unset($newValues);
         if (empty($arErrors)) {
             $bBasketUpdate = CSaleBasket::Update($arItem['ID'], $arFields);
         }
     } else {
         $arErrors[] = GetMessage('SBB_PRODUCT_PRICE_NOT_FOUND');
     }
 }
 if ($bBasketUpdate === true) {
     CBitrixComponent::includeComponentClass("bitrix:sale.basket.basket");
     $basket = new CBitrixBasketComponent();
     $basket->weightKoef = htmlspecialcharsbx(COption::GetOptionString('sale', 'weight_koef', 1, SITE_ID));
     $basket->weightUnit = htmlspecialcharsbx(COption::GetOptionString('sale', 'weight_unit', "", SITE_ID));
     $basket->columns = $arColumns;
     $basket->offersProps = $strOffersProps;
     $basket->quantityFloat = isset($_POST["quantity_float"]) && $_POST["quantity_float"] == "Y" ? "Y" : "N";
     $basket->countDiscount4AllQuantity = isset($_POST["count_discount_4_all_quantity"]) && $_POST["count_discount_4_all_quantity"] == "Y" ? "Y" : "N";
     $basket->priceVatShowValue = isset($_POST["price_vat_show_value"]) && $_POST["price_vat_show_value"] == "Y" ? "Y" : "N";
Exemple #29
0
 public function recalculateBasket($arPost)
 {
     global $USER;
     $arRes = array();
     if ($this->hideCoupon != "Y") {
         if (!empty($arPost['delete_coupon'])) {
             $arRes['VALID_COUPON'] = DiscountCouponsManager::delete($arPost['delete_coupon']);
         } else {
             $oldUse = false;
             if (array_key_exists('coupon', $arPost)) {
                 $arPost['coupon'] = trim((string) $arPost['coupon']);
                 if ($arPost['coupon'] != '') {
                     $arRes['VALID_COUPON'] = DiscountCouponsManager::add($arPost['coupon']);
                 } else {
                     $oldUse = true;
                 }
             }
             if ($oldUse) {
                 if (!isset($arRes["VALID_COUPON"]) || $arRes["VALID_COUPON"] === false) {
                     DiscountCouponsManager::clear(true);
                 }
             }
         }
     }
     $arTmpItems = array();
     $dbItems = CSaleBasket::GetList(array("PRICE" => "DESC"), array("FUSER_ID" => CSaleBasket::GetBasketUserID(), "LID" => SITE_ID, "ORDER_ID" => "NULL"), false, false, array("ID", "NAME", "PRODUCT_PROVIDER_CLASS", "CALLBACK_FUNC", "MODULE", "PRODUCT_ID", "QUANTITY", "DELAY", "CAN_BUY", "CURRENCY", "SUBSCRIBE", "TYPE", "SET_PARENT_ID", "NOTES"));
     while ($arItem = $dbItems->Fetch()) {
         if (CSaleBasketHelper::isSetItem($arItem)) {
             continue;
         }
         $arTmpItems[] = $arItem;
     }
     if (!empty($arTmpItems)) {
         if (self::$catalogIncluded === null) {
             self::$catalogIncluded = Loader::includeModule('catalog');
         }
         if (self::$catalogIncluded) {
             $arTmpItems = getRatio($arTmpItems);
         }
         foreach ($arTmpItems as $arItem) {
             $isFloatQuantity = isset($arItem["MEASURE_RATIO"]) && floatval($arItem["MEASURE_RATIO"]) > 0 && $arItem["MEASURE_RATIO"] != 1 || $this->quantityFloat == "Y" ? true : false;
             if (!isset($arPost["QUANTITY_" . $arItem["ID"]]) || floatval($arPost["QUANTITY_" . $arItem["ID"]]) <= 0) {
                 $quantityTmp = $isFloatQuantity === true ? floatval($arItem["QUANTITY"]) : intval($arItem["QUANTITY"]);
             } else {
                 $quantityTmp = $isFloatQuantity === true ? floatval($arPost["QUANTITY_" . $arItem["ID"]]) : intval($arPost["QUANTITY_" . $arItem["ID"]]);
             }
             $deleteTmp = $arPost["DELETE_" . $arItem["ID"]] == "Y" ? "Y" : "N";
             $delayTmp = $arPost["DELAY_" . $arItem["ID"]] == "Y" ? "Y" : "N";
             if ($arItem["CAN_BUY"] == "Y") {
                 $res = $this->checkQuantity($arItem, $quantityTmp);
                 if (!empty($res)) {
                     $arRes["WARNING_MESSAGE"][] = $res["ERROR"];
                 }
             }
             if ($deleteTmp == "Y" && in_array("DELETE", $this->columns)) {
                 if ($arItem["SUBSCRIBE"] == "Y" && is_array($_SESSION["NOTIFY_PRODUCT"][$USER->GetID()])) {
                     unset($_SESSION["NOTIFY_PRODUCT"][$USER->GetID()][$arItem["PRODUCT_ID"]]);
                 }
                 CSaleBasket::Delete($arItem["ID"]);
             } elseif ($arItem["DELAY"] == "N" && $arItem["CAN_BUY"] == "Y") {
                 $arFields = array();
                 if (in_array("QUANTITY", $this->columns)) {
                     $arFields["QUANTITY"] = $quantityTmp;
                 }
                 if (in_array("DELAY", $this->columns)) {
                     $arFields["DELAY"] = $delayTmp;
                 }
                 if (!empty($arFields) && ($arItem["QUANTITY"] != $arFields["QUANTITY"] && in_array("QUANTITY", $this->columns) || $arItem["DELAY"] != $arFields["DELAY"] && in_array("DELAY", $this->columns))) {
                     CSaleBasket::Update($arItem["ID"], $arFields);
                 }
             } elseif ($arItem["DELAY"] == "Y" && $arItem["CAN_BUY"] == "Y") {
                 $arFields = array();
                 if (in_array("DELAY", $this->columns)) {
                     $arFields["DELAY"] = $delayTmp;
                 }
                 if (!empty($arFields) && ($arItem["DELAY"] != $arFields["DELAY"] && in_array("DELAY", $this->columns))) {
                     CSaleBasket::Update($arItem["ID"], $arFields);
                 }
             }
         }
     }
     return $arRes;
 }
Exemple #30
0
				$arResult["ORDER_PRICE"] = 0;

				foreach ($arOrderForDiscount['BASKET_ITEMS'] as &$arOneItem)
				{
					$arResult["ORDER_PRICE"] += doubleval($arOneItem['PRICE'])*doubleval($arOneItem['QUANTITY']);
					$arBasketInfo = array(
						'IGNORE_CALLBACK_FUNC' => 'Y',
						'PRICE' => $arOneItem['PRICE'],
						'CURRENCY' => $arOneItem['CURRENCY']
					);
					if (array_key_exists('DISCOUNT_PRICE', $arOneItem))
					{
						$arBasketInfo['DISCOUNT_PRICE'] = $arOneItem['DISCOUNT_PRICE'];
					}
					CSaleBasket::Update(
						$arOneItem['ID'],
						$arBasketInfo
					);
				}
				if (isset($arOneItem))
					unset($arOneItem);
				$arBasketItems["BASKET_ITEMS"] = $arOrderForDiscount['BASKET_ITEMS'];
				$totalOrderPrice = $arResult["ORDER_PRICE"] + $arResult["DELIVERY_PRICE"] + $arResult["TAX_PRICE"] - $arResult["DISCOUNT_PRICE"];
				CSaleOrder::Update($arResult["ORDER_ID"], array("PRICE" => $totalOrderPrice));

				/*send mail order*/
				$strOrderList = "";
				foreach ($arBasketItems["BASKET_ITEMS"] as $val)
				{
					if (CSaleBasketHelper::isSetItem($val))
						continue;