- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/internals/catalog/provider.php
- Класс: BitrixSaleInternalsCatalogProvider
- Вызов: Provider::setReserveQuantityByProduct
static function setReserveQuantityByProduct(array $shipmentItemList, $storeId, $quantity) : SaleResult
{
$result = new SaleResult();
if ($quantity == 0)
{
return $result;
}
/** @var SaleShipmentItem $shipmentItem */
foreach ($shipmentItemList as $shipmentItem)
{
$basketItem = $shipmentItem->getBasketItem();
if (!$basketItem->isReservableItem())
{
continue;
}
/** @var SaleReserveQuantityCollection $reserveQuantityCollection */
$reserveQuantityCollection = $basketItem->getReserveQuantityCollection();
if (!$reserveQuantityCollection)
{
continue;
}
$productId = $basketItem->getProductId();
/** @var SaleOrder $order */
$order = $basketItem->getBasket()->getOrder();
$pool = PoolQuantity::getInstance($order->getInternalId());
$reserve = null;
/** @var SaleReserveQuantity $item */
foreach ($reserveQuantityCollection as $item)
{
if ($item->getStoreId() === $storeId)
{
$reserve = $item;
break;
}
}
if ($reserve === null)
{
$reserve = $reserveQuantityCollection->create();
$reserve->setStoreId($storeId);
}
if ($quantity < 0)
{
$settableQuantity = $quantity;
if ($shipmentItem->getReservedQuantity() < $quantity)
{
$settableQuantity = $shipmentItem->getReservedQuantity();
}
}
else
{
$needQuantity = $basketItem->getQuantity() - $reserve->getQuantity();
$settableQuantity = (abs($needQuantity) >= abs($quantity)) ? $quantity : $needQuantity;
}
$reserve->setFieldNoDemand('QUANTITY', $reserve->getQuantity() + $settableQuantity);
self::applyReserveToShipmentItem($shipmentItem, $settableQuantity);
$quantity -= $settableQuantity;
$pool->addByStore(SaleInternalsPoolQuantity::POOL_RESERVE_TYPE, $productId, $storeId, $settableQuantity);
$foundItem = false;
$poolItems = SaleInternalsItemsPool::get($order->getInternalId(), $productId);
if (!empty($poolItems))
{
/** @var SaleShipmentItem $poolItem */
foreach ($poolItems as $poolItem)
{
if (
$poolItem instanceof SaleShipmentItem
&& $poolItem->getInternalIndex() == $shipmentItem->getInternalIndex()
)
{
$foundItem = true;
break;
}
}
}
if (!$foundItem)
{
SaleInternalsItemsPool::add($order->getInternalId(), $productId, $shipmentItem);
}
}
return $result;
}