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