/** * Collect address discount amount * * @param Mage_Sales_Model_Quote_Address $address * @return Mage_SalesRule_Model_Quote_Discount */ public function collect(Mage_Sales_Model_Quote_Address $address) { parent::collect($address); $quote = $address->getQuote(); $store = Mage::app()->getStore($quote->getStoreId()); $this->_calculator->reset($address); $items = $this->_getAddressItems($address); if (!count($items)) { return $this; } $eventArgs = array('website_id' => $store->getWebsiteId(), 'customer_group_id' => $quote->getCustomerGroupId(), 'coupon_code' => $quote->getCouponCode()); $this->_calculator->init($store->getWebsiteId(), $quote->getCustomerGroupId(), $quote->getCouponCode()); $this->_calculator->initTotals($items, $address); $address->setDiscountDescription(array()); foreach ($items as $item) { if ($item->getNoDiscount()) { $item->setDiscountAmount(0); $item->setBaseDiscountAmount(0); } else { /** * Child item discount we calculate for parent */ if ($item->getParentItemId()) { continue; } $eventArgs['item'] = $item; Mage::dispatchEvent('sales_quote_address_discount_item', $eventArgs); if ($item->getHasChildren() && $item->isChildrenCalculated()) { $isMatchedParent = $this->_calculator->canApplyRules($item); $this->_calculator->setSkipActionsValidation($isMatchedParent); foreach ($item->getChildren() as $child) { $this->_calculator->process($child); if ($isMatchedParent) { $this->_recalculateChildDiscount($child); } $eventArgs['item'] = $child; Mage::dispatchEvent('sales_quote_address_discount_item', $eventArgs); $this->_aggregateItemDiscount($child); } $this->_calculator->setSkipActionsValidation(false); } else { $this->_calculator->process($item); $this->_aggregateItemDiscount($item); } } } /** * Process shipping amount discount */ $address->setShippingDiscountAmount(0); $address->setBaseShippingDiscountAmount(0); if ($address->getShippingAmount()) { $this->_calculator->processShippingAmount($address); $this->_addAmount(-$address->getShippingDiscountAmount()); $this->_addBaseAmount(-$address->getBaseShippingDiscountAmount()); } $this->_calculator->prepareDescription($address); return $this; }
public function testCanApplyRules() { $item = $this->_getQuoteItemMock(); $quote = $item->getQuote(); $quote->setItemsQty(2); $quote->setVirtualItemsQty(1); $this->assertTrue($this->_model->canApplyRules($item)); $quote->setItemsQty(2); $quote->setVirtualItemsQty(2); $this->assertTrue($this->_model->canApplyRules($item)); return true; }