- Модуль: crm
- Путь к файлу: ~/bitrix/modules/crm/lib/Reservation/Strategy/ReserveQuantityEqualProductQuantityStrategy.php
- Класс: Bitrix\Crm\Reservation\Strategy\ReserveQuantityEqualProductQuantityStrategy
- Вызов: ReserveQuantityEqualProductQuantityStrategy::reservationProductRow
public function reservationProductRow(int $productRowId, float $quantity, int $storeId, ?Date $dateReserveEnd): ReservationResult
{
$result = new ReservationResult();
$productRow = $this->getProductRow($productRowId);
if (!$productRow)
{
$result->addError(
new Error(Loc::getMessage('CRM_RESERVATION_STRATEGY_RESERVE_QUANTITY_EQUAL_PRODUCT_QUANTITY_STRATEDY_PRODUCT_NOT_FOUND'))
);
return $result;
}
if (
ReservationService::getInstance()->isRestrictedType((int)$productRow['TYPE'])
|| (int)$productRow['PRODUCT_ID'] === 0
)
{
$result->addError(
new Error(Loc::getMessage('CRM_RESERVATION_STRATEGY_RESERVE_QUANTITY_EQUAL_PRODUCT_QUANTITY_STRATEGY_PRODUCT_NOT_SUPPORT_RESERVATION'))
);
return $result;
}
$productRowQuantity = (float)$productRow['QUANTITY'];
if ($productRowQuantity < $quantity)
{
$result->addError(
new Error(Loc::getMessage('CRM_RESERVATION_STRATEGY_RESERVE_QUANTITY_EQUAL_PRODUCT_QUANTITY_STRATEDY_LARGE_RESERVE_THAN_QUANTITY'))
);
return $result;
}
$reserveInfo = $result->addReserveInfo(
$productRowId,
$quantity,
$quantity
);
$reserveInfo->setStoreId($storeId);
$reserveInfo->setDateReserveEnd($dateReserveEnd ? (string)$dateReserveEnd : null);
$isAutoReservation = $productRowQuantity === $quantity;
$existReserve = $this->getReserve($productRowId);
if ($existReserve)
{
if ((int)$existReserve['STORE_ID'] !== $storeId)
{
$reserveInfo->setChanged();
}
else
{
$reserveInfo->setDeltaReserveQuantity($quantity - (float)$existReserve['RESERVE_QUANTITY']);
}
$saveResult = $this->saveCrmReserve([
'ID' => $existReserve['ID'],
'RESERVE_QUANTITY' => $quantity,
'STORE_ID' => $storeId,
'DATE_RESERVE_END' => $dateReserveEnd,
'IS_AUTO' => $isAutoReservation && $existReserve['IS_AUTO'] === 'Y' ? 'Y' : 'N',
]);
$result->addErrors(
$saveResult->getErrors()
);
return $result;
}
// If the quantity is empty, reserve all. Only when adding.
if ($quantity === 0.0)
{
$quantity = $productRowQuantity;
$isAutoReservation = true;
$reserveInfo->setReserveQuantity($quantity);
$reserveInfo->setDeltaReserveQuantity($quantity);
}
$saveResult = $this->saveCrmReserve([
'ROW_ID' => $productRowId,
'RESERVE_QUANTITY' => $quantity,
'STORE_ID' => $storeId,
'DATE_RESERVE_END' => $dateReserveEnd,
'IS_AUTO' => $isAutoReservation ? 'Y' : 'N',
]);
$result->addErrors(
$saveResult->getErrors()
);
return $result;
}