• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/internals/shipmentrules.php
  • Класс: BitrixSaleInternalsShipmentRules
  • Вызов: ShipmentRules::createReserveRule
static function createReserveRule(SaleReserveQuantity $reserve, PoolQuantity $pool, int $productId)
{
	$basketItem = $reserve->getCollection()->getBasketItem();

	$poolReservationList = $pool->getQuantitiesWithStore(PoolQuantity::POOL_RESERVE_TYPE);
	if (
		empty($poolReservationList)
		|| !isset($poolReservationList[$productId])
	)
	{
		return false;
	}

	$rule = [
		'PRODUCT_ID' => $productId,
		'BASKET_ITEM' => $basketItem,
		'PROVIDER_NAME' => $basketItem->getProvider(),
		'RESERVE_ITEM' => $reserve,
		'STORE' => []
	];

	$quantityByStore = [];
	if ($reserve->getQuantity() > 0)
	{
		$quantity = $reserve->getFields()->getOriginalValues()['QUANTITY'] ?? 0;
		$quantityByStore = [
			$reserve->getStoreId() => $reserve->getQuantity() - $quantity
		];
	}
	elseif ($reserve->getQuantity() == 0)
	{
		$quantity = $reserve->getFields()->getOriginalValues()['QUANTITY'];
		$quantityByStore = [$reserve->getStoreId() => -$quantity];
	}

	if ($quantityByStore)
	{
		$rule['ACTION'][PoolQuantity::POOL_RESERVE_TYPE] = [
			'QUANTITY_BY_STORE' => $quantityByStore,
			'QUANTITY' => array_sum($quantityByStore),
		];
	}

	$pool->setByStore(PoolQuantity::POOL_RESERVE_TYPE, $productId, $reserve->getStoreId(), 0);

	return $rule;
}