/** * Test if the item needs to have its quantity checked for available * inventory. * @param Mage_Sales_Model_Quote_Item $item The item to check * @return bool True if inventory is managed, false if not */ public function isItemInventoried(Mage_Sales_Model_Quote_Item $item) { // never consider a child product as inventoried, allow the parent deal // with inventory and let the child not need to worry about it as the parent // will be the item to keep track of qty being ordered. // Both checks needed as child items will not have a parent item id prior // to being saved and a parent item prior to being added to the parent (e.g. // immediately after being loaded from the DB). if ($item->getParentItemId() || $item->getParentItem()) { return false; } // when dealing with parent items, if any child of the product is managed // stock, consider the entire item as managed stock - allows for the parent // config product in the quote to deal with inventory while allowing child // products to not care individually if ($item->getHasChildren()) { foreach ($item->getChildren() as $childItem) { $childStock = $childItem->getProduct()->getStockItem(); if ($this->isManagedStock($childStock)) { // This Parent is inventoried. Child's ROM setting is 'No backorders', and Manage Stock check hasn't been manually overridden return true; } } // if none of the children were managed stock, the parent is not inventoried return false; } return $this->isManagedStock($item->getProduct()->getStockItem()); }
/** * Gets the item information for standard items or child items of configurable products * * @param Mage_Sales_Model_Quote_Item $item * @param bool $cartFreeShipping * @return Webshopapps_Wsacommon_Model_Totals */ protected function _getStdWeightQtyTotals($item, $cartFreeShipping) { $finalTotals = new Webshopapps_Wsacommon_Model_Totals(); $addressWeight = 0; $addressQty = 0; $freeMethodWeight = 0; if ($item->getHasChildren() && ($item->isShipSeparately() || $item->getProduct()->getTypeId() == Mage_Catalog_Model_Product_Type::TYPE_CONFIGURABLE)) { foreach ($item->getChildren() as $child) { if ($child->getProduct()->isVirtual()) { continue; } $addressQty += $item->getQty() * $child->getQty(); $itemWeight = $child->getWeight(); $itemQty = $child->getTotalQty(); $rowWeight = $itemWeight * $itemQty; if ($cartFreeShipping || $child->getFreeShipping() === true) { $rowWeight = 0; } elseif (is_numeric($child->getFreeShipping())) { $freeQty = $child->getFreeShipping(); if ($itemQty > $freeQty) { $rowWeight = $itemWeight * ($itemQty - $freeQty); } else { $rowWeight = 0; } } $freeMethodWeight += $rowWeight; $addressWeight += $rowWeight; } } else { $addressQty += $item->getQty(); $itemWeight = $item->getWeight(); $rowWeight = $itemWeight * $item->getQty(); $addressWeight += $rowWeight; if ($cartFreeShipping || $item->getFreeShipping() === true) { $rowWeight = 0; } elseif (is_numeric($item->getFreeShipping())) { $freeQty = $item->getFreeShipping(); if ($item->getQty() > $freeQty) { $rowWeight = $itemWeight * ($item->getQty() - $freeQty); } else { $rowWeight = 0; } } $freeMethodWeight += $rowWeight; } $finalTotals->setWeight($addressWeight); $finalTotals->setFreeMethodWeight($freeMethodWeight); // TODO This wasnt in original, needs checking $finalTotals->setQty($addressQty); return $finalTotals; }
/** * Delete quote item. If it does not have identifier then it will be only removed from collection * * @param Mage_Sales_Model_Quote_Item $item * @return Mage_Sales_Model_Quote */ public function deleteItem(Mage_Sales_Model_Quote_Item $item) { if ($item->getId()) { $this->removeItem($item->getId()); } else { $quoteItems = $this->getItemsCollection(); $items = array($item); if ($item->getHasChildren()) { foreach ($item->getChildren() as $child) { $items[] = $child; } } foreach ($quoteItems as $key => $quoteItem) { foreach ($items as $item) { if ($quoteItem->compare($item)) { $quoteItems->removeItemByKey($key); } } } } return $this; }
/** * Adds all the items to an array including any child items. * No need to check if item is valid. This is called after totals which already does the validation * * @param Array $itemGroup - The array which is passed back by reference * @param Mage_Sales_Model_Quote_Item $item - The item to process */ private static function processItemGroup(&$itemGroup, $item) { if ($item->getHasChildren() && $item->isShipSeparately()) { foreach ($item->getChildren() as $child) { $itemGroup[] = $child; } } else { $itemGroup[] = $item; } }