• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/Reservation/Strategy/ReserveQuantityEqualProductQuantityStrategy.php
  • Класс: Bitrix\Crm\Reservation\Strategy\ReserveQuantityEqualProductQuantityStrategy
  • Вызов: ReserveQuantityEqualProductQuantityStrategy::reservationProductRow
public function reservationProductRow(int $productRowId, float $quantity, int $storeId, ?Date $dateReserveEnd): ReservationResult
{
	$result = new ReservationResult();

	$productRow = $this->getProductRow($productRowId);
	if (!$productRow)
	{
		$result->addError(
			new Error(Loc::getMessage('CRM_RESERVATION_STRATEGY_RESERVE_QUANTITY_EQUAL_PRODUCT_QUANTITY_STRATEDY_PRODUCT_NOT_FOUND'))
		);
		return $result;
	}

	if (
		ReservationService::getInstance()->isRestrictedType((int)$productRow['TYPE'])
		|| (int)$productRow['PRODUCT_ID'] === 0
	)
	{
		$result->addError(
			new Error(Loc::getMessage('CRM_RESERVATION_STRATEGY_RESERVE_QUANTITY_EQUAL_PRODUCT_QUANTITY_STRATEGY_PRODUCT_NOT_SUPPORT_RESERVATION'))
		);
		return $result;
	}

	$productRowQuantity = (float)$productRow['QUANTITY'];
	if ($productRowQuantity < $quantity)
	{
		$result->addError(
			new Error(Loc::getMessage('CRM_RESERVATION_STRATEGY_RESERVE_QUANTITY_EQUAL_PRODUCT_QUANTITY_STRATEDY_LARGE_RESERVE_THAN_QUANTITY'))
		);
		return $result;
	}

	$reserveInfo = $result->addReserveInfo(
		$productRowId,
		$quantity,
		$quantity
	);
	$reserveInfo->setStoreId($storeId);
	$reserveInfo->setDateReserveEnd($dateReserveEnd ? (string)$dateReserveEnd : null);

	$isAutoReservation = $productRowQuantity === $quantity;
	$existReserve = $this->getReserve($productRowId);
	if ($existReserve)
	{
		if ((int)$existReserve['STORE_ID'] !== $storeId)
		{
			$reserveInfo->setChanged();
		}
		else
		{
			$reserveInfo->setDeltaReserveQuantity($quantity - (float)$existReserve['RESERVE_QUANTITY']);
		}

		$saveResult = $this->saveCrmReserve([
			'ID' => $existReserve['ID'],
			'RESERVE_QUANTITY' => $quantity,
			'STORE_ID' => $storeId,
			'DATE_RESERVE_END' => $dateReserveEnd,
			'IS_AUTO' => $isAutoReservation && $existReserve['IS_AUTO'] === 'Y' ? 'Y' : 'N',
		]);

		$result->addErrors(
			$saveResult->getErrors()
		);

		return $result;
	}

	// If the quantity is empty, reserve all. Only when adding.
	if ($quantity === 0.0)
	{
		$quantity = $productRowQuantity;
		$isAutoReservation = true;

		$reserveInfo->setReserveQuantity($quantity);
		$reserveInfo->setDeltaReserveQuantity($quantity);
	}

	$saveResult = $this->saveCrmReserve([
		'ROW_ID' => $productRowId,
		'RESERVE_QUANTITY' => $quantity,
		'STORE_ID' => $storeId,
		'DATE_RESERVE_END' => $dateReserveEnd,
		'IS_AUTO' => $isAutoReservation ? 'Y' : 'N',
	]);

	$result->addErrors(
		$saveResult->getErrors()
	);

	return $result;
}