예제 #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;
 }
 /**
  * Calculate item price including/excluding tax, row total including/excluding tax
  * and subtotal including/excluding tax.
  * Determine discount price if needed
  *
  * @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->_store = $address->getQuote()->getStore();
     $this->_address = $address;
     $this->_subtotalInclTax = 0;
     $this->_baseSubtotalInclTax = 0;
     $this->_subtotal = 0;
     $this->_baseSubtotal = 0;
     $this->_roundingDeltas = array();
     $address->setSubtotalInclTax(0);
     $address->setBaseSubtotalInclTax(0);
     $address->setTotalAmount('subtotal', 0);
     $address->setBaseTotalAmount('subtotal', 0);
     $items = $this->_getAddressItems($address);
     if (!$items) {
         return $this;
     }
     $addressRequest = $this->_getAddressTaxRequest($address);
     $storeRequest = $this->_getStoreTaxRequest($address);
     $this->_calculator->setCustomer($address->getQuote()->getCustomer());
     if ($this->_config->priceIncludesTax($this->_store)) {
         $classIds = array();
         foreach ($items as $item) {
             $classIds[] = $item->getProduct()->getTaxClassId();
             if ($item->getHasChildren()) {
                 foreach ($item->getChildren() as $child) {
                     $classIds[] = $child->getProduct()->getTaxClassId();
                 }
             }
         }
         $classIds = array_unique($classIds);
         $storeRequest->setProductClassId($classIds);
         $addressRequest->setProductClassId($classIds);
         if ($this->_helper->isCrossBorderTradeEnabled($this->_store)) {
             $this->_areTaxRequestsSimilar = true;
         } else {
             $this->_areTaxRequestsSimilar = $this->_calculator->compareRequests($storeRequest, $addressRequest);
         }
     }
     foreach ($items as $item) {
         if ($item->getParentItem()) {
             continue;
         }
         if ($item->getHasChildren() && $item->isChildrenCalculated()) {
             foreach ($item->getChildren() as $child) {
                 $this->_processItem($child, $addressRequest);
             }
             $this->_recalculateParent($item);
         } else {
             $this->_processItem($item, $addressRequest);
         }
         $this->_addSubtotalAmount($address, $item);
     }
     $address->setRoundingDeltas($this->_roundingDeltas);
     return $this;
 }
예제 #3
0
 /**
  * Collect tax totals for quote address
  *
  * @param   Mage_Sales_Model_Quote_Address $address
  * @return  Mage_Tax_Model_Sales_Total_Quote
  */
 public function collect(Mage_Sales_Model_Quote_Address $address)
 {
     parent::collect($address);
     $this->_roundingDeltas = array();
     $this->_baseRoundingDeltas = array();
     $this->_hiddenTaxes = array();
     $address->setShippingTaxAmount(0);
     $address->setBaseShippingTaxAmount(0);
     $this->_store = $address->getQuote()->getStore();
     $customer = $address->getQuote()->getCustomer();
     if ($customer) {
         $this->_calculator->setCustomer($customer);
     }
     if (!$address->getAppliedTaxesReset()) {
         $address->setAppliedTaxes(array());
     }
     $items = $this->_getAddressItems($address);
     if (!count($items)) {
         return $this;
     }
     $request = $this->_calculator->getRateRequest($address, $address->getQuote()->getBillingAddress(), $address->getQuote()->getCustomerTaxClassId(), $this->_store);
     if ($this->_config->priceIncludesTax($this->_store)) {
         if ($this->_helper->isCrossBorderTradeEnabled($this->_store)) {
             $this->_areTaxRequestsSimilar = true;
         } else {
             $this->_areTaxRequestsSimilar = $this->_calculator->compareRequests($this->_calculator->getRateOriginRequest($this->_store), $request);
         }
     }
     switch ($this->_config->getAlgorithm($this->_store)) {
         case Mage_Tax_Model_Calculation::CALC_UNIT_BASE:
             $this->_unitBaseCalculation($address, $request);
             break;
         case Mage_Tax_Model_Calculation::CALC_ROW_BASE:
             $this->_rowBaseCalculation($address, $request);
             break;
         case Mage_Tax_Model_Calculation::CALC_TOTAL_BASE:
             $this->_totalBaseCalculation($address, $request);
             break;
         default:
             break;
     }
     $this->_addAmount($address->getExtraTaxAmount());
     $this->_addBaseAmount($address->getBaseExtraTaxAmount());
     $this->_calculateShippingTax($address, $request);
     $this->_processHiddenTaxes();
     //round total amounts in address
     $this->_roundTotals($address);
     return $this;
 }
 /**
  * Collect tax totals for quote address
  *
  * @param   Mage_Sales_Model_Quote_Address $address
  * @return  Mage_Tax_Model_Sales_Total_Quote
  */
 public function collect(Mage_Sales_Model_Quote_Address $address)
 {
     parent::collect($address);
     $store = $address->getQuote()->getStore();
     $customer = $address->getQuote()->getCustomer();
     if ($customer) {
         $this->_calculator->setCustomer($customer);
     }
     if (!$address->getAppliedTaxesReset()) {
         $address->setAppliedTaxes(array());
     }
     $items = $address->getAllItems();
     if (!count($items)) {
         return $this;
     }
     $request = $this->_calculator->getRateRequest($address, $address->getQuote()->getBillingAddress(), $address->getQuote()->getCustomerTaxClassId(), $store);
     $this->_areTaxRequestsSimilar = $this->_calculator->compareRequests($this->_calculator->getRateOriginRequest($address->getQuote()->getStore()), $request);
     switch ($this->_config->getAlgorithm($store)) {
         case Mage_Tax_Model_Calculation::CALC_UNIT_BASE:
             $this->_unitBaseCalculation($address, $request);
             break;
         case Mage_Tax_Model_Calculation::CALC_ROW_BASE:
             $this->_rowBaseCalculation($address, $request);
             break;
         case Mage_Tax_Model_Calculation::CALC_TOTAL_BASE:
             $this->_totalBaseCalculation($address, $request);
             break;
         default:
             break;
     }
     /**
      * Subtract taxes from subtotal amount if prices include tax
      */
     if ($this->_usePriceIncludeTax($store)) {
         $subtotal = $address->getSubtotalInclTax() - $address->getTotalAmount('tax');
         $baseSubtotal = $address->getBaseSubtotalInclTax() - $address->getBaseTotalAmount('tax');
         $address->setTotalAmount('subtotal', $subtotal);
         $address->setBaseTotalAmount('subtotal', $baseSubtotal);
     }
     $this->_addAmount($address->getExtraTaxAmount());
     $this->_addBaseAmount($address->getBaseExtraTaxAmount());
     $this->_calculateShippingTax($address, $request);
     return $this;
 }
