Example #1
0
 /**
  * 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;
 }