/** * Sets all variations of price on final totals for use with standard items. Not the parent bundle/configurable. * * @param Mage_Sales_Model_Quote_Item $item * @param Webshopapps_Wsacommon_Model_Totals $finalTotals */ protected function setStandardPrices($item, &$finalTotals) { $finalTotals->setBasePrice($finalTotals->getBasePrice() + $item->getBaseRowTotal()); $finalTotals->setPrice($finalTotals->getPrice() + $item->getRowTotal()); $finalTotals->setPriceInclTax($finalTotals->getPriceInclTax() + $item->getRowTotalInclTax()); $finalTotals->setBasePriceInclTax($finalTotals->getBasePriceInclTax() + $item->getBaseRowTotalInclTax()); $finalTotals->setDiscountedPrice($finalTotals->getDiscountedPrice() + ($item->getRowTotal() - $item->getDiscountAmount())); $finalTotals->setBaseDiscountedPrice($finalTotals->getBaseDiscountedPrice() + ($item->getBaseRowTotal() - $item->getBaseDiscountAmount())); $finalTotals->setDiscountedPriceInclTax($finalTotals->getDiscountedPriceInclTax() + ($item->getRowTotalInclTax() - $item->getDiscountAmount())); $finalTotals->setBaseDiscountedPriceInclTax($finalTotals->getBaseDiscountedPriceInclTax() + ($item->getBaseRowTotalInclTax() - $item->getBaseDiscountAmount())); }
/** * When the previously applied discount amount on the item row total * is less than the current applied discount recalculate the current discount * to account for previously applied discount. Otherwise, don't recalculate * the current discount. * * @param Mage_Sales_Model_Quote_Item * @param Varien_Object * @param array * @return float */ protected function calculateDiscountAmount(Mage_Sales_Model_Quote_Item $item, Varien_Object $result, array $data) { /** @var float */ $itemRowTotal = $item->getBaseRowTotal(); /** @var float */ $currentDiscountAmount = $result->getBaseDiscountAmount(); /** @var float */ $previousAppliedDiscountAmount = 0.0; foreach ($data as $discount) { $previousAppliedDiscountAmount += $discount['amount']; } /** @var float */ $itemRowTotalWithAppliedPreviousDiscount = $itemRowTotal - $previousAppliedDiscountAmount; if ($itemRowTotalWithAppliedPreviousDiscount < 0) { $itemRowTotalWithAppliedPreviousDiscount = 0; } return $itemRowTotalWithAppliedPreviousDiscount < $currentDiscountAmount ? $itemRowTotalWithAppliedPreviousDiscount : $currentDiscountAmount; }
/** * Add row total item amount to subtotal * * @param Mage_Sales_Model_Quote_Address $address * @param Mage_Sales_Model_Quote_Item $item * @return $this */ protected function _addSubtotalAmount(Mage_Sales_Model_Quote_Address $address, $item) { if ($this->_getTaxDataHelper()->priceIncludesTax($item->getStoreId())) { $subTotal = $item->getRowTotalInclTax() - $item->getRowTax(); $baseSubTotal = $item->getBaseRowTotalInclTax() - $item->getBaseRowTax(); $address->setTotalAmount('subtotal', $address->getTotalAmount('subtotal') + $subTotal); $address->setBaseTotalAmount('subtotal', $address->getBaseTotalAmount('subtotal') + $baseSubTotal); } else { $address->setTotalAmount('subtotal', $address->getTotalAmount('subtotal') + $item->getRowTotal()); $address->setBaseTotalAmount('subtotal', $address->getBaseTotalAmount('subtotal') + $item->getBaseRowTotal()); } $address->setSubtotalInclTax($address->getSubtotalInclTax() + $item->getRowTotalInclTax()); $address->setBaseSubtotalInclTax($address->getBaseSubtotalInclTax() + $item->getBaseRowTotalInclTax()); return $this; }
/** * Returns a total discount on the cart from the provided items * * @param Mage_Sales_Model_Quote_Item $item * @param Mage_Sales_Model_Quote_Address $address * @param TBT_Rewards_Model_Sales_Rule $rule * @param array() &$cartRules * @param int $qty max discount qty or unlimited if null * @return array($discountAmount, $baseDiscountAmount) */ protected function _getTotalPercentDiscountOnitem($item, $address, $rule, &$cartRules, $qty = null) { $quote = $item->getQuote(); $store = $item->getQuote()->getStore(); $qty = empty($qty) ? $item->getQty() : (int) $qty; $quoteAmount = $quote->getStore()->convertPrice($cartRules[$rule->getId()]); $quoteAmountBase = $cartRules[$rule->getId()]; if (Mage::helper('tax')->discountTax($store) && !Mage::helper('tax')->applyTaxAfterDiscount($store)) { $tax_amount = $item->getTaxAmount() / $item->getQty() * $qty; $base_tax_amount = $item->getBaseTaxAmount() / $item->getQty() * $qty; $quoteAmount += $tax_amount; // $cartItem->getTaxAmount(); $quoteAmountBase += $base_tax_amount; // $cartItem->getTaxAmount(); } else { $tax_amount = $base_tax_amount = 0; } $shipping_amount = $address->getShippingAmount(); $base_shipping_amount = $address->getBaseShippingAmount(); $add_shipping = $rule->getApplyToShipping() ? $shipping_amount : 0; $add_base_shipping = $rule->getApplyToShipping() ? $base_shipping_amount : 0; $discountAmount = min($item->getRowTotal() / $item->getQty() * $qty - $item->getDiscountAmount() + $add_shipping + $tax_amount, $quoteAmount); $baseDiscountAmount = min($item->getBaseRowTotal() / $item->getQty() * $qty - $item->getBaseDiscountAmount() + $add_base_shipping + $base_tax_amount, $quoteAmountBase); return array($discountAmount, $baseDiscountAmount); }
/** * Calculates tax amounts for the row item using $this->_calculator * * @param Mage_Sales_Model_Quote_Item $item * @return $this */ protected function _calcTaxAmounts(&$item) { //@nelkaake -a 16/11/10: Calculator only works in magento 1.4 and up. if (!Mage::helper('rewards/version')->isMageVersionAtLeast('1.4.2')) { return $this; } // @nelkaake -a 16/11/10: Tax calculation methods $tax = $this->_calculator->calcTaxAmount($item->getRowTotal(), $item->getTaxPercent(), false); $baseTax = $this->_calculator->calcTaxAmount($item->getBaseRowTotal(), $item->getTaxPercent(), false); $item->setTaxAmount($tax); $item->setBaseTaxAmount($baseTax); $item->setTaxableAmount($item->getRowTotal()); $item->setBaseTaxableAmount($item->getBaseRowTotal()); //@nelkaake -a 26/01/11: We don't set this so that we can later use the row total including tax to find out // how much of the order was discounted due to catalog redemption rules. $item->setRowTotalInclTax($item->getRowTotal() + $tax); $item->setBaseRowTotalInclTax($item->getBaseRowTotal() + $baseTax); return $this; }