- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/shipmentitem.php
- Класс: BitrixSaleShipmentItem
- Вызов: ShipmentItem::onFieldModify
protected function onFieldModify($name, $oldValue, $value)
{
$result = new Result();
$shipment = $this->getCollection()->getShipment();
$order = $shipment->getCollection()->getOrder();
if ($shipment->isShipped())
{
return $result->addError(
new ResultError(
Loc::getMessage('SALE_SHIPMENT_ITEM_SHIPMENT_ALREADY_SHIPPED_CANNOT_EDIT'),
'SALE_SHIPMENT_ITEM_SHIPMENT_ALREADY_SHIPPED_CANNOT_EDIT'
)
);
}
if ($name == "QUANTITY")
{
/** @var BasketItem $basketItem */
if (!$basketItem = $this->getBasketItem())
{
if ($value != 0)
{
throw new MainObjectNotFoundException('Entity "BasketItem" not found');
}
}
$deltaQuantity = $value - $oldValue;
if ($basketItem && $deltaQuantity > 0)
{
$systemShipment = $shipment->getCollection()->getSystemShipment();
$systemBasketItemQuantity = $systemShipment->getBasketItemQuantity($basketItem);
if ($systemBasketItemQuantity < abs($deltaQuantity))
{
$errorBasketCode = $basketItem->getBasketCode();
if ($basketItem->isBundleChild())
{
/** @var BasketItem $parentBasketItem */
if (!($parentBasketItem = $basketItem->getParentBasketItem()))
{
throw new MainObjectNotFoundException('Entity "Parent Basket Item" not found');
}
$errorBasketCode = $parentBasketItem->getBasketCode();
}
if (isset(static::$errors[$errorBasketCode][$basketItem->getField('ORDER_DELIVERY_BASKET_ID')]['STORE_QUANTITY_LARGER_ALLOWED']))
{
static::$errors[$errorBasketCode][$basketItem->getField('ORDER_DELIVERY_BASKET_ID')]['STORE_QUANTITY_LARGER_ALLOWED'] += $basketItem->getQuantity();
}
else
{
$result->addError(
new ResultError(
Loc::getMessage(
'SALE_SHIPMENT_ITEM_LESS_AVAILABLE_QUANTITY_2',
[
'#PRODUCT_NAME#' => $basketItem->getField('NAME'),
]
), 'SALE_SHIPMENT_ITEM_LESS_AVAILABLE_QUANTITY'
)
);
static::$errors[$errorBasketCode][$basketItem->getField('ORDER_DELIVERY_BASKET_ID')]['STORE_QUANTITY_LARGER_ALLOWED'] = $basketItem->getQuantity();
}
return $result;
}
}
if ($basketItem)
{
if (!$this->isMathActionOnly())
{
$r = $this->calculateDelivery();
if (!$r->isSuccess())
{
$result->addErrors($r->getErrors());
}
}
}
/** @var ShipmentItemStoreCollection $shipmentItemStoreCollection */
$shipmentItemStoreCollection = $this->getShipmentItemStoreCollection();
if (
!$shipmentItemStoreCollection
&& $basketItem->isReservableItem()
)
{
throw new MainObjectNotFoundException('Entity "ShipmentItemStoreCollection" not found');
}
if ($shipmentItemStoreCollection)
{
if ((int)$value === 0)
{
$basketItemName = Loc::getMessage("SALE_SHIPMENT_ITEM_BASKET_WRONG_BASKET_ITEM");
$basketItemProductId = '1';
if ($basketItem)
{
$basketItemName = $basketItem->getField('NAME');
$basketItemProductId = $basketItem->getProductId();
}
$registry = Registry::getInstance(static::getRegistryType());
/** @var OrderHistory $orderHistory */
$orderHistory = $registry->getOrderHistoryClassName();
$orderHistory::addAction(
'SHIPMENT',
$order->getId(),
'SHIPMENT_ITEM_BASKET_REMOVED',
$shipment->getId(),
null,
[
'NAME' => $basketItemName,
'PRODUCT_ID' => $basketItemProductId,
]
);
/** @var ShipmentItemStore $shipmentItemStore */
foreach ($shipmentItemStoreCollection as $shipmentItemStore)
{
$shipmentItemStore->delete();
}
}
elseif ($basketItem->isReservableItem())
{
// check barcodes
$r = $shipmentItemStoreCollection->onShipmentItemModify(EventActions::UPDATE, $this, $name, $oldValue, $value);
if (!$r->isSuccess())
{
$result->addErrors($r->getErrors());
return $result;
}
$barcodeQuantity = $shipmentItemStoreCollection->getQuantityByBasketCode($basketItem->getBasketCode());
if ($barcodeQuantity > $value)
{
$result->addError(
new ResultError(
Loc::getMessage('SALE_SHIPMENT_ITEM_BARCODE_MORE_ITEM_QUANTITY'),
'BARCODE_MORE_ITEM_QUANTITY'
)
);
return $result;
}
}
}
if (!$basketItem)
{
return $result;
}
}
return parent::onFieldModify($name, $oldValue, $value);
}