/**
  * @param ShipmentItem $shipmentItem
  * @return ShipmentItemCollection
  */
 public static function load(ShipmentItem $shipmentItem)
 {
     /** @var ShipmentItemStoreCollection $shipmentItemStoreCollection */
     $shipmentItemStoreCollection = new static();
     $shipmentItemStoreCollection->shipmentItem = $shipmentItem;
     if ($shipmentItem->getId() > 0) {
         $basketItem = $shipmentItem->getBasketItem();
         $shipmentItemStoreList = ShipmentItemStore::loadForShipmentItem($shipmentItem->getId());
         /** @var ShipmentItemStore $shipmentItemStoreDat */
         foreach ($shipmentItemStoreList as $shipmentItemStoreDat) {
             $shipmentItemStore = ShipmentItemStore::create($shipmentItemStoreCollection, $basketItem);
             $fields = $shipmentItemStoreDat->getFieldValues();
             $shipmentItemStore->initFields($fields);
             $shipmentItemStoreCollection->addItem($shipmentItemStore);
         }
     }
     return $shipmentItemStoreCollection;
 }
Example #2
0
 /**
  * @param ShipmentItem $sourceItem
  * @param $quantity
  * @return Result
  * @throws Main\ArgumentException
  * @throws Main\ArgumentOutOfRangeException
  * @throws Main\NotSupportedException
  */
 private function transferItem2SystemShipment(ShipmentItem $sourceItem, $quantity)
 {
     /** @var ShipmentItemCollection $sourceItemCollection */
     $sourceItemCollection = $sourceItem->getCollection();
     if ($this !== $sourceItemCollection->getShipment()) {
         throw new Main\ArgumentException("item");
     }
     $quantity = floatval($quantity);
     /** @var ShipmentCollection $shipmentCollection */
     $shipmentCollection = $this->getCollection();
     /** @var Shipment $systemShipment */
     $systemShipment = $shipmentCollection->getSystemShipment();
     /** @var BasketItem $basketItem */
     $basketItem = $sourceItem->getBasketItem();
     $shipmentItemCode = $sourceItem->getBasketCode();
     if ($quantity === 0) {
         return new Result();
     }
     /** @var ShipmentItemCollection $systemShipmentItemCollection */
     $systemShipmentItemCollection = $systemShipment->getShipmentItemCollection();
     $systemShipmentItem = $systemShipmentItemCollection->getItemByBasketCode($shipmentItemCode);
     if (is_null($systemShipmentItem)) {
         $systemShipmentItem = $systemShipmentItemCollection->createItem($basketItem);
     }
     $newSystemShipmentItemQuantity = $systemShipmentItem->getQuantity() + $quantity;
     if ($newSystemShipmentItemQuantity < 0) {
         $result = new Result();
         $result->addError(new ResultError(str_replace(array("#NAME#", "#QUANTITY#"), array($sourceItem->getBasketItem()->getField("NAME"), abs($quantity)), Loc::getMessage('SALE_SHIPMENT_QUANTITY_MISMATCH')), 'SALE_SHIPMENT_QUANTITY_MISMATCH'));
         return $result;
     }
     $systemShipmentItem->setFieldNoDemand('QUANTITY', $newSystemShipmentItemQuantity);
     $affectedQuantity = 0;
     if ($quantity > 0) {
         if ($sourceItem->getReservedQuantity() > 0) {
             $affectedQuantity = $quantity;
             $originalQuantity = $sourceItem->getQuantity() + $quantity;
             if ($sourceItem->getReservedQuantity() < $originalQuantity) {
                 $affectedQuantity -= $originalQuantity - $sourceItem->getReservedQuantity();
             }
         }
     } elseif ($quantity < 0) {
         if ($systemShipmentItem->getReservedQuantity() > 0) {
             $affectedQuantity = $quantity;
             if ($systemShipmentItem->getReservedQuantity() < -$affectedQuantity) {
                 $affectedQuantity = -1 * $systemShipmentItem->getReservedQuantity();
             }
         }
     }
     if ($affectedQuantity != 0) {
         $result = $sourceItem->setField("RESERVED_QUANTITY", $sourceItem->getField('RESERVED_QUANTITY') - $affectedQuantity);
         //			if (!$result->isSuccess(true))
         //				return $result;
         $systemShipmentItem->setFieldNoDemand('RESERVED_QUANTITY', $systemShipmentItem->getField('RESERVED_QUANTITY') + $affectedQuantity);
     }
     $tryReserveResult = null;
     if ($quantity > 0) {
         if ($systemShipment->needReservation()) {
             /** @var Result $tryReserveResult */
             $tryReserveResult = Provider::tryReserveShipmentItem($systemShipmentItem);
         } else {
             /** @var Result $tryReserveResult */
             $tryReserveResult = Provider::tryUnreserveShipmentItem($systemShipmentItem);
         }
     } elseif ($quantity < 0) {
         if ($sourceItemCollection->getShipment()->needReservation()) {
             /** @var Result $tryReserveResult */
             $tryReserveResult = Provider::tryReserveShipmentItem($sourceItem);
         }
     }
     $canReserve = false;
     if ($tryReserveResult === null) {
         $canReserve = true;
     }
     if ($tryReserveResult !== null && ($tryReserveResult->isSuccess() && ($tryReserveResultData = $tryReserveResult->getData()))) {
         if (array_key_exists('CAN_RESERVE', $tryReserveResultData)) {
             $canReserve = $tryReserveResultData['CAN_RESERVE'];
         }
     }
     if ($systemShipment->needReservation() && $canReserve) {
         $systemShipment->updateReservedFlag();
     }
     return new Result();
 }
