• Модуль: catalog
  • Путь к файлу: ~/bitrix/modules/catalog/lib/product/catalogprovider.php
  • Класс: BitrixCatalogProductCatalogProvider
  • Вызов: CatalogProvider::tryShip
public function tryShip(array $products)
	{
		$result = new SaleResult();
		$resultList = array();

		$filteredProducts = $this->createQuantityFilteredProducts($products);

		if (empty($filteredProducts))
		{
			$result->setData(
				array(
					'TRY_SHIP_PRODUCTS_LIST' => array_fill_keys(array_keys($products), true)
				)
			);

			return $result;
		}

		$availableItems = $this->createProductsListWithCatalogData($filteredProducts);
		if (empty($availableItems))
		{
			$productIdList = array_keys($products);
			foreach($productIdList as $productId)
			{
				$result->addError(
					new SaleResultError(
						MainLocalizationLoc::getMessage(
							"SALE_PROVIDER_PRODUCT_NOT_AVAILABLE",
							array_merge(
								self::getProductCatalogInfo($productId),
								array("#PRODUCT_ID#" => $productId)
							)
						), "SALE_PROVIDER_PRODUCT_NOT_AVAILABLE"
					)
				);
			}

			$result->setData(
				array(
					'TRY_SHIP_PRODUCTS_LIST' => array_fill_keys($productIdList, false)
				)
			);

			return $result;
		}
		else
		{
			foreach ($availableItems as $productId => $productData)
			{
				$messageId = null;
				if (
					isset($productData['PRODUCT']['TYPE'])
					&& $productData['PRODUCT']['TYPE'] === CatalogProductTable::TYPE_SERVICE
				)
				{
					if (
						(!isset($productData['CATALOG']['ACTIVE']) || $productData['CATALOG']['ACTIVE'] !== 'Y')
						|| (!isset($productData['PRODUCT']['AVAILABLE']) || $productData['PRODUCT']['AVAILABLE'] !== 'Y')
					)
					{
						$messageId = 'SALE_PROVIDER_PRODUCT_SERVICE_NOT_AVAILABLE';
					}
				}
				else
				{
					if (!isset($productData['CATALOG']['ACTIVE']) || $productData['CATALOG']['ACTIVE'] !== 'Y')
					{
						$messageId = 'SALE_PROVIDER_PRODUCT_NOT_AVAILABLE';
					}
				}
				if ($messageId !== null)
				{
					$result->addError(
						new SaleResultError(
							MainLocalizationLoc::getMessage(
								$messageId,
								array_merge(
									self::getProductCatalogInfo($productId),
									array("#PRODUCT_ID#" => $productId)
								)
							), "SALE_PROVIDER_PRODUCT_NOT_AVAILABLE"
						)
					);

					$resultList[$productId] = false;
					unset($availableItems[$productId]);
				}
			}
		}

		if (!empty($availableItems))
		{
			if (CatalogConfigState::isUsedInventoryManagement())
			{
				$r = $this->checkProductsInStore($availableItems);
				if ($r->isSuccess())
				{
					$data = $r->getData();
					if (!empty($data['PRODUCTS_LIST_IN_STORE']))
					{
						$resultList = $resultList + $data['PRODUCTS_LIST_IN_STORE'];
					}
				}
				else
				{
					$result->addErrors($r->getErrors());
				}
			}
			else
			{
				$r = $this->checkProductsQuantity($availableItems);
				if ($r->isSuccess())
				{
					$data = $r->getData();
					if (!empty($data['PRODUCTS_LIST_REQUIRED_QUANTITY']))
					{
						$resultList = $resultList + $data['PRODUCTS_LIST_REQUIRED_QUANTITY'];
					}
				}
				else
				{
					$result->addErrors($r->getErrors());
				}

			}
		}

		if (!empty($resultList))
		{
			$result->setData(
				array(
					'TRY_SHIP_PRODUCTS_LIST' => $resultList
				)
			);
		}

		return $result;
	}