- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/internals/shipmentrules.php
- Класс: BitrixSaleInternalsShipmentRules
- Вызов: ShipmentRules::createShipRule
static function createShipRule(SaleShipmentItem $shipmentItem, PoolQuantity $pool)
{
$basketItem = $shipmentItem->getBasketItem();
if (!$basketItem->isReservableItem())
{
return false;
}
$poolQuantitiesList = $pool->getQuantitiesWithStore(PoolQuantity::POOL_QUANTITY_TYPE);
if (empty($poolQuantitiesList))
{
return false;
}
$shipment = $shipmentItem->getCollection()->getShipment();
$coefficient = 1;
if ($shipment->needShip() === SaleInternalsCatalogProvider::SALE_TRANSFER_PROVIDER_SHIPMENT_NEED_SHIP)
{
$coefficient = -1;
}
$needUseReserve = $coefficient < 1 || SaleConfiguration::isEnableAutomaticReservation();
$productId = $basketItem->getProductId();
$rule = array(
'SHIPMENT_ITEM' => $shipmentItem,
'BASKET_ITEM' => $basketItem,
'PRODUCT_ID' => $productId,
'PROVIDER_NAME' => $basketItem->getProvider(),
);
$storeData = SaleInternalsCatalogProvider::createMapShipmentItemStoreData($shipmentItem, $needUseReserve);
if (!empty($storeData))
{
$reservedQuantity = 0;
$needReserveByStore = [];
foreach ($storeData as $item)
{
$reservedQuantity += $item['RESERVED_QUANTITY'];
$needReserveByStore[$item['STORE_ID']] = $item['RESERVED_QUANTITY'] > 0;
}
$rule['STORE_DATA'] = [
$shipmentItem->getInternalIndex() => $storeData
];
$rule['NEED_RESERVE'] = $reservedQuantity > 0;
$rule['NEED_RESERVE_BY_STORE'] = [
$shipmentItem->getInternalIndex() => $needReserveByStore
];
}
else
{
$rule['NEED_RESERVE'] = $basketItem->getReservedQuantity() > 0;
$rule['NEED_RESERVE_BY_STORE'] = [
$shipmentItem->getInternalIndex() => [
SaleConfiguration::getDefaultStoreId() => $rule['NEED_RESERVE']
]
];
$reservedQuantity = 0;
/** @var SaleReserveQuantityCollection $reserveQuantityCollection */
$reserveQuantityCollection = $basketItem->getReserveQuantityCollection();
if ($reserveQuantityCollection)
{
$reservedQuantity = $reserveQuantityCollection->getQuantityByStoreId(
SaleConfiguration::getDefaultStoreId()
);
}
if ($shipmentItem->getQuantity() < $reservedQuantity)
{
$reservedQuantity = $shipmentItem->getQuantity();
}
$rule['RESERVED_QUANTITY'] = $reservedQuantity;
$rule['RESERVED_QUANTITY_BY_STORE'] = [
$shipmentItem->getInternalIndex() => [
SaleConfiguration::getDefaultStoreId() => $reservedQuantity
]
];
}
if (array_key_exists($productId, $poolQuantitiesList))
{
$quantityByStore = [];
foreach ($storeData as $item)
{
$storeId = $item['STORE_ID'];
$quantity = $coefficient * $item['QUANTITY'];
if (!isset($quantityByStore[$storeId]))
{
$quantityByStore[$storeId] = 0;
}
$quantityByStore[$storeId] += $quantity;
$poolQuantity = $poolQuantitiesList[$productId][$storeId] - $quantity;
$pool->setByStore(PoolQuantity::POOL_QUANTITY_TYPE, $productId, $storeId, $poolQuantity);
}
if ($quantityByStore)
{
$rule['ACTION'][PoolQuantity::POOL_QUANTITY_TYPE] = [
'QUANTITY_BY_STORE' => $quantityByStore,
'QUANTITY' => array_sum($quantityByStore)
];
}
else
{
$storeId = SaleConfiguration::getDefaultStoreId();
$quantity = $coefficient * $shipmentItem->getQuantity();
$rule['ACTION'][PoolQuantity::POOL_QUANTITY_TYPE] = [
'QUANTITY' => $quantity,
'QUANTITY_BY_STORE' => [
$storeId => $quantity
]
];
}
}
return $rule;
}