• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/shipmentitemstore.php
  • Класс: BitrixSaleShipmentItemStore
  • Вызов: ShipmentItemStore::onFieldModify
protected function onFieldModify($name, $oldValue, $value)
{
	global $USER;

	if (is_object($USER) && $USER->isAuthorized())
	{
		$this->setFieldNoDemand('MODIFIED_BY', $USER->GetID());
	}

	$this->setFieldNoDemand('DATE_MODIFY', new MainTypeDateTime());

	$result = parent::onFieldModify($name, $oldValue, $value);
	if (!$result->isSuccess())
	{
		return $result;
	}

	if (
		$name === 'STORE_ID'
		&& $this->needMoveReserve()
	)
	{
		$shipmentItem = $this->getCollection()->getShipmentItem();
		$basketItem = $shipmentItem->getBasketItem();

		/** @var ReserveQuantityCollection $reserveCollection */
		$reserveCollection = $basketItem->getReserveQuantityCollection();

		if (
			$reserveCollection
			&& $shipmentItem->getReservedQuantity() > 0
			&& $this->getQuantity() > 0
		)
		{
			$storeIdFrom = (int)$oldValue ?: Configuration::getDefaultStoreId();
			$storeIdTo = (int)$value;

			if (
				$storeIdFrom === 0
				|| $storeIdTo === 0
				|| $storeIdFrom === $storeIdTo
			)
			{
				return $result;
			}

			$reserveTo = $reserveFrom = null;

			/** @var ReserveQuantity $reserve */
			foreach ($reserveCollection as $reserve)
			{
				if ($reserve->getStoreId() === $storeIdFrom)
				{
					$reserveFrom = $reserve;
				}
				elseif ($reserve->getStoreId() === $storeIdTo)
				{
					$reserveTo = $reserve;
				}

				if ($reserveTo && $reserveFrom)
				{
					break;
				}
			}

			if ($reserveFrom)
			{
				$settableQuantity = $reserveFrom->getQuantity() - $this->getQuantity();
				if ($settableQuantity > 0)
				{
					$reserveFrom->setField('QUANTITY', $settableQuantity);
				}
				else
				{
					$reserveFrom->delete();
				}
			}

			if (!$reserveTo)
			{
				$reserveTo = $reserveCollection->create();
				$reserveTo->setStoreId($storeIdTo);
			}

			$reserveTo->setQuantity($reserveTo->getQuantity() + $this->getQuantity());
		}
	}
	elseif (
		$name === 'QUANTITY'
		&& $this->needMoveReserve()
	)
	{
		$shipmentItem = $this->getCollection()->getShipmentItem();
		$basketItem = $shipmentItem->getBasketItem();

		/** @var ReserveQuantityCollection $reserveCollection */
		$reserveCollection = $basketItem->getReserveQuantityCollection();

		if ($reserveCollection && $shipmentItem->getReservedQuantity() > 0)
		{
			if ($value > $oldValue)
			{
				$storeIdFrom = Configuration::getDefaultStoreId();
				$storeIdTo = $this->getStoreId();
			}
			else
			{
				$storeIdTo = Configuration::getDefaultStoreId();
				$storeIdFrom = $this->getStoreId();
			}

			if (
				$storeIdFrom === 0
				|| $storeIdTo === 0
				|| $storeIdFrom === $storeIdTo
			)
			{
				return $result;
			}

			$reserveTo = $reserveFrom = null;

			/** @var ReserveQuantity $reserve */
			foreach ($reserveCollection as $reserve)
			{
				if ($reserve->getStoreId() === $storeIdFrom)
				{
					$reserveFrom = $reserve;
				}
				elseif ($reserve->getStoreId() === $storeIdTo)
				{
					$reserveTo = $reserve;
				}

				if ($reserveTo && $reserveFrom)
				{
					break;
				}
			}

			$delta = abs($oldValue - $value);

			if ($reserveFrom)
			{
				$settableQuantity = $reserveFrom->getQuantity() - $delta;
				if ($settableQuantity > 0)
				{
					$reserveFrom->setField('QUANTITY', $settableQuantity);
				}
				else
				{
					$reserveFrom->delete();
				}
			}

			if (!$reserveTo)
			{
				$reserveTo = $reserveCollection->create();
				$reserveTo->setStoreId($storeIdTo);
			}

			$reserveTo->setQuantity($reserveTo->getQuantity() + $delta);
		}
	}

	return $result;
}