• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/shipmentitem.php
  • Класс: Bitrix\Sale\ShipmentItem
  • Вызов: ShipmentItem::save
public function save()
{
	$this->checkCallingContext();

	$result = new Result();

	$id = $this->getId();
	$fields = $this->fields->getValues();

	$shipment = $this->getCollection()->getShipment();

	/** @var Order $order */
	$order = $shipment->getCollection()->getOrder();

	if ($this->isChanged())
	{
		/** @var Main\Entity\Event $event */
		$event = new Main\Event('sale', 'OnBeforeSaleShipmentItemEntitySaved', [
				'ENTITY' => $this,
				'VALUES' => $this->fields->getOriginalValues()
		]);
		$event->send();
	}

	if ($id > 0)
	{
		$fields = $this->fields->getChangedValues();

		if (!empty($fields) && is_array($fields))
		{
			if (!$shipment->isSystem())
			{
				if (isset($fields["QUANTITY"]) && (floatval($fields["QUANTITY"]) == 0))
				{
					return $result;
				}
			}

			$r = $this->updateInternal($id, $fields);
			if (!$r->isSuccess())
			{
				$registry = Registry::getInstance(static::getRegistryType());

				/** @var OrderHistory $orderHistory */
				$orderHistory = $registry->getOrderHistoryClassName();
				$orderHistory::addAction(
					'SHIPMENT',
					$order->getId(),
					'SHIPMENT_ITEM_UPDATE_ERROR',
					$id,
					$this,
					["ERROR" => $r->getErrorMessages()]
				);

				$result->addErrors($r->getErrors());
				return $result;
			}

			if ($resultData = $r->getData())
				$result->setData($resultData);
		}

		if ($order && $order->getId() > 0)
		{
			$registry = Registry::getInstance(static::getRegistryType());

			/** @var OrderHistory $orderHistory */
			$orderHistory = $registry->getOrderHistoryClassName();
			$orderHistory::collectEntityFields('SHIPMENT_ITEM_STORE', $order->getId(), $id);
		}
	}
	else
	{
		$fields['ORDER_DELIVERY_ID'] = $this->getParentShipmentId();
		$this->setFieldNoDemand('ORDER_DELIVERY_ID', $fields['ORDER_DELIVERY_ID']);

		$fields['DATE_INSERT'] = new Main\Type\DateTime();
		$this->setFieldNoDemand('DATE_INSERT', $fields['DATE_INSERT']);

		$fields["BASKET_ID"] = $this->basketItem->getId();
		$this->setFieldNoDemand('BASKET_ID', $fields['BASKET_ID']);

		if ($fields['BASKET_ID'] <= 0)
		{
			return $result;
		}

		if (!isset($fields["QUANTITY"]) || (floatval($fields["QUANTITY"]) == 0))
		{
			return $result;
		}

		$r = $this->addInternal($fields);
		if (!$r->isSuccess())
		{
			$registry = Registry::getInstance(static::getRegistryType());

			/** @var OrderHistory $orderHistory */
			$orderHistory = $registry->getOrderHistoryClassName();
			$orderHistory::addAction(
				'SHIPMENT',
				$order->getId(),
				'SHIPMENT_ITEM_ADD_ERROR',
				null,
				$this,
				["ERROR" => $r->getErrorMessages()]
			);

			$result->addErrors($r->getErrors());
			return $result;
		}

		if ($resultData = $r->getData())
			$result->setData($resultData);

		$id = $r->getId();
		$this->setFieldNoDemand('ID', $id);

		if (!$shipment->isSystem())
		{
			$registry = Registry::getInstance(static::getRegistryType());

			/** @var OrderHistory $orderHistory */
			$orderHistory = $registry->getOrderHistoryClassName();
			$orderHistory::addAction(
				'SHIPMENT',
				$order->getId(),
				'SHIPMENT_ITEM_BASKET_ADDED',
				$shipment->getId(),
				$this->basketItem,
				[
					'QUANTITY' => $this->getQuantity(),
				]
			);
		}
	}

	if ($id > 0)
	{
		$result->setId($id);
	}

	if ($this->isChanged())
	{
		/** @var Main\Event $event */
		$event = new Main\Event('sale', 'OnSaleShipmentItemEntitySaved', [
			'ENTITY' => $this,
			'VALUES' => $this->fields->getOriginalValues(),
		]);
		$event->send();
	}

	$shipmentItemStoreCollection = $this->getShipmentItemStoreCollection();
	if ($shipmentItemStoreCollection)
	{
		$r = $shipmentItemStoreCollection->save();
		if (!$r->isSuccess())
		{
			$result->addErrors($r->getErrors());
		}
	}

	if ($result->isSuccess())
	{
		$registry = Registry::getInstance(static::getRegistryType());

		/** @var OrderHistory $orderHistory */
		$orderHistory = $registry->getOrderHistoryClassName();
		$orderHistory::collectEntityFields('SHIPMENT_ITEM', $order->getId(), $id);
	}

	return $result;
}