/**
  * Retrieve stock qty whether product is composite or no
  *
  * @param StockItemInterface $stockItem
  * @return float
  * @SuppressWarnings(PHPMD.CyclomaticComplexity)
  * @SuppressWarnings(PHPMD.UnusedLocalVariable)
  */
 public function getStockQty(StockItemInterface $stockItem)
 {
     if (!$stockItem->hasStockQty()) {
         $stockItem->setStockQty(0);
         $product = $this->productFactory->create();
         $product->load($stockItem->getProductId());
         // prevent possible recursive loop
         if (!$product->isComposite()) {
             $stockQty = $stockItem->getQty();
         } else {
             $stockQty = null;
             $productsByGroups = $product->getTypeInstance()->getProductsToPurchaseByReqGroups($product);
             foreach ($productsByGroups as $productsInGroup) {
                 $qty = 0;
                 foreach ($productsInGroup as $childProduct) {
                     $qty += $this->getStockQty($stockItem);
                 }
                 if (null === $stockQty || $qty < $stockQty) {
                     $stockQty = $qty;
                 }
             }
         }
         $stockQty = (double) $stockQty;
         if ($stockQty < 0 || !$stockItem->getManageStock() || !$stockItem->getIsInStock() || !$product->isSaleable()) {
             $stockQty = 0;
         }
         $stockItem->setStockQty($stockQty);
     }
     return (double) $stockItem->getData('stock_qty');
 }