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