public function collect(Mage_Sales_Model_Order_Creditmemo $creditmemo) { $store = $creditmemo->getStore(); $totalTax = 0; $baseTotalTax = 0; $weeeTaxAmount = 0; $baseWeeeTaxAmount = 0; foreach ($creditmemo->getAllItems() as $item) { $orderItem = $item->getOrderItem(); if ($orderItem->isDummy()) { continue; } $orderItemQty = $orderItem->getQtyOrdered(); $weeeRowDiscountAmount = $orderItem->getDiscountAppliedForWeeeTax(); $weeeDiscountAmount = $creditmemo->roundPrice($weeeRowDiscountAmount / $orderItemQty * $item->getQty(), 'regular', true); $baseWeeeRowDiscountAmount = $orderItem->getBaseDiscountAppliedForWeeeTax(); $baseWeeeDiscountAmount = $creditmemo->roundPrice($baseWeeeRowDiscountAmount / $orderItemQty * $item->getQty(), 'base', true); $weeeAmountExclTax = (Mage::helper('weee')->getWeeeTaxInclTax($item) - Mage::helper('weee')->getTotalTaxAppliedForWeeeTax($item)) * $item->getQty(); $totalTax += $weeeAmountExclTax - $weeeDiscountAmount; $baseWeeeAmountExclTax = (Mage::helper('weee')->getBaseWeeeTaxInclTax($item) - Mage::helper('weee')->getBaseTotalTaxAppliedForWeeeTax($item)) * $item->getQty(); $baseTotalTax += $baseWeeeAmountExclTax - $baseWeeeDiscountAmount; $item->setWeeeTaxAppliedRowAmount($weeeAmountExclTax); $item->setBaseWeeeTaxAppliedRowAmount($baseWeeeAmountExclTax); $weeeTaxAmount += Mage::helper('weee')->getWeeeTaxInclTax($item) * $item->getQty(); $baseWeeeTaxAmount += Mage::helper('weee')->getBaseWeeeTaxInclTax($item) * $item->getQty(); $newApplied = array(); $applied = Mage::helper('weee')->getApplied($item); foreach ($applied as $one) { $one['base_row_amount'] = $one['base_amount'] * $item->getQty(); $one['row_amount'] = $one['amount'] * $item->getQty(); $one['base_row_amount_incl_tax'] = $one['base_amount_incl_tax'] * $item->getQty(); $one['row_amount_incl_tax'] = $one['amount_incl_tax'] * $item->getQty(); $one['weee_discount'] = $weeeDiscountAmount; $one['base_weee_discount'] = $baseWeeeDiscountAmount; $newApplied[] = $one; } Mage::helper('weee')->setApplied($item, $newApplied); $item->setWeeeTaxRowDisposition($item->getWeeeTaxDisposition() * $item->getQty()); $item->setBaseWeeeTaxRowDisposition($item->getBaseWeeeTaxDisposition() * $item->getQty()); } /* * please refer the description in weee - invoice section for reasoning */ if (Mage::helper('weee')->includeInSubtotal($store)) { $creditmemo->setSubtotal($creditmemo->getSubtotal() + $totalTax); $creditmemo->setBaseSubtotal($creditmemo->getBaseSubtotal() + $baseTotalTax); } else { $creditmemo->setTaxAmount($creditmemo->getTaxAmount() + $totalTax); $creditmemo->setBaseTaxAmount($creditmemo->getBaseTaxAmount() + $baseTotalTax); } //Increment the subtotal $creditmemo->setSubtotalInclTax($creditmemo->getSubtotalInclTax() + $weeeTaxAmount); $creditmemo->setBaseSubtotalInclTax($creditmemo->getBaseSubtotalInclTax() + $baseWeeeTaxAmount); //Increment the grand total $creditmemo->setGrandTotal($creditmemo->getGrandTotal() + $totalTax); $creditmemo->setBaseGrandTotal($creditmemo->getBaseGrandTotal() + $baseTotalTax); return $this; }
public function collect(Mage_Sales_Model_Order_Creditmemo $creditmemo) { $creditmemo->setDiscountAmount(0); $creditmemo->setBaseDiscountAmount(0); $order = $creditmemo->getOrder(); $totalDiscountAmount = 0; $baseTotalDiscountAmount = 0; /** * Calculate how much shipping discount should be applied * basing on how much shipping should be refunded. */ $baseShippingAmount = $creditmemo->getBaseShippingAmount(); if ($baseShippingAmount) { $baseShippingDiscount = $baseShippingAmount * $order->getBaseShippingDiscountAmount() / $order->getBaseShippingAmount(); $shippingDiscount = $order->getShippingAmount() * $baseShippingDiscount / $order->getBaseShippingAmount(); $totalDiscountAmount = $totalDiscountAmount + $shippingDiscount; $baseTotalDiscountAmount = $baseTotalDiscountAmount + $baseShippingDiscount; } /** @var $item Mage_Sales_Model_Order_Invoice_Item */ foreach ($creditmemo->getAllItems() as $item) { $orderItem = $item->getOrderItem(); if ($orderItem->isDummy()) { continue; } $orderItemDiscount = (double) $orderItem->getDiscountInvoiced(); $baseOrderItemDiscount = (double) $orderItem->getBaseDiscountInvoiced(); $orderItemQty = $orderItem->getQtyInvoiced(); if ($orderItemDiscount && $orderItemQty) { $discount = $orderItemDiscount - $orderItem->getDiscountRefunded(); $baseDiscount = $baseOrderItemDiscount - $orderItem->getBaseDiscountRefunded(); if (!$item->isLast()) { $availableQty = $orderItemQty - $orderItem->getQtyRefunded(); $discount = $creditmemo->roundPrice($discount / $availableQty * $item->getQty(), 'regular', true); $baseDiscount = $creditmemo->roundPrice($baseDiscount / $availableQty * $item->getQty(), 'base', true); } $totalDiscountAmount += $discount; $baseTotalDiscountAmount += $baseDiscount; $item->setDiscountAmount($discount); $item->setBaseDiscountAmount($baseDiscount); } } $creditmemo->setDiscountAmount(-$totalDiscountAmount); $creditmemo->setBaseDiscountAmount(-$baseTotalDiscountAmount); $creditmemo->setGrandTotal($creditmemo->getGrandTotal() - $totalDiscountAmount); $creditmemo->setBaseGrandTotal($creditmemo->getBaseGrandTotal() - $baseTotalDiscountAmount); return $this; }
/** * Collects the total tax for the credit memo * * @param Mage_Sales_Model_Order_Creditmemo $creditmemo * @return Mage_Sales_Model_Order_Creditmemo_Total_Tax */ public function collect(Mage_Sales_Model_Order_Creditmemo $creditmemo) { $shippingTaxAmount = 0; $baseShippingTaxAmount = 0; $totalTax = 0; $baseTotalTax = 0; $totalHiddenTax = 0; $baseTotalHiddenTax = 0; $weeeTaxAmount = 0; $baseWeeeTaxAmount = 0; $order = $creditmemo->getOrder(); /** @var $item Mage_Sales_Model_Order_Creditmemo_Item */ foreach ($creditmemo->getAllItems() as $item) { $orderItem = $item->getOrderItem(); if ($orderItem->isDummy()) { continue; } $orderItemTax = $orderItem->getTaxInvoiced(); $baseOrderItemTax = $orderItem->getBaseTaxInvoiced(); $orderItemHiddenTax = $orderItem->getHiddenTaxInvoiced(); $baseOrderItemHiddenTax = $orderItem->getBaseHiddenTaxInvoiced(); $orderItemQty = $orderItem->getQtyInvoiced(); if (($orderItemTax || $orderItemHiddenTax) && $orderItemQty) { /** * Check item tax amount */ $tax = $orderItemTax - $orderItem->getTaxRefunded(); $baseTax = $baseOrderItemTax - $orderItem->getTaxRefunded(); $hiddenTax = $orderItemHiddenTax - $orderItem->getHiddenTaxRefunded(); $baseHiddenTax = $baseOrderItemHiddenTax - $orderItem->getBaseHiddenTaxRefunded(); if (!$item->isLast()) { $availableQty = $orderItemQty - $orderItem->getQtyRefunded(); $tax = $creditmemo->roundPrice($tax / $availableQty * $item->getQty()); $baseTax = $creditmemo->roundPrice($baseTax / $availableQty * $item->getQty(), 'base'); $hiddenTax = $creditmemo->roundPrice($hiddenTax / $availableQty * $item->getQty()); $baseHiddenTax = $creditmemo->roundPrice($baseHiddenTax / $availableQty * $item->getQty(), 'base'); } $item->setTaxAmount($tax); $item->setBaseTaxAmount($baseTax); $item->setHiddenTaxAmount($hiddenTax); $item->setBaseHiddenTaxAmount($baseHiddenTax); $totalTax += $tax; $baseTotalTax += $baseTax; $totalHiddenTax += $hiddenTax; $baseTotalHiddenTax += $baseHiddenTax; } } $invoice = $creditmemo->getInvoice(); if ($invoice) { //recalculate tax amounts in case if refund shipping value was changed if ($order->getBaseShippingAmount() && $creditmemo->getBaseShippingAmount()) { $taxFactor = $creditmemo->getBaseShippingAmount() / $order->getBaseShippingAmount(); $shippingTaxAmount = $invoice->getShippingTaxAmount() * $taxFactor; $baseShippingTaxAmount = $invoice->getBaseShippingTaxAmount() * $taxFactor; $totalHiddenTax += $invoice->getShippingHiddenTaxAmount() * $taxFactor; $baseTotalHiddenTax += $invoice->getBaseShippingHiddenTaxAmount() * $taxFactor; $shippingHiddenTaxAmount = $invoice->getShippingHiddenTaxAmount() * $taxFactor; $baseShippingHiddenTaxAmount = $invoice->getBaseShippingHiddenTaxAmount() * $taxFactor; $shippingTaxAmount = $creditmemo->roundPrice($shippingTaxAmount); $baseShippingTaxAmount = $creditmemo->roundPrice($baseShippingTaxAmount, 'base'); $totalHiddenTax = $creditmemo->roundPrice($totalHiddenTax); $baseTotalHiddenTax = $creditmemo->roundPrice($baseTotalHiddenTax, 'base'); $shippingHiddenTaxAmount = $creditmemo->roundPrice($shippingHiddenTaxAmount); $baseShippingHiddenTaxAmount = $creditmemo->roundPrice($baseShippingHiddenTaxAmount, 'base'); $totalTax += $shippingTaxAmount; $baseTotalTax += $baseShippingTaxAmount; } } else { $orderShippingAmount = $order->getShippingAmount(); $baseOrderShippingAmount = $order->getBaseShippingAmount(); $orderShippingHiddenTaxAmount = $order->getShippingHiddenTaxAmount(); $baseOrderShippingHiddenTaxAmount = $order->getBaseShippingHiddenTaxAmount(); $baseOrderShippingRefundedAmount = $order->getBaseShippingRefunded(); $baseOrderShippingHiddenTaxRefunded = $order->getBaseShippingHiddenTaxRefunded(); $shippingTaxAmount = 0; $baseShippingTaxAmount = 0; $shippingHiddenTaxAmount = 0; $baseShippingHiddenTaxAmount = 0; $shippingDelta = $baseOrderShippingAmount - $baseOrderShippingRefundedAmount; if ($shippingDelta > $creditmemo->getBaseShippingAmount()) { $part = $creditmemo->getShippingAmount() / $orderShippingAmount; $basePart = $creditmemo->getBaseShippingAmount() / $baseOrderShippingAmount; $shippingTaxAmount = $order->getShippingTaxAmount() * $part; $baseShippingTaxAmount = $order->getBaseShippingTaxAmount() * $basePart; $shippingHiddenTaxAmount = $order->getShippingHiddenTaxAmount() * $part; $baseShippingHiddenTaxAmount = $order->getBaseShippingHiddenTaxAmount() * $basePart; $shippingTaxAmount = $creditmemo->roundPrice($shippingTaxAmount); $baseShippingTaxAmount = $creditmemo->roundPrice($baseShippingTaxAmount, 'base'); $shippingHiddenTaxAmount = $creditmemo->roundPrice($shippingHiddenTaxAmount); $baseShippingHiddenTaxAmount = $creditmemo->roundPrice($baseShippingHiddenTaxAmount, 'base'); } elseif ($shippingDelta == $creditmemo->getBaseShippingAmount()) { $shippingTaxAmount = $order->getShippingTaxAmount() - $order->getShippingTaxRefunded(); $baseShippingTaxAmount = $order->getBaseShippingTaxAmount() - $order->getBaseShippingTaxRefunded(); $shippingHiddenTaxAmount = $order->getShippingHiddenTaxAmount() - $order->getShippingHiddenTaxRefunded(); $baseShippingHiddenTaxAmount = $order->getBaseShippingHiddenTaxAmount() - $order->getBaseShippingHiddenTaxRefunded(); } $totalTax += $shippingTaxAmount; $baseTotalTax += $baseShippingTaxAmount; $totalHiddenTax += $shippingHiddenTaxAmount; $baseTotalHiddenTax += $baseShippingHiddenTaxAmount; } $allowedTax = $order->getTaxInvoiced() - $order->getTaxRefunded() - $creditmemo->getTaxAmount(); $allowedBaseTax = $order->getBaseTaxInvoiced() - $order->getBaseTaxRefunded() - $creditmemo->getBaseTaxAmount(); $allowedHiddenTax = $order->getHiddenTaxInvoiced() + $order->getShippingHiddenTaxAmount() - $order->getHiddenTaxRefunded() - $order->getShippingHiddenTaxRefunded(); $allowedBaseHiddenTax = $order->getBaseHiddenTaxInvoiced() + $order->getBaseShippingHiddenTaxAmount() - $order->getBaseHiddenTaxRefunded() - $order->getBaseShippingHiddenTaxRefunded(); $totalTax = min($allowedTax, $totalTax); $baseTotalTax = min($allowedBaseTax, $baseTotalTax); $totalHiddenTax = min($allowedHiddenTax, $totalHiddenTax); $baseTotalHiddenTax = min($allowedBaseHiddenTax, $baseTotalHiddenTax); $creditmemo->setTaxAmount($creditmemo->getTaxAmount() + $totalTax); $creditmemo->setBaseTaxAmount($creditmemo->getBaseTaxAmount() + $baseTotalTax); $creditmemo->setHiddenTaxAmount($totalHiddenTax); $creditmemo->setBaseHiddenTaxAmount($baseTotalHiddenTax); $creditmemo->setShippingTaxAmount($shippingTaxAmount); $creditmemo->setBaseShippingTaxAmount($baseShippingTaxAmount); $creditmemo->setGrandTotal($creditmemo->getGrandTotal() + $totalTax + $totalHiddenTax); $creditmemo->setBaseGrandTotal($creditmemo->getBaseGrandTotal() + $baseTotalTax + $baseTotalHiddenTax); return $this; }