• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/Reservation/Agent/ReservedProductCleaner.php
  • Класс: Bitrix\Crm\Reservation\Agent\ReservedProductCleaner
  • Вызов: ReservedProductCleaner::releaseDealReserves
private function releaseDealReserves(): int
{
	$processedRecords = 0;

	/**
	 * @var \Bitrix\Crm\Service\Factory\Deal $factory
	 */
	$factory = Container::getInstance()->getFactory(CCrmOwnerType::Deal);
	if (!$factory)
	{
		return $processedRecords;
	}

	$dealReserves = [];
	$rows = ProductRowReservationTable::getList([
		'select' => [
			'ID',
			'RESERVE_QUANTITY',
			'PRODUCT_ROW_ID' => 'PRODUCT_ROW.ID',
			'PRODUCT_ROW_OWNER_ID' => 'PRODUCT_ROW.OWNER_ID',
		],
		'filter' => [
			'>RESERVE_QUANTITY' => 0,
			'<=DATE_RESERVE_END' => new DateTime(),
			'!=PRODUCT_ROW.DEAL_OWNER.CLOSED' => 'Y',
		],
		'limit' => self::RECORD_LIMIT,
	]);
	foreach ($rows as $row)
	{
		$rowId = (int)$row['PRODUCT_ROW_ID'];
		$ownerId = (int)$row['PRODUCT_ROW_OWNER_ID'];

		$validRecord = $rowId > 0 && $ownerId > 0;
		if (!$validRecord)
		{
			continue;
		}

		$dealReserves[$ownerId] ??= [];
		$dealReserves[$ownerId][$rowId] = [
			'ID' => $row['ID'],
			'RESERVE_QUANTITY' => $row['RESERVE_QUANTITY'],
		];

		$processedRecords++;
	}

	if (empty($dealReserves))
	{
		return 0;
	}

	/**
	 * @var Deal[] $deals
	 */
	$deals = $factory->getItems([
		'select' => [
			'*',
			Deal::FIELD_NAME_PRODUCTS,
		],
		'filter' => [
			'=ID' => array_keys($dealReserves),
		],
	]);
	foreach ($deals as $deal)
	{
		/**
		 * @var ProductRow[] $productRows
		 */
		$productRows = $deal->getProductRows();
		if (empty($productRows))
		{
			continue;
		}

		$dealId = $deal->getId();
		foreach ($productRows as $productRow)
		{
			$rowId = $productRow->getId();
			if (!isset($dealReserves[$dealId][$rowId]))
			{
				continue;
			}

			/**
			 * @var ProductRowReservation $reservation
			 */
			$reservation = $productRow->getProductRowReservation();
			if ($reservation)
			{
				$reservation->setReserveQuantity(0);
				$reservation->setDateReserveEnd(null);
			}
		}

		$operation = $factory->getUpdateOperation($deal);
		$result = $operation->launch();
		$this->logResult("update deal '{$dealId}'", $result);

		if ($result->isSuccess())
		{
			unset($dealReserves[$dealId]);
		}
	}

	$this->forceDeleteReserves($dealReserves);

	return $processedRecords;
}