Exemple #1
0
 /**
  * @param $action
  * @param BasketItem $basketItem
  * @param null $name
  * @param null $oldValue
  * @param null $value
  */
 public function onBasketModify($action, BasketItem $basketItem, $name = null, $oldValue = null, $value = null)
 {
     switch ($action) {
         case "UPDATE":
             if ($name == "QUANTITY") {
                 /** @var ShipmentItemCollection $collection */
                 $collection = $this->getCollection();
                 $shipment = $collection->getShipment();
                 if ($shipment->isShipped() != "Y") {
                     return true;
                 }
                 if ($basketItem->getBasketCode() != $this->getBasketCode()) {
                     return true;
                 }
                 $quantity = $value - $oldValue;
                 if ($quantity != 0) {
                     $result = Provider::tryReserveShipmentItem($this);
                 }
                 if (!empty($result) && is_array($result)) {
                     $this->setField('RESERVED_QUANTITY', $result['QUANTITY']);
                     if ($quantity > 0) {
                         if ($this->getQuantity() != $this->getReservedQuantity()) {
                             /** @var ShipmentItemCollection $shipmentItemCollection */
                             $shipmentItemCollection = $this->getCollection();
                             /** @var Shipment $shipment */
                             $shipment = $shipmentItemCollection->getShipment();
                             $shipment->setMark();
                         }
                     }
                 }
             }
             //change quantity
             break;
         case "DELETE":
             // unreserve
             break;
     }
 }
Exemple #2
0
 /**
  * @param BasketItem $basketItem
  * @return float|int
  * @throws Main\ObjectNotFoundException
  */
 public function getBasketItemQuantity(BasketItem $basketItem)
 {
     $allQuantity = 0;
     /** @var ShipmentItemCollection $shipmntItemCollection */
     if (!($shipmentItemCollection = $this->getShipmentItemCollection())) {
         throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found');
     }
     /** @var ShipmentItem $shipmentItem */
     foreach ($shipmentItemCollection as $shipmentItem) {
         if ($shipmentItem->getBasketCode() == $basketItem->getBasketCode()) {
             $allQuantity += $shipmentItem->getQuantity();
         }
     }
     return $allQuantity;
 }
