/** * @param Mage_Sales_Model_Quote_Address $address * @return Mage_Sales_Model_Quote_Address_Total_Abstract */ public function collect(Mage_Sales_Model_Quote_Address $address) { $quote = $address->getQuote(); $payment = $quote->getPayment(); if ($address->getAddressType() === 'billing') { return $this; } $configId = $payment->getPayoneConfigPaymentMethodId(); if (empty($configId)) { return $this; } $config = $this->helperConfig()->getConfigPaymentMethodById($configId, $quote->getStoreId()); if (empty($config)) { return $this; } $feeConfig = $config->getFeeConfigForQuote($quote); if (!is_array($feeConfig) or !array_key_exists('fee_config', $feeConfig)) { return $this; } $paymentFee = $feeConfig['fee_config']; $oldShippingAmount = $address->getBaseShippingAmount(); $newShippingAmount = $oldShippingAmount + $paymentFee; $address->setBaseShippingAmount($newShippingAmount); $address->setShippingAmount($quote->getStore()->convertPrice($newShippingAmount, false)); return parent::collect($address); }
/** * 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); } }
/** * 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); } }
public function collect(Mage_Sales_Model_Quote_Address $address) { $oldWeight = $address->getWeight(); $address->setWeight(0); $address->setShippingAmount(0); $method = $address->getShippingMethod(); $freeAddress = $address->getFreeShipping(); $address->setFreeMethodWeight(0); foreach ($address->getAllItems() as $item) { $item->calcRowWeight(); $address->setWeight($address->getWeight() + $item->getRowWeight()); if ($freeAddress || $item->getFreeShipping() === true) { $item->setRowWeight(0); } elseif (is_numeric($item->getFreeShipping())) { $origQty = $item->getQty(); if ($origQty > $item->getFreeShipping()) { $item->setQty($origQty - $item->getFreeShipping()); $item->calcRowWeight(); $item->setQty($origQty); } else { $item->setRowWeight(0); } } $address->setFreeMethodWeight($address->getFreeMethodWeight() + $item->getRowWeight()); } $address->collectShippingRates(); $address->setShippingAmount(0); $address->setBaseShippingAmount(0); $method = $address->getShippingMethod(); if ($method) { foreach ($address->getAllShippingRates() as $rate) { if ($rate->getCode() == $method) { $amountPrice = $address->getQuote()->getStore()->convertPrice($rate->getPrice(), false); $address->setShippingAmount($amountPrice); $address->setBaseShippingAmount($rate->getPrice()); $address->setShippingDescription($rate->getCarrierTitle() . ' - ' . $rate->getMethodDescription()); break; } } } $address->setGrandTotal($address->getGrandTotal() + $address->getShippingAmount()); $address->setBaseGrandTotal($address->getBaseGrandTotal() + $address->getBaseShippingAmount()); 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; }
public function collect(Mage_Sales_Model_Quote_Address $address) { $oldWeight = $address->getWeight(); $address->setWeight(0); $address->setShippingAmount(0); $address->setBaseShippingAmount(0); $address->setFreeMethodWeight(0); $items = $address->getAllItems(); if (!count($items)) { return $this; } $method = $address->getShippingMethod(); $freeAddress = $address->getFreeShipping(); $addressWeight = $address->getWeight(); $freeMethodWeight = $address->getFreeMethodWeight(); $addressQty = 0; foreach ($items as $item) { /** * Skip if this item is virtual */ if ($item->getProduct()->isVirtual()) { continue; } /** * Children weight we calculate for parent */ if ($item->getParentItem()) { continue; } if ($item->getHasChildren() && $item->isShipSeparately()) { foreach ($item->getChildren() as $child) { if ($child->getProduct()->isVirtual()) { continue; } $addressQty += $item->getQty() * $child->getQty(); if (!$item->getProduct()->getWeightType()) { $itemWeight = $child->getWeight(); $itemQty = $item->getQty() * $child->getQty(); $rowWeight = $itemWeight * $itemQty; $addressWeight += $rowWeight; if ($freeAddress || $child->getFreeShipping() === true) { $rowWeight = 0; } elseif (is_numeric($child->getFreeShipping())) { $freeQty = $child->getFreeShipping(); if ($itemQty > $freeQty) { $rowWeight = $itemWeight * ($itemQty - $freeQty); } else { $rowWeight = 0; } } $freeMethodWeight += $rowWeight; $item->setRowWeight($rowWeight); } } if ($item->getProduct()->getWeightType()) { $itemWeight = $item->getWeight(); $rowWeight = $itemWeight * $item->getQty(); $addressWeight += $rowWeight; if ($freeAddress || $item->getFreeShipping() === true) { $rowWeight = 0; } elseif (is_numeric($item->getFreeShipping())) { $freeQty = $item->getFreeShipping(); if ($item->getQty() > $freeQty) { $rowWeight = $itemWeight * ($item->getQty() - $freeQty); } else { $rowWeight = 0; } } $freeMethodWeight += $rowWeight; $item->setRowWeight($rowWeight); } } else { if (!$item->getProduct()->isVirtual()) { $addressQty += $item->getQty(); } $itemWeight = $item->getWeight(); $rowWeight = $itemWeight * $item->getQty(); $addressWeight += $rowWeight; if ($freeAddress || $item->getFreeShipping() === true) { $rowWeight = 0; } elseif (is_numeric($item->getFreeShipping())) { $freeQty = $item->getFreeShipping(); if ($item->getQty() > $freeQty) { $rowWeight = $itemWeight * ($item->getQty() - $freeQty); } else { $rowWeight = 0; } } $freeMethodWeight += $rowWeight; $item->setRowWeight($rowWeight); } } if (isset($addressQty)) { $address->setItemQty($addressQty); } $address->setWeight($addressWeight); $address->setFreeMethodWeight($freeMethodWeight); $address->collectShippingRates(); $address->setShippingAmount(0); $address->setBaseShippingAmount(0); $method = $address->getShippingMethod(); if ($method) { foreach ($address->getAllShippingRates() as $rate) { if ($rate->getCode() == $method) { $amountPrice = $address->getQuote()->getStore()->convertPrice($rate->getPrice(), false); $address->setShippingAmount($amountPrice); $address->setBaseShippingAmount($rate->getPrice()); $address->setShippingDescription($rate->getCarrierTitle() . ' - ' . $rate->getMethodTitle()); break; } } } $address->setGrandTotal($address->getGrandTotal() + $address->getShippingAmount()); $address->setBaseGrandTotal($address->getBaseGrandTotal() + $address->getBaseShippingAmount()); 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; }
/** * Adds shipping cost to request as item * * @param Mage_Sales_Model_Quote_Address $address * @return int */ protected function _addShipping($address) { $lineNumber = $this->_getNewLineCode(); $storeId = $address->getQuote()->getStore()->getId(); $taxClass = Mage::helper('tax')->getShippingTaxClass($storeId); $shippingAmount = max(0.0, (double) $address->getBaseShippingAmount()); if ($this->_getTaxDataHelper()->applyTaxAfterDiscount($storeId)) { $shippingAmount -= (double) $address->getBaseShippingDiscountAmount(); } $line = $this->_getNewDocumentRequestLineObject(); $line->setLineCode($lineNumber); $shippingSku = $this->_getConfigHelper()->getShippingSku($storeId); $line->setItemCode($shippingSku ?: self::DEFAULT_SHIPPING_ITEMS_SKU); $line->setItemDescription(self::DEFAULT_SHIPPING_ITEMS_DESCRIPTION); $line->setAvalaraGoodsAndServicesType($taxClass); $line->setNumberOfItems(1); $line->setlineAmount($shippingAmount); $discounted = (double) $address->getBaseShippingDiscountAmount() && $this->_getTaxDataHelper()->applyTaxAfterDiscount($storeId) ? 'true' : 'false'; $line->setDiscounted($discounted); if ($this->_getTaxDataHelper()->shippingPriceIncludesTax($storeId)) { $line->setTaxIncluded('true'); } $this->_lines[$lineNumber] = $line; $this->_setLinesToRequest(); $this->_lineToLineId[$lineNumber] = $shippingSku; return $lineNumber; }
/** * 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; }
/** * @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; }
/** * update earning points for address items * * @param Mage_Sales_Model_Quote_Address $address * @return Magestore_RewardPoints_Model_Total_Quote_Earning */ protected function _updateEarningPoints($address) { $items = $address->getAllItems(); $earningPoints = $address->getRewardpointsEarn(); if (!count($items) || $earningPoints <= 0) { return $this; } // Calculate total item prices $baseItemsPrice = 0; $totalItemsQty = 0; $isBaseOnQty = false; foreach ($items as $item) { if ($item->getParentItemId()) { continue; } if ($item->getHasChildren() && $item->isChildrenCalculated()) { foreach ($item->getChildren() as $child) { $baseItemsPrice += $item->getQty() * ($child->getQty() * $child->getBasePriceInclTax() - $child->getBaseDiscountAmount()); $totalItemsQty += $item->getQty() * $child->getQty(); } } elseif ($item->getProduct()) { $baseItemsPrice += $item->getQty() * $item->getBasePriceInclTax() - $item->getBaseDiscountAmount(); $totalItemsQty += $item->getQty(); } } $baseItemsPrice += $address->getBaseShippingAmount() + $address->getBaseShippingTaxAmount(); if ($baseItemsPrice < 0.0001) { $isBaseOnQty = true; } // Update for items foreach ($items as $item) { if ($item->getParentItemId()) { continue; } if ($item->getHasChildren() && $item->isChildrenCalculated()) { foreach ($item->getChildren() as $child) { $baseItemPrice = $item->getQty() * ($child->getQty() * $child->getBasePriceInclTax() - $child->getBaseDiscountAmount()); $itemQty = $item->getQty() * $child->getQty(); if ($isBaseOnQty) { $itemEarning = round($itemQty * $earningPoints / $totalItemsQty, 0, PHP_ROUND_HALF_DOWN); } else { $itemEarning = round($baseItemPrice * $earningPoints / $baseItemsPrice, 0, PHP_ROUND_HALF_DOWN); } $child->setRewardpointsEarn($itemEarning); } } elseif ($item->getProduct()) { $baseItemPrice = $item->getQty() * $item->getBasePriceInclTax() - $item->getBaseDiscountAmount(); $itemQty = $item->getQty(); if ($isBaseOnQty) { $itemEarning = round($itemQty * $earningPoints / $totalItemsQty, 0, PHP_ROUND_HALF_DOWN); } else { $itemEarning = round($baseItemPrice * $earningPoints / $baseItemsPrice, 0, PHP_ROUND_HALF_DOWN); } $item->setRewardpointsEarn($itemEarning); } } 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; }
/** * Prepare Discount Amount used for Tax * * @param Mage_Sales_Model_Quote_Address $address * @param type $baseDiscount * @return Magestore_RewardPoints_Model_Total_Quote_Point */ public function _prepareDiscountForTaxAmount(Mage_Sales_Model_Quote_Address $address, $baseDiscount, $points) { $items = $address->getAllItems(); if (!count($items)) { return $this; } // Calculate total item prices $baseItemsPrice = 0; foreach ($items as $item) { if ($item->getParentItemId()) { continue; } if ($item->getHasChildren() && $item->isChildrenCalculated()) { foreach ($item->getChildren() as $child) { $baseItemsPrice += $item->getQty() * ($child->getQty() * $child->getBasePrice() - $child->getBaseDiscountAmount() + $child->getBaseTaxAmount()); } } elseif ($item->getProduct()) { $baseItemsPrice += $item->getQty() * $item->getBasePrice() - $item->getBaseDiscountAmount() - $item->getRewardpointsBaseDiscount() + $item->getBaseTaxAmount(); } } $discountForShipping = Mage::getStoreConfig(Magestore_RewardPoints_Helper_Calculation_Spending::XML_PATH_SPEND_FOR_SHIPPING, $address->getQuote()->getStoreId()); $discountForShippingTax = Mage::getStoreConfig(Magestore_RewardPoints_Helper_Calculation_Spending::XML_PATH_SPEND_FOR_SHIPPING_TAX, $address->getQuote()->getStoreId()); if ($discountForShipping) { $baseItemsPrice += $address->getBaseShippingAmount(); if ($discountForShippingTax) { $baseItemsPrice += $address->getBaseShippingTaxAmount(); } } if ($baseItemsPrice < 0.0001) { return $this; } // Update discount for each item foreach ($items as $item) { if ($item->getParentItemId()) { continue; } if ($item->getHasChildren() && $item->isChildrenCalculated()) { foreach ($item->getChildren() as $child) { $baseItemPrice = $item->getQty() * ($child->getQty() * $child->getBasePrice() - $child->getBaseDiscountAmount() + $child->getBaseTaxAmount()); $itemBaseDiscount = $baseDiscount * $baseItemPrice / $baseItemsPrice; $itemDiscount = Mage::app()->getStore()->convertPrice($itemBaseDiscount); $pointSpent = round($points * $baseItemPrice / $baseItemsPrice, 0, PHP_ROUND_HALF_DOWN); $child->setRewardpointsBaseDiscount($child->getRewardpointsBaseDiscount() + $itemBaseDiscount)->setRewardpointsDiscount($child->getRewardpointsDiscount() + $itemDiscount)->setMagestoreBaseDiscount($child->getMagestoreBaseDiscount() + $itemBaseDiscount)->setRewardpointsSpent($child->getRewardpointsSpent() + $pointSpent); } } elseif ($item->getProduct()) { $baseItemPrice = $item->getQty() * $item->getBasePrice() - $item->getBaseDiscountAmount() - $item->getRewardpointsBaseDiscount() + $item->getBaseTaxAmount(); $itemBaseDiscount = $baseDiscount * $baseItemPrice / $baseItemsPrice; $itemDiscount = Mage::app()->getStore()->convertPrice($itemBaseDiscount); $pointSpent = round($points * $baseItemPrice / $baseItemsPrice, 0, PHP_ROUND_HALF_DOWN); $item->setRewardpointsBaseDiscount($item->getRewardpointsBaseDiscount() + $itemBaseDiscount)->setRewardpointsDiscount($item->getRewardpointsDiscount() + $itemDiscount)->setMagestoreBaseDiscount($item->getMagestoreBaseDiscount() + $itemBaseDiscount)->setRewardpointsSpent($item->getRewardpointsSpent() + $pointSpent); } } if ($discountForShipping) { $shipping = $address->getBaseShippingAmount(); if ($discountForShippingTax) { $shipping += $address->getBaseShippingTaxAmount(); } $itemBaseDiscount = $baseDiscount * $shipping / $baseItemsPrice; $itemDiscount = Mage::app()->getStore()->convertPrice($itemBaseDiscount); $address->setRewardpointsBaseAmount($itemBaseDiscount)->setMagestoreBaseDiscountForShipping($itemBaseDiscount)->setRewardpointsAmount($itemDiscount); } return $this; }
/** * Prepare Discount Amount used for Tax * * @param Mage_Sales_Model_Quote_Address $address * @param type $baseDiscount * @return Magestore_RewardPoints_Model_Total_Quote_Point */ public function _prepareDiscountForTaxAmount(Mage_Sales_Model_Quote_Address $address, $baseDiscount, $points) { $items = $address->getAllItems(); if (!count($items)) { return $this; } // Calculate total item prices $baseItemsPrice = 0; $store = Mage::app()->getStore(); foreach ($items as $item) { if ($item->getParentItemId()) { continue; } if ($item->getHasChildren() && $item->isChildrenCalculated()) { foreach ($item->getChildren() as $child) { $baseItemsPrice += $item->getQty() * ($child->getQty() * $child->getBasePrice() - $child->getBaseDiscountAmount()); } } elseif ($item->getProduct()) { $baseItemsPrice += $item->getQty() * $item->getBasePrice() - $item->getBaseDiscountAmount() - $item->getRewardpointsBaseDiscount(); } } $discountForShipping = Mage::getStoreConfig(Magestore_RewardPoints_Helper_Calculation_Spending::XML_PATH_SPEND_FOR_SHIPPING, $address->getQuote()->getStoreId()); if ($discountForShipping) { $baseItemsPrice += $address->getBaseShippingAmount(); } if ($baseItemsPrice < 0.0001) { return $this; } // Update discount for each item foreach ($items as $item) { if ($item->getParentItemId()) { continue; } if ($item->getHasChildren() && $item->isChildrenCalculated()) { foreach ($item->getChildren() as $child) { $baseItemPrice = $item->getQty() * ($child->getQty() * $child->getBasePrice() - $child->getBaseDiscountAmount()); $itemBaseDiscount = $baseDiscount * $baseItemPrice / $baseItemsPrice; $itemDiscount = Mage::app()->getStore()->convertPrice($itemBaseDiscount); $pointSpent = round($points * $baseItemPrice / $baseItemsPrice, 0, PHP_ROUND_HALF_DOWN); $child->setRewardpointsBaseDiscount($child->getRewardpointsBaseDiscount() + $itemBaseDiscount)->setRewardpointsDiscount($child->getRewardpointsDiscount() + $itemDiscount)->setMagestoreBaseDiscount($child->getMagestoreBaseDiscount() + $itemBaseDiscount)->setRewardpointsSpent($child->getRewardpointsSpent() + $pointSpent); $baseTaxableAmount = $child->getBaseTaxableAmount(); $taxableAmount = $child->getTaxableAmount(); $child->setBaseTaxableAmount($child->getBaseTaxableAmount() - $child->getRewardpointsBaseDiscount()); $child->setTaxableAmount($child->getTaxableAmount() - $child->getRewardpointsDiscount()); if ($child->getBaseTaxableAmount() < 0) { $child->setBaseTaxableAmount(0); $child->setTaxableAmount(0); } $rate = $this->getItemRateOnQuote($child->getProduct(), $store); if ($rate > 1) { $hiddenBaseTaxBeforeDiscount = Mage::getSingleton('tax/calculation')->calcTaxAmount($baseTaxableAmount, ($rate - 1) * 100, true, false); $hiddenTaxBeforeDiscount = Mage::getSingleton('tax/calculation')->calcTaxAmount($taxableAmount, ($rate - 1) * 100, true, false); $hiddenBaseTaxAfterDiscount = Mage::getSingleton('tax/calculation')->calcTaxAmount($child->getBaseTaxableAmount(), ($rate - 1) * 100, true, false); $hiddenTaxAfterDiscount = Mage::getSingleton('tax/calculation')->calcTaxAmount($child->getTaxableAmount(), ($rate - 1) * 100, true, false); $this->_hiddentBaseDiscount += Mage::getSingleton('tax/calculation')->round($hiddenBaseTaxBeforeDiscount) - Mage::getSingleton('tax/calculation')->round($hiddenBaseTaxAfterDiscount); $this->_hiddentDiscount += Mage::getSingleton('tax/calculation')->round($hiddenTaxBeforeDiscount) - Mage::getSingleton('tax/calculation')->round($hiddenTaxAfterDiscount); } } } elseif ($item->getProduct()) { $baseItemPrice = $item->getQty() * $item->getBasePrice() - $item->getBaseDiscountAmount() - $item->getRewardpointsBaseDiscount(); $itemBaseDiscount = $baseDiscount * $baseItemPrice / $baseItemsPrice; $itemDiscount = Mage::app()->getStore()->convertPrice($itemBaseDiscount); $pointSpent = round($points * $baseItemPrice / $baseItemsPrice, 0, PHP_ROUND_HALF_DOWN); $item->setRewardpointsBaseDiscount($item->getRewardpointsBaseDiscount() + $itemBaseDiscount)->setRewardpointsDiscount($item->getRewardpointsDiscount() + $itemDiscount)->setMagestoreBaseDiscount($item->getMagestoreBaseDiscount() + $itemBaseDiscount)->setRewardpointsSpent($item->getRewardpointsSpent() + $pointSpent); $baseTaxableAmount = $item->getBaseTaxableAmount(); $taxableAmount = $item->getTaxableAmount(); $item->setBaseTaxableAmount($item->getBaseTaxableAmount() - $item->getRewardpointsBaseDiscount()); $item->setTaxableAmount($item->getTaxableAmount() - $item->getRewardpointsDiscount()); if ($item->getBaseTaxableAmount() < 0) { $item->setBaseTaxableAmount(0); $item->setTaxableAmount(0); } $rate = $this->getItemRateOnQuote($item->getProduct(), $store); if ($rate > 1) { $hiddenBaseTaxBeforeDiscount = Mage::getSingleton('tax/calculation')->calcTaxAmount($baseTaxableAmount, ($rate - 1) * 100, true, false); $hiddenTaxBeforeDiscount = Mage::getSingleton('tax/calculation')->calcTaxAmount($taxableAmount, ($rate - 1) * 100, true, false); $hiddenBaseTaxAfterDiscount = Mage::getSingleton('tax/calculation')->calcTaxAmount($item->getBaseTaxableAmount(), ($rate - 1) * 100, true, false); $hiddenTaxAfterDiscount = Mage::getSingleton('tax/calculation')->calcTaxAmount($item->getTaxableAmount(), ($rate - 1) * 100, true, false); $this->_hiddentBaseDiscount += Mage::getSingleton('tax/calculation')->round($hiddenBaseTaxBeforeDiscount) - Mage::getSingleton('tax/calculation')->round($hiddenBaseTaxAfterDiscount); $this->_hiddentDiscount += Mage::getSingleton('tax/calculation')->round($hiddenTaxBeforeDiscount) - Mage::getSingleton('tax/calculation')->round($hiddenTaxAfterDiscount); } } } if ($discountForShipping) { $itemBaseDiscount = $baseDiscount * $address->getBaseShippingAmount() / $baseItemsPrice; $itemDiscount = Mage::app()->getStore()->convertPrice($itemBaseDiscount); $address->setRewardpointsBaseAmount($itemBaseDiscount)->setMagestoreBaseDiscountForShipping($address->getMagestoreBaseDiscountForShipping() + $itemBaseDiscount)->setRewardpointsAmount($itemDiscount); $address->setBaseShippingTaxable($address->getBaseShippingTaxable() - $address->getRewardpointsBaseAmount()); $address->setShippingTaxable($address->getShippingTaxable() - $address->getRewardpointsAmount()); if ($address->getBaseShippingTaxable() < 0) { $address->setBaseShippingTaxable(0); $address->setShippingTaxable(0); } } return $this; }
/** * 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; }
/** * @param Mage_Sales_Model_Quote_Address $address * @return $this|Mage_Sales_Model_Quote_Address_Total_Abstract */ public function collect(Mage_Sales_Model_Quote_Address $address) { $helper = Mage::helper('mageworx_multifees'); if ($address->getSubtotal() == 0 && floatval($address->getCustomerCreditAmount()) == 0) { return $this; } if ($this->_collected) { return $this; } //////////////////////////////////////////////////////////////////// $subtotalRowTOTAL = 0; $CompanyTotal = 0; $PersonTotal = 0; $quote = Mage::getSingleton('checkout/cart')->getQuote(); $cartItems = $quote->getAllVisibleItems(); $userGroupId = Mage::getSingleton('customer/session')->getCustomerGroupId(); foreach ($cartItems as $item) { $subtotalRow = 0; $_product = Mage::getModel('catalog/product')->load($item->getProductId()); $ids = $_product->getCategoryIds(); $productId = $item->getProductId(); $qty = $item->getQty(); $price = $item->getProduct()->getPrice(); $subtotalRow = $subtotalRow + $price * $qty; //If the product has perception tax for persons if (array_search("372", $ids) != false && $subtotalRow >= 100) { $PersonTotal = $PersonTotal + $subtotalRow; } //If the product has perception tax for persons if (array_search("373", $ids) != false) { $CompanyTotal = $CompanyTotal + $subtotalRow; } } //If the user is Not log in if ($userGroupId == 0 || $userGroupId == 8) { $subtotalRowTOTAL = $PersonTotal; $subtotalRowTOTAL = $subtotalRowTOTAL / 1.18; } elseif ($userGroupId == 8) { $subtotalRowTOTAL = $CompanyTotal; $subtotalRowTOTAL = $subtotalRowTOTAL / 1.18; } else { $subtotalRowTOTAL = 0; } ////////////////////////////////////////////////////////////////////////////////////////////////////// $baseSubtotalRow = floatval($subtotalRowTOTAL); $baseSubtotal = floatval($address->getBaseSubtotalWithDiscount()); $baseShipping = floatval($address->getBaseShippingAmount()); // - $address->getBaseShippingTaxAmount() $baseTax = floatval($address->getBaseTaxAmount()); //amount $address->setMultifeesAmount(0); $address->setBaseMultifeesAmount(0); $address->setDetailsMultifees(null); $quote = $address->getQuote(); $feeMessages = new Varien_Data_Collection(); // add payment fee (front and admin) if (Mage::app()->getRequest()->getPost('is_payment_fee', false)) { $feesPost = Mage::app()->getRequest()->getPost('fee', array()); foreach ($feesPost as $feeId => $data) { if (isset($data['message'])) { $obj = new Varien_Object(); $obj->setFeeId($feeId); $obj->setMessage($data['message']); $feeMessages->addItem($obj); } } $helper->addFeesToCart($feesPost, $quote->getStoreId(), false, 2, 0); } // add shipping fee (front and admin) if (Mage::app()->getRequest()->getPost('is_shipping_fee', false)) { $feesPost = Mage::app()->getRequest()->getPost('fee', array()); foreach ($feesPost as $feeId => $data) { if (isset($data['message'])) { $obj = new Varien_Object(); $obj->setFeeId($feeId); $obj->setMessage($data['message']); $feeMessages->addItem($obj); } } $helper->addFeesToCart($feesPost, $quote->getStoreId(), false, 3, 0); } $feesData = $helper->getQuoteDetailsMultifees($address->getId()); // autoadd default cart fees, no hidden if (is_null($feesData) && $helper->isEnableCartFees()) { $this->autoAddFeesByParams(1, 0, 2, 1, '', $quote, $address, $helper, null); } // autoadd hidden cart fees if ($helper->isEnableCartFees()) { $this->autoAddFeesByParams(1, 0, 1, 1, '', $quote, $address, $helper, null); } // autoadd hidden shipping fees if ($helper->isEnableShippingFees() && $address->getShippingMethod()) { $this->autoAddFeesByParams(3, 0, 1, 1, strval($address->getShippingMethod()), $quote, $address, $helper, $feeMessages); } // autoadd hidden fees if ($helper->isEnablePaymentFees() && $quote->getPayment()->getMethod()) { // autoadd default payment fees, no hidden if (is_null($feesData) && Mage::app()->getRequest()->getControllerName() == 'express') { $this->autoAddFeesByParams(2, 0, 3, 1, $quote->getPayment()->getMethod(), $quote, $address, $helper, null); } // autoadd hidden payment fees $this->autoAddFeesByParams(2, 0, 1, 1, $quote->getPayment()->getMethod(), $quote, $address, $helper, $feeMessages); } $feesData = $helper->getQuoteDetailsMultifees($address->getId()); if (!is_array($feesData) || count($feesData) == 0) { return $this; } // check conditions added fees // get all possible fees $possibleFeesCollection = $helper->getMultifees(0, 0, 0, 0, '', $quote, $address); $possibleFees = array(); foreach ($possibleFeesCollection as $fee) { $possibleFees[$fee->getId()] = $fee; } $store = $quote->getStore(); $baseMultifeesAmount = 0; $baseMultifeesTaxAmount = 0; foreach ($feesData as $feeId => $data) { if (!isset($data['options']) || !isset($possibleFees[$feeId])) { unset($feesData[$feeId]); continue; } $baseMultifeesLeft = 0; $appliedTotals = $data['applied_totals']; foreach ($appliedTotals as $field) { switch ($field) { case 'subtotal': $baseMultifeesLeft += $baseSubtotal; break; case 'shipping': $baseMultifeesLeft += $baseShipping; break; case 'tax': $baseMultifeesLeft += $baseTax; break; case 'rowsubtotal': $baseMultifeesLeft += $baseSubtotalRow; break; } } $taxClassId = $data['tax_class_id']; // Caluclation the subtotal/discount with/without tax $baseSubtotal = floatval($address->getBaseSubtotal()); $discountAmount = $address->getBaseDiscountAmount(); if (Mage::helper('tax')->discountTax()) { // check discount with tax $discountAmount = floatval($helper->getPriceExcludeTax($discountAmount, $quote, $data['tax_class_id'])); } $baseSubtotal = floatval($baseSubtotal + $discountAmount); ///////////////////// //Custom ////////////////////// $baseSubtotalRow = floatval($baseSubtotalRow + $discountAmount); $feePrice = 0; $feeTax = 0; foreach ($data['options'] as $optionId => $value) { if (isset($value['percent'])) { $opBasePrice = $baseMultifeesLeft * $value['percent'] / 100; } else { $opBasePrice = $value['base_price'] * $possibleFees[$feeId]->getFoundQty($address->getId()); } $opPrice = $store->convertPrice($opBasePrice); if ($helper->isTaxСalculationIncludesTax()) { $opBaseTax = $opBasePrice - $helper->getPriceExcludeTax($opBasePrice, $quote, $taxClassId, $address); $opTax = $opPrice - $helper->getPriceExcludeTax($opPrice, $quote, $taxClassId, $address); } else { // add tax $opBasePrice += $opBaseTax = $helper->getTaxPrice($opBasePrice, $quote, $taxClassId, $address); $opPrice += $opTax = $helper->getTaxPrice($opPrice, $quote, $taxClassId, $address); } // round price $opBasePrice = $store->roundPrice($opBasePrice); $opPrice = $store->roundPrice($opPrice); $opBaseTax = $store->roundPrice($opBaseTax); $opTax = $store->roundPrice($opTax); //$opPrice, $opBasePrice = inclTax $feesData[$feeId]['options'][$optionId]['base_price'] = $opBasePrice; $feesData[$feeId]['options'][$optionId]['price'] = $opPrice; $feesData[$feeId]['options'][$optionId]['base_tax'] = $opBaseTax; $feesData[$feeId]['options'][$optionId]['tax'] = $opTax; $feeTax += $opBaseTax; $feePrice += $opBasePrice; } $feesData[$feeId]['base_price'] = $feePrice; $feesData[$feeId]['price'] = $store->convertPrice($feePrice); $feesData[$feeId]['base_tax'] = $feeTax; $feesData[$feeId]['tax'] = $store->convertPrice($feeTax); $baseMultifeesAmount += $feePrice; $baseMultifeesTaxAmount += $feeTax; } $multifeesAmount = $store->roundPrice($store->convertPrice($baseMultifeesAmount)); $baseMultifeesAmount = $store->roundPrice($baseMultifeesAmount); $multifeesTaxAmount = $store->roundPrice($store->convertPrice($baseMultifeesTaxAmount)); $baseMultifeesTaxAmount = $store->roundPrice($baseMultifeesTaxAmount); if ($helper->isIncludeFeeInShippingPrice()) { $address->setBaseShippingAmount($baseMultifeesAmount - $baseMultifeesTaxAmount + $address->getBaseShippingAmount()); $address->setShippingAmount($multifeesAmount - $multifeesTaxAmount + $address->getShippingAmount()); $address->setBaseShippingTaxAmount($baseMultifeesTaxAmount + $address->getBaseShippingTaxAmount()); $address->setShippingTaxAmount($multifeesTaxAmount + $address->getShippingTaxAmount()); $address->setBaseShippingInclTax($baseMultifeesAmount + $address->getBaseShippingInclTax()); $address->setShippingInclTax($multifeesAmount + $address->getShippingInclTax()); $address->setBaseGrandTotal($address->getBaseGrandTotal() + $baseMultifeesAmount - $baseMultifeesTaxAmount); $address->setGrandTotal($address->getGrandTotal() + $multifeesAmount - $multifeesTaxAmount); } else { $address->setBaseMultifeesAmount($baseMultifeesAmount); $address->setMultifeesAmount($multifeesAmount); $address->setBaseMultifeesTaxAmount($baseMultifeesTaxAmount); $address->setMultifeesTaxAmount($multifeesTaxAmount); $address->setDetailsMultifees(serialize($feesData)); $address->setBaseTotalAmount('multifees', $baseMultifeesAmount); $address->setTotalAmount('multifees', $multifeesAmount); } $address->setBaseTaxAmount($address->getBaseTaxAmount() + $baseMultifeesTaxAmount); $address->setTaxAmount($address->getTaxAmount() + $multifeesTaxAmount); // emulation $this->_saveAppliedTaxes($address, $applied, $tax, $baseTax, $rate); $appliedTaxes = $address->getAppliedTaxes(); if (is_array($appliedTaxes)) { foreach ($appliedTaxes as $row) { if (isset($appliedTaxes[$row['id']]['amount'])) { $appliedTaxes[$row['id']]['amount'] += $multifeesTaxAmount; $appliedTaxes[$row['id']]['base_amount'] += $baseMultifeesTaxAmount; break; } } $address->setAppliedTaxes($appliedTaxes); } $this->_collected = true; return $this; }
/** * Adds shipping cost to request as item * * @param Mage_Sales_Model_Quote_Address $address * @return int */ protected function _addShipping($address) { $lineNumber = count($this->_lines); $storeId = $address->getQuote()->getStore()->getId(); $taxClass = Mage::helper('tax')->getShippingTaxClass($storeId); $shippingAmount = max(0.0, (double) $address->getBaseShippingAmount()); if ($this->_getTaxDataHelper()->applyTaxAfterDiscount($storeId)) { $shippingAmount -= (double) $address->getBaseShippingDiscountAmount(); } $line = new Line(); $line->setNo($lineNumber); $shippingSku = $this->_getConfigHelper()->getShippingSku($storeId); $line->setItemCode($shippingSku ?: 'Shipping'); $line->setDescription('Shipping costs'); $line->setTaxCode($taxClass); $line->setQty(1); $line->setAmount($shippingAmount); $line->setDiscounted((double) $address->getBaseShippingDiscountAmount() && $this->_getTaxDataHelper()->applyTaxAfterDiscount($storeId)); if ($this->_getTaxDataHelper()->shippingPriceIncludesTax($storeId)) { $line->setTaxIncluded(true); } $this->_lines[$lineNumber] = $line; $this->_request->setLines($this->_lines); $this->_lineToLineId[$lineNumber] = $this->_getConfigHelper()->getShippingSku($storeId); return $lineNumber; }
/** * 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; }
/** * 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; }
public function _prepareDiscountCreditForAmount(Mage_Sales_Model_Quote_Address $address, $rate, $baseCustomercreditForShipping) { // Update discount for each item $helper = Mage::helper('customercredit'); foreach ($address->getAllItems() as $item) { if ($item->getParentItemId()) { continue; } if ($item->getHasChildren() && $item->isChildrenCalculated()) { foreach ($item->getChildren() as $child) { if (!$child->isDeleted() && $child->getProduct()->getTypeId() != 'customercredit') { $baseItemPrice = $child->getBaseRowTotal() + $child->getBaseTaxAmount() - $child->getBaseDiscountAmount() - $child->getMagestoreBaseDiscount(); $itemBaseDiscount = $baseItemPrice * $rate; $itemDiscount = Mage::app()->getStore()->convertPrice($itemBaseDiscount); $child->setMagestoreBaseDiscount($child->getMagestoreBaseDiscount() + $itemBaseDiscount); $child->setBaseCustomercreditDiscount($itemBaseDiscount)->setCustomercreditDiscount($itemDiscount); } } } else { if ($item->getProduct()) { if (!$item->isDeleted() && $item->getProduct()->getTypeId() != 'customercredit') { $baseItemPrice = $item->getBaseRowTotal() + $item->getBaseTaxAmount() - $item->getBaseDiscountAmount() - $item->getMagestoreBaseDiscount(); $itemBaseDiscount = $baseItemPrice * $rate; $itemDiscount = Mage::app()->getStore()->convertPrice($itemBaseDiscount); $item->setMagestoreBaseDiscount($item->getMagestoreBaseDiscount() + $itemBaseDiscount); $item->setBaseCustomercreditDiscount($itemBaseDiscount)->setCustomercreditDiscount($itemDiscount); } } } } if ($helper->getSpendConfig('shipping') && $baseCustomercreditForShipping) { $baseShippingPrice = $address->getBaseShippingAmount() + $address->getBaseShippingTaxAmount() - $address->getBaseShippingDiscountAmount() - $address->getMagestoreBaseDiscountForShipping(); $baseShippingDiscount = min($baseShippingPrice, $baseCustomercreditForShipping); $shippingDiscount = Mage::app()->getStore()->convertPrice($baseShippingDiscount); $address->setMagestoreBaseDiscountForShipping($address->getMagestoreBaseDiscountForShipping() + $baseShippingDiscount); $address->setBaseCustomercreditDiscountForShipping($baseShippingDiscount); $address->setCustomercreditDiscountForShipping($shippingDiscount); } return $this; }
/** * * @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)); }