コード例 #1
0
	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;
	}
コード例 #2
0
 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;
 }
コード例 #3
0
 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;
 }