public function applyShipping(Mage_Sales_Model_Quote_Address $address) { $shippingAmount = $address->getShippingAmountForDiscount(); if ($shippingAmount !== null) { $baseShippingAmount = $address->getBaseShippingAmountForDiscount(); } else { $shippingAmount = $address->getShippingAmount(); $baseShippingAmount = $address->getBaseShippingAmount(); } $points_apply = (int) Mage::helper('rewardpoints/event')->getCreditPoints(); $this->_quote = $quote = $address->getQuote(); $customer = $quote->getCustomer(); $customerId = $customer->getId(); if ($points_apply > 0 && $customerId != null) { $points_apply = Mage::helper('rewardpoints/data')->convertMoneyToPoints(Mage::getSingleton('rewardpoints/session')->getDiscountleft()); $points_apply_amount = Mage::getSingleton('rewardpoints/session')->getDiscountleft(); if (!$this->_discount) { //$reward_model = Mage::getModel('rewardpoints/stats'); 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 ($points_apply > $reward_model->getPointsCurrent($customerId, Mage::app()->getStore()->getId())){ if ($points_apply > $customer_points) { return false; } else { $discounts = $points_apply_amount; } if (Mage::getSingleton('rewardpoints/session')->getDiscountleft() && (!Mage::getSingleton('rewardpoints/session')->getShippingChecked() && $discounts > 0) || Mage::getSingleton('rewardpoints/session')->getProductChecked() == 0) { Mage::getSingleton('rewardpoints/session')->setShippingChecked(0); Mage::getSingleton('rewardpoints/session')->setDiscountleft($points_apply_amount); $this->_discount = $discounts; $this->_couponCode = $points_apply; } else { $this->_discount = Mage::getSingleton('rewardpoints/session')->getDiscountleft(); $this->_couponCode = $points_apply; } } $discountAmount = 0; $baseDiscountAmount = 0; //////////////////////////// $discountAmount = min($shippingAmount - $address->getShippingDiscountAmount(), $quote->getStore()->convertPrice($this->_discount)); $baseDiscountAmount = min($baseShippingAmount - $address->getBaseShippingDiscountAmount(), $this->_discount); //$discountAmount = Mage::helper('rewardpoints/data')->ratePointCorrection($discountAmount); //$baseDiscountAmount = Mage::helper('rewardpoints/data')->ratePointCorrection($baseDiscountAmount); Mage::getSingleton('rewardpoints/session')->setShippingChecked(1); //$quote_id = Mage::helper('checkout/cart')->getCart()->getQuote()->getId(); Mage::getSingleton('rewardpoints/session')->setDiscountleft(Mage::getSingleton('rewardpoints/session')->getDiscountleft() - $baseDiscountAmount); $discountAmount = min($discountAmount + $address->getShippingDiscountAmount(), $shippingAmount); $baseDiscountAmount = min($baseDiscountAmount + $address->getBaseShippingDiscountAmount(), $baseShippingAmount); $address->setShippingDiscountAmount($discountAmount); $address->setBaseShippingDiscountAmount($baseDiscountAmount); } }
/** * Apply discounts to shipping amount * * @param Mage_Sales_Model_Quote_Address $address * @return Mage_SalesRule_Model_Validator */ public function processShippingAmount(Mage_Sales_Model_Quote_Address $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 Mage_SalesRule_Model_Rule::TO_PERCENT_ACTION: $rulePercent = max(0, 100 - $rule->getDiscountAmount()); case Mage_SalesRule_Model_Rule::BY_PERCENT_ACTION: $discountAmount = ($shippingAmount - $address->getShippingDiscountAmount()) * $rulePercent / 100; $baseDiscountAmount = ($baseShippingAmount - $address->getBaseShippingDiscountAmount()) * $rulePercent / 100; $discountPercent = min(100, $address->getShippingDiscountPercent() + $rulePercent); $address->setShippingDiscountPercent($discountPercent); break; case Mage_SalesRule_Model_Rule::TO_FIXED_ACTION: $quoteAmount = $quote->getStore()->convertPrice($rule->getDiscountAmount()); $discountAmount = $shippingAmount - $quoteAmount; $baseDiscountAmount = $baseShippingAmount - $rule->getDiscountAmount(); break; case Mage_SalesRule_Model_Rule::BY_FIXED_ACTION: $quoteAmount = $quote->getStore()->convertPrice($rule->getDiscountAmount()); $discountAmount = $quoteAmount; $baseDiscountAmount = $rule->getDiscountAmount(); break; case Mage_SalesRule_Model_Rule::CART_FIXED_ACTION: $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(); $this->_maintainAddressCouponCode($address, $rule); $this->_addDiscountDescription($address, $rule); if ($rule->getStopRulesProcessing()) { break; } } $address->setAppliedRuleIds($this->mergeIds($address->getAppliedRuleIds(), $appliedRuleIds)); $quote->setAppliedRuleIds($this->mergeIds($quote->getAppliedRuleIds(), $appliedRuleIds)); return $this; }
/** * @param Mage_Sales_Model_Quote_Address $address * @param Mage_SalesRule_Model_Rule $rule * @param Mage_Sales_Model_Quote_Item_Abstract[] $allItems * @param Mage_Sales_Model_Quote_Item_Abstract[] $validItems * * @return bool */ public function handle(Mage_Sales_Model_Quote_Address $address, Mage_SalesRule_Model_Rule $rule, array $allItems, array $validItems) { // Skip invalid rule actions if ($rule->getSimpleAction() !== Mage_SalesRule_Model_Rule::CART_FIXED_ACTION) { return false; } // Skip if there are no valid items and it's not applied to shipping if (!count($validItems) && !$rule->getApplyToShipping()) { return false; } // Define a few helpful variables $helper = $this->getHelper(); $quote = $address->getQuote(); $store = $quote->getStore(); // Total available discount amounts $baseDiscountAmount = $helper->round($rule->getDiscountAmount(), $quote->getBaseCurrencyCode()); $discountAmount = $helper->round($store->convertPrice($baseDiscountAmount), $quote->getQuoteCurrencyCode()); // Skip zero discounts if ($discountAmount <= 0.0) { return false; } $applied = false; // Pre-calculate the totals for all valid items $ruleTotalItemsPrice = 0; $ruleTotalBaseItemsPrice = 0; $itemPrices = []; foreach ($validItems as $item) { // Get max quantity (min or rule max qty or item qty) $qty = $helper->getItemRuleQty($item, $rule); // Skip zero quantity if ($qty <= 0.0) { continue; } // Get unit price $itemPrice = $helper->getItemPrice($item); $itemBasePrice = $helper->getItemBasePrice($item); // Get row price $itemRowPrice = $itemPrice * $item->getTotalQty(); $itemBaseRowPrice = $itemBasePrice * $item->getTotalQty(); // Get discountable price $itemDiscountablePrice = $itemPrice * $qty; $itemBaseDiscountablePrice = $itemBasePrice * $qty; // Save price data for later $itemPrices[$item->getId()] = [$itemPrice, $itemBasePrice, $itemRowPrice, $itemBaseRowPrice, $itemDiscountablePrice, $itemBaseDiscountablePrice]; // Add row prices to running totals $ruleTotalItemsPrice += $itemDiscountablePrice; $ruleTotalBaseItemsPrice += $itemBaseDiscountablePrice; } $startDiscountAmount = $discountAmount; $startBaseDiscountAmount = $baseDiscountAmount; foreach ($validItems as $item) { // Skip the skipped items if (!isset($itemPrices[$item->getId()])) { continue; } // Flag indicating the rule was applied $applied = true; // Extract the pre-calculate price data list($itemPrice, $itemBasePrice, $itemRowPrice, $itemBaseRowPrice, $itemDiscountablePrice, $itemBaseDiscountablePrice) = $itemPrices[$item->getId()]; // Calculate remaining row amount $itemRemainingRowPrice = max($itemRowPrice - $item->getDiscountAmount(), 0); $itemRemainingBaseRowPrice = max($itemBaseRowPrice - $item->getBaseDiscountAmount(), 0); // Calculate price factor $priceFactor = $itemDiscountablePrice / $ruleTotalItemsPrice; $basePriceFactor = $itemBaseDiscountablePrice / $ruleTotalBaseItemsPrice; // Calculate (and round) the item discount amount $itemDiscountAmount = $helper->round($startDiscountAmount * $priceFactor, $quote->getQuoteCurrencyCode()); $itemBaseDiscountAmount = $helper->round($startBaseDiscountAmount * $basePriceFactor, $quote->getBaseCurrencyCode()); // Ensure discount does not exceed the remaining discount, max item discount, or remaining row price $itemDiscountAmount = max(min($itemDiscountAmount, $discountAmount, $itemDiscountablePrice, $itemRemainingRowPrice), 0.0); $itemBaseDiscountAmount = max(min($itemBaseDiscountAmount, $baseDiscountAmount, $itemBaseDiscountablePrice, $itemRemainingBaseRowPrice), 0.0); // Update the item discount $item->setDiscountAmount($item->getDiscountAmount() + $itemDiscountAmount); $item->setBaseDiscountAmount($item->getBaseDiscountAmount() + $itemBaseDiscountAmount); // This is a bit wonky, but needed for taxes $item->setOriginalDiscountAmount($item->getOriginalDiscountAmount() + $itemDiscountAmount); $item->setBaseOriginalDiscountAmount($item->getBaseOriginalDiscountAmount() + $itemBaseDiscountAmount); // Subtract from the total remaining discount amount $discountAmount -= $itemDiscountAmount; $baseDiscountAmount -= $itemBaseDiscountAmount; } if ($rule->getApplyToShipping()) { $shippingAmount = $address->getShippingAmountForDiscount(); $baseShippingAmount = $address->getBaseShippingAmountForDiscount(); if ($shippingAmount === null || $baseShippingAmount === null) { $shippingAmount = $address->getShippingAmount(); $baseShippingAmount = $address->getBaseShippingAmount(); } $shippingAmount -= $address->getShippingDiscountAmount(); $baseShippingAmount -= $address->getBaseShippingDiscountAmount(); $shippingDiscountAmount = max(min($discountAmount, $shippingAmount), 0.0); $shippingBaseDiscountAmount = max(min($baseDiscountAmount, $baseShippingAmount), 0.0); $address->setShippingDiscountAmount($address->getShippingDiscountAmount() + $shippingDiscountAmount); $address->setBaseShippingDiscountAmount($address->getBaseShippingDiscountAmount() + $shippingBaseDiscountAmount); // Subtract from the total discount amount $discountAmount -= $shippingDiscountAmount; $baseDiscountAmount -= $shippingBaseDiscountAmount; $applied = true; } // Do something with possible remaining discount amount if ($applied && $discountAmount > 0.0) { foreach ($validItems as $item) { // Skip the skipped items if (!isset($itemPrices[$item->getId()])) { continue; } // Extract the pre-calculate price data list($itemPrice, $itemBasePrice, $itemRowPrice, $itemBaseRowPrice, $itemDiscountablePrice, $itemBaseDiscountablePrice) = $itemPrices[$item->getId()]; // Calculate remaining row amount $itemRemainingRowPrice = max($itemRowPrice - $item->getDiscountAmount(), 0); $itemRemainingBaseRowPrice = max($itemBaseRowPrice - $item->getBaseDiscountAmount(), 0); // Apply the discount if ($itemRemainingRowPrice >= $discountAmount && $itemRemainingBaseRowPrice >= $baseDiscountAmount) { // Update the item discount $item->setDiscountAmount($item->getDiscountAmount() + $discountAmount); $item->setBaseDiscountAmount($item->getBaseDiscountAmount() + $baseDiscountAmount); // This is a bit wonky, but needed for taxes $item->setOriginalDiscountAmount($item->getOriginalDiscountAmount() + $discountAmount); $item->setBaseOriginalDiscountAmount($item->getBaseOriginalDiscountAmount() + $baseDiscountAmount); // Zero out remaining discount $discountAmount = 0.0; $baseDiscountAmount = 0.0; } // If we've used the discount, exit the loop early if ($discountAmount <= 0.0) { break; } } } return $applied; }
/** * @param Mage_Sales_Model_Quote_Address $address * @param Mage_SalesRule_Model_Rule $rule * @param Mage_Sales_Model_Quote_Item_Abstract[] $allItems * @param Mage_Sales_Model_Quote_Item_Abstract[] $validItems * * @return bool */ public function handle(Mage_Sales_Model_Quote_Address $address, Mage_SalesRule_Model_Rule $rule, array $allItems, array $validItems) { // Skip invalid rule actions if ($rule->getSimpleAction() !== Mage_SalesRule_Model_Rule::BY_FIXED_ACTION) { return false; } // Skip if there are no valid items and it's not applied to shipping if (!count($validItems) && !$rule->getApplyToShipping()) { return false; } // Define a few helpful variables $helper = $this->getHelper(); $quote = $address->getQuote(); $store = $quote->getStore(); // Discount amount $baseDiscountAmount = $helper->round($rule->getDiscountAmount(), $quote->getBaseCurrencyCode()); $discountAmount = $helper->round($store->convertPrice($baseDiscountAmount), $quote->getQuoteCurrencyCode()); // Skip zero discounts if ($discountAmount <= 0.0) { return false; } // Get the discount step size $step = max(floatval($rule->getDiscountStep()), 0.0); $applied = false; foreach ($validItems as $item) { // Get max quantity $qty = $helper->getItemRuleQty($item, $rule); // Apply discount step size limitation if ($step > 0.0) { $qty = floor($qty / $step) * $step; } // Skip zero quantities if ($qty <= 0.0) { continue; } $applied = true; // Calculate discount amounts $discountAmount = $discountAmount * $qty; $baseDiscountAmount = $baseDiscountAmount * $qty; $originalDiscountAmount = $discountAmount * $qty; $baseOriginalDiscountAmount = $baseDiscountAmount * $qty; // Round the discount amounts $discountAmount = $helper->round($discountAmount, $address->getQuote()->getQuoteCurrencyCode()); $baseDiscountAmount = $helper->round($baseDiscountAmount, $address->getQuote()->getBaseCurrencyCode()); $originalDiscountAmount = $helper->round($originalDiscountAmount, $address->getQuote()->getQuoteCurrencyCode()); $baseOriginalDiscountAmount = $helper->round($baseOriginalDiscountAmount, $address->getQuote()->getBaseCurrencyCode()); // Update the item discounts $item->setDiscountAmount($item->getDiscountAmount() + $discountAmount); $item->setBaseDiscountAmount($item->getBaseDiscountAmount() + $baseDiscountAmount); $item->setOriginalDiscountAmount($item->getOriginalDiscountAmount() + $originalDiscountAmount); $item->setBaseOriginalDiscountAmount($item->getBaseOriginalDiscountAmount() + $baseOriginalDiscountAmount); } if ($rule->getApplyToShipping()) { $shippingAmount = $address->getShippingAmountForDiscount(); $baseShippingAmount = $address->getBaseShippingAmountForDiscount(); if ($shippingAmount === null || $baseShippingAmount === null) { $shippingAmount = $address->getShippingAmount(); $baseShippingAmount = $address->getBaseShippingAmount(); } $shippingAmount -= $address->getShippingDiscountAmount(); $baseShippingAmount -= $address->getBaseShippingDiscountAmount(); $shippingDiscountAmount = min(max($discountAmount, 0.0), $shippingAmount); $shippingBaseDiscountAmount = min(max($baseDiscountAmount, 0.0), $baseShippingAmount); $address->setShippingDiscountAmount($address->getShippingDiscountAmount() + $shippingDiscountAmount); $address->setBaseShippingDiscountAmount($address->getBaseShippingDiscountAmount() + $shippingBaseDiscountAmount); $applied = true; } return $applied; }
/** * Apply discounts to shipping amount * * @param Mage_Sales_Model_Quote_Address $address * @return Mage_SalesRule_Model_Validator */ public function processShippingAmount(Mage_Sales_Model_Quote_Address $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; } // WDCA BEGIN //@nelkaake -a 16/11/10: $points_rule = $this->getRule($rule->getId()); if ($points_rule->isPointsRule()) { if ($points_rule->getPointsAction() == TBT_Rewards_Model_Salesrule_Actions::ACTION_DISCOUNT_BY_POINTS_SPENT) { $rule->setDiscountAmount(0); } } // WDCA END $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': //@nelkaake -a 26/01/11: To resolve an issue with Magento 1.4.2 and the shipping discounts, we have to keep // track of the cart fixed discounts separately from the old way that no longer works with Magento 1.4.2 // as well as the new way with Magento 1.4.2. getCartFixedRules2 is the old way as stored by // the recalculateDiscount function above. That's what you see on the next 5 lines. if (Mage::helper('rewards')->isBaseMageVersionAtLeast('1.4.2')) { $cartRules = $address->getCartFixedRules2(); } else { $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(); $this->_maintainAddressCouponCode($address, $rule); $this->_addDiscountDescription($address, $rule); if ($rule->getStopRulesProcessing()) { break; } } $address->setAppliedRuleIds($this->mergeIds($address->getAppliedRuleIds(), $appliedRuleIds)); $quote->setAppliedRuleIds($this->mergeIds($quote->getAppliedRuleIds(), $appliedRuleIds)); return $this; }
/** * @param Mage_Sales_Model_Quote_Address $address * @param Mage_SalesRule_Model_Rule $rule * @param Mage_Sales_Model_Quote_Item_Abstract[] $allItems * @param Mage_Sales_Model_Quote_Item_Abstract[] $validItems * * @return bool */ public function handle(Mage_Sales_Model_Quote_Address $address, Mage_SalesRule_Model_Rule $rule, array $allItems, array $validItems) { // Skip invalid rule actions if ($rule->getSimpleAction() !== Mage_SalesRule_Model_Rule::BY_PERCENT_ACTION) { return false; } // Skip if there are no valid items and it's not applied to shipping if (!count($validItems) && !$rule->getApplyToShipping()) { return false; } // Define a few helpful variables $helper = $this->getHelper(); $quote = $address->getQuote(); $store = $quote->getStore(); // Get discount percent $discountPercent = max(min($rule->getDiscountAmount(), 100.0), 0.0); $discountMultiplier = $discountPercent / 100; // Skip zero discounts if ($discountPercent <= 0.0) { return false; } // Get the discount step size $step = max(floatval($rule->getDiscountStep()), 0.0); $applied = false; foreach ($validItems as $item) { // Get max quantity $qty = $helper->getItemRuleQty($item, $rule); // Apply discount step size limitation if ($step > 0.0) { $qty = floor($qty / $step) * $step; } // Skip zero quantities if ($qty <= 0.0) { continue; } $applied = true; // Get row prices $itemRowPrice = $helper->getItemPrice($item) * $qty; $itemBaseRowPrice = $helper->getItemBasePrice($item) * $qty; $itemOriginalRowPrice = $helper->getItemOriginalPrice($item) * $qty; $itemBaseOriginalRowPrice = $helper->getItemBaseOriginalPrice($item) * $qty; // Calculate discount amounts $discountAmount = ($itemRowPrice - $item->getDiscountAmount()) * $discountMultiplier; $baseDiscountAmount = ($itemBaseRowPrice - $item->getBaseDiscountAmount()) * $discountMultiplier; $originalDiscountAmount = ($itemOriginalRowPrice - $item->getOriginalDiscountAmount()) * $discountMultiplier; $baseOriginalDiscountAmount = ($itemBaseOriginalRowPrice - $item->getBaseOriginalDiscountAmount()) * $discountMultiplier; // Round the discount amounts $discountAmount = $helper->round($discountAmount, $address->getQuote()->getQuoteCurrencyCode()); $baseDiscountAmount = $helper->round($baseDiscountAmount, $address->getQuote()->getBaseCurrencyCode()); $originalDiscountAmount = $helper->round($originalDiscountAmount, $address->getQuote()->getQuoteCurrencyCode()); $baseOriginalDiscountAmount = $helper->round($baseOriginalDiscountAmount, $address->getQuote()->getBaseCurrencyCode()); // Update the item discounts $item->setDiscountAmount($item->getDiscountAmount() + $discountAmount); $item->setBaseDiscountAmount($item->getBaseDiscountAmount() + $baseDiscountAmount); $item->setOriginalDiscountAmount($item->getOriginalDiscountAmount() + $originalDiscountAmount); $item->setBaseOriginalDiscountAmount($item->getBaseOriginalDiscountAmount() + $baseOriginalDiscountAmount); // Update the item percent discount value $discountPercent = min(100, $item->getDiscountPercent() + $discountPercent); $item->setDiscountPercent($discountPercent); } if ($rule->getApplyToShipping()) { $shippingAmount = $address->getShippingAmountForDiscount(); $baseShippingAmount = $address->getBaseShippingAmountForDiscount(); if ($shippingAmount === null || $baseShippingAmount === null) { $shippingAmount = $address->getShippingAmount(); $baseShippingAmount = $address->getBaseShippingAmount(); } // Subtract existing discounts $shippingAmount -= $address->getShippingDiscountAmount(); $baseShippingAmount -= $address->getBaseShippingDiscountAmount(); // Calculate and round discounts $shippingDiscountAmount = $helper->round($shippingAmount * $discountMultiplier, $address->getQuote()->getQuoteCurrencyCode()); $shippingBaseDiscountAmount = $helper->round($baseShippingAmount * $discountMultiplier, $address->getQuote()->getBaseCurrencyCode()); // Make sure the discount isn't more that the remaining amount $shippingDiscountAmount = min(max($shippingDiscountAmount, 0.0), $shippingAmount); $shippingBaseDiscountAmount = min(max($shippingBaseDiscountAmount, 0.0), $baseShippingAmount); // Store discounts $address->setShippingDiscountAmount($address->getShippingDiscountAmount() + $shippingDiscountAmount); $address->setBaseShippingDiscountAmount($address->getBaseShippingDiscountAmount() + $shippingBaseDiscountAmount); $applied = true; } return $applied; }