- Модуль: 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;
}