Beispiel #1
0
 /**
  * Collect address discount amount
  *
  * @param   Mage_Sales_Model_Quote_Address $address
  * @return  Mage_SalesRule_Model_Quote_Discount
  */
 public function collect(Mage_Sales_Model_Quote_Address $address)
 {
     parent::collect($address);
     $quote = $address->getQuote();
     $store = Mage::app()->getStore($quote->getStoreId());
     $this->_calculator->reset($address);
     $items = $this->_getAddressItems($address);
     if (!count($items)) {
         return $this;
     }
     $eventArgs = array('website_id' => $store->getWebsiteId(), 'customer_group_id' => $quote->getCustomerGroupId(), 'coupon_code' => $quote->getCouponCode());
     $this->_calculator->init($store->getWebsiteId(), $quote->getCustomerGroupId(), $quote->getCouponCode());
     $this->_calculator->initTotals($items, $address);
     $address->setDiscountDescription(array());
     $items = $this->_calculator->sortItemsByPriority($items);
     foreach ($items as $item) {
         if ($item->getNoDiscount()) {
             $item->setDiscountAmount(0);
             $item->setBaseDiscountAmount(0);
         } else {
             /**
              * Child item discount we calculate for parent
              */
             if ($item->getParentItemId()) {
                 continue;
             }
             $eventArgs['item'] = $item;
             Mage::dispatchEvent('sales_quote_address_discount_item', $eventArgs);
             if ($item->getHasChildren() && $item->isChildrenCalculated()) {
                 foreach ($item->getChildren() as $child) {
                     $this->_calculator->process($child);
                     $eventArgs['item'] = $child;
                     Mage::dispatchEvent('sales_quote_address_discount_item', $eventArgs);
                     $this->_aggregateItemDiscount($child);
                 }
             } else {
                 $this->_calculator->process($item);
                 $this->_aggregateItemDiscount($item);
             }
         }
     }
     /**
      * process weee amount
      */
     if (Mage::helper('weee')->isEnabled() && Mage::helper('weee')->isDiscounted($store)) {
         $this->_calculator->processWeeeAmount($address, $items);
     }
     /**
      * Process shipping amount discount
      */
     $address->setShippingDiscountAmount(0);
     $address->setBaseShippingDiscountAmount(0);
     if ($address->getShippingAmount()) {
         $this->_calculator->processShippingAmount($address);
         $this->_addAmount(-$address->getShippingDiscountAmount());
         $this->_addBaseAmount(-$address->getBaseShippingDiscountAmount());
     }
     $this->_calculator->prepareDescription($address);
     return $this;
 }
 protected function _canProcessRule($rule, $address)
 {
     if (!Mage::registry('aitFrontSalesRuleValidator')) {
         Mage::register('aitFrontSalesRuleValidator', $this);
     }
     return parent::_canProcessRule($rule, $address) && !(!self::_isUseCustomActions() && in_array($rule->getSimpleAction(), array('by_percent_surcharge', 'by_fixed_surcharge', 'cart_fixed_surcharge')));
 }
