public static function updateData(Order &$order, &$shipment, $shipmentBasket) { /**@var \Bitrix\Sale\Shipment $shipment */ $result = new Result(); $shippingItems = array(); $idsFromForm = array(); $basket = $order->getBasket(); $shipmentItemCollection = $shipment->getShipmentItemCollection(); if (is_null(self::$useStoreControl)) { self::$useStoreControl = Option::get('catalog', 'default_use_store_control', 'N') == 'Y'; } if (is_array($shipmentBasket)) { // PREPARE DATA FOR SET_FIELDS foreach ($shipmentBasket as $items) { if (isset($items['BASKET_ID']) && $items['BASKET_ID'] > 0) { $basketItem = $basket->getItemById($items['BASKET_ID']); /** @var \Bitrix\Sale\BasketItem $basketItem */ $basketCode = $basketItem->getBasketCode(); } else { $basketCode = $items['BASKET_CODE']; $basketItem = $basket->getItemByBasketCode($basketCode); } $tmp = array('BASKET_CODE' => $basketCode, 'AMOUNT' => $items['AMOUNT'], 'ORDER_DELIVERY_BASKET_ID' => $items['ORDER_DELIVERY_BASKET_ID']); $idsFromForm[$basketCode] = array(); if ($items['BARCODE_INFO'] && self::$useStoreControl) { foreach ($items['BARCODE_INFO'] as $item) { $tmp['BARCODE'] = array('ORDER_DELIVERY_BASKET_ID' => $items['ORDER_DELIVERY_BASKET_ID'], 'STORE_ID' => $item['STORE_ID'], 'QUANTITY' => $basketItem->isBarcodeMulti() ? 1 : $item['QUANTITY']); $barcodeCount = 0; if ($item['BARCODE']) { foreach ($item['BARCODE'] as $barcode) { $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']; $shippingItems[] = $tmp; $barcodeCount++; } } if ($basketItem->isBarcodeMulti()) { while ($barcodeCount < $item['QUANTITY']) { unset($tmp['BARCODE']['ID']); $tmp['BARCODE']['BARCODE'] = ''; $shippingItems[] = $tmp; $barcodeCount++; } } // crutch $el = $basket->getItemByBasketCode($basketCode); if ($el->isBundleParent()) { unset($tmp['BARCODE']); $shippingItems[] = $tmp; } } } else { $shippingItems[] = $tmp; } } } // DELETE FROM COLLECTION /** @var \Bitrix\Sale\ShipmentItem $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(); /** @var \Bitrix\Sale\ShipmentItemStore $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 \Bitrix\Sale\Order $order */ $basketItem = $order->getBasket()->getItemByBasketCode($basketCode); /** @var \Bitrix\Sale\BasketItem $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 ($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) { $barcode = $shippingItem['BARCODE']; /** @var \Bitrix\Sale\ShipmentItemStoreCollection $shipmentItemStoreCollection */ $shipmentItemStoreCollection = $shipmentItem->getShipmentItemStoreCollection(); if (!$basketItem->isBarcodeMulti()) { /** @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 \Bitrix\Sale\ShipmentItemStore $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; }