Example #3
0
 /**
  * @param \Bitrix\Sale\ShipmentItem $shipment
  * @return mixed
  */
 protected static function prepareData($shipment)
 {
     $data['STATUS_ID'] = $shipment->getField('STATUS_ID');
     return $data;
 }
Example #4
0
 /**
  * @param ShipmentItem $shipmentItem
  * @param $quantity
  * @return array|bool
  * @throws NotSupportedException
  */
 private static function unreserveShipmentItem(ShipmentItem $shipmentItem, $quantity)
 {
     global $APPLICATION;
     $result = new Result();
     $fields = array();
     /** @var ShipmentItemCollection $shipmentItemCollection */
     $shipmentItemCollection = $shipmentItem->getCollection();
     /** @var Shipment $shipment */
     $shipment = $shipmentItemCollection->getShipment();
     /** @var BasketItem $basketItem */
     $basketItem = $shipmentItem->getBasketItem();
     $provider = $basketItem->getProvider();
     if ($provider instanceof Provider) {
         throw new NotSupportedException('provider not supported');
     } elseif ($provider && array_key_exists("IBXSaleProductProvider", class_implements($provider))) {
         $data = array("PRODUCT_ID" => $basketItem->getProductId(), "UNDO_RESERVATION" => "Y", "QUANTITY_ADD" => $quantity, "ORDER_DEDUCTED" => $shipment->isShipped() ? "Y" : "N");
         $APPLICATION->ResetException();
         if ($resultReserveData = $provider::ReserveProduct($data)) {
             if ($resultReserveData['RESULT']) {
                 $fields['QUANTITY'] = $resultReserveData['QUANTITY_RESERVED'];
                 if (isset($resultReserveData['QUANTITY_NOT_RESERVED']) && floatval($resultReserveData['QUANTITY_NOT_RESERVED']) > 0) {
                     $fields['QUANTITY'] = $shipmentItem->getReservedQuantity() + ($shipmentItem->getQuantity() - $shipmentItem->getReservedQuantity()) - $resultReserveData['QUANTITY_NOT_RESERVED'];
                 }
                 return $result;
             } else {
                 if ($ex = $APPLICATION->GetException()) {
                     if ($ex->GetID() != "ALREADY_FLAG") {
                         $result->addError(new ResultError($ex->GetString()));
                     }
                 } else {
                     $result->addError(new ResultError(Loc::getMessage('SALE_PROVIDER_RESERVE_BASKET_ITEM_ERROR'), 'SALE_PROVIDER_RESERVE_BASKET_ITEM_ERROR'));
                 }
             }
         }
     }
     if (!empty($fields)) {
         $result->setData($fields);
     }
     return $result;
 }
 /**
  * @param Shipment $shipment
  * @return ShipmentItemCollection
  */
 public static function load(Shipment $shipment)
 {
     /** @var ShipmentItemCollection $shipmentItemCollection */
     $shipmentItemCollection = new static();
     $shipmentItemCollection->shipment = $shipment;
     if ($shipment->getId() > 0) {
         $shipmentItemList = ShipmentItem::loadForShipment($shipment->getId());
         /** @var ShipmentItem $shipmentItem */
         foreach ($shipmentItemList as $shipmentItem) {
             $shipmentItem->setCollection($shipmentItemCollection);
             $shipmentItemCollection->addItem($shipmentItem);
         }
     }
     return $shipmentItemCollection;
 }