Exemple #3
0
 /**
  * @param BasketItem $basketItem
  * @param $quantity
  * @return Result
  * @throws NotSupportedException
  * @throws ObjectNotFoundException
  */
 private static function reserveBasketItem(BasketItem $basketItem, $quantity)
 {
     global $APPLICATION;
     $result = new Result();
     $fields = array();
     $provider = $basketItem->getProvider();
     $hasProvider = false;
     if ($provider instanceof Provider) {
         throw new NotSupportedException('provider not supported');
     } elseif ($provider && array_key_exists("IBXSaleProductProvider", class_implements($provider))) {
         $hasProvider = true;
         $data = array("PRODUCT_ID" => $basketItem->getProductId());
         if ($quantity > 0) {
             $data["UNDO_RESERVATION"] = "N";
             $data["QUANTITY_ADD"] = $quantity;
         } else {
             $data["UNDO_RESERVATION"] = "Y";
             $data["QUANTITY_ADD"] = abs($quantity);
         }
         $APPLICATION->ResetException();
         if ($resultReserveData = $provider::ReserveProduct($data)) {
             if ($resultReserveData['RESULT']) {
                 $fields['QUANTITY'] = $resultReserveData['QUANTITY_RESERVED'];
                 if ($quantity < 0) {
                     $fields['QUANTITY'] = $quantity;
                 }
                 $fields['HAS_PROVIDER'] = $hasProvider;
                 $result->setData($fields);
                 if ($ex = $APPLICATION->GetException()) {
                     /** @var Basket $basket */
                     if (!($basket = $basketItem->getCollection())) {
                         throw new ObjectNotFoundException('Entity "Basket" not found');
                     }
                     if ($order = $basket->getOrder()) {
                         /** @var ShipmentCollection $shipmentCollection */
                         if (!($shipmentCollection = $order->getShipmentCollection())) {
                             throw new ObjectNotFoundException('Entity "ShipmentCollection" not found');
                         }
                         /** @var Shipment $shipment */
                         foreach ($shipmentCollection as $shipment) {
                             /** @var ShipmentItemCollection $shipmentItemCollection */
                             if (!($shipmentItemCollection = $shipment->getShipmentItemCollection())) {
                                 throw new ObjectNotFoundException('Entity "ShipmentItemCollection" not found');
                             }
                             if ($shipmentItemCollection->getItemByBasketCode($basketItem->getBasketCode())) {
                                 $shipment->setField('MARKED', 'Y');
                                 $oldErrorText = $shipment->getField('REASON_MARKED');
                                 $shipment->setField('REASON_MARKED', $oldErrorText . (strval($oldErrorText) != '' ? "\n" : "") . $ex->GetString());
                             }
                         }
                     }
                 }
                 return $result;
             } else {
                 if ($ex = $APPLICATION->GetException()) {
                     $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'));
                 }
             }
         } else {
             $result->addError(new ResultError(Loc::getMessage('SALE_PROVIDER_RESERVE_BASKET_ITEM_ERROR'), 'SALE_PROVIDER_RESERVE_BASKET_ITEM_ERROR'));
         }
     } else {
         $fields['QUANTITY'] = $quantity;
         $result->setData($fields);
     }
     return $result;
 }
 /**
  * @param BasketItem $basketItem
  *
  * @return Result
  * @throws Main\ArgumentOutOfRangeException
  * @throws Main\ObjectNotFoundException
  * @throws \ErrorException
  */
 public function deleteByBasketItem(BasketItem $basketItem)
 {
     $result = new Result();
     $systemShipmentItem = null;
     /** @var Shipment $shipment */
     if (!($shipment = $this->getShipment())) {
         throw new Main\ObjectNotFoundException('Entity "Shipment" not found');
     }
     /** @var ShipmentItem $shipmentItem */
     foreach ($this->collection as $shipmentItem) {
         if ($shipmentItem->getBasketCode() == $basketItem->getBasketCode()) {
             if ($shipment->isSystem()) {
                 $systemShipmentItem = $shipmentItem;
                 continue;
             }
             $r = $shipmentItem->delete();
             if (!$r->isSuccess()) {
                 $result->addErrors($r->getErrors());
             }
         }
     }
     if ($systemShipmentItem !== null) {
         if ($systemShipmentItem->getReservedQuantity() > 0) {
             /** @var Result $r */
             $r = $systemShipmentItem->tryUnreserve();
             if (!$r->isSuccess()) {
                 $result->addErrors($r->getErrors());
             }
         }
         if ($result->isSuccess()) {
             $shipmentItem->setFieldNoDemand('QUANTITY', 0);
         }
     }
     return $result;
 }
Exemple #5
0
 /**
  * @param Sale\BasketItem $basketItem
  * @param $quantity
  */
 public function set(Sale\BasketItem $basketItem, $quantity)
 {
     $this->quantities[$basketItem->getBasketCode()] = $quantity;
     $this->items[$basketItem->getBasketCode()] = $basketItem;
 }
