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