Пример #1
0
 /**
  * @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);
 }
Пример #2
0
 /**
  * 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;
 }
Пример #3
0
 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);
     }
 }
Пример #4
0
 /**
  * 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);
     }
 }
Пример #5
0
 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;
 }
Пример #6
0
 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;
 }
Пример #8
0
 /**
  * @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;
 }
Пример #9
0
 /**
  * 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;
 }
Пример #11
0
 /**
  * @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;
 }
Пример #12
0
 /**
  * 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;
 }
Пример #13
0
 /**
  * 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;
 }
Пример #14
0
 /**
  * @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;
 }
Пример #15
0
 /**
  * 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;
 }
Пример #16
0
 /**
  * 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;
 }
Пример #17
0
 /**
  * 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;
 }
Пример #18
0
 /**
  * @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;
 }
Пример #19
0
 /**
  * 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;
 }
Пример #20
0
 /**
  * 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;
 }
Пример #21
0
 /**
  * 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;
 }
Пример #22
0
 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;
 }
Пример #23
-1
 /**
  * 
  * @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));
 }