Beispiel #3
0
 public function process(Mage_Sales_Model_Quote_Item_Abstract $item)
 {
     parent::process($item);
     try {
         $customer = Mage::getSingleton('customer/session');
         if ($customer->isLoggedIn()) {
             $customerId = Mage::getModel('customer/session')->getCustomerId();
             $auto_use = Mage::getStoreConfig('rewardpoints/default/auto_use', Mage::app()->getStore()->getId());
             if ($auto_use) {
                 if (Mage::getStoreConfig('rewardpoints/default/flatstats', Mage::app()->getStore()->getId())) {
                     $reward_model = Mage::getModel('rewardpoints/flatstats');
                     $customer_points = $reward_model->collectPointsCurrent($customerId, Mage::app()->getStore()->getId());
                 } else {
                     $reward_model = Mage::getModel('rewardpoints/stats');
                     $customer_points = $reward_model->getPointsCurrent($customerId, Mage::app()->getStore()->getId());
                 }
                 if ($customer_points && $customer_points > Mage::helper('rewardpoints/event')->getCreditPoints()) {
                     //J2T MOD. getCartAmount
                     $cart_amount = Mage::getModel('rewardpoints/discount')->getCartAmount($item->getQuote());
                     $cart_amount = Mage::helper('rewardpoints/data')->processMathValue($cart_amount);
                     $points_value = min(Mage::helper('rewardpoints/data')->convertMoneyToPoints($cart_amount), (int) $customer_points);
                     Mage::getSingleton('customer/session')->setProductChecked(0);
                     Mage::helper('rewardpoints/event')->setCreditPoints($points_value);
                 }
             }
             Mage::getModel('rewardpoints/discount')->apply($item);
         }
     } catch (Mage_Core_Exception $e) {
         Mage::getSingleton('checkout/session')->addError($e->getMessage());
     } catch (Exception $e) {
         Mage::getSingleton('checkout/session')->addError($e);
     }
     return $this;
 }
 /**
  * Collect information about free shipping for all address items
  *
  * @param   Mage_Sales_Model_Quote_Address $address
  * @return  Mage_SalesRule_Model_Quote_Freeshipping
  */
 public function collect(Mage_Sales_Model_Quote_Address $address)
 {
     parent::collect($address);
     $quote = $address->getQuote();
     $store = Mage::app()->getStore($quote->getStoreId());
     $address->setFreeShipping(0);
     $items = $this->_getAddressItems($address);
     if (!count($items)) {
         return $this;
     }
     $this->_calculator->init($store->getWebsiteId(), $quote->getCustomerGroupId(), $quote->getCouponCode());
     $isAllFree = true;
     foreach ($items as $item) {
         if ($item->getNoDiscount()) {
             $isAllFree = false;
             $item->setFreeShipping(false);
         } else {
             /**
              * Child item discount we calculate for parent
              */
             if ($item->getParentItemId()) {
                 continue;
             }
             $this->_calculator->processFreeShipping($item);
             $isItemFree = (bool) $item->getFreeShipping();
             $isAllFree = $isAllFree && $isItemFree;
             if ($item->getHasChildren() && $item->isChildrenCalculated()) {
                 foreach ($item->getChildren() as $child) {
                     $this->_calculator->processFreeShipping($child);
                     /**
                      * Parent free shipping we apply to all children
                      */
                     if ($isItemFree) {
                         $child->setFreeShipping($isItemFree);
                     }
                 }
             }
         }
     }
     if ($isAllFree && !$address->getFreeShipping()) {
         $address->setFreeShipping(true);
     }
     return $this;
 }
Beispiel #5
0
 public function testProcess()
 {
     $item = $this->getMock('Mage_Sales_Model_Quote_Item', array('getAddress'), array(), '', false);
     $item->expects($this->once())->method('getAddress')->will($this->returnValue(true));
     $item->setDiscountCalculationPrice(-1);
     $item->setCalculationPrice(1);
     $quote = $this->getMock('Mage_Sales_Model_Quote', null, array(), '', false);
     $item->setQuote($quote);
     $this->assertInstanceOf('Mage_SalesRule_Model_Validator', $this->_model->process($item));
     return true;
 }
 /**
  * Quote item discount calculation process
  *
  * @param   Mage_Sales_Model_Quote_Item_Abstract $item
  * @return  Mage_SalesRule_Model_Validator
  */
 public function process(Mage_Sales_Model_Quote_Item_Abstract $item)
 {
     $address = $this->_getAddress($item);
     /**
      * check coupon count limit
      */
     $this->validateCouponCount($address);
     /**
      * check coupon usage
      */
     $this->validateCouponUsage($address);
     parent::process($item);
 }
