• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/Reservation/Strategy/ReservePaidProductsStrategy.php
  • Класс: Bitrix\Crm\Reservation\Strategy\ReservePaidProductsStrategy
  • Вызов: ReservePaidProductsStrategy::removeReservesPaymentProducts
public function removeReservesPaymentProducts(int $ownerTypeId, int $ownerId, Payment $payment): ReservationResult
{
	$result = new ReservationResult();

	/**
	 * @var PayableBasketItem[] $paymentBasketItems
	 */
	$paymentBasketItems = $payment->getPayableItemCollection()->getBasketItems();
	$unReservedBasketItems = [];
	$unReservedProductsIds = [];
	foreach ($paymentBasketItems as $payableItem)
	{
		$basketId = (int)$payableItem->getField('ENTITY_ID');
		$unReservedBasketItems[$basketId] = (float)$payableItem->getField('QUANTITY');

		/**
		 * @var BasketItem $entityObject
		 */
		$entityObject = $payableItem->getEntityObject();
		$unReservedProductsIds[] = $entityObject->getProductId();
	}

	if (empty($unReservedBasketItems))
	{
		return $result;
	}

	$productRowToBasket = BasketService::getInstance()->getRowIdsToBasketIdsByEntity($ownerTypeId, $ownerId);
	$existReserves = ProductRowReservationTable::getList([
		'select' => [
			'ID',
			'ROW_ID',
			'RESERVE_QUANTITY',
			'DATE_RESERVE_END',
			'STORE_ID',
		],
		'filter' => [
			'=ROW_ID' => array_keys($productRowToBasket),
		],
	]);
	foreach ($existReserves as $reserve)
	{
		$rowId = (int)$reserve['ROW_ID'];
		$basketId = $productRowToBasket[$rowId] ?? null;
		if (!$basketId)
		{
			continue;
		}

		$unReservedQuantity = (float)($unReservedBasketItems[$basketId] ?? 0.0);
		if (empty($unReservedQuantity))
		{
			continue;
		}

		$reserveQuantity = (float)$reserve['RESERVE_QUANTITY'];
		$newReserveQuantity = max(0, $reserveQuantity - $unReservedQuantity);

		$saveResult = $this->saveCrmReserve([
			'ID' => $reserve['ID'],
			'RESERVE_QUANTITY' => $newReserveQuantity,
		]);

		$reserveInfo = $result->addReserveInfo(
			$rowId,
			$newReserveQuantity,
			$newReserveQuantity - $reserveQuantity
		);
		$reserveInfo->setStoreId((int)$reserve['STORE_ID']);
		$reserveInfo->setDateReserveEnd((string)$reserve['DATE_RESERVE_END']);

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

	return $result;
}