• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/controller/realizationdocument.php
  • Класс: Bitrix\Crm\Controller\RealizationDocument
  • Вызов: RealizationDocument::setShippedAction
public function setShippedAction(int $id, string $value): void
{
	if (!Catalog\Component\UseStore::isUsed())
	{
		$this->addError(
			new Main\Error(
				Main\Localization\Loc::getMessage('CRM_CONTROLLER_REALIZATION_DOCUMENT_NOT_USED_INVENTORY_MANAGEMENT'),
				self::REALIZATION_NOT_USED_INVENTORY_MANAGEMENT_ERROR_CODE
			)
		);
		return;
	}

	$accessAction =
		$value === 'Y'
			? ActionDictionary::ACTION_STORE_DOCUMENT_CONDUCT
			: ActionDictionary::ACTION_STORE_DOCUMENT_CANCEL
	;
	if (!$this->checkPermission($accessAction, $id))
	{
		return;
	}

	$shipmentResult = $this->prepareShipment($id);
	if (!$shipmentResult->isSuccess())
	{
		$this->addErrors($shipmentResult->getErrors());
		return;
	}

	$shipmentData = $shipmentResult->getData();
	/** @var Crm\Order\Shipment $shipment */
	$shipment = $shipmentData['shipment'];
	/** @var Crm\Order\Order $order */
	$order = $shipmentData['order'];

	if ($value === 'Y' && $shipment->isShipped())
	{
		$this->addError(
			new Main\Error(
				Main\Localization\Loc::getMessage(
					'CRM_CONTROLLER_REALIZATION_DOCUMENT_SHIP_DEDUCTED_ERROR',
					[
						'#ID#' => htmlspecialcharsbx($shipment->getField('ACCOUNT_NUMBER')),
					]
				),
				self::REALIZATION_ALREADY_DEDUCTED_ERROR_CODE
			)
		);
	}
	elseif ($value === 'N' && !$shipment->isShipped())
	{
		$this->addError(
			new Main\Error(
				Main\Localization\Loc::getMessage(
					'CRM_CONTROLLER_REALIZATION_DOCUMENT_UNSHIP_UNDEDUCTED_ERROR',
					[
						'#ID#' => htmlspecialcharsbx($shipment->getField('ACCOUNT_NUMBER')),
					]
				),
				self::REALIZATION_NOT_DEDUCTED_ERROR_CODE
			)
		);
	}
	else
	{
		if ($value === 'Y')
		{
			if ($shipment->getShipmentItemCollection()->isEmpty())
			{
				$this->addError(
					new Main\Error(
						Main\Localization\Loc::getMessage('CRM_CONTROLLER_REALIZATION_DOCUMENT_PRODUCT_NOT_FOUND'),
						self::REALIZATION_PRODUCT_NOT_FOUND_ERROR_CODE
					)
				);
				return;
			}

			/** @var Crm\Order\ShipmentItem $shipmentItem */
			foreach ($shipment->getShipmentItemCollection() as $shipmentItem)
			{
				$shipmentItemStoreCollection = $shipmentItem->getShipmentItemStoreCollection();
				if ($shipmentItemStoreCollection && $shipmentItemStoreCollection->isEmpty())
				{
					$basketItem = $shipmentItem->getBasketItem();

					$reserveQuantityCollection = $basketItem->getReserveQuantityCollection();
					if ($reserveQuantityCollection && $reserveQuantityCollection->isEmpty())
					{
						$storeId = $this->defaultStoreId;
					}
					elseif ($reserveQuantityCollection && $reserveQuantityCollection->count() === 1)
					{
						/** @var \Bitrix\Sale\ReserveQuantity $reserveQuantity */
						$reserveQuantity = $reserveQuantityCollection->current();
						$storeId = $reserveQuantity->getStoreId();
					}
					else
					{
						break;
					}

					$shipmentItemStore = $shipmentItemStoreCollection->createItem($basketItem);
					$setFieldResult = $shipmentItemStore->setFields([
						'BASKET_ID' => $basketItem->getId(),
						'STORE_ID' => $storeId,
						'QUANTITY' => $shipmentItem->getQuantity(),
						'ORDER_DELIVERY_BASKET_ID' => $shipmentItem->getId(),
					]);
					if (!$setFieldResult->isSuccess())
					{
						$this->addErrors($setFieldResult->getErrors());
					}
				}
			}
		}

		$setResult = $shipment->setField('DEDUCTED', $value);
		if (!$setResult->isSuccess())
		{
			$this->addErrors($setResult->getErrors());
		}
	}

	if ($this->errorCollection->isEmpty())
	{
		$saveOrderResult = $order->save();
		if ($saveOrderResult->isSuccess())
		{
			if ($value === 'N')
			{
				ShipmentService::getInstance()->reserveCanceledShipment($shipment);
			}
		}
		else
		{
			$this->addErrors($saveOrderResult->getErrors());
		}
	}
	else
	{
		if ($value === 'Y')
		{
			$shipmentResult = $this->prepareShipment($id);
			$shipmentData = $shipmentResult->getData();
			/** @var Crm\Order\Shipment $shipment */
			$shipment = $shipmentData['shipment'];
			/** @var Crm\Order\Order $order */
			$order = $shipmentData['order'];

			$setResult = $shipment->setField('IS_REALIZATION', $value);
			if ($setResult->isSuccess())
			{
				$saveOrderResult = $order->save();
				if (!$saveOrderResult->isSuccess())
				{
					$this->addErrors($saveOrderResult->getErrors());
				}
			}
		}
	}
}