PageRenderTime 49ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/app/code/core/Mage/Sales/Model/Quote/Address/Total/Tax.php

https://gitlab.com/blingbang2016/shop
PHP | 253 lines | 183 code | 37 blank | 33 comment | 22 complexity | 7e494a87976e318906077abb778fa2d3 MD5 | raw file
  1. <?php
  2. /**
  3. * Magento
  4. *
  5. * NOTICE OF LICENSE
  6. *
  7. * This source file is subject to the Open Software License (OSL 3.0)
  8. * that is bundled with this package in the file LICENSE.txt.
  9. * It is also available through the world-wide-web at this URL:
  10. * http://opensource.org/licenses/osl-3.0.php
  11. * If you did not receive a copy of the license and are unable to
  12. * obtain it through the world-wide-web, please send an email
  13. * to license@magento.com so we can send you a copy immediately.
  14. *
  15. * DISCLAIMER
  16. *
  17. * Do not edit or add to this file if you wish to upgrade Magento to newer
  18. * versions in the future. If you wish to customize Magento for your
  19. * needs please refer to http://www.magento.com for more information.
  20. *
  21. * @category Mage
  22. * @package Mage_Sales
  23. * @copyright Copyright (c) 2006-2016 X.commerce, Inc. and affiliates (http://www.magento.com)
  24. * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
  25. */
  26. class Mage_Sales_Model_Quote_Address_Total_Tax extends Mage_Sales_Model_Quote_Address_Total_Abstract
  27. {
  28. protected $_appliedTaxes = array();
  29. public function __construct(){
  30. $this->setCode('tax');
  31. }
  32. public function collect(Mage_Sales_Model_Quote_Address $address)
  33. {
  34. $store = $address->getQuote()->getStore();
  35. $address->setTaxAmount(0);
  36. $address->setBaseTaxAmount(0);
  37. //$address->setShippingTaxAmount(0);
  38. //$address->setBaseShippingTaxAmount(0);
  39. $address->setAppliedTaxes(array());
  40. $items = $address->getAllItems();
  41. if (!count($items)) {
  42. return $this;
  43. }
  44. $custTaxClassId = $address->getQuote()->getCustomerTaxClassId();
  45. $taxCalculationModel = Mage::getSingleton('tax/calculation');
  46. /* @var $taxCalculationModel Mage_Tax_Model_Calculation */
  47. $request = $taxCalculationModel->getRateRequest(
  48. $address,
  49. $address->getQuote()->getBillingAddress(),
  50. $custTaxClassId,
  51. $store
  52. );
  53. foreach ($items as $item) {
  54. /**
  55. * Child item's tax we calculate for parent
  56. */
  57. if ($item->getParentItemId()) {
  58. continue;
  59. }
  60. /**
  61. * We calculate parent tax amount as sum of children's tax amounts
  62. */
  63. if ($item->getHasChildren() && $item->isChildrenCalculated()) {
  64. foreach ($item->getChildren() as $child) {
  65. $discountBefore = $item->getDiscountAmount();
  66. $baseDiscountBefore = $item->getBaseDiscountAmount();
  67. $rate = $taxCalculationModel->getRate(
  68. $request->setProductClassId($child->getProduct()->getTaxClassId())
  69. );
  70. $child->setTaxPercent($rate);
  71. $child->calcTaxAmount();
  72. if ($discountBefore != $item->getDiscountAmount()) {
  73. $address->setDiscountAmount(
  74. $address->getDiscountAmount() + ($item->getDiscountAmount() - $discountBefore)
  75. );
  76. $address->setBaseDiscountAmount(
  77. $address->getBaseDiscountAmount() + ($item->getBaseDiscountAmount() - $baseDiscountBefore)
  78. );
  79. $address->setGrandTotal(
  80. $address->getGrandTotal() - ($item->getDiscountAmount() - $discountBefore)
  81. );
  82. $address->setBaseGrandTotal(
  83. $address->getBaseGrandTotal() - ($item->getBaseDiscountAmount() - $baseDiscountBefore)
  84. );
  85. }
  86. $this->_saveAppliedTaxes(
  87. $address,
  88. $taxCalculationModel->getAppliedRates($request),
  89. $child->getTaxAmount(),
  90. $child->getBaseTaxAmount(),
  91. $rate
  92. );
  93. }
  94. $itemTaxAmount = $item->getTaxAmount() + $item->getDiscountTaxCompensation();
  95. $address->setTaxAmount($address->getTaxAmount() + $itemTaxAmount);
  96. $itemBaseTaxAmount = $item->getBaseTaxAmount() + $item->getBaseDiscountTaxCompensation();
  97. $address->setBaseTaxAmount($address->getBaseTaxAmount() + $itemBaseTaxAmount);
  98. }
  99. else {
  100. $discountBefore = $item->getDiscountAmount();
  101. $baseDiscountBefore = $item->getBaseDiscountAmount();
  102. $rate = $taxCalculationModel->getRate(
  103. $request->setProductClassId($item->getProduct()->getTaxClassId())
  104. );
  105. $item->setTaxPercent($rate);
  106. $item->calcTaxAmount();
  107. if ($discountBefore != $item->getDiscountAmount()) {
  108. $address->setDiscountAmount(
  109. $address->getDiscountAmount() + ($item->getDiscountAmount() - $discountBefore)
  110. );
  111. $address->setBaseDiscountAmount(
  112. $address->getBaseDiscountAmount() + ($item->getBaseDiscountAmount() - $baseDiscountBefore)
  113. );
  114. $address->setGrandTotal(
  115. $address->getGrandTotal() - ($item->getDiscountAmount() - $discountBefore)
  116. );
  117. $address->setBaseGrandTotal(
  118. $address->getBaseGrandTotal() - ($item->getBaseDiscountAmount() - $baseDiscountBefore)
  119. );
  120. }
  121. $itemTaxAmount = $item->getTaxAmount() + $item->getDiscountTaxCompensation();
  122. $address->setTaxAmount($address->getTaxAmount() + $itemTaxAmount);
  123. $itemBaseTaxAmount = $item->getBaseTaxAmount() + $item->getBaseDiscountTaxCompensation();
  124. $address->setBaseTaxAmount($address->getBaseTaxAmount() + $itemBaseTaxAmount);
  125. $applied = $taxCalculationModel->getAppliedRates($request);
  126. $this->_saveAppliedTaxes(
  127. $address,
  128. $applied,
  129. $item->getTaxAmount(),
  130. $item->getBaseTaxAmount(),
  131. $rate
  132. );
  133. }
  134. }
  135. $shippingTaxClass = Mage::getStoreConfig(Mage_Tax_Model_Config::CONFIG_XML_PATH_SHIPPING_TAX_CLASS, $store);
  136. $shippingTax = 0;
  137. $shippingBaseTax = 0;
  138. if ($shippingTaxClass) {
  139. if ($rate = $taxCalculationModel->getRate($request->setProductClassId($shippingTaxClass))) {
  140. if (!Mage::helper('tax')->shippingPriceIncludesTax()) {
  141. $shippingTax = $address->getShippingAmount() * $rate/100;
  142. $shippingBaseTax= $address->getBaseShippingAmount() * $rate/100;
  143. } else {
  144. $shippingTax = $address->getShippingTaxAmount();
  145. $shippingBaseTax= $address->getBaseShippingTaxAmount();
  146. }
  147. $shippingTax = $store->roundPrice($shippingTax);
  148. $shippingBaseTax= $store->roundPrice($shippingBaseTax);
  149. $address->setTaxAmount($address->getTaxAmount() + $shippingTax);
  150. $address->setBaseTaxAmount($address->getBaseTaxAmount() + $shippingBaseTax);
  151. $this->_saveAppliedTaxes(
  152. $address,
  153. $taxCalculationModel->getAppliedRates($request),
  154. $shippingTax,
  155. $shippingBaseTax,
  156. $rate
  157. );
  158. }
  159. }
  160. if (!Mage::helper('tax')->shippingPriceIncludesTax()) {
  161. $address->setShippingTaxAmount($shippingTax);
  162. $address->setBaseShippingTaxAmount($shippingBaseTax);
  163. }
  164. $address->setGrandTotal($address->getGrandTotal() + $address->getTaxAmount());
  165. $address->setBaseGrandTotal($address->getBaseGrandTotal() + $address->getBaseTaxAmount());
  166. return $this;
  167. }
  168. protected function _saveAppliedTaxes(Mage_Sales_Model_Quote_Address $address, $applied, $amount, $baseAmount, $rate)
  169. {
  170. $previouslyAppliedTaxes = $address->getAppliedTaxes();
  171. $process = count($previouslyAppliedTaxes);
  172. foreach ($applied as $row) {
  173. if (!isset($previouslyAppliedTaxes[$row['id']])) {
  174. $row['process'] = $process;
  175. $row['amount'] = 0;
  176. $row['base_amount'] = 0;
  177. $previouslyAppliedTaxes[$row['id']] = $row;
  178. }
  179. if (!is_null($row['percent'])) {
  180. $row['percent'] = $row['percent'] ? $row['percent'] : 1;
  181. $rate = $rate ? $rate : 1;
  182. $appliedAmount = $amount/$rate*$row['percent'];
  183. $baseAppliedAmount = $baseAmount/$rate*$row['percent'];
  184. } else {
  185. $appliedAmount = 0;
  186. $baseAppliedAmount = 0;
  187. foreach ($row['rates'] as $rate) {
  188. $appliedAmount += $rate['amount'];
  189. $baseAppliedAmount += $rate['base_amount'];
  190. }
  191. }
  192. if ($appliedAmount || $previouslyAppliedTaxes[$row['id']]['amount']) {
  193. $previouslyAppliedTaxes[$row['id']]['amount'] += $appliedAmount;
  194. $previouslyAppliedTaxes[$row['id']]['base_amount'] += $baseAppliedAmount;
  195. } else {
  196. unset($previouslyAppliedTaxes[$row['id']]);
  197. }
  198. }
  199. $address->setAppliedTaxes($previouslyAppliedTaxes);
  200. }
  201. public function fetch(Mage_Sales_Model_Quote_Address $address)
  202. {
  203. $applied = $address->getAppliedTaxes();
  204. $store = $address->getQuote()->getStore();
  205. $amount = $address->getTaxAmount();
  206. if (($amount!=0) || (Mage::helper('tax')->displayZeroTax($store))) {
  207. $address->addTotal(array(
  208. 'code'=>$this->getCode(),
  209. 'title'=>Mage::helper('sales')->__('Tax'),
  210. 'full_info'=>$applied ? $applied : array(),
  211. 'value'=>$amount
  212. ));
  213. }
  214. return $this;
  215. }
  216. }