• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/helpers/admin/blocks/orderbasketshipment.php
  • Класс: BitrixSaleHelpersAdminBlocksOrderBasketShipment
  • Вызов: OrderBasketShipment::updateData
static function updateData(Order &$order, &$shipment, $shipmentBasket)
{
	/**@var BitrixSaleShipment $shipment */
	$result = new Result();
	$shippingItems = array();
	$idsFromForm = array();
	$basket = $order->getBasket();
	$shipmentItemCollection = $shipment->getShipmentItemCollection();
	if (is_null(self::$useStoreControl))
		self::$useStoreControl = Configuration::useStoreControl();

	if(is_array($shipmentBasket))
	{
		// PREPARE DATA FOR SET_FIELDS
		foreach ($shipmentBasket as $items)
		{
			$items['QUANTITY'] = floatval(str_replace(',', '.', $items['QUANTITY'] ?? 0));
			$items['AMOUNT'] = floatval(str_replace(',', '.', $items['AMOUNT']));
			if (isset($items['BASKET_ID']) && $items['BASKET_ID'] > 0)
			{
				if (!$basketItem = $basket->getItemById($items['BASKET_ID']))
				{
					$result->addError(new ResultError(
						Loc::getMessage(
							'SALE_ORDER_SHIPMENT_BASKET_BASKET_ITEM_NOT_FOUND',
							[
								'#BASKET_ITEM_ID#' => $items['BASKET_ID'],
							]
						),
						'PROVIDER_UNRESERVED_SHIPMENT_ITEM_WRONG_BASKET_ITEM')
					);
					return $result;
				}
				/** @var BitrixSaleBasketItem $basketItem */
				$basketCode = $basketItem->getBasketCode();
			}
			else
			{
				$basketCode = $items['BASKET_CODE'];
				if(!$basketItem = $basket->getItemByBasketCode($basketCode))
				{
					$result->addError(new ResultError(
						Loc::getMessage(
							'SALE_ORDER_SHIPMENT_BASKET_BASKET_ITEM_NOT_FOUND',
							[
								'#BASKET_ITEM_ID#' => $items['BASKET_ID'],
							]
						),
						'PROVIDER_UNRESERVED_SHIPMENT_ITEM_WRONG_BASKET_ITEM')
					);
					return $result;
				}
			}

			$tmp = array(
				'BASKET_CODE' => $basketCode,
				'AMOUNT' => $items['AMOUNT'],
				'ORDER_DELIVERY_BASKET_ID' => $items['ORDER_DELIVERY_BASKET_ID'] ?? null,
			);
			$idsFromForm[$basketCode] = array();

			if (!empty($items['BARCODE_INFO']) && (self::$useStoreControl || $basketItem->isSupportedMarkingCode()))
			{
				foreach ($items['BARCODE_INFO'] as $item)
				{
					if ($basketItem->isBundleParent())
					{
						$shippingItems[] = $tmp;
						continue;
					}

					$tmp['BARCODE'] = array(
						'ORDER_DELIVERY_BASKET_ID' => $items['ORDER_DELIVERY_BASKET_ID'],
						'STORE_ID' => (int)$item['STORE_ID'],
						'QUANTITY' => ($basketItem->isBarcodeMulti() || $basketItem->isSupportedMarkingCode()) ? 1 : $item['QUANTITY']
					);

					$barcodeCount = 0;
					if (!empty($item['BARCODE']) && is_array($item['BARCODE']))
					{
						foreach ($item['BARCODE'] as $barcode)
						{
							if(self::$useStoreControl && ($barcodeCount >= $items['QUANTITY']))
							{
								break;
							}

							$barcode['ID'] = (int)$barcode['ID'];
							$idsFromForm[$basketCode]['BARCODE_IDS'][$barcode['ID']] = true;

							if ($barcode['ID'] > 0)
								$tmp['BARCODE']['ID'] = $barcode['ID'];
							else
								unset($tmp['BARCODE']['ID']);

							$tmp['BARCODE']['BARCODE'] = $barcode['VALUE'];
							$tmp['BARCODE']['MARKING_CODE'] = $barcode['MARKING_CODE'];
							$shippingItems[] = $tmp;
							$barcodeCount++;
						}
					}
					elseif (!$basketItem->isBarcodeMulti() && !$basketItem->isSupportedMarkingCode())
					{
						$shippingItems[] = $tmp;
						continue;
					}

					if ($basketItem->isBarcodeMulti() || $basketItem->isSupportedMarkingCode())
					{
						while ($barcodeCount < $item['QUANTITY'])
						{
							unset($tmp['BARCODE']['ID']);
							$tmp['BARCODE']['BARCODE'] = '';
							$tmp['BARCODE']['MARKING_CODE'] = '';
							$shippingItems[] = $tmp;
							$barcodeCount++;
						}
					}
				}
			}
			else
			{
				$shippingItems[] = $tmp;
			}
		}
	}


	// DELETE FROM COLLECTION
	/** @var BitrixSaleShipmentItem $shipmentItem */
	foreach ($shipmentItemCollection as $shipmentItem)
	{
		if (!array_key_exists($shipmentItem->getBasketCode(), $idsFromForm))
		{
			/** @var Result $r */
			$r = $shipmentItem->delete();
			if (!$r->isSuccess())
				$result->addErrors($r->getErrors());
		}

		$shipmentItemStoreCollection = $shipmentItem->getShipmentItemStoreCollection();
		if ($shipmentItemStoreCollection)
		{
			/** @var BitrixSaleShipmentItemStore $shipmentItemStore */
			foreach ($shipmentItemStoreCollection as $shipmentItemStore)
			{
				$shipmentItemId = $shipmentItemStore->getId();
				if (!isset($idsFromForm[$shipmentItem->getBasketCode()]['BARCODE_IDS'][$shipmentItemId]))
				{
					$delResult = $shipmentItemStore->delete();
					if (!$delResult->isSuccess())
						$result->addErrors($delResult->getErrors());
				}
			}
		}
	}

	$isStartField = $shipmentItemCollection->isStartField();

	// SET DATA
	foreach ($shippingItems as $shippingItem)
	{
		if ((int)$shippingItem['ORDER_DELIVERY_BASKET_ID'] <= 0)
		{
			$basketCode = $shippingItem['BASKET_CODE'];
			/** @var BitrixSaleOrder $order */
			$basketItem = $order->getBasket()->getItemByBasketCode($basketCode);

			/** @var BitrixSaleBasketItem $basketItem */
			$shipmentItem = $shipmentItemCollection->createItem($basketItem);
			if ($shipmentItem === null)
			{
				$result->addError(
					new EntityError(
						Loc::getMessage('SALE_ORDER_SHIPMENT_BASKET_ERROR_ALREADY_SHIPPED')
					)
				);
				return $result;
			}
			unset($shippingItem['BARCODE']['ORDER_DELIVERY_BASKET_ID']);
		}
		else
		{
			$shipmentItem = $shipmentItemCollection->getItemById($shippingItem['ORDER_DELIVERY_BASKET_ID']);
			$basketItem = $shipmentItem->getBasketItem();
		}

		if ($shippingItem['AMOUNT'] <= 0)
		{
			$result->addError(
				new EntityError(
					Loc::getMessage('SALE_ORDER_SHIPMENT_BASKET_ERROR_QUANTITY', array('#BASKET_ITEM#' => $basketItem->getField('NAME'))),
					'BASKET_ITEM_'.$basketItem->getBasketCode()
				)
			);
			continue;
		}

		if ($shipmentItem->getQuantity() < $shippingItem['AMOUNT'])
		{
			$order->setMathActionOnly(true);
			$setFieldResult = $shipmentItem->setField('QUANTITY', $shippingItem['AMOUNT']);
			$order->setMathActionOnly(false);

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

		if (!empty($shippingItem['BARCODE']) && (self::$useStoreControl || $basketItem->isSupportedMarkingCode()))
		{
			$barcode = $shippingItem['BARCODE'];

			/** @var BitrixSaleShipmentItemStoreCollection $shipmentItemStoreCollection */
			$shipmentItemStoreCollection = $shipmentItem->getShipmentItemStoreCollection();
			if ($shipmentItemStoreCollection)
			{
				if (!$basketItem->isBarcodeMulti() && !$basketItem->isSupportedMarkingCode())
				{
					/** @var Result $r */
					$r = $shipmentItemStoreCollection->setBarcodeQuantityFromArray($shipmentBasket[$basketItem->getId()]);
					if(!$r->isSuccess())
					{
						$result->addErrors($r->getErrors());
					}
				}

				if (isset($barcode['ID']) && intval($barcode['ID']) > 0)
				{
					/** @var BitrixSaleShipmentItemStore $shipmentItemStore */
					if ($shipmentItemStore = $shipmentItemStoreCollection->getItemById($barcode['ID']))
					{
						unset($barcode['ID']);
						$setFieldResult = $shipmentItemStore->setFields($barcode);

						if (!$setFieldResult->isSuccess())
							$result->addErrors($setFieldResult->getErrors());
					}
				}
				else
				{
					$shipmentItemStore = $shipmentItemStoreCollection->createItem($basketItem);
					$setFieldResult = $shipmentItemStore->setFields($barcode);
					if (!$setFieldResult->isSuccess())
						$result->addErrors($setFieldResult->getErrors());
				}
			}
		}

		$setFieldResult = $shipmentItem->setField('QUANTITY', $shippingItem['AMOUNT']);
		if (!$setFieldResult->isSuccess())
			$result->addErrors($setFieldResult->getErrors());
	}

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

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

	return $result;
}