Esempio n. 1
0
 /**
  * @param BasketItem $basketItem
  * @param $quantity
  * @return float|int|null
  * @throws NotSupportedException
  */
 protected static function tryReserveBasketItem(BasketItem $basketItem, $quantity)
 {
     $result = new Result();
     $provider = $basketItem->getProvider();
     if (!$basketItem->isBundleChild()) {
         /** @var Basket $basket */
         $basket = $basketItem->getCollection();
     } else {
         /** @var BasketItem $parentBasketItem */
         $parentBasketItem = $basketItem->getParentBasketItem();
         /** @var Basket $basket */
         $basket = $parentBasketItem->getCollection();
     }
     $order = $basket->getOrder();
     $hasProvider = false;
     $quantityTrace = null;
     $poolQuantity = static::getReservationPoolItem($order->getInternalId(), $basketItem);
     $tryQuantity = $quantity + $poolQuantity;
     if ($provider instanceof Provider) {
         throw new NotSupportedException('provider not supported');
     } elseif ($provider && array_key_exists("IBXSaleProductProvider", class_implements($provider))) {
         $hasProvider = true;
         $r = static::checkAvailableProductQuantity($basketItem, $tryQuantity);
         if ($r->isSuccess()) {
             $availableQuantityData = $r->getData();
             if (array_key_exists('AVAILABLE_QUANTITY', $availableQuantityData)) {
                 $availableQuantity = $availableQuantityData['AVAILABLE_QUANTITY'];
             } else {
                 $result->addError(new ResultError(Loc::getMessage('PROVIDER_RESERVE_BASKET_ITEM_WRONG_AVAILABLE_QUANTITY'), 'PROVIDER_RESERVE_BASKET_ITEM_WRONG_AVAILABLE_QUANTITY'));
                 return $result;
             }
             if (array_key_exists('QUANTITY_TRACE', $availableQuantityData)) {
                 $quantityTrace = $availableQuantityData['QUANTITY_TRACE'];
             }
             //
         } else {
             $result->addErrors($r->getErrors());
             return $result;
         }
         $availableQuantity -= $poolQuantity;
     } else {
         $availableQuantity = $quantity;
     }
     $fields = array('AVAILABLE_QUANTITY' => $availableQuantity, 'HAS_PROVIDER' => $hasProvider);
     if ($quantityTrace !== null) {
         $fields['QUANTITY_TRACE'] = $quantityTrace;
     }
     $result->setData($fields);
     return $result;
 }