예제 #5
0
 /**
  * Collect totals information about shipping
  *
  * @param   Mage_Sales_Model_Quote_Address $address
  * @return  Mage_Sales_Model_Quote_Address_Total_Shipping
  */
 public function collect(Mage_Sales_Model_Quote_Address $address)
 {
     parent::collect($address);
     $calc = $this->_calculator;
     $store = $address->getQuote()->getStore();
     $storeTaxRequest = $calc->getRateOriginRequest($store);
     $addressTaxRequest = $calc->getRateRequest($address, $address->getQuote()->getBillingAddress(), $address->getQuote()->getCustomerTaxClassId(), $store);
     $shippingTaxClass = $this->_config->getShippingTaxClass($store);
     $storeTaxRequest->setProductClassId($shippingTaxClass);
     $addressTaxRequest->setProductClassId($shippingTaxClass);
     $priceIncludesTax = $this->_config->shippingPriceIncludesTax($store);
     if ($priceIncludesTax) {
         if ($this->_helper->isCrossBorderTradeEnabled($store)) {
             $this->_areTaxRequestsSimilar = true;
         } else {
             $this->_areTaxRequestsSimilar = $this->_calculator->compareRequests($storeTaxRequest, $addressTaxRequest);
         }
     }
     $shipping = $taxShipping = $address->getShippingAmount();
     $baseShipping = $baseTaxShipping = $address->getBaseShippingAmount();
     $rate = $calc->getRate($addressTaxRequest);
     if ($priceIncludesTax) {
         if ($this->_areTaxRequestsSimilar) {
             $tax = $this->_round($calc->calcTaxAmount($shipping, $rate, true, false), $rate, true);
             $baseTax = $this->_round($calc->calcTaxAmount($baseShipping, $rate, true, false), $rate, true, 'base');
             $taxShipping = $shipping;
             $baseTaxShipping = $baseShipping;
             $shipping = $shipping - $tax;
             $baseShipping = $baseShipping - $baseTax;
             $taxable = $taxShipping;
             $baseTaxable = $baseTaxShipping;
             $isPriceInclTax = true;
             $address->setTotalAmount('shipping', $shipping);
             $address->setBaseTotalAmount('shipping', $baseShipping);
         } else {
             $storeRate = $calc->getStoreRate($addressTaxRequest, $store);
             $storeTax = $calc->calcTaxAmount($shipping, $storeRate, true, false);
             $baseStoreTax = $calc->calcTaxAmount($baseShipping, $storeRate, true, false);
             $shipping = $calc->round($shipping - $storeTax);
             $baseShipping = $calc->round($baseShipping - $baseStoreTax);
             $tax = $this->_round($calc->calcTaxAmount($shipping, $rate, false, false), $rate, true);
             $baseTax = $this->_round($calc->calcTaxAmount($baseShipping, $rate, false, false), $rate, true, 'base');
             $taxShipping = $shipping + $tax;
             $baseTaxShipping = $baseShipping + $baseTax;
             $taxable = $taxShipping;
             $baseTaxable = $baseTaxShipping;
             $isPriceInclTax = true;
             $address->setTotalAmount('shipping', $shipping);
             $address->setBaseTotalAmount('shipping', $baseShipping);
         }
     } else {
         $appliedRates = $calc->getAppliedRates($addressTaxRequest);
         $taxes = array();
         $baseTaxes = array();
         foreach ($appliedRates as $appliedRate) {
             $taxRate = $appliedRate['percent'];
             $taxId = $appliedRate['id'];
             $taxes[] = $this->_round($calc->calcTaxAmount($shipping, $taxRate, false, false), $taxId, false);
             $baseTaxes[] = $this->_round($calc->calcTaxAmount($baseShipping, $taxRate, false, false), $taxId, false, 'base');
         }
         $tax = array_sum($taxes);
         $baseTax = array_sum($baseTaxes);
         $taxShipping = $shipping + $tax;
         $baseTaxShipping = $baseShipping + $baseTax;
         $taxable = $shipping;
         $baseTaxable = $baseShipping;
         $isPriceInclTax = false;
         $address->setTotalAmount('shipping', $shipping);
         $address->setBaseTotalAmount('shipping', $baseShipping);
     }
     $address->setShippingInclTax($taxShipping);
     $address->setBaseShippingInclTax($baseTaxShipping);
     $address->setShippingTaxable($taxable);
     $address->setBaseShippingTaxable($baseTaxable);
     $address->setIsShippingInclTax($isPriceInclTax);
     if ($this->_config->discountTax($store)) {
         $address->setShippingAmountForDiscount($taxShipping);
         $address->setBaseShippingAmountForDiscount($baseTaxShipping);
     }
     return $this;
 }