/** * Initialize stock item * * @param \Magento\CatalogInventory\Model\Stock\Item $stockItem * @param \Magento\Sales\Model\Quote\Item $quoteItem * @param int $qty * * @return \Magento\Framework\Object * @throws \Magento\Framework\Model\Exception */ public function initialize(\Magento\CatalogInventory\Model\Stock\Item $stockItem, \Magento\Sales\Model\Quote\Item $quoteItem, $qty) { /** * When we work with subitem */ if ($quoteItem->getParentItem()) { $rowQty = $quoteItem->getParentItem()->getQty() * $qty; /** * we are using 0 because original qty was processed */ $qtyForCheck = $this->quoteItemQtyList->getQty($quoteItem->getProduct()->getId(), $quoteItem->getId(), $quoteItem->getQuoteId(), 0); } else { $increaseQty = $quoteItem->getQtyToAdd() ? $quoteItem->getQtyToAdd() : $qty; $rowQty = $qty; $qtyForCheck = $this->quoteItemQtyList->getQty($quoteItem->getProduct()->getId(), $quoteItem->getId(), $quoteItem->getQuoteId(), $increaseQty); } $productTypeCustomOption = $quoteItem->getProduct()->getCustomOption('product_type'); if (!is_null($productTypeCustomOption)) { // Check if product related to current item is a part of product that represents product set if ($this->typeConfig->isProductSet($productTypeCustomOption->getValue())) { $stockItem->setProductName($quoteItem->getProduct()->getName()); $stockItem->setIsChildItem(true); } } $result = $stockItem->checkQuoteItemQty($rowQty, $qtyForCheck, $qty); if ($stockItem->hasIsChildItem()) { $stockItem->unsIsChildItem(); } if (!is_null($result->getItemIsQtyDecimal())) { $quoteItem->setIsQtyDecimal($result->getItemIsQtyDecimal()); if ($quoteItem->getParentItem()) { $quoteItem->getParentItem()->setIsQtyDecimal($result->getItemIsQtyDecimal()); } } /** * Just base (parent) item qty can be changed * qty of child products are declared just during add process * exception for updating also managed by product type */ if ($result->getHasQtyOptionUpdate() && (!$quoteItem->getParentItem() || $quoteItem->getParentItem()->getProduct()->getTypeInstance()->getForceChildItemQtyChanges($quoteItem->getParentItem()->getProduct()))) { $quoteItem->setData('qty', $result->getOrigQty()); } if (!is_null($result->getItemUseOldQty())) { $quoteItem->setUseOldQty($result->getItemUseOldQty()); } if (!is_null($result->getMessage())) { $quoteItem->setMessage($result->getMessage()); } if (!is_null($result->getItemBackorders())) { $quoteItem->setBackorders($result->getItemBackorders()); } return $result; }
public function testSetProductWithQuoteAndStockItem() { $productMock = $this->generateProductMock(self::PRODUCT_ID, self::PRODUCT_TYPE, self::PRODUCT_SKU, self::PRODUCT_NAME, self::PRODUCT_WEIGHT, self::PRODUCT_TAX_CLASS_ID, self::PRODUCT_COST); $this->eventDispatcher->expects($this->once())->method('dispatch')->with('sales_quote_item_set_product', ['product' => $productMock, 'quote_item' => $this->model]); $isQtyDecimal = true; $this->stockItemDoMock->expects($this->once())->method('getStockId')->will($this->returnValue(99)); $this->stockItemDoMock->expects($this->once())->method('getIsQtyDecimal')->will($this->returnValue($isQtyDecimal)); $storeId = 15; $customerGroupId = 11; $quoteMock = $this->getMockBuilder('Magento\\Sales\\Model\\Quote')->disableOriginalConstructor()->setMethods(['getStoreId', 'getCustomerGroupId', '__wakeup'])->getMock(); $quoteMock->expects($this->once())->method('getStoreId')->will($this->returnValue($storeId)); $quoteMock->expects($this->once())->method('getCustomerGroupId')->will($this->returnValue($customerGroupId)); $this->model->setQuote($quoteMock); $productMock->expects($this->once())->method('setStoreId')->with($storeId); $productMock->expects($this->once())->method('setCustomerGroupId')->with($customerGroupId); $this->model->setProduct($productMock); $this->assertEquals($productMock, $this->model->getProduct()); $this->assertEquals(self::PRODUCT_ID, $this->model->getProductId()); $this->assertEquals(self::PRODUCT_TYPE, $this->model->getRealProductType()); $this->assertEquals(self::PRODUCT_SKU, $this->model->getSku()); $this->assertEquals(self::PRODUCT_NAME, $this->model->getName()); $this->assertEquals(self::PRODUCT_WEIGHT, $this->model->getWeight()); $this->assertEquals(self::PRODUCT_TAX_CLASS_ID, $this->model->getTaxClassId()); $this->assertEquals(self::PRODUCT_COST, $this->model->getBaseCost()); $this->assertEquals($isQtyDecimal, $this->model->getIsQtyDecimal()); }
/** * Returns whether moving to wishlist is allowed for this item * * @param Item $item * @return bool */ public function isMoveToWishlistAllowed($item) { return $item->getProduct()->isVisibleInSiteVisibility(); }
/** * Prepare options array for info buy request * * @param \Magento\Sales\Model\Quote\Item $item * @return array */ protected function _prepareOptionsForRequest($item) { $newInfoOptions = array(); $optionIds = $item->getOptionByCode('option_ids'); if ($optionIds) { foreach (explode(',', $optionIds->getValue()) as $optionId) { $option = $item->getProduct()->getOptionById($optionId); $optionValue = $item->getOptionByCode('option_' . $optionId)->getValue(); $group = $this->_objectManager->get('Magento\\Catalog\\Model\\Product\\Option')->groupFactory($option->getType())->setOption($option)->setQuoteItem($item); $newInfoOptions[$optionId] = $group->prepareOptionValueForRequest($optionValue); } } return $newInfoOptions; }
/** * Adds stock item qty to $items (creates new entry or increments existing one) * $items is array with following structure: * array( * $productId => array( * 'qty' => $qty, * 'item' => $stockItems|null * ) * ) * * @param QuoteItem $quoteItem * @param array &$items * @return void */ protected function _addItemToQtyArray($quoteItem, &$items) { $productId = $quoteItem->getProductId(); if (!$productId) { return; } if (isset($items[$productId])) { $items[$productId]['qty'] += $quoteItem->getTotalQty(); } else { $stockItem = null; if ($quoteItem->getProduct()) { /** @var Item $stockItem */ $stockItem = $this->stockItemRegistry->retrieve($quoteItem->getProduct()->getId()); } $items[$productId] = array('item' => $stockItem, 'qty' => $quoteItem->getTotalQty()); } }
/** * Retrieve product identifier linked with item * * @param \Magento\Sales\Model\Quote\Item $item * @return int */ public function getProductId($item) { return $item->getProduct()->getId(); }
/** * Unset custom_price data for quote item * * @param Item $item * @return void */ protected function unsetCustomPrice(Item $item) { /** @var \Magento\Framework\Object $infoBuyRequest */ $infoBuyRequest = $item->getBuyRequest(); if ($infoBuyRequest->hasData('custom_price')) { $infoBuyRequest->unsetData('custom_price'); $infoBuyRequest->setValue(serialize($infoBuyRequest->getData())); $infoBuyRequest->setCode('info_buyRequest'); $infoBuyRequest->setProduct($item->getProduct()); $item->addOption($infoBuyRequest); } $item->unsetData('custom_price'); $item->unsetData('original_custom_price'); }