示例#1
0
 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;
 }