public static function DeductProduct($arParams) { global $APPLICATION; $arRes = array(); $arFields = array(); $strUseStoreControl = COption::GetOptionString('catalog','default_use_store_control'); $disableReservation = (COption::GetOptionString("catalog", "enable_reservation") == "N" && COption::GetOptionString("sale", "product_reserve_condition", "O") != "S" && $strUseStoreControl != "Y"); if ($disableReservation) { $arRes["RESULT"] = true; return $arRes; } if ((int)$arParams["PRODUCT_ID"] <= 0) { $APPLICATION->ThrowException(Loc::getMessage("RSRV_INCORRECT_ID"), "NO_ORDER_ID"); $arRes["RESULT"] = false; return $arRes; } $arParams["QUANTITY"] = doubleval($arParams["QUANTITY"]); if ((string)$arParams["UNDO_DEDUCTION"] != "Y") $arParams["UNDO_DEDUCTION"] = "N"; if ((string)$arParams["EMULATE"] != "Y") $arParams["EMULATE"] = "N"; if ((string)$arParams["PRODUCT_RESERVED"] != "Y") $arParams["PRODUCT_RESERVED"] = "N"; if (!isset($arParams["STORE_DATA"])) $arParams["STORE_DATA"] = array(); if (!is_array($arParams["STORE_DATA"])) $arParams["STORE_DATA"] = array($arParams["STORE_DATA"]); $rsProducts = CCatalogProduct::GetList( array(), array('ID' => $arParams["PRODUCT_ID"]), false, false, array('ID', 'QUANTITY', 'QUANTITY_RESERVED', 'QUANTITY_TRACE', 'CAN_BUY_ZERO', 'NEGATIVE_AMOUNT_TRACE') ); if ($arProduct = $rsProducts->Fetch()) { if ($arParams["UNDO_DEDUCTION"] == "N") { if ($arParams["EMULATE"] == "Y" || $arProduct["QUANTITY_TRACE"] == "N") { $arRes["RESULT"] = true; } else { if ($strUseStoreControl == "Y") { if (!empty($arParams["STORE_DATA"])) { $totalAmount = 0; foreach ($arParams["STORE_DATA"] as $id => $arRecord) { if (!isset($arRecord["STORE_ID"]) || intval($arRecord["STORE_ID"]) < 0 || !isset($arRecord["QUANTITY"]) || intval($arRecord["QUANTITY"]) < 0) { $APPLICATION->ThrowException(Loc::getMessage("DDCT_DEDUCTION_STORE_ERROR", self::GetProductCatalogInfo($arParams["PRODUCT_ID"])), "DDCT_DEDUCTION_STORE_ERROR"); $arRes["RESULT"] = false; return $arRes; } $rsProps = CCatalogStoreProduct::GetList( array(), array( "PRODUCT_ID" => $arParams["PRODUCT_ID"], "STORE_ID" => $arRecord["STORE_ID"] ), false, false, array('ID', 'AMOUNT') ); if ($arProp = $rsProps->Fetch()) { if ($arProp["AMOUNT"] < $arRecord["QUANTITY"]) { $APPLICATION->ThrowException( Loc::getMessage( "DDCT_DEDUCTION_QUANTITY_STORE_ERROR", array_merge(self::GetProductCatalogInfo($arParams["PRODUCT_ID"]), array("#STORE_ID#" => $arRecord["STORE_ID"])) ), "DDCT_DEDUCTION_QUANTITY_STORE_ERROR" ); $arRes["RESULT"] = false; return $arRes; } else { $res = CCatalogStoreProduct::Update($arProp["ID"], array("AMOUNT" => $arProp["AMOUNT"] - $arRecord["QUANTITY"])); if ($res) { $arRes["STORES"][$arRecord["STORE_ID"]] = $arRecord["QUANTITY"]; $totalAmount += $arRecord["QUANTITY"]; //deleting barcodes if (isset($arRecord["BARCODE"]) && is_array($arRecord["BARCODE"]) && count($arRecord["BARCODE"]) > 0) { foreach ($arRecord["BARCODE"] as $barcodeId => $barcodeValue) { $arFields = array( "STORE_ID" => $arRecord["STORE_ID"], "BARCODE" => $barcodeValue, "PRODUCT_ID" => $arParams["PRODUCT_ID"] ); $dbres = CCatalogStoreBarcode::GetList( array(), $arFields, false, false, array("ID", "STORE_ID", "BARCODE", "PRODUCT_ID") ); if ($arRes = $dbres->Fetch()) { CCatalogStoreBarcode::Delete($arRes["ID"]); } else { $APPLICATION->ThrowException( Loc::getMessage( "DDCT_DEDUCTION_BARCODE_ERROR", array_merge(self::GetProductCatalogInfo($arParams["PRODUCT_ID"]), array("#BARCODE#" => $barcodeValue)) ), "DDCT_DEDUCTION_BARCODE_ERROR" ); $arRes["RESULT"] = false; return $arRes; } } } } else { $APPLICATION->ThrowException(Loc::getMessage("DDCT_DEDUCTION_SAVE_ERROR", self::GetProductCatalogInfo($arParams["PRODUCT_ID"])), "DDCT_DEDUCTION_SAVE_ERROR"); $arRes["RESULT"] = false; return $arRes; } } } } //updating total sum if ($arParams["PRODUCT_RESERVED"] == "Y") { if ($totalAmount <= $arProduct["QUANTITY_RESERVED"]) { $arFields["QUANTITY_RESERVED"] = $arProduct["QUANTITY_RESERVED"] - $totalAmount; } else if ($totalAmount <= $arProduct["QUANTITY_RESERVED"] + $arProduct["QUANTITY"]) { $arFields["QUANTITY_RESERVED"] = 0; $arFields["QUANTITY"] = $arProduct["QUANTITY"] - ($totalAmount - $arProduct["QUANTITY_RESERVED"]); } else //not enough products - don't deduct anything { $arRes["RESULT"] = false; return $arRes; } } else //product not reserved, use main quantity field to deduct from, quantity_reserved only if there is shortage in the main field { if ($totalAmount <= $arProduct["QUANTITY"]) { $arFields["QUANTITY"] = $arProduct["QUANTITY"] - $totalAmount; } else if ($totalAmount <= $arProduct["QUANTITY_RESERVED"] + $arProduct["QUANTITY"]) { $arFields["QUANTITY"] = 0; $arFields["QUANTITY_RESERVED"] = $arProduct["QUANTITY_RESERVED"] - ($totalAmount - $arProduct["QUANTITY"]); } else //not enough products - don't deduct anything { $arRes["RESULT"] = false; return $arRes; } } CCatalogProduct::Update($arParams["PRODUCT_ID"], $arFields); if (isset($arFields['QUANTITY']) && self::isNeedClearPublicCache( $arProduct['QUANTITY'], $arFields['QUANTITY'], $arProduct['QUANTITY_TRACE'], $arProduct['CAN_BUY_ZERO'] )) { $productInfo = array( 'CAN_BUY_ZERO' => $arProduct['CAN_BUY_ZERO'], 'NEGATIVE_AMOUNT_TRACE' => $arProduct['NEGATIVE_AMOUNT_TRACE'], 'QUANTITY_TRACE' => $arProduct['QUANTITY_TRACE'], 'OLD_QUANTITY' => $arProduct['QUANTITY'], 'QUANTITY' => $arFields['QUANTITY'], 'DELTA' => $arFields['QUANTITY'] - $arProduct['QUANTITY'] ); self::clearPublicCache($arProduct['ID'], $productInfo); } $arRes["RESULT"] = true; } else { $APPLICATION->ThrowException(Loc::getMessage("DDCT_DEDUCTION_STORE_ERROR", self::GetProductCatalogInfo($arParams["PRODUCT_ID"])), "DEDUCTION_STORE_ERROR1"); $arRes["RESULT"] = false; return $arRes; } } else // store control not used { if ($arParams["QUANTITY"] <= $arProduct["QUANTITY_RESERVED"] + $arProduct["QUANTITY"]) { if ($arParams["PRODUCT_RESERVED"] == "Y") { if ($arParams["QUANTITY"] <= $arProduct["QUANTITY_RESERVED"]) { $arFields["QUANTITY_RESERVED"] = $arProduct["QUANTITY_RESERVED"] - $arParams["QUANTITY"]; } else { $arFields["QUANTITY_RESERVED"] = 0; $arFields["QUANTITY"] = $arProduct["QUANTITY"] - ($arParams["QUANTITY"] - $arProduct["QUANTITY_RESERVED"]); } } else //product not reserved, use main quantity field to deduct from, quantity_reserved only if there is shortage in the main field { if ($arParams["QUANTITY"] <= $arProduct["QUANTITY"]) { $arFields["QUANTITY"] = $arProduct["QUANTITY"] - $arParams["QUANTITY"]; } else { $arFields["QUANTITY"] = 0; $arFields["QUANTITY_RESERVED"] = $arProduct["QUANTITY_RESERVED"] - ($arParams["QUANTITY"] - $arProduct["QUANTITY"]); } } $arRes["RESULT"] = CCatalogProduct::Update($arParams["PRODUCT_ID"], $arFields); if (isset($arFields['QUANTITY']) && self::isNeedClearPublicCache( $arProduct['QUANTITY'], $arFields['QUANTITY'], $arProduct['QUANTITY_TRACE'], $arProduct['CAN_BUY_ZERO'] )) { $productInfo = array( 'CAN_BUY_ZERO' => $arProduct['CAN_BUY_ZERO'], 'NEGATIVE_AMOUNT_TRACE' => $arProduct['NEGATIVE_AMOUNT_TRACE'], 'QUANTITY_TRACE' => $arProduct['QUANTITY_TRACE'], 'OLD_QUANTITY' => $arProduct['QUANTITY'], 'QUANTITY' => $arFields['QUANTITY'], 'DELTA' => $arFields['QUANTITY'] - $arProduct['QUANTITY'] ); self::clearPublicCache($arProduct['ID'], $productInfo); } } else //not enough products - don't deduct anything { $APPLICATION->ThrowException(Loc::getMessage("DDCT_DEDUCTION_QUANTITY_ERROR", self::GetProductCatalogInfo($arParams["PRODUCT_ID"])), "DDCT_DEDUCTION_QUANTITY_ERROR"); $arRes["RESULT"] = false; return $arRes; } } //store control } //emulate /quantity trace } else //undo deduction { if ($arParams["EMULATE"] == "Y" || $arProduct["QUANTITY_TRACE"] == "N") { $arRes["RESULT"] = true; } else { if ($strUseStoreControl == "Y") { if (!empty($arParams["STORE_DATA"])) { $totalAddedAmount = 0; foreach ($arParams["STORE_DATA"] as $id => $arRecord) { $rsProps = CCatalogStoreProduct::GetList( array(), array( "PRODUCT_ID" => $arParams["PRODUCT_ID"], "STORE_ID" => $arRecord["STORE_ID"] ), false, false, array('ID', 'AMOUNT') ); if ($arProp = $rsProps->Fetch()) { $res = CCatalogStoreProduct::Update( $arProp["ID"], array("AMOUNT" => $arProp["AMOUNT"] + $arRecord["QUANTITY"]) ); if ($res) { $arRes["STORES"][$arRecord["STORE_ID"]] = $arRecord["QUANTITY"]; $totalAddedAmount += $arRecord["QUANTITY"]; //adding barcodes if (isset($arRecord["BARCODE"]) && strlen($arRecord["BARCODE"]) > 0) { $arFields = array( "STORE_ID" => $arRecord["STORE_ID"], "BARCODE" => $arRecord["BARCODE"], "PRODUCT_ID" => $arParams["PRODUCT_ID"] ); CCatalogStoreBarcode::Add($arFields); } } else { $APPLICATION->ThrowException(Loc::getMessage("DDCT_DEDUCTION_SAVE_ERROR", self::GetProductCatalogInfo($arParams["PRODUCT_ID"])), "DDCT_DEDUCTION_SAVE_ERROR"); $arRes["RESULT"] = false; return $arRes; } } } // $dbAmount = $DB->Query("SELECT SUM(AMOUNT) as AMOUNT FROM b_catalog_store_product WHERE PRODUCT_ID = ".$arParams["PRODUCT_ID"]." ", true); // if ($totalAddedAmount = $dbAmount->Fetch()) // { // } if ($arParams["PRODUCT_RESERVED"] == "Y") { $arUpdateFields["QUANTITY_RESERVED"] = $arProduct["QUANTITY_RESERVED"] + $totalAddedAmount; } else { $arUpdateFields["QUANTITY"] = $arProduct["QUANTITY"] + $totalAddedAmount; } CCatalogProduct::Update($arParams["PRODUCT_ID"], $arUpdateFields); if (isset($arUpdateFields['QUANTITY']) && self::isNeedClearPublicCache( $arProduct['QUANTITY'], $arUpdateFields['QUANTITY'], $arProduct['QUANTITY_TRACE'], $arProduct['CAN_BUY_ZERO'] )) { $productInfo = array( 'CAN_BUY_ZERO' => $arProduct['CAN_BUY_ZERO'], 'NEGATIVE_AMOUNT_TRACE' => $arProduct['NEGATIVE_AMOUNT_TRACE'], 'QUANTITY_TRACE' => $arProduct['QUANTITY_TRACE'], 'OLD_QUANTITY' => $arProduct['QUANTITY'], 'QUANTITY' => $arUpdateFields['QUANTITY'], 'DELTA' => $arUpdateFields['QUANTITY'] - $arProduct['QUANTITY'] ); self::clearPublicCache($arProduct['ID'], $productInfo); } $arRes["RESULT"] = true; } else { $APPLICATION->ThrowException(Loc::getMessage("DDCT_DEDUCTION_STORE_ERROR", self::GetProductCatalogInfo($arParams["PRODUCT_ID"])), "DEDUCTION_STORE_ERROR2"); $arRes["RESULT"] = false; return $arRes; } } else //store control not used { if ($arParams["PRODUCT_RESERVED"] == "Y") { $arFields["QUANTITY_RESERVED"] = $arProduct["QUANTITY_RESERVED"] + $arParams["QUANTITY"]; // $arFields["QUANTITY"] = $arProduct["QUANTITY"] - $arParams["QUANTITY_RESERVED"]; } else { $arFields["QUANTITY"] = $arProduct["QUANTITY"] + $arParams["QUANTITY"]; // $arFields["QUANTITY_RESERVED"] = $arProduct["QUANTITY_RESERVED"] - $arParams["QUANTITY_RESERVED"]; } $arRes["RESULT"] = CCatalogProduct::Update($arParams["PRODUCT_ID"], $arFields); if (isset($arFields['QUANTITY']) && self::isNeedClearPublicCache( $arProduct['QUANTITY'], $arFields['QUANTITY'], $arProduct['QUANTITY_TRACE'], $arProduct['CAN_BUY_ZERO'] )) { $productInfo = array( 'CAN_BUY_ZERO' => $arProduct['CAN_BUY_ZERO'], 'NEGATIVE_AMOUNT_TRACE' => $arProduct['NEGATIVE_AMOUNT_TRACE'], 'QUANTITY_TRACE' => $arProduct['QUANTITY_TRACE'], 'OLD_QUANTITY' => $arProduct['QUANTITY'], 'QUANTITY' => $arFields['QUANTITY'], 'DELTA' => $arFields['QUANTITY'] - $arProduct['QUANTITY'] ); self::clearPublicCache($arProduct['ID'], $productInfo); } } } //emulate or quantity trace } } else { $arRes["RESULT"] = false; } if (!$arRes["RESULT"]) { $APPLICATION->ThrowException(Loc::getMessage("DDCT_UNKNOWN_ERROR", self::GetProductCatalogInfo($arParams["PRODUCT_ID"])), "UNKNOWN_DEDUCTION_ERROR"); } return $arRes; }
public static function DeductProduct($arParams) { global $APPLICATION; $arRes = array(); $arFields = array(); $basketItem = null; $strUseStoreControl = COption::GetOptionString('catalog', 'default_use_store_control'); $disableReservation = COption::GetOptionString("catalog", "enable_reservation") == "N" && COption::GetOptionString("sale", "product_reserve_condition") != "S" && $strUseStoreControl != "Y"; if ($disableReservation) { $arRes["RESULT"] = true; return $arRes; } if ((int) $arParams["PRODUCT_ID"] <= 0) { $APPLICATION->ThrowException(Loc::getMessage("RSRV_INCORRECT_ID"), "NO_ORDER_ID"); $arRes["RESULT"] = false; return $arRes; } $isOrderConverted = \Bitrix\Main\Config\Option::get("main", "~sale_converted_15", 'N'); $arParams["QUANTITY"] = doubleval($arParams["QUANTITY"]); if ((string) $arParams["UNDO_DEDUCTION"] != "Y") { $arParams["UNDO_DEDUCTION"] = "N"; } if ((string) $arParams["EMULATE"] != "Y") { $arParams["EMULATE"] = "N"; } if ((string) $arParams["PRODUCT_RESERVED"] != "Y") { $arParams["PRODUCT_RESERVED"] = "N"; } if (!isset($arParams["STORE_DATA"])) { $arParams["STORE_DATA"] = array(); } if (!is_array($arParams["STORE_DATA"])) { $arParams["STORE_DATA"] = array($arParams["STORE_DATA"]); } $basketItem = null; if (isset($arParams["BASKET_ITEM"]) && $isOrderConverted == "Y") { if ($arParams["BASKET_ITEM"] instanceof \Bitrix\Sale\BasketItem) { /** @var \Bitrix\Sale\BasketItem $basketItem */ $basketItem = $arParams["BASKET_ITEM"]; } } $rsProducts = CCatalogProduct::GetList(array(), array('ID' => $arParams["PRODUCT_ID"]), false, false, array('ID', 'QUANTITY', 'QUANTITY_RESERVED', 'QUANTITY_TRACE', 'CAN_BUY_ZERO')); if ($arProduct = $rsProducts->Fetch()) { if ($arParams["UNDO_DEDUCTION"] == "N") { if ($arParams["EMULATE"] == "Y" || $arProduct["QUANTITY_TRACE"] == "N") { $arRes["RESULT"] = true; } else { if ($strUseStoreControl == "Y") { if ($isOrderConverted == "Y" && empty($arParams["STORE_DATA"]) && $basketItem) { $countStores = static::GetStoresCount(array('SITE_ID' => $basketItem->getField('LID'))); $defaultDeductionStore = Main\Config\Option::get("sale", "deduct_store_id", "", $basketItem->getField('LID')); if (($countStores == 1 || $countStores == -1 || $defaultDeductionStore > 0) && !$basketItem->isBarcodeMulti()) { if ($productStore = static::GetProductStores(array('PRODUCT_ID' => $arParams["PRODUCT_ID"], 'SITE_ID' => $basketItem->getField('LID')))) { $productStore = reset($productStore); $arParams["STORE_DATA"] = array($productStore['STORE_ID'] => array('STORE_ID' => $productStore['STORE_ID'], 'QUANTITY' => $arParams["QUANTITY"])); } } } $barcodeMulti = false; if ($isOrderConverted == "Y") { $barcodeMulti = $basketItem->isBarcodeMulti(); } if ($barcodeMulti) { if (!empty($arParams["STORE_DATA"])) { foreach ($arParams["STORE_DATA"] as $id => $arRecord) { if (!empty($arRecord["BARCODE"]) && is_array($arRecord["BARCODE"])) { foreach ($arRecord["BARCODE"] as $barcodeId => $barcodeValue) { if (strval(trim($barcodeValue)) == "") { $APPLICATION->ThrowException(Loc::getMessage("DDCT_DEDUCTION_MULTI_BARCODE_EMPTY", array_merge(self::GetProductCatalogInfo($arParams["PRODUCT_ID"]), array("#STORE_ID#" => $arRecord['STORE_ID']))), "DDCT_DEDUCTION_MULTI_BARCODE_EMPTY"); $arRes["RESULT"] = false; return $arRes; } } } else { $APPLICATION->ThrowException(Loc::getMessage("DDCT_DEDUCTION_MULTI_BARCODE_EMPTY", array_merge(self::GetProductCatalogInfo($arParams["PRODUCT_ID"]), array("#STORE_ID#" => $arRecord['STORE_ID']))), "DDCT_DEDUCTION_MULTI_BARCODE_EMPTY"); $arRes["RESULT"] = false; return $arRes; } } } } if (!empty($arParams["STORE_DATA"])) { foreach ($arParams["STORE_DATA"] as $id => $arRecord) { if (!empty($arRecord["BARCODE"]) && is_array($arRecord["BARCODE"])) { foreach ($arRecord["BARCODE"] as $barcodeValue) { $arRes['BARCODE'][$barcodeValue] = false; } } } $totalAmount = 0; foreach ($arParams["STORE_DATA"] as $id => $arRecord) { if (!isset($arRecord["STORE_ID"]) || intval($arRecord["STORE_ID"]) < 0 || !isset($arRecord["QUANTITY"]) || intval($arRecord["QUANTITY"]) < 0) { $APPLICATION->ThrowException(Loc::getMessage("DDCT_DEDUCTION_STORE_ERROR", self::GetProductCatalogInfo($arParams["PRODUCT_ID"])), "DDCT_DEDUCTION_STORE_ERROR"); $arRes["RESULT"] = false; return $arRes; } $rsProps = CCatalogStoreProduct::GetList(array(), array("PRODUCT_ID" => $arParams["PRODUCT_ID"], "STORE_ID" => $arRecord["STORE_ID"]), false, false, array('ID', 'AMOUNT')); if ($arProp = $rsProps->Fetch()) { if ($arProp["AMOUNT"] < $arRecord["QUANTITY"]) { $APPLICATION->ThrowException(Loc::getMessage("DDCT_DEDUCTION_QUANTITY_STORE_ERROR", array_merge(self::GetProductCatalogInfo($arParams["PRODUCT_ID"]), array("#STORE_ID#" => $arRecord["STORE_ID"]))), "DDCT_DEDUCTION_QUANTITY_STORE_ERROR"); $arRes["RESULT"] = false; return $arRes; } else { $res = CCatalogStoreProduct::Update($arProp["ID"], array("AMOUNT" => $arProp["AMOUNT"] - $arRecord["QUANTITY"])); if ($res) { $arRes["STORES"][$arRecord["STORE_ID"]] = $arRecord["QUANTITY"]; $totalAmount += $arRecord["QUANTITY"]; //deleting barcodes if (isset($arRecord["BARCODE"]) && is_array($arRecord["BARCODE"]) && count($arRecord["BARCODE"]) > 0) { foreach ($arRecord["BARCODE"] as $barcodeId => $barcodeValue) { if (strval(trim($barcodeValue)) == "" || !$barcodeMulti) { continue; } $arFields = array("STORE_ID" => $arRecord["STORE_ID"], "BARCODE" => $barcodeValue, "PRODUCT_ID" => $arParams["PRODUCT_ID"]); $dbres = CCatalogStoreBarcode::GetList(array(), $arFields, false, false, array("ID", "STORE_ID", "BARCODE", "PRODUCT_ID")); if ($catalogStoreBarcodeRes = $dbres->Fetch()) { CCatalogStoreBarcode::Delete($catalogStoreBarcodeRes["ID"]); $arRes['BARCODE'][$barcodeValue] = true; } else { $APPLICATION->ThrowException(Loc::getMessage("DDCT_DEDUCTION_BARCODE_ERROR", array_merge(self::GetProductCatalogInfo($arParams["PRODUCT_ID"]), array("#BARCODE#" => $barcodeValue))), "DDCT_DEDUCTION_BARCODE_ERROR"); $arRes['BARCODE'][$barcodeValue] = false; $arRes["RESULT"] = false; return $arRes; } } } } else { $APPLICATION->ThrowException(Loc::getMessage("DDCT_DEDUCTION_SAVE_ERROR", self::GetProductCatalogInfo($arParams["PRODUCT_ID"])), "DDCT_DEDUCTION_SAVE_ERROR"); $arRes["RESULT"] = false; return $arRes; } } } } //updating total sum if ($arParams["PRODUCT_RESERVED"] == "Y") { if ($totalAmount <= $arProduct["QUANTITY_RESERVED"]) { $needReserved = $arProduct["QUANTITY_RESERVED"] - $totalAmount; if ($totalAmount > $arProduct["QUANTITY_RESERVED"]) { $needReserved = $arProduct["QUANTITY_RESERVED"]; } $arFields["QUANTITY_RESERVED"] = $needReserved; } else { if ($totalAmount <= $arProduct["QUANTITY_RESERVED"] + $arProduct["QUANTITY"]) { $arFields["QUANTITY_RESERVED"] = 0; $arFields["QUANTITY"] = $arProduct["QUANTITY"] - ($totalAmount - $arProduct["QUANTITY_RESERVED"]); } else { $arRes["RESULT"] = false; return $arRes; } } } else { if ($totalAmount <= $arProduct["QUANTITY"]) { $arFields["QUANTITY"] = $arProduct["QUANTITY"] - $totalAmount; } else { if ($totalAmount <= $arProduct["QUANTITY_RESERVED"] + $arProduct["QUANTITY"]) { $arFields["QUANTITY"] = 0; $minusQuantity = $totalAmount - $arProduct["QUANTITY"]; $needReserved = $arProduct["QUANTITY_RESERVED"] - $minusQuantity; if ($minusQuantity > $arProduct["QUANTITY_RESERVED"]) { $needReserved = $arProduct["QUANTITY_RESERVED"]; } $arFields["QUANTITY_RESERVED"] = $needReserved; } else { $arRes["RESULT"] = false; return $arRes; } } } CCatalogProduct::Update($arParams["PRODUCT_ID"], $arFields); if (isset($arFields['QUANTITY']) && self::isNeedClearPublicCache($arProduct['QUANTITY'], $arFields['QUANTITY'], $arProduct['QUANTITY_TRACE'], $arProduct['CAN_BUY_ZERO'])) { $productInfo = array('CAN_BUY_ZERO' => $arProduct['CAN_BUY_ZERO'], 'QUANTITY_TRACE' => $arProduct['QUANTITY_TRACE'], 'OLD_QUANTITY' => $arProduct['QUANTITY'], 'QUANTITY' => $arFields['QUANTITY'], 'DELTA' => $arFields['QUANTITY'] - $arProduct['QUANTITY']); self::clearPublicCache($arProduct['ID'], $productInfo); } $arRes["RESULT"] = true; } else { $APPLICATION->ThrowException(Loc::getMessage("DDCT_DEDUCTION_STORE_ERROR", self::GetProductCatalogInfo($arParams["PRODUCT_ID"])), "DEDUCTION_STORE_ERROR1"); $arRes["RESULT"] = false; return $arRes; } } else { if ($arParams["QUANTITY"] <= $arProduct["QUANTITY_RESERVED"] + $arProduct["QUANTITY"]) { if ($arParams["PRODUCT_RESERVED"] == "Y") { if ($arParams["QUANTITY"] <= $arProduct["QUANTITY_RESERVED"]) { $needReserved = $arProduct["QUANTITY_RESERVED"] - $arParams["QUANTITY"]; if ($arParams["QUANTITY"] > $arProduct["QUANTITY_RESERVED"]) { $needReserved = $arProduct["QUANTITY_RESERVED"]; } $arFields["QUANTITY_RESERVED"] = $needReserved; } else { $arFields["QUANTITY_RESERVED"] = 0; $arFields["QUANTITY"] = $arProduct["QUANTITY"] - ($arParams["QUANTITY"] - $arProduct["QUANTITY_RESERVED"]); } } else { if ($arParams["QUANTITY"] <= $arProduct["QUANTITY"]) { $arFields["QUANTITY"] = $arProduct["QUANTITY"] - $arParams["QUANTITY"]; } else { $arFields["QUANTITY"] = 0; $minusQuantity = $arParams["QUANTITY"] - $arProduct["QUANTITY"]; $needReserved = $arProduct["QUANTITY_RESERVED"] - $minusQuantity; if ($minusQuantity > $arProduct["QUANTITY_RESERVED"]) { $needReserved = $arProduct["QUANTITY_RESERVED"]; } $arFields["QUANTITY_RESERVED"] = $needReserved; } } $arRes["RESULT"] = CCatalogProduct::Update($arParams["PRODUCT_ID"], $arFields); if (isset($arFields['QUANTITY']) && self::isNeedClearPublicCache($arProduct['QUANTITY'], $arFields['QUANTITY'], $arProduct['QUANTITY_TRACE'], $arProduct['CAN_BUY_ZERO'])) { $productInfo = array('CAN_BUY_ZERO' => $arProduct['CAN_BUY_ZERO'], 'QUANTITY_TRACE' => $arProduct['QUANTITY_TRACE'], 'OLD_QUANTITY' => $arProduct['QUANTITY'], 'QUANTITY' => $arFields['QUANTITY'], 'DELTA' => $arFields['QUANTITY'] - $arProduct['QUANTITY']); self::clearPublicCache($arProduct['ID'], $productInfo); } } else { $APPLICATION->ThrowException(Loc::getMessage("DDCT_DEDUCTION_QUANTITY_ERROR", self::GetProductCatalogInfo($arParams["PRODUCT_ID"])), "DDCT_DEDUCTION_QUANTITY_ERROR"); $arRes["RESULT"] = false; return $arRes; } } //store control } //emulate /quantity trace } else { if ($arParams["EMULATE"] == "Y" || $arProduct["QUANTITY_TRACE"] == "N") { $arRes["RESULT"] = true; } else { if ($strUseStoreControl == "Y") { if ($isOrderConverted == "Y" && empty($arParams["STORE_DATA"]) && $basketItem) { $countStores = static::GetStoresCount(array('SITE_ID' => $basketItem->getField('LID'))); if ($countStores == 1 && !$basketItem->isBarcodeMulti()) { if ($productStore = static::GetProductStores(array('PRODUCT_ID' => $arParams["PRODUCT_ID"], 'SITE_ID' => $basketItem->getField('LID')))) { $productStore = reset($productStore); $arParams["STORE_DATA"] = array($productStore['STORE_ID'] => array('STORE_ID' => $productStore['STORE_ID'], 'QUANTITY' => $arParams["QUANTITY"])); } } } if (!empty($arParams["STORE_DATA"])) { $totalAddedAmount = 0; foreach ($arParams["STORE_DATA"] as $id => $arRecord) { $rsProps = CCatalogStoreProduct::GetList(array(), array("PRODUCT_ID" => $arParams["PRODUCT_ID"], "STORE_ID" => $arRecord["STORE_ID"]), false, false, array('ID', 'AMOUNT')); if ($arProp = $rsProps->Fetch()) { $res = CCatalogStoreProduct::Update($arProp["ID"], array("AMOUNT" => $arProp["AMOUNT"] + $arRecord["QUANTITY"])); if ($res) { $arRes["STORES"][$arRecord["STORE_ID"]] = $arRecord["QUANTITY"]; $totalAddedAmount += $arRecord["QUANTITY"]; $barcodeMulti = false; if ($isOrderConverted == "Y") { $barcodeMulti = $basketItem->isBarcodeMulti(); } //adding barcodes if (isset($arRecord["BARCODE"])) { if (!empty($arRecord["BARCODE"]) && is_array($arRecord["BARCODE"])) { foreach ($arRecord["BARCODE"] as $barcodeValue) { if (strval(trim($barcodeValue)) == '' || strval(trim($barcodeValue)) != '' && !$barcodeMulti) { continue; } $arFields = array("STORE_ID" => $arRecord["STORE_ID"], "BARCODE" => $barcodeValue, "PRODUCT_ID" => $arParams["PRODUCT_ID"]); CCatalogStoreBarcode::Add($arFields); } } elseif (!is_array($arRecord["BARCODE"])) { $arFields = array("STORE_ID" => $arRecord["STORE_ID"], "BARCODE" => $arRecord["BARCODE"], "PRODUCT_ID" => $arParams["PRODUCT_ID"]); CCatalogStoreBarcode::Add($arFields); } } } else { $APPLICATION->ThrowException(Loc::getMessage("DDCT_DEDUCTION_SAVE_ERROR", self::GetProductCatalogInfo($arParams["PRODUCT_ID"])), "DDCT_DEDUCTION_SAVE_ERROR"); $arRes["RESULT"] = false; return $arRes; } } } // $dbAmount = $DB->Query("SELECT SUM(AMOUNT) as AMOUNT FROM b_catalog_store_product WHERE PRODUCT_ID = ".$arParams["PRODUCT_ID"]." ", true); // if ($totalAddedAmount = $dbAmount->Fetch()) // { // } if ($arParams["PRODUCT_RESERVED"] == "Y") { $arUpdateFields["QUANTITY_RESERVED"] = $arProduct["QUANTITY_RESERVED"] + $totalAddedAmount; } else { $arUpdateFields["QUANTITY"] = $arProduct["QUANTITY"] + $totalAddedAmount; } CCatalogProduct::Update($arParams["PRODUCT_ID"], $arUpdateFields); if (isset($arUpdateFields['QUANTITY']) && self::isNeedClearPublicCache($arProduct['QUANTITY'], $arUpdateFields['QUANTITY'], $arProduct['QUANTITY_TRACE'], $arProduct['CAN_BUY_ZERO'])) { $productInfo = array('CAN_BUY_ZERO' => $arProduct['CAN_BUY_ZERO'], 'QUANTITY_TRACE' => $arProduct['QUANTITY_TRACE'], 'OLD_QUANTITY' => $arProduct['QUANTITY'], 'QUANTITY' => $arUpdateFields['QUANTITY'], 'DELTA' => $arUpdateFields['QUANTITY'] - $arProduct['QUANTITY']); self::clearPublicCache($arProduct['ID'], $productInfo); } $arRes["RESULT"] = true; } else { $APPLICATION->ThrowException(Loc::getMessage("DDCT_DEDUCTION_STORE_ERROR", self::GetProductCatalogInfo($arParams["PRODUCT_ID"])), "DEDUCTION_STORE_ERROR2"); $arRes["RESULT"] = false; return $arRes; } } else { if ($arParams["PRODUCT_RESERVED"] == "Y") { $arFields["QUANTITY_RESERVED"] = $arProduct["QUANTITY_RESERVED"] + $arParams["QUANTITY"]; // $arFields["QUANTITY"] = $arProduct["QUANTITY"] - $arParams["QUANTITY_RESERVED"]; } else { $arFields["QUANTITY"] = $arProduct["QUANTITY"] + $arParams["QUANTITY"]; // $arFields["QUANTITY_RESERVED"] = $arProduct["QUANTITY_RESERVED"] - $arParams["QUANTITY_RESERVED"]; } $arRes["RESULT"] = CCatalogProduct::Update($arParams["PRODUCT_ID"], $arFields); if (isset($arFields['QUANTITY']) && self::isNeedClearPublicCache($arProduct['QUANTITY'], $arFields['QUANTITY'], $arProduct['QUANTITY_TRACE'], $arProduct['CAN_BUY_ZERO'])) { $productInfo = array('CAN_BUY_ZERO' => $arProduct['CAN_BUY_ZERO'], 'QUANTITY_TRACE' => $arProduct['QUANTITY_TRACE'], 'OLD_QUANTITY' => $arProduct['QUANTITY'], 'QUANTITY' => $arFields['QUANTITY'], 'DELTA' => $arFields['QUANTITY'] - $arProduct['QUANTITY']); self::clearPublicCache($arProduct['ID'], $productInfo); } } } //emulate or quantity trace } } else { $arRes["RESULT"] = false; } if (!$arRes["RESULT"]) { $APPLICATION->ThrowException(Loc::getMessage("DDCT_UNKNOWN_ERROR", self::GetProductCatalogInfo($arParams["PRODUCT_ID"])), "UNKNOWN_DEDUCTION_ERROR"); } if ($arRes['RESULT'] === true) { static::clearHitCache('CATALOG_PRODUCT'); } return $arRes; }
public static function DeductProduct($arParams) { global $DB; $arRes = array(); $arFields = array(); $strUseStoreControl = COption::GetOptionString('catalog', 'default_use_store_control', 'N'); if (intval($arParams["PRODUCT_ID"]) <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("RSRV_INCORRECT_ID"), "NO_ORDER_ID"); $arRes["RESULT"] = false; return $arRes; } $arParams["QUANTITY"] = doubleval($arParams["QUANTITY"]); if (intval($arParams["UNDO_DEDUCTION"]) != "Y") { $arParams["UNDO_DEDUCTION"] = "N"; } if (intval($arParams["EMULATE"]) != "Y") { $arParams["EMULATE"] = "N"; } if (intval($arParams["PRODUCT_RESERVED"]) != "Y") { $arParams["PRODUCT_RESERVED"] = "N"; } if (!isset($arParams["STORE_DATA"])) { $arParams["STORE_DATA"] = array(); } if (!is_array($arParams["STORE_DATA"])) { $arParams["STORE_DATA"] = array($arParams["STORE_DATA"]); } $rsProducts = CCatalogProduct::GetList(array(), array('ID' => $arParams["PRODUCT_ID"]), false, false, array('ID', 'QUANTITY', 'QUANTITY_RESERVED')); if ($arProduct = $rsProducts->Fetch()) { if ($arParams["UNDO_DEDUCTION"] == "N") { if ($arParams["EMULATE"] == "Y" || $arProduct["QUANTITY_TRACE"] == "N") { $arRes["RESULT"] = true; } else { if ($strUseStoreControl == "Y") { if (!empty($arParams["STORE_DATA"])) { $totalAmount = 0; foreach ($arParams["STORE_DATA"] as $id => $arRecord) { if (!isset($arRecord["STORE_ID"]) || intval($arRecord["STORE_ID"]) < 0 || !isset($arRecord["QUANTITY"]) || intval($arRecord["QUANTITY"]) < 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("DDCT_DEDUCTION_STORE_ERROR", self::GetProductCatalogInfo($arParams["PRODUCT_ID"])), "DDCT_DEDUCTION_STORE_ERROR"); $arRes["RESULT"] = false; return $arRes; } $rsProps = CCatalogStoreProduct::GetList(array(), array("PRODUCT_ID" => $arParams["PRODUCT_ID"], "STORE_ID" => $arRecord["STORE_ID"]), false, false, array('ID', 'AMOUNT')); if ($arProp = $rsProps->Fetch()) { if ($arProp["AMOUNT"] < $arRecord["QUANTITY"]) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("DDCT_DEDUCTION_QUANTITY_STORE_ERROR", array_merge(self::GetProductCatalogInfo($arParams["PRODUCT_ID"]), array("#STORE_ID#" => $arRecord["STORE_ID"]))), "DDCT_DEDUCTION_QUANTITY_STORE_ERROR"); $arRes["RESULT"] = false; return $arRes; } else { $res = CCatalogStoreProduct::Update($arProp["ID"], array("AMOUNT" => $arProp["AMOUNT"] - $arRecord["QUANTITY"])); if ($res) { $arRes["STORES"][$arRecord["STORE_ID"]] = $arRecord["QUANTITY"]; $totalAmount += $arRecord["QUANTITY"]; //deleting barcodes if (isset($arRecord["BARCODE"]) && is_array($arRecord["BARCODE"]) && count($arRecord["BARCODE"]) > 0) { foreach ($arRecord["BARCODE"] as $barcodeId => $barcodeValue) { $arFields = array("STORE_ID" => $arRecord["STORE_ID"], "BARCODE" => $barcodeValue, "PRODUCT_ID" => $arParams["PRODUCT_ID"]); $dbres = CCatalogStoreBarcode::GetList(array(), $arFields, false, false, array("ID", "STORE_ID", "BARCODE", "PRODUCT_ID")); if ($arRes = $dbres->Fetch()) { CCatalogStoreBarcode::Delete($arRes["ID"]); } } } } else { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("DDCT_DEDUCTION_SAVE_ERROR", self::GetProductCatalogInfo($arParams["PRODUCT_ID"])), "DDCT_DEDUCTION_SAVE_ERROR"); $arRes["RESULT"] = false; return $arRes; } } } } //updating total sum //TODO // $dbAmount = $DB->Query("SELECT SUM(AMOUNT) as AMOUNT FROM b_catalog_store_product WHERE PRODUCT_ID = ".intval($arParams["PRODUCT_ID"])." ", true); // if ($amount = $dbAmount->Fetch()) // { if ($arParams["PRODUCT_RESERVED"] == "Y") { if ($totalAmount <= $arProduct["QUANTITY_RESERVED"]) { $arFields["QUANTITY_RESERVED"] = $arProduct["QUANTITY_RESERVED"] - $totalAmount; } else { if ($totalAmount <= $arProduct["QUANTITY_RESERVED"] + $arProduct["QUANTITY"]) { $arFields["QUANTITY_RESERVED"] = 0; $arFields["QUANTITY"] = $arProduct["QUANTITY"] - ($totalAmount - $arProduct["QUANTITY_RESERVED"]); } else { $arRes["RESULT"] = false; return $arRes; } } } else { if ($totalAmount <= $arProduct["QUANTITY"]) { $arFields["QUANTITY"] = $arProduct["QUANTITY"] - $totalAmount; } else { if ($totalAmount <= $arProduct["QUANTITY_RESERVED"] + $arProduct["QUANTITY"]) { $arFields["QUANTITY"] = 0; $arFields["QUANTITY_RESERVED"] = $arProduct["QUANTITY_RESERVED"] - ($totalAmount - $arProduct["QUANTITY"]); } else { $arRes["RESULT"] = false; return $arRes; } } } CCatalogProduct::Update($arParams["PRODUCT_ID"], $arFields); // } $arRes["RESULT"] = true; } else { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("DDCT_DEDUCTION_STORE_ERROR", self::GetProductCatalogInfo($arParams["PRODUCT_ID"])), "DEDUCTION_STORE_ERROR1"); $arRes["RESULT"] = false; return $arRes; } } else { if ($arParams["QUANTITY"] <= $arProduct["QUANTITY_RESERVED"] + $arProduct["QUANTITY"]) { if ($arParams["PRODUCT_RESERVED"] == "Y") { if ($arParams["QUANTITY"] <= $arProduct["QUANTITY_RESERVED"]) { $arFields["QUANTITY_RESERVED"] = $arProduct["QUANTITY_RESERVED"] - $arParams["QUANTITY"]; } else { $arFields["QUANTITY_RESERVED"] = 0; $arFields["QUANTITY"] = $arProduct["QUANTITY"] - ($arParams["QUANTITY"] - $arProduct["QUANTITY_RESERVED"]); } } else { if ($arParams["QUANTITY"] <= $arProduct["QUANTITY"]) { $arFields["QUANTITY"] = $arProduct["QUANTITY"] - $arParams["QUANTITY"]; } else { $arFields["QUANTITY"] = 0; $arFields["QUANTITY_RESERVED"] = $arProduct["QUANTITY_RESERVED"] - ($arParams["QUANTITY"] - $arProduct["QUANTITY"]); } } $arRes["RESULT"] = CCatalogProduct::Update($arParams["PRODUCT_ID"], $arFields); } else { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("DDCT_DEDUCTION_QUANTITY_ERROR", self::GetProductCatalogInfo($arParams["PRODUCT_ID"])), "DDCT_DEDUCTION_QUANTITY_ERROR"); $arRes["RESULT"] = false; return $arRes; } } //store control } //emulate /quantity trace } else { if ($arParams["EMULATE"] == "Y" || $arProduct["QUANTITY_TRACE"] == "N") { $arRes["RESULT"] = true; } else { if ($strUseStoreControl == "Y") { if (!empty($arParams["STORE_DATA"])) { $totalAddedAmount = 0; foreach ($arParams["STORE_DATA"] as $id => $arRecord) { $rsProps = CCatalogStoreProduct::GetList(array(), array("PRODUCT_ID" => $arParams["PRODUCT_ID"], "STORE_ID" => $arRecord["STORE_ID"]), false, false, array('ID', 'AMOUNT')); if ($arProp = $rsProps->Fetch()) { $res = CCatalogStoreProduct::Update($arProp["ID"], array("AMOUNT" => $arProp["AMOUNT"] + $arRecord["QUANTITY"])); if ($res) { $arRes["STORES"][$arRecord["STORE_ID"]] = $arRecord["QUANTITY"]; $totalAddedAmount += $arRecord["QUANTITY"]; //adding barcodes if (isset($arRecord["BARCODE"]) && strlen($arRecord["BARCODE"]) > 0) { $arFields = array("STORE_ID" => $arRecord["STORE_ID"], "BARCODE" => $arRecord["BARCODE"], "PRODUCT_ID" => $arParams["PRODUCT_ID"]); CCatalogStoreBarcode::Add($arFields); } } else { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("DDCT_DEDUCTION_SAVE_ERROR", self::GetProductCatalogInfo($arParams["PRODUCT_ID"])), "DDCT_DEDUCTION_SAVE_ERROR"); $arRes["RESULT"] = false; return $arRes; } } } // $dbAmount = $DB->Query("SELECT SUM(AMOUNT) as AMOUNT FROM b_catalog_store_product WHERE PRODUCT_ID = ".$arParams["PRODUCT_ID"]." ", true); // if ($totalAddedAmount = $dbAmount->Fetch()) // { // } if ($arParams["PRODUCT_RESERVED"] == "Y") { $arUpdateFields["QUANTITY_RESERVED"] = $arProduct["QUANTITY_RESERVED"] + $totalAddedAmount; } else { $arUpdateFields["QUANTITY"] = $arProduct["QUANTITY"] + $totalAddedAmount; } CCatalogProduct::Update($arParams["PRODUCT_ID"], $arUpdateFields); $arRes["RESULT"] = true; } else { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("DDCT_DEDUCTION_STORE_ERROR", self::GetProductCatalogInfo($arParams["PRODUCT_ID"])), "DEDUCTION_STORE_ERROR2"); $arRes["RESULT"] = false; return $arRes; } } else { if ($arParams["PRODUCT_RESERVED"] == "Y") { $arFields["QUANTITY_RESERVED"] = $arProduct["QUANTITY_RESERVED"] + $arParams["QUANTITY"]; // $arFields["QUANTITY"] = $arProduct["QUANTITY"] - $arParams["QUANTITY_RESERVED"]; } else { $arFields["QUANTITY"] = $arProduct["QUANTITY"] + $arParams["QUANTITY"]; // $arFields["QUANTITY_RESERVED"] = $arProduct["QUANTITY_RESERVED"] - $arParams["QUANTITY_RESERVED"]; } $arRes["RESULT"] = CCatalogProduct::Update($arParams["PRODUCT_ID"], $arFields); } } //emulate or quantity trace } } else { $arRes["RESULT"] = false; } if (!$arRes["RESULT"]) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("DDCT_UNKNOWN_ERROR", self::GetProductCatalogInfo($arParams["PRODUCT_ID"])), "UNKNOWN_DEDUCTION_ERROR"); } return $arRes; }