• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/helpers/admin/blocks/ordershipment.php
  • Класс: BitrixSaleHelpersAdminBlocksOrderShipment
  • Вызов: OrderShipment::updateData
static function updateData(Order &$order, array $shipments)
{
	global $USER, $APPLICATION;

	$saleModulePermissions = $APPLICATION->GetGroupRight("sale");

	$result = new Result();
	$data = array();
	$basketResult = null;

	if (!$order)
	{
		$result->addError(
			new EntityError(
				Loc::getMessage('SALE_ORDER_SHIPMENT_ERROR_ORDER_NOT_FOUND')
			)
		);
		return $result;
	}

	$shipmentCollection = $order->getShipmentCollection();

	$isStartField = $shipmentCollection->isStartField();

	foreach ($shipments as $item)
	{
		$shipmentId = intval($item['SHIPMENT_ID']);
		$isNew = ($shipmentId <= 0);
		$deliveryService = null;

		if ($isNew)
		{
			self::$shipment = $shipmentCollection->createItem();
		}
		else
		{
			self::$shipment = $shipmentCollection->getItemById($shipmentId);
			if (!self::$shipment)
			{
				$result->addError(
					new EntityError(
						Loc::getMessage('SALE_ORDER_SHIPMENT_ERROR_SHIPMENT_NOT_FOUND')
					)
				);
				continue;
			}
		}

		self::$defaultFields = self::$shipment->getFieldValues();

		/** @var BitrixSaleBasketItem $product */

		$countItems = count(self::$shipment->getShipmentItemCollection());
		$systemShipment = $shipmentCollection->getSystemShipment();
		$systemShipmentItemCollection = $systemShipment->getShipmentItemCollection();

		$products = array();
		if (
			!isset($item['PRODUCT'])
			&& self::$shipment->getId() <= 0
		)
		{
			$basket = $order->getBasket();
			if ($basket)
			{
				$basketItems = $basket->getBasketItems();
				foreach ($basketItems as $product)
				{
					$systemShipmentItem = $systemShipmentItemCollection->getItemByBasketCode($product->getBasketCode());
					if ($product->isBundleChild() || !$systemShipmentItem || $systemShipmentItem->getQuantity() <= 0)
						continue;

					$products[] = array(
						'AMOUNT' => $product->getQuantity(),
						'BASKET_CODE' => $product->getBasketCode()
					);
				}
			}
		}
		else
		{
			$products = $item['PRODUCT'];
		}

		if ($item['DEDUCTED'] == 'Y')
		{
			$basketResult = OrderBasketShipment::updateData($order, self::$shipment, $products);
			if (!$basketResult->isSuccess())
				$result->addErrors($basketResult->getErrors());
		}

		$extraServices = $item['EXTRA_SERVICES'] ?? [];

		$shipmentFields = array(
			'COMPANY_ID' => (isset($item['COMPANY_ID']) && intval($item['COMPANY_ID']) > 0) ? intval($item['COMPANY_ID']) : 0,
			'DEDUCTED' => $item['DEDUCTED'],
			'DELIVERY_DOC_NUM' => $item['DELIVERY_DOC_NUM'],
			'TRACKING_NUMBER' => $item['TRACKING_NUMBER'],
			'CURRENCY' => $order->getCurrency(),
			'COMMENTS' => $item['COMMENTS'] ?? null,
			'WEIGHT' => $item['WEIGHT'] * self::getWeightKoef($order->getSiteId())
		);

		if($item['CUSTOM_WEIGHT_DELIVERY'] === 'Y')
		{
			self::$shipment->markFieldCustom('WEIGHT');
		}
		else
		{
			self::$shipment->unMarkFieldCustom('WEIGHT');
		}

		if ($isNew)
		{
			$shipmentFields['STATUS_ID'] = DeliveryStatus::getInitialStatus();
		}
		elseif (isset($item['STATUS_ID']) && $item['STATUS_ID'] !== self::$defaultFields['STATUS_ID'])
		{
			$shipmentFields['STATUS_ID'] = $item['STATUS_ID'];
		}

		if ($isNew && $saleModulePermissions == "P")
		{
			if (empty($item['COMPANY_ID']))
			{
				$shipmentFields['COMPANY_ID'] = $order->getField('COMPANY_ID');
			}
			if (empty($item['RESPONSIBLE_ID']))
			{
				$shipmentFields['RESPONSIBLE_ID'] = $order->getField('RESPONSIBLE_ID');
				$shipmentFields['EMP_RESPONSIBLE_ID'] = $USER->GetID();
				$shipmentFields['DATE_RESPONSIBLE_ID'] = new DateTime();
			}
		}

		if ($item['DELIVERY_DOC_DATE'])
		{
			try
			{
				$shipmentFields['DELIVERY_DOC_DATE'] = new Date($item['DELIVERY_DOC_DATE']);
			}
			catch (MainObjectException $exception)
			{
				$result->addError(
					new EntityError(
						Loc::getMessage('SALE_ORDER_SHIPMENT_ERROR_UNCORRECT_FORM_DATE')
					)
				);
			}
		}

		$shipmentFields['DELIVERY_ID'] = (($item['PROFILE'] ?? 0) > 0) ? $item['PROFILE'] : $item['DELIVERY_ID'];

		try
		{
			if($deliveryService = ServicesManager::getObjectById($shipmentFields['DELIVERY_ID']))
			{
				if ($deliveryService->isProfile())
					$shipmentFields['DELIVERY_NAME'] = $deliveryService->getNameWithParent();
				else
					$shipmentFields['DELIVERY_NAME'] = $deliveryService->getName();
			}
		}
		catch (MainArgumentNullException $e)
		{
			$result->addError(
				new EntityError(
					Loc::getMessage('SALE_ORDER_SHIPMENT_ERROR_NO_DELIVERY_SERVICE')
				)
			);
		}

		$responsibleId = self::$shipment->getField('RESPONSIBLE_ID');
		if (($item['RESPONSIBLE_ID'] ?? null) != $responsibleId || empty($responsibleId))
		{
			if (isset($item['RESPONSIBLE_ID']))
				$shipmentFields['RESPONSIBLE_ID'] = $item['RESPONSIBLE_ID'];
			else
				$shipmentFields['RESPONSIBLE_ID'] = $order->getField('RESPONSIBLE_ID');

			if (!empty($shipmentFields['RESPONSIBLE_ID']))
			{
				$shipmentFields['EMP_RESPONSIBLE_ID'] = $USER->getID();
				$shipmentFields['DATE_RESPONSIBLE_ID'] = new DateTime();
			}
		}

		if ($extraServices)
		{
			self::$shipment->setExtraServices($extraServices);
		}

		$setFieldsResult = self::$shipment->setFields($shipmentFields);
		if (!$setFieldsResult->isSuccess())
		{
			$result->addErrors($setFieldsResult->getErrors());
		}

		self::$shipment->setStoreId($item['DELIVERY_STORE_ID'] ?? 0);

		if ($item['DEDUCTED'] == 'N')
		{
			$basketResult = OrderBasketShipment::updateData($order, self::$shipment, $products);
			if (!$basketResult->isSuccess())
				$result->addErrors($basketResult->getErrors());
		}

		$fields = array(
			'CUSTOM_PRICE_DELIVERY' => $item['CUSTOM_PRICE_DELIVERY'] === 'Y' ? 'Y' : 'N',
			'ALLOW_DELIVERY' => $item['ALLOW_DELIVERY'] === 'Y' ? 'Y' : 'N'
		);

		$deliveryPrice = (float)str_replace(',', '.', $item['PRICE_DELIVERY']);

		if ($item['CUSTOM_PRICE_DELIVERY'] == 'Y')
			$fields['BASE_PRICE_DELIVERY'] = $deliveryPrice;
		else
			$fields['BASE_PRICE_DELIVERY'] = (float)str_replace(',', '.', $item['BASE_PRICE_DELIVERY']);

		$fields['PRICE_DELIVERY'] = $deliveryPrice;

		$setFieldsResult = self::$shipment->setFields($fields);


		if (!$setFieldsResult->isSuccess())
		{
			$result->addErrors($setFieldsResult->getErrors());
		}

		if($deliveryService && !empty($item['ADDITIONAL']))
		{
			$modifiedShipment = $deliveryService->processAdditionalInfoShipmentEdit(self::$shipment, $item['ADDITIONAL']);

			if($modifiedShipment && get_class($modifiedShipment) == 'BitrixSaleShipment')
				self::$shipment = $modifiedShipment;
		}

		$data['SHIPMENT'][] = self::$shipment;
	}

	if ($isStartField)
	{
		$hasMeaningfulFields = $shipmentCollection->hasMeaningfulField();

		/** @var Result $r */
		$r = $shipmentCollection->doFinalAction($hasMeaningfulFields);
		if (!$r->isSuccess())
		{
			$result->addErrors($r->getErrors());
		}
	}

	$result->setData($data);

	return $result;
}