- Модуль: 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());
}
}
}
}
}