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

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

	$itemsFromDb = array();
	if ($order->getId() > 0)
	{
		$itemsFromDbList = static::getList(
			array(
				"filter" => array("ORDER_ID" => $order->getId()),
				"select" => array("ID" , "DELIVERY_NAME", "DELIVERY_ID")
			)
		);
		while ($itemsFromDbItem = $itemsFromDbList->fetch())
			$itemsFromDb[$itemsFromDbItem["ID"]] = $itemsFromDbItem;
	}

	/** @var Shipment $shipment */
	foreach ($this->collection as $shipment)
	{
		if ($shipment->isSystem())
			continue;

		if (($systemShipment = $this->getSystemShipment()) && $systemShipment->getId() == 0)
		{
			/** @var Result $r */
			$r = $this->cloneShipment($shipment, $systemShipment);
			if ($r->isSuccess())
			{
				break;
			}
			else
			{
				$result->addErrors($r->getErrors());
			}
		}
	}

	$changeMeaningfulFields = array(
		"DELIVERY_LOCATION",
		"PRICE_DELIVERY",
		"CUSTOM_PRICE_DELIVERY",
		"ALLOW_DELIVERY",
		"DEDUCTED",
		"RESERVED",
		"DELIVERY_NAME",
		"DELIVERY_ID",
		"CANCELED",
		"MARKED",
		"SYSTEM",
		"COMPANY_ID",
		"DISCOUNT_PRICE",
		"BASE_PRICE_DELIVERY",
		"EXTERNAL_DELIVERY",
	);

	/** @var Shipment $shipment */
	foreach ($this->collection as $shipment)
	{
		$isNew = (bool)($shipment->getId() <= 0);
		$isChanged = $shipment->isChanged();

		if ($order->getId() > 0 && $isChanged)
		{
			$logFields = array();


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

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

		}

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

					/** @var OrderHistory $orderHistory */
					$orderHistory = $registry->getOrderHistoryClassName();
					$orderHistory::addLog(
						'SHIPMENT',
						$order->getId(),
						$isNew ? 'SHIPMENT_ADD' : 'SHIPMENT_UPDATE',
						$shipment->getId(),
						$shipment,
						$logFields,
						$orderHistory::SALE_ORDER_HISTORY_LOG_LEVEL_1
					);

					$orderHistory::addAction(
						'SHIPMENT',
						$order->getId(),
						"SHIPMENT_SAVED",
						$shipment->getId(),
						$shipment,
						array(),
						OrderHistory::SALE_ORDER_HISTORY_ACTION_LOG_LEVEL_1
					);
				}
			}

		}
		else
		{
			$result->addErrors($r->getErrors());
		}

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

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

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

		$this->deleteInternal($k);
		$this->deleteExtraServiceInternal($k);

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

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

			/** @var OrderHistory $orderHistory */
			$orderHistory = $registry->getOrderHistoryClassName();
			$orderHistory::addAction(
				'SHIPMENT',
				$order->getId(),
				'SHIPMENT_REMOVED',
				$k,
				null,
				array(
					'ID' => $k,
					'DELIVERY_NAME' => $v['DELIVERY_NAME'],
					'DELIVERY_ID' => $v['DELIVERY_ID'],
				)
			);

			$registry = Registry::getInstance(static::getRegistryType());

			/** @var EntityMarker $entityMarker */
			$entityMarker = $registry->getEntityMarkerClassName();
			$entityMarker::deleteByFilter(array(
				 '=ORDER_ID' => $order->getId(),
				 '=ENTITY_TYPE' => $entityMarker::ENTITY_TYPE_SHIPMENT,
				 '=ENTITY_ID' => $k,
			 ));
		}

	}

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

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

	return $result;
}