Exemple #6
0
 /**
  * @param BasketItem $item
  * @param array $productData
  * @return \Bitrix\Sale\Result
  * @throws SystemException
  */
 public static function fillBasketItem(BasketItem &$item, array $productData, Order $order, Basket $basket, $needDataUpdate = false)
 {
     $basketCode = $item->getBasketCode();
     if (isset($productData["PRODUCT_PROVIDER_CLASS"]) && strlen($productData["PRODUCT_PROVIDER_CLASS"]) > 0) {
         $item->setField("PRODUCT_PROVIDER_CLASS", trim($productData["PRODUCT_PROVIDER_CLASS"]));
     }
     $item->setField("QUANTITY", $productData["QUANTITY"]);
     $product = array();
     $data = array();
     /* Get actual info from provider
      *	cases:
      *	 1) add new product to basket;
      *	 2) saving operation;
      */
     if (!self::$isTrustProductFormData || $needDataUpdate) {
         $data = Provider::getProductData($basket, array("PRICE"), $item);
         if (isset($data[$basketCode])) {
             $product = $data[$basketCode];
             if (isset($product['DISCOUNT_PRICE'])) {
                 $product['DISCOUNT_PRICE'] = roundEx($product['DISCOUNT_PRICE'], SALE_VALUE_PRECISION);
             }
             if (isset($product['BASE_PRICE'])) {
                 $product['PRICE'] = $product['BASE_PRICE'] - $product['DISCOUNT_PRICE'];
             }
             $discount = $order->getDiscount();
             if ($discount !== null) {
                 if (isset($data[$basketCode]['BASE_PRICE']) && isset($data[$basketCode]['CURRENCY'])) {
                     $discount->setBasketItemBasePrice($basketCode, $data[$basketCode]['BASE_PRICE'], $data[$basketCode]['CURRENCY']);
                 }
                 if (!empty($data[$basketCode]['DISCOUNT_LIST'])) {
                     $discount->setBasketItemDiscounts($basketCode, $data[$basketCode]['DISCOUNT_LIST']);
                 }
             }
         }
     }
     /*
      * Let's extract cached provider product data from field
      * cases:
      *  1) all activity through ajax
      */
     if (empty($data[$basketCode]) && !empty($productData["PROVIDER_DATA"])) {
         $data[$basketCode] = unserialize($productData["PROVIDER_DATA"]);
     }
     if (!empty($productData["SET_ITEMS_DATA"])) {
         $productData["SET_ITEMS"] = unserialize($productData["SET_ITEMS_DATA"]);
     }
     if (is_array($data[$basketCode]) && !empty($data[$basketCode])) {
         self::setProviderTrustData($item, $order, $data[$basketCode]);
     }
     if (!self::$isTrustProductFormData) {
         if (isset($productData["MODULE"]) && $productData["MODULE"] == "catalog") {
             $data = OrderBasket::getProductDetails($item->getProductId(), $productData["QUANTITY"], $order->getUserId(), $order->getSiteId());
             $product = array_merge($product, $data);
         }
         unset($productData["CURRENCY"]);
     }
     $product = array_merge($product, $productData);
     if (isset($product["OFFER_ID"]) || intval($product["OFFER_ID"]) >= 0) {
         $product["PRODUCT_ID"] = $product["OFFER_ID"];
     }
     $product = array_intersect_key($product, array_flip($item::getAvailableFields()));
     if (isset($product["MEASURE_CODE"]) && strlen($product["MEASURE_CODE"]) > 0) {
         $measures = OrderBasket::getCatalogMeasures();
         if (isset($measures[$product["MEASURE_CODE"]]) && strlen($measures[$product["MEASURE_CODE"]]) > 0) {
             $product["MEASURE_NAME"] = $measures[$product["MEASURE_CODE"]];
         }
     }
     if (!isset($product["CURRENCY"]) || strlen($product["CURRENCY"]) <= 0) {
         $product["CURRENCY"] = $order->getCurrency();
     }
     if ($productData["IS_SET_PARENT"] == "Y") {
         $product["TYPE"] = BasketItem::TYPE_SET;
     }
     OrderEdit::setProductDetails($productData["OFFER_ID"], $order->getUserId(), $order->getSiteId(), array_merge($product, $productData));
     $result = self::setBasketItemFields($item, $product);
     return $result;
 }
 /**
  * @param BasketItem $basketItem
  * @return bool
  * @throws Main\ObjectNotFoundException
  */
 protected function isExistsBasketItem(BasketItem $basketItem)
 {
     /** @var ShipmentItem $shipmentItem */
     foreach ($this->collection as $shipmentItem) {
         if ($shipmentItem->getBasketCode() == $basketItem->getBasketCode()) {
             return true;
         }
     }
     return false;
 }