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

	$paidRows = $this->getPaidProductRows($ownerTypeId, $ownerId);

	$rowIds = array_keys($paidRows);
	$existReserves = $this->getReservesByRowsIds($rowIds);
	$deductedRows = $this->getDeductedProductRows($rowIds);
	foreach ($paidRows as $rowId => $paidQuantity)
	{
		$reserve = $existReserves[$rowId] ?? null;
		$reserveQuantity = (float)($reserve['RESERVE_QUANTITY'] ?? 0);
		$deductedQuantity = (float)($deductedRows[$rowId] ?? 0.0);
		$newReserveQuantity = $paidQuantity - $deductedQuantity;

		if ($reserveQuantity >= $newReserveQuantity)
		{
			continue;
		}

		$reserveInfo = $result->addReserveInfo(
			$rowId,
			$newReserveQuantity,
			$newReserveQuantity - $reserveQuantity
		);

		if ($reserve)
		{
			$reserveInfo->setStoreId($reserve['STORE_ID']);
			$reserveInfo->setDateReserveEnd((string)$reserve['DATE_RESERVE_END']);

			$saveResult = $this->saveCrmReserve([
				'ID' => $reserve['ID'],
				'RESERVE_QUANTITY' => $newReserveQuantity,
			]);
		}
		else
		{
			$reserveInfo->setStoreId($this->defaultStoreId);
			$reserveInfo->setDateReserveEnd((string)$this->defaultDateReserveEnd);

			$saveResult = $this->saveCrmReserve([
				'ROW_ID' => $rowId,
				'RESERVE_QUANTITY' => $newReserveQuantity,
				'STORE_ID' => $this->defaultStoreId,
				'DATE_RESERVE_END' => $this->defaultDateReserveEnd,
			]);
		}

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

	return $result;
}