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