• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/shipmentitemcollection.php
  • Класс: BitrixSaleShipmentItemCollection
  • Вызов: ShipmentItemCollection::save
public function save()
{
	$result = new MainEntityResult();

	/** @var Shipment $shipment */
	if (!$shipment = $this->getShipment())
	{
		throw new MainObjectNotFoundException('Entity "Shipment" not found');
	}

	/** @var ShipmentCollection $shipmentCollection */
	if (!$shipmentCollection = $shipment->getCollection())
	{
		throw new MainObjectNotFoundException('Entity "ShipmentCollection" not found');
	}

	/** @var Order $order */
	if (!$order = $shipmentCollection->getOrder())
	{
		throw new MainObjectNotFoundException('Entity "Order" not found');
	}

	$itemsFromDb = array();
	if ($this->getShipment()->getId() > 0)
	{
		$itemsFromDbList = static::getList(
			array(
				"filter" => array("ORDER_DELIVERY_ID" => $this->getShipment()->getId()),
				"select" => array("ID", 'BASKET_ID')
			)
		);
		while ($itemsFromDbItem = $itemsFromDbList->fetch())
			$itemsFromDb[$itemsFromDbItem["ID"]] = $itemsFromDbItem;
	}


	/** @var ShipmentItem $shipmentItem */
	foreach ($this->collection as $shipmentItem)
	{
		/** @var BasketItem $basketItem */
		if (!$basketItem = $shipmentItem->getBasketItem())
		{
			continue;
		}

		if ($basketItem->isBundleParent())
		{
			$this->addBundleToCollection($basketItem);
		}
	}

	/** @var Shipment $shipment */
	if (!$shipment = $this->getShipment())
	{
		throw new MainObjectNotFoundException('Entity "Shipment" not found');
	}

	$changeMeaningfulFields = array(
		"QUANTITY",
		"RESERVED_QUANTITY",
	);

	/** @var ShipmentItem $shipmentItem */
	foreach ($this->collection as $shipmentItem)
	{
		/** @var BasketItem $basketItem */
		if (!$basketItem = $shipmentItem->getBasketItem())
		{
			continue;
		}

		$isNew = (bool)($shipmentItem->getId() <= 0);
		$isChanged = $shipmentItem->isChanged();

		if ($order->getId() > 0 && $isChanged)
		{
			$logFields = array(
				"BASKET_ID" => $basketItem->getId(),
				"BASKET_ITEM_NAME" => $basketItem->getField("NAME"),
				"BASKET_ITEM_PRODUCT_ID" => $basketItem->getField("PRODUCT_ID"),
				"ORDER_DELIVERY_ID" => $shipmentItem->getField("ORDER_DELIVERY_ID"),
			);

			$fields = $shipmentItem->getFields();
			$originalValues = $fields->getOriginalValues();

			foreach($originalValues as $originalFieldName => $originalFieldValue)
			{
				if (in_array($originalFieldName, $changeMeaningfulFields) && $shipmentItem->getField($originalFieldName) != $originalFieldValue)
				{
					$logFields[$originalFieldName] = $shipmentItem->getField($originalFieldName);
					if (!$isNew)
						$logFields['OLD_'.$originalFieldName] = $originalFieldValue;
				}
			}
		}

		$r = $shipmentItem->save();
		if ($r->isSuccess())
		{
			if ($order->getId() > 0 && $isChanged)
			{
				$registry = Registry::getInstance(static::getRegistryType());

				/** @var OrderHistory $orderHistory */
				$orderHistory = $registry->getOrderHistoryClassName();
				$orderHistory::addLog(
					'SHIPMENT_ITEM',
					$order->getId(),
					$isNew ? 'SHIPMENT_ITEM_ADD' : 'SHIPMENT_ITEM_UPDATE',
					$shipmentItem->getId(),
					$shipmentItem,
					$logFields,
					$orderHistory::SALE_ORDER_HISTORY_LOG_LEVEL_1
				);
			}
		}
		else
		{
			$result->addErrors($r->getErrors());
		}

		if (isset($itemsFromDb[$shipmentItem->getId()]))
		{
			unset($itemsFromDb[$shipmentItem->getId()]);
		}
	}

	/** @var Basket $basket */
	if (!$basket = $order->getBasket())
	{
		throw new MainObjectNotFoundException('Entity "Basket" not found');
	}

	foreach ($itemsFromDb as $k => $v)
	{
		$v['ENTITY_REGISTRY_TYPE'] = static::getRegistryType();

		/** @var MainEvent $event */
		$event = new MainEvent('sale', "OnBeforeSaleShipmentItemDeleted", array(
				'VALUES' => $v,
		));
		$event->send();

		static::deleteInternal($k);

		/** @var MainEvent $event */
		$event = new MainEvent('sale', "OnSaleShipmentItemDeleted", array(
				'VALUES' => $v,
		));
		$event->send();

		/** @var BasketItem $basketItem */
		if ($basketItem = $basket->getItemById($k))
		{
			$registry = Registry::getInstance(static::getRegistryType());

			/** @var OrderHistory $orderHistory */
			$orderHistory = $registry->getOrderHistoryClassName();
			$orderHistory::addAction(
				'SHIPMENT',
				$order->getId(),
				'SHIPMENT_ITEM_BASKET_REMOVED',
				$shipment->getId(),
				null,
				array(
					'NAME' => $basketItem->getField('NAME'),
					'QUANTITY' => $basketItem->getQuantity(),
					'PRODUCT_ID' => $basketItem->getProductId(),
				)
			);
		}
	}

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

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

	return $result;
}