Beispiel #7
0
 public function process(Mage_Sales_Model_Quote_Item_Abstract $item)
 {
     parent::process($item);
     if (Mage::helper('referafriend')->checkVersion('1.4.0.0')) {
         if (!$this->_discount) {
             $this->_discount = Mage::getModel('referafriend/discount');
         }
         if ($this->_discount) {
             $this->_discount->apply($item);
         }
     }
     return $this;
 }
 public function processShippingAmount(Mage_Sales_Model_Quote_Address $address)
 {
     if (version_compare(Mage::getVersion(), '1.4.1.0', '>=')) {
         return parent::processShippingAmount($address);
     }
     $shippingAmount = $address->getShippingAmountForDiscount();
     if ($shippingAmount !== null) {
         $baseShippingAmount = $address->getBaseShippingAmountForDiscount();
     } else {
         $shippingAmount = $address->getShippingAmount();
         $baseShippingAmount = $address->getBaseShippingAmount();
     }
     $quote = $address->getQuote();
     $appliedRuleIds = array();
     foreach ($this->_getRules() as $rule) {
         /* @var $rule Mage_SalesRule_Model_Rule */
         if (!$rule->getApplyToShipping() || !$this->_canProcessRule($rule, $address)) {
             continue;
         }
         $discountAmount = 0;
         $baseDiscountAmount = 0;
         $rulePercent = min(100, $rule->getDiscountAmount());
         switch ($rule->getSimpleAction()) {
             case 'to_percent':
                 $rulePercent = max(0, 100 - $rule->getDiscountAmount());
             case 'by_percent':
                 $discountAmount = ($shippingAmount - $address->getShippingDiscountAmount()) * $rulePercent / 100;
                 $baseDiscountAmount = ($baseShippingAmount - $address->getBaseShippingDiscountAmount()) * $rulePercent / 100;
                 $discountPercent = min(100, $address->getShippingDiscountPercent() + $rulePercent);
                 $address->setShippingDiscountPercent($discountPercent);
                 break;
             case 'to_fixed':
                 $quoteAmount = $quote->getStore()->convertPrice($rule->getDiscountAmount());
                 $discountAmount = $shippingAmount - $quoteAmount;
                 $baseDiscountAmount = $baseShippingAmount - $rule->getDiscountAmount();
                 break;
             case 'by_fixed':
                 $quoteAmount = $quote->getStore()->convertPrice($rule->getDiscountAmount());
                 $discountAmount = $quoteAmount;
                 $baseDiscountAmount = $rule->getDiscountAmount();
                 break;
             case 'cart_fixed':
                 $cartRules = $address->getCartFixedRules();
                 if (!isset($cartRules[$rule->getId()])) {
                     $cartRules[$rule->getId()] = $rule->getDiscountAmount();
                 }
                 if ($cartRules[$rule->getId()] > 0) {
                     $quoteAmount = $quote->getStore()->convertPrice($cartRules[$rule->getId()]);
                     $discountAmount = min($shippingAmount - $address->getShippingDiscountAmount(), $quoteAmount);
                     $baseDiscountAmount = min($baseShippingAmount - $address->getBaseShippingDiscountAmount(), $cartRules[$rule->getId()]);
                     $cartRules[$rule->getId()] -= $baseDiscountAmount;
                 }
                 $address->setCartFixedRules($cartRules);
                 break;
         }
         $discountAmount = min($address->getShippingDiscountAmount() + $discountAmount, $shippingAmount);
         $baseDiscountAmount = min($address->getBaseShippingDiscountAmount() + $baseDiscountAmount, $baseShippingAmount);
         $address->setShippingDiscountAmount($discountAmount);
         $address->setBaseShippingDiscountAmount($baseDiscountAmount);
         $appliedRuleIds[$rule->getRuleId()] = $rule->getRuleId();
         // MODIFICATION BY AMASTY
         $currentCouponCode = explode(',', $this->getCouponCode());
         if ($currentCouponCode && $rule->getCouponCode() && in_array($rule->getCouponCode(), $currentCouponCode)) {
             $address->setCouponCode($this->getCouponCode());
         }
         // MODIFICATION BY AMASTY END
         if ($rule->getCouponCode() && strtolower($rule->getCouponCode()) == strtolower($this->getCouponCode())) {
             $address->setCouponCode($this->getCouponCode());
         }
         $this->_addDiscountDescription($address, $rule);
         if ($rule->getStopRulesProcessing()) {
             break;
         }
     }
     $address->setAppliedRuleIds($this->mergeIds($address->getAppliedRuleIds(), $appliedRuleIds));
     $quote->setAppliedRuleIds($this->mergeIds($quote->getAppliedRuleIds(), $appliedRuleIds));
     return $this;
 }
 /**
  * Quote item discount calculation process
  *
  * @param   Mage_Sales_Model_Quote_Item_Abstract $item
  *
  * @return  Mage_SalesRule_Model_Validator
  */
 public function process(Mage_Sales_Model_Quote_Item_Abstract $item)
 {
     $item->setDiscountAmount(0);
     $item->setBaseDiscountAmount(0);
     $item->setDiscountPercent(0);
     $quote = $item->getQuote();
     $address = $this->_getAddress($item);
     $itemPrice = $this->_getItemPrice($item);
     $baseItemPrice = $this->_getItemBasePrice($item);
     $itemOriginalPrice = $this->_getItemOriginalPrice($item);
     $baseItemOriginalPrice = $this->_getItemBaseOriginalPrice($item);
     if ($itemPrice < 0) {
         return $this;
     }
     $appliedRuleIds = array();
     foreach ($this->_getRules() as $rule) {
         /* @var $rule Mage_SalesRule_Model_Rule */
         if (!$this->_canProcessRule($rule, $address)) {
             continue;
         }
         if (!$rule->getActions()->validate($item)) {
             continue;
         }
         $qty = $this->_getItemQty($item, $rule);
         $discountAmount = 0;
         $baseDiscountAmount = 0;
         //discount for original price
         $originalDiscountAmount = 0;
         $baseOriginalDiscountAmount = 0;
         if ($rule->getSimpleAction() != Mage_SalesRule_Model_Rule::BUY_X_GET_Y_ACTION) {
             return parent::process($item);
         }
         switch ($rule->getSimpleAction()) {
             case Mage_SalesRule_Model_Rule::BUY_X_GET_Y_ACTION:
                 $x = $rule->getDiscountStep();
                 $y = $rule->getDiscountAmount();
                 if (!$x || $y > $x) {
                     break;
                 }
                 $buyAndDiscountQty = $x + $y;
                 $fullRuleQtyPeriod = floor($qty / $buyAndDiscountQty);
                 $freeQty = $qty - $fullRuleQtyPeriod * $buyAndDiscountQty;
                 $discountQty = $fullRuleQtyPeriod * $y;
                 if ($freeQty > $x) {
                     $discountQty += $freeQty - $x;
                 }
                 /**
                  * This is the only needed part to get/apply the discount, if you have any issues or different
                  * Different version of @see Mage_SalesRule_Model_Validator you can take this code and update this file
                  * With your version of @see Mage_SalesRule_Model_Validator
                  */
                 if ($address->getByXGetY()) {
                     $arrItems = Mage::helper('web_rules')->getItemsToDiscount($rule, $address, $item);
                     if (isset($arrItems[$item->getId()])) {
                         $discountQty = $arrItems[$item->getId()];
                     } else {
                         $discountQty = 0;
                     }
                 }
                 /** The modifications end here */
                 $discountAmount = $discountQty * $itemPrice;
                 $baseDiscountAmount = $discountQty * $baseItemPrice;
                 //get discount for original price
                 $originalDiscountAmount = $discountQty * $itemOriginalPrice;
                 $baseOriginalDiscountAmount = $discountQty * $baseItemOriginalPrice;
                 break;
         }
         $result = new Varien_Object(array('discount_amount' => $discountAmount, 'base_discount_amount' => $baseDiscountAmount));
         Mage::dispatchEvent('salesrule_validator_process', array('rule' => $rule, 'item' => $item, 'address' => $address, 'quote' => $quote, 'qty' => $qty, 'result' => $result));
         $discountAmount = $result->getDiscountAmount();
         $baseDiscountAmount = $result->getBaseDiscountAmount();
         $percentKey = $item->getDiscountPercent();
         /**
          * Process "delta" rounding
          */
         if ($percentKey) {
             $delta = isset($this->_roundingDeltas[$percentKey]) ? $this->_roundingDeltas[$percentKey] : 0;
             $baseDelta = isset($this->_baseRoundingDeltas[$percentKey]) ? $this->_baseRoundingDeltas[$percentKey] : 0;
             $discountAmount += $delta;
             $baseDiscountAmount += $baseDelta;
             $this->_roundingDeltas[$percentKey] = $discountAmount - $quote->getStore()->roundPrice($discountAmount);
             $this->_baseRoundingDeltas[$percentKey] = $baseDiscountAmount - $quote->getStore()->roundPrice($baseDiscountAmount);
             $discountAmount = $quote->getStore()->roundPrice($discountAmount);
             $baseDiscountAmount = $quote->getStore()->roundPrice($baseDiscountAmount);
         } else {
             $discountAmount = $quote->getStore()->roundPrice($discountAmount);
             $baseDiscountAmount = $quote->getStore()->roundPrice($baseDiscountAmount);
         }
         /**
          * We can't use row total here because row total not include tax
          * Discount can be applied on price included tax
          */
         $itemDiscountAmount = $item->getDiscountAmount();
         $itemBaseDiscountAmount = $item->getBaseDiscountAmount();
         $discountAmount = min($itemDiscountAmount + $discountAmount, $itemPrice * $qty);
         $baseDiscountAmount = min($itemBaseDiscountAmount + $baseDiscountAmount, $baseItemPrice * $qty);
         $item->setDiscountAmount($discountAmount);
         $item->setBaseDiscountAmount($baseDiscountAmount);
         $item->setOriginalDiscountAmount($originalDiscountAmount);
         $item->setBaseOriginalDiscountAmount($baseOriginalDiscountAmount);
         $appliedRuleIds[$rule->getRuleId()] = $rule->getRuleId();
         $this->_maintainAddressCouponCode($address, $rule);
         $this->_addDiscountDescription($address, $rule);
         if ($rule->getStopRulesProcessing()) {
             break;
         }
     }
     $item->setAppliedRuleIds(join(',', $appliedRuleIds));
     $address->setAppliedRuleIds($this->mergeIds($address->getAppliedRuleIds(), $appliedRuleIds));
     $quote->setAppliedRuleIds($this->mergeIds($quote->getAppliedRuleIds(), $appliedRuleIds));
     return $this;
 }
Beispiel #10
0
 protected function _getRules2()
 {
     $rules = $this->_rules;
     $first_rule = current($rules);
     if ($first_rule !== false) {
         if ($first_rule instanceof Mage_SalesRule_Model_Mysql4_Rule_Collection) {
             return parent::_getRules();
         }
     }
     return $rules;
 }