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) { $order = $creditmemo->getOrder(); $paymentMethod = $order->getPayment()->getMethod(); if ($this->getHelper()->isBillpayPayment($paymentMethod)) { $action = Mage::app()->getRequest()->getActionName(); switch ($action) { case 'updateQty': case 'new': $gross = $order->getBillpayChargedFee(); $net = $order->getBillpayChargedFeeNet(); $baseGross = $order->getBaseBillpayChargedFee(); $baseNet = $order->getBaseBillpayChargedFeeNet(); $refundable = $order->getBillpayChargedFee() - $order->getBillpayChargedFeeRefunded(); $baseRefundable = $order->getBaseBillpayChargedFee() - $order->getBaseBillpayChargedFeeRefunded(); $refundableTax = $refundable - ($order->getBillpayChargedFeeNet() - $order->getBillpayChargedFeeRefundedNet()); $baseRefundableTax = $baseRefundable - ($order->getBaseBillpayChargedFeeNet() - $order->getBaseBillpayChargedFeeRefundedNet()); // increase tax amount $creditmemo->setTaxAmount($creditmemo->getTaxAmount() + $refundableTax); $creditmemo->setBaseTaxAmount($creditmemo->getBaseTaxAmount() + $baseRefundableTax); // increase grand total $creditmemo->setGrandTotal($creditmemo->getGrandTotal() + $refundable); $creditmemo->setBaseGrandTotal($creditmemo->getBaseGrandTotal() + $baseRefundable); // We have to set the value for subtotal incl. tax here when a fee tax is present // Otherwise the value will be calculated wrongly in Mage_Tax_Block_Sales_Order_Tax::_initSubtotal if (!$creditmemo->getSubtotalInclTax() && $refundableTax > 0) { $subtotalInclTax = $creditmemo->getSubtotal() + $creditmemo->getTaxAmount() - $creditmemo->getShippingTaxAmount() - $refundableTax; $creditmemo->setSubtotalInclTax($subtotalInclTax); } break; case 'save': $data = Mage::app()->getRequest()->getPost('creditmemo'); if (isset($data)) { if (array_key_exists('billpay_charged_fee_refund', $data)) { $storeId = $creditmemo->getOrder()->getStore()->getStoreId(); $baseChargedFeeRefunded = Mage::app()->getStore()->roundPrice($data['billpay_charged_fee_refund']); if ($baseChargedFeeRefunded < 0) { Mage::throwException('Refunded billpay fee must not be smaller than zero'); } $baseOrderGross = $order->getBaseBillpayChargedFee(); $baseOrderNet = $order->getBaseBillpayChargedFeeNet(); $orderGross = $order->getBillpayChargedFee(); $orderNet = $order->getBillpayChargedFeeNet(); $baseAllowedRefund = $baseOrderGross - $order->getBaseBillpayChargedFeeRefunded(); if ((string) (double) $baseChargedFeeRefunded > (string) (double) $baseAllowedRefund) { $baseAllowedRefund = $order->formatBasePrice($baseAllowedRefund); Mage::throwException("Maximum billpay fee amount to refund is: {$baseAllowedRefund}"); } if ($baseOrderGross > 0 && $baseOrderNet > 0) { if ($this->getHelper()->getConfigData('fee/display_incl_tax_admin', $storeId)) { $part = $baseChargedFeeRefunded / $baseOrderGross; $baseChargedFeeRefundedNet = Mage::app()->getStore()->roundPrice($baseOrderNet * $part); } else { $part = $baseChargedFeeRefunded / $baseOrderNet; $baseChargedFeeRefundedNet = $baseChargedFeeRefunded; $baseChargedFeeRefunded = Mage::app()->getStore()->roundPrice($baseOrderGross * $part); } $chargedFeeRefunded = Mage::app()->getStore()->roundPrice($orderGross * $part); $chargedFeeRefundedNet = Mage::app()->getStore()->roundPrice($orderNet * $part); $allowedRefund = $orderGross - $order->getBillpayChargedFeeRefunded(); $allowedRefundNet = $orderNet - $order->getBillpayChargedFeeRefundedNet(); if ($chargedFeeRefunded > $allowedRefund) { $chargedFeeRefunded = $allowedRefund; } if ($chargedFeeRefundedNet > $allowedRefundNet) { $chargedFeeRefundedNet = $allowedRefundNet; } $order->setBaseBillpayChargedFeeRefunded($order->getBaseBillpayChargedFeeRefunded() + $baseChargedFeeRefunded); $order->setBaseBillpayChargedFeeRefundedNet($order->getBaseBillpayChargedFeeRefundedNet() + $baseChargedFeeRefundedNet); $order->setBillpayChargedFeeRefunded($order->getBillpayChargedFeeRefunded() + $chargedFeeRefunded); $order->setBillpayChargedFeeRefundedNet($order->getBillpayChargedFeeRefundedNet() + $chargedFeeRefundedNet); $creditmemo->setBillpayChargedFeeRefunded($chargedFeeRefunded); $creditmemo->setBillpayChargedFeeRefundedNet($chargedFeeRefundedNet); $creditmemo->setBaseBillpayChargedFeeRefunded($baseChargedFeeRefunded); $creditmemo->setBaseBillpayChargedFeeRefundedNet($baseChargedFeeRefundedNet); $creditmemo->setBaseGrandTotal($creditmemo->getBaseGrandTotal() + $baseChargedFeeRefunded); $creditmemo->setGrandTotal($creditmemo->getGrandTotal() + $chargedFeeRefunded); $creditmemo->setTaxAmount($creditmemo->getTaxAmount() + ($chargedFeeRefunded - $chargedFeeRefundedNet)); $creditmemo->setBaseTaxAmount($creditmemo->getBaseTaxAmount() + ($baseChargedFeeRefunded - $baseChargedFeeRefundedNet)); } } } break; } } return $this; }