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@magentocommerce.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.magentocommerce.com for more information.
20: *
21: * @category Mage
22: * @package Mage_SalesRule
23: * @copyright Copyright (c) 2012 Magento Inc. (http://www.magentocommerce.com)
24: * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
25: */
26:
27:
28: class Mage_SalesRule_Model_Quote_Freeshipping extends Mage_Sales_Model_Quote_Address_Total_Abstract
29: {
30: /**
31: * Discount calculation object
32: *
33: * @var Mage_SalesRule_Model_Validator
34: */
35: protected $_calculator;
36:
37: public function __construct()
38: {
39: $this->setCode('discount');
40: $this->_calculator = Mage::getSingleton('salesrule/validator');
41: }
42:
43: /**
44: * Collect information about free shipping for all address items
45: *
46: * @param Mage_Sales_Model_Quote_Address $address
47: * @return Mage_SalesRule_Model_Quote_Freeshipping
48: */
49: public function collect(Mage_Sales_Model_Quote_Address $address)
50: {
51: parent::collect($address);
52: $quote = $address->getQuote();
53: $store = Mage::app()->getStore($quote->getStoreId());
54:
55: $address->setFreeShipping(0);
56: $items = $this->_getAddressItems($address);
57: if (!count($items)) {
58: return $this;
59: }
60: $this->_calculator->init($store->getWebsiteId(), $quote->getCustomerGroupId(), $quote->getCouponCode());
61:
62: $isAllFree = true;
63: foreach ($items as $item) {
64: if ($item->getNoDiscount()) {
65: $isAllFree = false;
66: $item->setFreeShipping(false);
67: } else {
68: /**
69: * Child item discount we calculate for parent
70: */
71: if ($item->getParentItemId()) {
72: continue;
73: }
74: $this->_calculator->processFreeShipping($item);
75: $isItemFree = (bool)$item->getFreeShipping();
76: $isAllFree = $isAllFree && $isItemFree;
77: if ($item->getHasChildren() && $item->isChildrenCalculated()) {
78: foreach ($item->getChildren() as $child) {
79: $this->_calculator->processFreeShipping($child);
80: /**
81: * Parent free shipping we apply to all children
82: */
83: if ($isItemFree) {
84: $child->setFreeShipping($isItemFree);
85: }
86:
87: }
88: }
89: }
90: }
91: if ($isAllFree && !$address->getFreeShipping()) {
92: $address->setFreeShipping(true);
93: }
94: return $this;
95: }
96:
97: /**
98: * Add information about free shipping for all address items to address object
99: * By default we not present such information
100: *
101: * @param Mage_Sales_Model_Quote_Address $address
102: * @return Mage_SalesRule_Model_Quote_Freeshipping
103: */
104: public function fetch(Mage_Sales_Model_Quote_Address $address)
105: {
106: return $this;
107: }
108:
109: }
110: