/** * Update the address with totals data used for display in a total line, * e.g. a total line in the cart. * * @param Mage_Sales_Model_Quote_Address * @return self */ public function fetch(Mage_Sales_Model_Quote_Address $address) { $total = $address->getTotalAmount($this->getCode()); if ($total) { $address->addTotal(['code' => $this->getCode(), 'title' => $this->_helper->__(self::TAX_TOTAL_TITLE), 'value' => $total]); } return $this; }
/** * Add row total item amount to subtotal * * @param Mage_Sales_Model_Quote_Address $address * @param Mage_Sales_Model_Quote_Item_Abstract $item * * @return Mage_Tax_Model_Sales_Total_Quote_Subtotal */ protected function _addSubtotalAmount(Mage_Sales_Model_Quote_Address $address, $item) { if ($this->_config->priceIncludesTax($this->_store)) { $subTotal = $item->getRowTotalInclTax() - $item->getRowTax(); $baseSubTotal = $item->getBaseRowTotalInclTax() - $item->getBaseRowTax(); $address->setTotalAmount('subtotal', $address->getTotalAmount('subtotal') + $subTotal); $address->setBaseTotalAmount('subtotal', $address->getBaseTotalAmount('subtotal') + $baseSubTotal); } else { $address->setTotalAmount('subtotal', $address->getTotalAmount('subtotal') + $item->getRowTotal()); $address->setBaseTotalAmount('subtotal', $address->getBaseTotalAmount('subtotal') + $item->getBaseRowTotal()); } $address->setSubtotalInclTax($address->getSubtotalInclTax() + $item->getRowTotalInclTax()); $address->setBaseSubtotalInclTax($address->getBaseSubtotalInclTax() + $item->getBaseRowTotalInclTax()); return $this; }
/** * Round the total amounts in address * * @param Mage_Sales_Model_Quote_Address $address * @return Mage_Tax_Model_Sales_Total_Quote_Tax */ protected function _roundTotals(Mage_Sales_Model_Quote_Address $address) { // initialize the delta to a small number to avoid non-deterministic behavior with rounding of 0.5 $totalDelta = 1.0E-6; $baseTotalDelta = 1.0E-6; /* * The order of rounding is import here. * Tax is rounded first, to be consistent with unit based calculation. * Hidden tax and shipping_hidden_tax are rounded next, which are really part of tax. * Shipping is rounded before subtotal to minimize the chance that subtotal is * rounded differently because of the delta. * Here is an example: 19.2% tax rate, subtotal = 49.95, shipping = 9.99, discount = 20% * subtotalExclTax = 41.90436, tax = 7.7238, hidden_tax = 1.609128, shippingPriceExclTax = 8.38087 * shipping_hidden_tax = 0.321826, discount = -11.988 * The grand total is 47.952 ~= 47.95 * The rounded values are: * tax = 7.72, hidden_tax = 1.61, shipping_hidden_tax = 0.32, * shipping = 8.39 (instead of 8.38 from simple rounding), subtotal = 41.9, discount = -11.99 * The grand total calculated from the rounded value is 47.95 * If we simply round each value and add them up, the result is 47.94, which is one penny off */ $totalCodes = array('tax', 'hidden_tax', 'shipping_hidden_tax', 'shipping', 'subtotal', 'weee', 'discount'); foreach ($totalCodes as $totalCode) { $exactAmount = $address->getTotalAmount($totalCode); $baseExactAmount = $address->getBaseTotalAmount($totalCode); if (!$exactAmount && !$baseExactAmount) { continue; } $roundedAmount = $this->_calculator->round($exactAmount + $totalDelta); $baseRoundedAmount = $this->_calculator->round($baseExactAmount + $baseTotalDelta); $address->setTotalAmount($totalCode, $roundedAmount); $address->setBaseTotalAmount($totalCode, $baseRoundedAmount); $totalDelta = $exactAmount + $totalDelta - $roundedAmount; $baseTotalDelta = $baseExactAmount + $baseTotalDelta - $baseRoundedAmount; } return $this; }
/** * Add row total item amount to subtotal * * @param Mage_Sales_Model_Quote_Address $address * @param Mage_Sales_Model_Quote_Item_Abstract $item * @return Mage_Tax_Model_Sales_Total_Quote_Subtotal */ protected function _addSubtotalAmount(Mage_Sales_Model_Quote_Address $address, $item) { $address->setTotalAmount('subtotal', $address->getTotalAmount('subtotal') + $item->getRowTotal()); $address->setBaseTotalAmount('subtotal', $address->getBaseTotalAmount('subtotal') + $item->getBaseRowTotal()); $address->setSubtotalInclTax($address->getSubtotalInclTax() + $item->getRowTotalInclTax()); $address->setBaseSubtotalInclTax($address->getBaseSubtotalInclTax() + $item->getBaseRowTotalInclTax()); return $this; }