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