/** * Prepare subtotals calculations result before apply tax * * @param Mage_Sales_Model_Quote_Address $address * @return Mage_Tax_Model_Sales_Total_Quote_Subtotal */ public function collect(Mage_Sales_Model_Quote_Address $address) { $this->_areTaxRequestsSimilar = $this->_calculator->compareRequests($this->_getStoreTaxRequest($address), $this->_getAddressTaxRequest($address)); $address->setSubtotalInclTax(0); $address->setBaseSubtotalInclTax(0); $this->_subtotalInclTax = 0; $this->_baseSubtotalInclTax = 0; if (!$address->getTaxSubtotalIsProcessed() && $this->_needSubtractTax($address)) { $address->setTotalAmount('subtotal', 0); $address->setBaseTotalAmount('subtotal', 0); $items = $address->getAllItems(); foreach ($items as $item) { /** * Child item's tax we calculate for parent - that why we skip them */ if ($item->getParentItemId()) { continue; } if ($item->getHasChildren() && $item->isChildrenCalculated()) { foreach ($item->getChildren() as $child) { $this->_resetItemPriceInclTax($child); $this->_recollectItem($address, $child); } $this->_recalculateParent($item); } else { $this->_resetItemPriceInclTax($item); $this->_recollectItem($address, $item); } $this->_addSubtotalAmount($address, $item); } if ($this->_areTaxRequestsSimilar) { $address->setSubtotalInclTax($this->_subtotalInclTax); $address->setBaseSubtotalInclTax($this->_baseSubtotalInclTax); } $this->_config->setNeedUsePriceExcludeTax(true); } elseif (!$address->getTaxSubtotalIsProcessed() && !$this->_needSubtractTax($address)) { foreach ($address->getAllItems() as $item) { $this->_resetItemPriceInclTax($item); } } if (!$address->getTaxSubtotalIsProcessed() && $this->_needSubtractShippingTax($address)) { $this->_processShippingAmount($address); $this->_config->setNeedUseShippingExcludeTax(true); } $address->setTaxSubtotalIsProcessed(true); return $this; }