• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/controller/realizationdocument.php
  • Класс: Bitrix\Crm\Controller\RealizationDocument
  • Вызов: RealizationDocument::setRealizationAction
public function setRealizationAction(int $id, string $value): void
{
	if ($value === 'Y' && !$this->checkModifyPermission($id))
	{
		return;
	}
	elseif ($value === 'N' && !$this->checkPermission(ActionDictionary::ACTION_STORE_DOCUMENT_DELETE, $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'];

	$delivery = Sale\Delivery\Services\Manager::getById($shipment->getDeliveryId());
	$isEmptyDeliveryService = (
		$delivery['CLASS_NAME'] === '\\' . Sale\Delivery\Services\EmptyDeliveryService::class
		|| is_subclass_of($delivery['CLASS_NAME'], Sale\Delivery\Services\EmptyDeliveryService::class)
	);

	if ($value === 'N')
	{
		if ($shipment->isShipped())
		{
			$this->addError(
				new Main\Error(
					Main\Localization\Loc::getMessage(
						'CRM_CONTROLLER_REALIZATION_DOCUMENT_DELETE_DEDUCTED_ERROR',
						[
							'#ID#' => htmlspecialcharsbx($shipment->getField('ACCOUNT_NUMBER')),
						]
					),
					self::REALIZATION_CANNOT_DELETE_ERROR_CODE
				)
			);
		}
		elseif (
			$this->isSetRealizationDocumentTradeBinding($order)
			&& $order->getShipmentCollection()->getNotSystemItems()->count() === 1
			&& $order->getPaymentCollection()->count() === 0
		)
		{
			$deleteOrder = Crm\Order\Order::delete($order->getId());
			if (!$deleteOrder->isSuccess())
			{
				$this->addErrors($deleteOrder->getErrors());
			}

			unset($order);
		}
		elseif ($isEmptyDeliveryService)
		{
			$deleteShipmentResult = $shipment->delete();
			if (!$deleteShipmentResult->isSuccess())
			{
				$this->addErrors($deleteShipmentResult->getErrors());
			}
		}
		else
		{
			$setResult = $shipment->setField('IS_REALIZATION', $value);
			if (!$setResult->isSuccess())
			{
				$this->addErrors($setResult->getErrors());
			}
		}
	}
	else
	{
		$setResult = $shipment->setField('IS_REALIZATION', $value);
		if (!$setResult->isSuccess())
		{
			$this->addErrors($setResult->getErrors());
		}
	}

	if (isset($order) && $this->errorCollection->isEmpty())
	{
		$saveOrderResult = $order->save();
		if (!$saveOrderResult->isSuccess())
		{
			$this->addErrors($saveOrderResult->getErrors());
		}
	}
}