• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/helpers/order/builder/basketbuilder.php
  • Класс: BitrixSaleHelpersOrderBuilderBasketBuilder
  • Вызов: BasketBuilder::setReserveDataForItem
protected function setReserveDataForItem(BasketItem $item, array $reserveData)
{
	if (!$item->isReservableItem())
	{
		return;
	}

	$reserveCollection = $item->getReserveQuantityCollection();
	if (!$reserveCollection)
	{
		return;
	}

	// if some reserves were created upon order creation, we have to clear them and set the manual reserves
	if ($this->getOrder()->isNew())
	{
		$this->clearReservesForItem($item);
	}

	foreach ($reserveData as $reserveCode => $reserve)
	{
		$isNewReserve = mb_strpos($reserveCode, 'n') === 0;
		if ($isNewReserve)
		{
			$reserveCollectionItem = $reserveCollection->create();
		}
		else
		{
			$reserveCollectionItem = $reserveCollection->getItemById($reserveCode);
			if (!$reserveCollectionItem)
			{
				continue;
			}
		}

		if (isset($reserve['STORE_ID']) && (int)$reserve['STORE_ID'] !== $reserveCollectionItem->getStoreId())
		{
			if (!$isNewReserve)
			{
				// drop the old reserve and create a new one instead since we can't just change the store id like that
				$deleteResult = $reserveCollectionItem->delete();
				if (!$deleteResult->isSuccess())
				{
					$this->getErrorsContainer()->addErrors($deleteResult->getErrors());
					continue;
				}

				$reserveCollectionItem = $reserveCollection->create();
			}

			$reserveCollectionItem->setStoreId((int)$reserve['STORE_ID']);
		}

		if (isset($reserve['QUANTITY']))
		{
			$quantity = (float)$reserve['QUANTITY'];
			if ($quantity < 0)
			{
				$quantity = 0;
			}
			$reserveCollectionItem->setQuantity($quantity);
		}

		if (isset($reserve['DATE_RESERVE_END']) && $reserve['DATE_RESERVE_END'] !== '')
		{
			$dateReserveEnd = new Date($reserve['DATE_RESERVE_END']);
			$reserveCollectionItem->setField('DATE_RESERVE_END', $dateReserveEnd);
		}

		if (isset($reserve['RESERVED_BY']))
		{
			$reserveCollectionItem->setField('RESERVED_BY', $reserve['RESERVED_BY']);
		}
	}
}