/** * @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; }