/** * 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; }
/** * 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; }
/** * 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; }