/** * 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)); } } }
} } } 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);
// 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 //Подгрузка брендов
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; }
/** * <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" => "Название свойства", "CODE" => "Код свойства", * "VALUE" => "Значение свойства", "SORT" => "Индекс сортировки")</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> * <?<br>if (CModule::IncludeModule("sale"))<br>{<br> $arFields = array(<br> "PRODUCT_ID" => 51,<br> "PRODUCT_PRICE_ID" => 0,<br> "PRICE" => 138.54,<br> "CURRENCY" => "RUB",<br> "WEIGHT" => 530,<br> "QUANTITY" => 1,<br> "LID" => LANG,<br> "DELAY" => "N",<br> "CAN_BUY" => "Y",<br> "NAME" => "Чемодан кожаный",<br> "CALLBACK_FUNC" => "MyBasketCallback",<br> "MODULE" => "my_module",<br> "NOTES" => "",<br> "ORDER_CALLBACK_FUNC" => "MyBasketOrderCallback",<br> "DETAIL_PAGE_URL" => "/".LANG."/detail.php?ID=51"<br> );<br><br> $arProps = array();<br><br> $arProps[] = array(<br> "NAME" => "Цвет",<br> "CODE" => "color",<br> "VALUE" => "черный"<br> );<br><br> $arProps[] = array(<br> "NAME" => "Размер",<br> "VALUE" => "1.5 x 2.5"<br> );<br><br> $arFields["PROPS"] = $arProps;<br><br> CSaleBasket::Add($arFields);<br>}<br>?><br> * * * * //пример на проверку создания покупателя * * $userId=XXX;//id пользователя * //получаем FUSER_ID, если покупатель для данного пользователя существует * $FUSER_ID=CSaleUser::GetList(array('USER_ID' => $userId)); * //если покупателя нет - создаем его * if(!$FUSER_ID['ID']) * $FUSER_ID['ID']=CSaleUser::_Add(array("USER_ID" => $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; }
<?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);
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 = "";
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; }
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; }
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; }
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;
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; }
<?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;
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; }
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")); }
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();
//выбираем товары по текущему заказу с сайта $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(
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; }
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"]) {
public function save() { return \CSaleBasket::Update($this['ID'], array('PRICE' => $this['PRICE'], 'QUANTITY' => $this['QUANTITY'], 'CURRENCY' => $this['CURRENCY'])); $cart->setTainted(true); }
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; }
$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";
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; }
$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;