public function fetchTotals(Mage_Sales_Model_Quote_Address $address) { $amount = $address->getShippingAmount(); if ($amount != 0) { $address->addTotal(array('code' => 'shipping', 'title' => Mage::helper('sales')->__('Shipping & Handling') . ' (' . $address->getShippingDescription() . ')', 'value' => $address->getShippingAmount())); } return $this; }
public function fetch(Mage_Sales_Model_Quote_Address $address) { $amount = $address->getShippingAmount(); $title = Mage::helper('sales')->__('Shipping & Handling'); // if ($address->getShippingDescription()) { // $title .= ' (' . $address->getShippingDescription() . ')'; // } $address->addTotal(array('code' => $this->getCode(), 'title' => $title, 'value' => $address->getShippingAmount())); return $this; }
/** * Fetch totals * * @param Mage_Sales_Model_Quote_Address $address * @return Mage_Sales_Model_Resource_Quote_Address_Attribute_Frontend_Shipping */ public function fetchTotals(Mage_Sales_Model_Quote_Address $address) { $amount = $address->getShippingAmount(); if ($amount != 0) { $title = Mage::helper('Mage_Sales_Helper_Data')->__('Shipping & Handling'); if ($address->getShippingDescription()) { $title .= sprintf(' (%s)', $address->getShippingDescription()); } $address->addTotal(array('code' => 'shipping', 'title' => $title, 'value' => $address->getShippingAmount())); } return $this; }
public function fetch(Mage_Sales_Model_Quote_Address $address) { $amount = $address->getShippingAmount(); if ($amount != 0 || $address->getShippingDescription()) { if ($address->getShippingDescription()) { $title = $address->getShippingDescription(); } else { $title = Mage::helper('sales')->__('Shipping & Handling'); } $address->addTotal(array('code' => $this->getCode(), 'title' => $title, 'value' => $address->getShippingAmount())); } return $this; }
/** * Convert quote address model to order * * @param Mage_Sales_Model_Quote $quote * @return Mage_Sales_Model_Order */ public function addressToOrder(Mage_Sales_Model_Quote_Address $address, $order = null) { if (!$order instanceof Mage_Sales_Model_Order) { $order = $this->toOrder($address->getQuote()); } $order->setWeight($address->getWeight())->setShippingMethod($address->getShippingMethod())->setShippingDescription($address->getShippingDescription())->setShippingRate($address->getShippingRate())->setSubtotal($address->getSubtotal())->setTaxAmount($address->getTaxAmount())->setDiscountAmount($address->getDiscountAmount())->setShippingAmount($address->getShippingAmount())->setGiftcertAmount($address->getGiftcertAmount())->setCustbalanceAmount($address->getCustbalanceAmount())->setGrandTotal($address->getGrandTotal())->setBaseSubtotal($address->getBaseSubtotal())->setBaseTaxAmount($address->getBaseTaxAmount())->setBaseDiscountAmount($address->getBaseDiscountAmount())->setBaseShippingAmount($address->getBaseShippingAmount())->setBaseGiftcertAmount($address->getBaseGiftcertAmount())->setBaseCustbalanceAmount($address->getBaseCustbalanceAmount())->setBaseGrandTotal($address->getBaseGrandTotal()); Mage::dispatchEvent('sales_convert_quote_address_to_order', array('address' => $address, 'order' => $order)); return $order; }
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); } }
public function collect(Mage_Sales_Model_Quote_Address $address) { $store = $address->getQuote()->getStore(); $session = Mage::getSingleton('checkout/session'); $discount = $session->getData('webpos_admin_discount'); if (!$discount) { return $this; } $items = $address->getAllItems(); if (!count($items)) { return $this; } $session->setData('webpos_admin_discount', $discount); $address->setWebposDiscountAmount($discount); $address->setData('webpos_discount_amount', $discount); /* Daniel - tax for discount */ $afterDiscount = Mage::getStoreConfig('tax/calculation/apply_after_discount'); if ($afterDiscount) { $country = Mage::getModel('checkout/session')->getQuote()->getShippingAddress()->getCountry(); $oldTax = $address->getTaxAmount(); $oldBaseTax = $address->getBaseTaxAmount(); if ($country) { $rateTax = Mage::getModel('tax/calculation_rate')->getCollection()->addFieldToFilter('tax_country_id', $country)->setOrder('rate', 'DESC')->getFirstItem(); $address->setTaxAmount(($address->getBaseSubtotal() - $discount + $address->getShippingAmount() + $address->getDiscountAmount()) * $rateTax->getRate() / 100)->setBaseTaxAmount(($address->getBaseSubtotal() - $discount + $address->getShippingAmount() + $address->getDiscountAmount()) * $rateTax->getRate() / 100); $taxCalculationModel = Mage::getSingleton('tax/calculation'); $request = Mage::getSingleton('tax/calculation')->getRateRequest($address, $address->getQuote()->getBillingAddress(), $address->getQuote()->getCustomerTaxClassId(), $store); $rate = Mage::getSingleton('tax/calculation')->getRate($request); $this->_saveAppliedTaxes($address, $taxCalculationModel->getAppliedRates($request), $address->getTaxAmount(), $address->getBaseTaxAmount(), $rate); } $address->setGrandTotal($address->getGrandTotal() - $address->getWebposDiscountAmount()); $address->setBaseGrandTotal($address->getBaseGrandTotal() - $address->getWebposDiscountAmount()); } else { $address->setGrandTotal($address->getGrandTotal() - $address->getWebposDiscountAmount()); $address->setBaseGrandTotal($address->getBaseGrandTotal() - $address->getWebposDiscountAmount()); } /* end */ return $this; }
public function fetch(Mage_Sales_Model_Quote_Address $address) { $this->_method = $address->getQuote()->getPayment()->getMethod(); $label = Mage::helper('msp')->getFeeLabel($this->_method); $quote = $address->getQuote(); $code = $quote->getPayment()->getMethod(); $amount = $address->getShippingAmount(); if ($amount != 0 || $address->getShippingDescription()) { if ($address->getServicecostAmount()) { $address->addTotal(array('code' => $this->getCode(), 'title' => $label, 'value' => $address->getServicecostPdf())); } } return $this; }
/** * Add pricing data for the item to the item payload. * * @return self */ protected function _injectPricingData() { $merchandisePricing = $this->_orderItem->getEmptyMerchandisePriceGroup()->setUnitPrice($this->_item->getPrice())->setAmount($this->_item->getRowTotal())->setTaxClass($this->_itemProduct->getTaxCode()); $this->_discountHelper->transferTaxDiscounts($this->_item, $merchandisePricing); $this->_orderItem->setMerchandisePricing($merchandisePricing); // This will be set by the parent address when initially creating the // item request builder. Each ship group should include shipping on // only one item in the ship group for address level shipping totals. if ($this->_item->getIncludeShippingTotals()) { $shippingPricing = $this->_orderItem->getEmptyShippingPriceGroup()->setAmount($this->_address->getShippingAmount())->setTaxClass($this->_taxConfig->shippingTaxClass); $this->_addShippingDiscount($shippingPricing); $this->_orderItem->setShippingPricing($shippingPricing); } return $this; }
public function collect(Mage_Sales_Model_Quote_Address $address) { $store = $address->getQuote()->getStore(); $address->setTaxAmount(0); $address->setBaseTaxAmount(0); $tax = Mage::getModel('tax/rate_data')->setCustomerClassId($address->getQuote()->getCustomerTaxClassId()); /* @var $tax Mage_Tax_Model_Rate_Data */ $taxAddress = $address; switch (Mage::getStoreConfig('sales/tax/based_on')) { case 'billing': $taxAddress = $address->getQuote()->getBillingAddress(); case 'shipping': $tax->setCountryId($taxAddress->getCountryId())->setRegionId($taxAddress->getRegionId())->setPostcode($taxAddress->getPostcode()); break; case 'origin': $tax->setCountryId(Mage::getStoreConfig('shipping/origin/country_id', $store))->setRegionId(Mage::getStoreConfig('shipping/origin/region_id', $store))->setPostcode(Mage::getStoreConfig('shipping/origin/postcode', $store)); break; } foreach ($address->getAllItems() as $item) { $tax->setProductClassId($item->getProduct()->getTaxClassId()); $rate = $tax->getRate(); $item->setTaxPercent($rate); $item->calcTaxAmount(); $address->setTaxAmount($address->getTaxAmount() + $item->getTaxAmount()); $address->setBaseTaxAmount($address->getBaseTaxAmount() + $item->getBaseTaxAmount()); } $shippingTaxClass = Mage::getStoreConfig('sales/tax/shipping_tax_class', $store); if ($shippingTaxClass) { $tax->setProductClassId($shippingTaxClass); if ($rate = $tax->getRate()) { $shippingTax = $address->getShippingAmount() * $rate / 100; $shippingBaseTax = $address->getBaseShippingAmount() * $rate / 100; $shippingTax = $store->roundPrice($shippingTax); $shippingBaseTax = $store->roundPrice($shippingBaseTax); $address->setTaxAmount($address->getTaxAmount() + $shippingTax); $address->setBaseTaxAmount($address->getBaseTaxAmount() + $shippingBaseTax); } } $address->setGrandTotal($address->getGrandTotal() + $address->getTaxAmount()); $address->setBaseGrandTotal($address->getBaseGrandTotal() + $address->getBaseTaxAmount()); return $this; }
/** * Collect totals information about shipping * * @param Mage_Sales_Model_Quote_Address $address * @return Mage_Sales_Model_Quote_Address_Total_Shipping */ public function collect(Mage_Sales_Model_Quote_Address $address) { $_code = 'customshippingrate'; $method = $address->getShippingMethod(); if ($method == $_code) { $amountPrice = $address->getQuote()->getStore()->convertPrice($address->getBaseShippingAmount(), false); if (Mage::helper('customshippingrate')->isMage13()) { $address->setShippingAmount($amountPrice); $address->setBaseShippingAmount($address->getBaseShippingAmount()); $address->setGrandTotal($address->getGrandTotal() + $address->getShippingAmount()); $address->setBaseGrandTotal($address->getBaseGrandTotal() + $address->getBaseShippingAmount()); } else { $this->_setAddress($address); $this->_setAmount($amountPrice); $this->_setBaseAmount($address->getBaseShippingAmount()); } return $this; } else { return parent::collect($address); } }
/** * @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; }
/** * Tax caclulation for shipping price * * @param Mage_Sales_Model_Quote_Address $address * @param Varien_Object $taxRateRequest * @return Mage_Tax_Model_Sales_Total_Quote */ protected function _calculateShippingTax(Mage_Sales_Model_Quote_Address $address, $taxRateRequest) { $taxRateRequest->setProductClassId($this->_config->getShippingTaxClass($this->_store)); $rate = $this->_calculator->getRate($taxRateRequest); $inclTax = $address->getIsShippingInclTax(); $shipping = $address->getShippingTaxable(); $baseShipping = $address->getBaseShippingTaxable(); $hiddenTax = null; $baseHiddenTax = null; switch ($this->_helper->getCalculationSequence($this->_store)) { case Mage_Tax_Model_Calculation::CALC_TAX_BEFORE_DISCOUNT_ON_EXCL: case Mage_Tax_Model_Calculation::CALC_TAX_BEFORE_DISCOUNT_ON_INCL: $tax = $this->_calculator->calcTaxAmount($shipping, $rate, $inclTax, false); $baseTax = $this->_calculator->calcTaxAmount($baseShipping, $rate, $inclTax, false); break; case Mage_Tax_Model_Calculation::CALC_TAX_AFTER_DISCOUNT_ON_EXCL: case Mage_Tax_Model_Calculation::CALC_TAX_AFTER_DISCOUNT_ON_INCL: $discountAmount = $address->getShippingDiscountAmount(); $baseDiscountAmount = $address->getBaseShippingDiscountAmount(); $tax = $this->_calculator->calcTaxAmount($shipping - $discountAmount, $rate, $inclTax, false); $baseTax = $this->_calculator->calcTaxAmount($baseShipping - $baseDiscountAmount, $rate, $inclTax, false); break; } if ($this->_config->getAlgorithm($this->_store) == Mage_Tax_Model_Calculation::CALC_TOTAL_BASE) { $tax = $this->_deltaRound($tax, $rate, $inclTax); $baseTax = $this->_deltaRound($baseTax, $rate, $inclTax, 'base'); } else { $tax = $this->_calculator->round($tax); $baseTax = $this->_calculator->round($baseTax); } if ($inclTax && !empty($discountAmount)) { $hiddenTax = $shipping - $tax - $address->getShippingAmount(); $baseHiddenTax = $baseShipping - $baseTax - $address->getBaseShippingAmount(); } $this->_addAmount(max(0, $tax)); $this->_addBaseAmount(max(0, $baseTax)); $address->setShippingTaxAmount(max(0, $tax)); $address->setBaseShippingTaxAmount(max(0, $baseTax)); $address->setShippingHiddenTaxAmount(max(0, $hiddenTax)); $address->setBaseShippingHiddenTaxAmount(max(0, $baseHiddenTax)); $address->addTotalAmount('shipping_hidden_tax', $hiddenTax); $address->addBaseTotalAmount('shipping_hidden_tax', $baseHiddenTax); $applied = $this->_calculator->getAppliedRates($taxRateRequest); $this->_saveAppliedTaxes($address, $applied, $tax, $baseTax, $rate); return $this; }
/** * 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::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; }
/** * Add shipping totals information to address object * * @param Mage_Sales_Model_Quote_Address $address * @return Mage_Sales_Model_Quote_Address_Total_Shipping */ public function fetch(Mage_Sales_Model_Quote_Address $address) { $amount = $address->getShippingAmount(); if ($amount != 0 || $address->getShippingDescription()) { $title = Mage::helper('sales')->__('Shipping & Handling'); if ($address->getShippingDescription()) { $description = str_replace("Express courier - ", "", $address->getShippingDescription()); $description = str_replace("Corriere espresso - ", "", $address->getShippingDescription()); $title .= ' (' . $description . ')'; } $address->addTotal(array('code' => $this->getCode(), 'title' => $title, 'value' => $address->getShippingAmount())); } return $this; }
/** * Add shipping totals information to address object * * @param Mage_Sales_Model_Quote_Address $address * @return Mage_Sales_Model_Quote_Address_Total_Shipping */ public function fetch(Mage_Sales_Model_Quote_Address $address) { $amount = $address->getShippingAmount(); if ($amount != 0 || $address->getShippingDescription()) { $title = Mage::helper('sales')->__('Shipping Charges'); if ($address->getShippingDescription()) { $desc = $address->getShippingDescription(); $_pos = strpos($desc, "-"); if ($_pos === false) { $title .= ' (' . $address->getShippingDescription() . ')'; } else { $_temp = explode("-", $desc); if (isset($_temp[1])) { $title .= ' (' . trim($_temp[1]) . ')'; } } // $title .= ' (' . $address->getShippingDescription() . ')'; } $address->addTotal(array('code' => $this->getCode(), 'title' => $title, 'value' => $address->getShippingAmount())); } 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_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; }
/** * Calculate shipping price without store tax * * @param Mage_Sales_Model_Quote_Address $address * @return Mage_Tax_Model_Sales_Total_Quote_Subtotal */ protected function _processShippingAmount($address) { if ($this->_areTaxRequestsSimilar) { return $this; } $store = $address->getQuote()->getStore(); $shippingTaxClass = $this->_config->getShippingTaxClass($store); $shippingAmount = $address->getShippingAmount(); $baseShippingAmount = $address->getBaseShippingAmount(); if ($shippingTaxClass) { $request = $this->_getStoreTaxRequest($address); $request->setProductClassId($shippingTaxClass); $rate = $this->_calculator->getRate($request); if ($rate) { $shippingTax = $this->_calculator->calcTaxAmount($shippingAmount, $rate, true, false); $shippingBaseTax = $this->_calculator->calcTaxAmount($baseShippingAmount, $rate, true, false); $shippingAmount -= $shippingTax; $baseShippingAmount -= $shippingBaseTax; $address->setTotalAmount('shipping', $this->_calculator->roundUp($shippingAmount)); $address->setBaseTotalAmount('shipping', $this->_calculator->roundUp($baseShippingAmount)); } } return $this; }
/** * 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; }
/** * Add shipping totals information to address object * * @param Mage_Sales_Model_Quote_Address $address * @return Mage_Sales_Model_Quote_Address_Total_Shipping */ public function fetch(Mage_Sales_Model_Quote_Address $address) { $amount = $address->getShippingAmount(); if ($amount != 0 || $address->getShippingDescription()) { $title = Mage::helper('sales')->__('Shipping & Handling'); $desc = $address->getShippingDescription(); switch ($desc) { case "Versandkostenpauschale - Versandkostenpauschale": $desc = "Versandkostenpauschale"; break; case "Versandkostenfrei - Versandkostenfrei": $desc = "Versandkostenfrei"; break; } $title .= ' (' . $desc . ')'; $value = $address->getShippingAmount(); $address->addTotal(array('code' => $this->getCode(), 'title' => $title, 'value' => $value)); } return $this; }
/** * Tax caclulation for shipping price * * @param Mage_Sales_Model_Quote_Address $address * @param Varien_Object $taxRateRequest * @return Mage_Tax_Model_Sales_Total_Quote */ protected function _calculateShippingTax(Mage_Sales_Model_Quote_Address $address, $taxRateRequest) { $store = $address->getQuote()->getStore(); $shippingTaxClass = $this->_config->getShippingTaxClass($store); $shippingAmount = $address->getShippingAmount(); $baseShippingAmount = $address->getBaseShippingAmount(); $shippingDiscountAmount = $address->getShippingDiscountAmount(); $baseShippingDiscountAmount = $address->getBaseShippingDiscountAmount(); /** * Subtract discount before calculate tax amount */ if ($this->_config->applyTaxAfterDiscount($store)) { $calcAmount = $shippingAmount - $shippingDiscountAmount; $baseCalcAmount = $baseShippingAmount - $baseShippingDiscountAmount; } else { $calcAmount = $shippingAmount; $baseCalcAmount = $baseShippingAmount; } $shippingTax = 0; $shippingBaseTax = 0; if ($shippingTaxClass) { $taxRateRequest->setProductClassId($shippingTaxClass); $rate = $this->_calculator->getRate($taxRateRequest); if ($rate) { if ($this->_config->shippingPriceIncludesTax($store) && $this->_areTaxRequestsSimilar) { $shippingTax = $this->_calculator->calcTaxAmount($calcAmount, $rate, true, false); $shippingBaseTax = $this->_calculator->calcTaxAmount($baseCalcAmount, $rate, true, false); $shippingAmount -= $shippingTax; $baseShippingAmount -= $shippingBaseTax; } else { $shippingTax = $this->_calculator->calcTaxAmount($calcAmount, $rate, false, false); $shippingBaseTax = $this->_calculator->calcTaxAmount($baseCalcAmount, $rate, false, false); } $rateKey = (string) $rate; if (isset($this->_roundingDeltas[$rateKey])) { $shippingTax += $this->_roundingDeltas[$rateKey]; } if (isset($this->_baseRoundingDeltas[$rateKey])) { $shippingBaseTax += $this->_baseRoundingDeltas[$rateKey]; } $shippingTax = $this->_calculator->round($shippingTax); $shippingBaseTax = $this->_calculator->round($shippingBaseTax); $address->setTotalAmount('shipping', $shippingAmount); $address->setBaseTotalAmount('shipping', $baseShippingAmount); /** * Provide additional attributes for apply discount on price include tax */ if ($this->_config->discountTax($store)) { $address->setShippingAmountForDiscount($shippingAmount + $shippingTax); $address->setBaseShippingAmountForDiscount($baseShippingAmount + $shippingBaseTax); } $this->_addAmount($shippingTax); $this->_addBaseAmount($shippingBaseTax); $applied = $this->_calculator->getAppliedRates($taxRateRequest); $this->_saveAppliedTaxes($address, $applied, $shippingTax, $shippingBaseTax, $rate); } } $address->setShippingTaxAmount($shippingTax); $address->setBaseShippingTaxAmount($shippingBaseTax); return $this; }
/** * Calculate cart total net * * @param Mage_Sales_Model_Quote_Address $address * @return int */ private function calculateCartTotal($address) { if ($address->getTaxAmount() > 0) { $value = $address->getGrandTotal() - $address->getTaxAmount(); return $this->currencyToSmallerUnit($value); } else { $discount = $address->getDiscountAmount() < 0 ? -$address->getDiscountAmount() : $address->getDiscountAmount(); $value = $address->getSubtotal() + $address->getShippingAmount() + $this->getQuote()->getBillpayChargedFeeNet() - $discount; // TODO: for rate payment add fee tax amount return $this->currencyToSmallerUnit($value); } }
/** * * @param Mage_Sales_Model_Quote $quote * @param Mage_Sales_Model_Quote_Address $address * @param Mage_Sales_Model_Quote_Item $item * @param int $rule_id */ public function getNewDiscounts($quote, $address, $item, $rule_id) { $rule = $this->getRule($rule_id); $store = $item->getQuote()->getStore(); //@nelkaake 17/03/2010 5:01:35 AM if (!$this->_getDiscountValidator()->isValidAppliedRedemption($rule, $item)) { return $this->_emptyDiscount(); } //@nelkaake -a 16/11/10: No rule ID? if (!$rule->getId()) { throw new Exception("No rule ID was detected in Salesrule_Discount_Calculator::getNewDiscounts, which means that there may be some unexpected behaviour that may cause problems."); } //@nelkaake -a 11/03/11: if this item is valid for the rule if (!$rule->getActions()->validate($item)) { return $this->_emptyDiscount(); } $qty = $item->getQty(); //@nelkaake -a 11/03/11: If we have a bundle of 2, and two bundles it's 2x2=4 products total. if ($item->getParentItem()) { $qty *= $item->getParentItem()->getQty(); } //@nelkaake -a 11/03/11: Is there a maximum quantity to discount? If so, use that. TODO check if this is required. $qty = $rule->getDiscountQty() ? min($qty, $rule->getDiscountQty()) : $qty; //@nelkaake -a 11/03/11: Make sure there discount percent is 100% max. $rulePercent = min(100, $rule->getDiscountAmount()); //@nelkaake -a 11/03/11: Initialize the discount amounts $discountAmount = 0; $baseDiscountAmount = 0; //@nelkaake 17/03/2010 5:09:27 AM :Get all items. $all_items = $item->getQuote()->getAllItems(); //@nelkaake -a 11/03/11: How much was the total shipping amount so far? $shipping_amount = $address->getShippingAmount(); $base_shipping_amount = $address->getBaseShippingAmount(); //@nelkaake -a 11/03/11: Initialize the per-item price. $itemPrice = $item->getDiscountCalculationPrice(); if ($itemPrice !== null) { $baseItemPrice = $item->getBaseDiscountCalculationPrice(); } else { $itemPrice = $item->getCalculationPrice(); $baseItemPrice = $item->getBaseCalculationPrice(); } $cartRules = $address->getRewardsCartRules(); $cartRules = empty($cartRules) ? array() : $cartRules; // WDCA CODE BEGIN //@nelkaake -a 11/03/11: Before we begin, refactor all the catalog redemptions so we have the latest row totals. // TODO Is this still needed? switch ($rule->getSimpleAction()) { case 'by_percent': $by_percent_discounter = Mage::getSingleton('rewards/salesrule_discount_action_bypercent'); list($discountAmount, $baseDiscountAmount) = $by_percent_discounter->applyDiscounts($cartRules, $address, $item, $rule, $qty); break; case 'cart_fixed': $cart_fixed_discounter = Mage::getSingleton('rewards/salesrule_discount_action_cartfixed'); list($discountAmount, $baseDiscountAmount) = $cart_fixed_discounter->applyDiscounts($cartRules, $address, $item, $rule, $qty); // WDCA CODE END break; default: throw new Exception("Reached unsupported discount action. This may be due to corrupt data. Unexpected rule action was: " . $rule->getSimpleAction()); break; } //@nelkaake -a 11/03/11: Save cart rule entries. $address->setRewardsCartRules($cartRules); $discountAmount = $quote->getStore()->roundPrice($discountAmount); $baseDiscountAmount = $quote->getStore()->roundPrice($baseDiscountAmount); return new Varien_Object(array('discount_amount' => $discountAmount, 'base_discount_amount' => $baseDiscountAmount)); }