Magento create Creditmemo to refund online or offline
<?php $orderId ='123456789'; $invoiceId = '1234'; $data = array( 'items' => array( '12345' => array('qty' => '1'), '12346' => array('qty' => '2') ), 'comment_text' => null, 'do_offline' => 1, 'shipping_amount' => 0, 'adjustment_positive' => '0', 'adjustment_negative' => '0', 'refund_customerbalance_return_enable' => 1, 'refund_customerbalance_return' => 39.9 ); // load order and invoice $order = Mage::getModel('sales/order')->load($orderId); $invoice = Mage::getModel('sales/order_invoice') ->load($invoiceId) ->setOrder($order); // if can credit memo if (!$order->getId() && !$order->canCreditmemo()) { Mage::throwException( $this->__('Cannot create credit memo for the order.') ); } // Initialize items $savedData = $data['items']; $qtys = array(); $backToStock = array(); foreach ($savedData as $orderItemId =>$itemData) { if (isset($itemData['qty'])) { $qtys[$orderItemId] = $itemData['qty']; } if (isset($itemData['back_to_stock'])) { $backToStock[$orderItemId] = true; } } $data['qtys'] = $qtys; // Create credit memo if invoice then prepareInvoiceCreditmemo(), otherwise prepareCreditmemo() $service = Mage::getModel('sales/service_order', $order); if ($invoice) { $creditmemo = $service->prepareInvoiceCreditmemo($invoice, $data); } else { $creditmemo = $service->prepareCreditmemo($data); } /** * Process back to stock flags */ foreach ($creditmemo->getAllItems() as $creditmemoItem) { $orderItem = $creditmemoItem->getOrderItem(); $parentId = $orderItem->getParentItemId(); if (isset($backToStock[$orderItem->getId()])) { $creditmemoItem->setBackToStock(true); } elseif ($orderItem->getParentItem() && isset($backToStock[$parentId]) && $backToStock[$parentId]) { $creditmemoItem->setBackToStock(true); } elseif (empty($savedData)) { $creditmemoItem->setBackToStock(Mage::helper('cataloginventory')->isAutoReturnEnabled()); } else { $creditmemoItem->setBackToStock(false); } } // A workaround regarding refund to customer balance $param = Mage::app()->getRequest()->getParams(); $param['creditmemo']['refund_customerbalance_return_enable'] = true; $param['creditmemo']['refund_customerbalance_return'] = $order->getData('base_total_paid'); Mage::app()->getRequest()->setParams($param); $args = array('creditmemo' => $creditmemo, 'request' => Mage::app()->getRequest()); Mage::dispatchEvent('adminhtml_sales_order_creditmemo_register_before', $args); if ($creditmemo) { if (($creditmemo->getGrandTotal() <= 0) && (!$creditmemo->getAllowZeroGrandTotal())) { Mage::throwException( $this->__('Credit memo\'s total must be positive.') ); } // Comment text if exist $creditmemo->addComment('our comment',false,false); // Flag for online refund if (isset($data['do_refund'])) { $creditmemo->setRefundRequested(true); } // Flag for offline refund if (isset($data['do_offline'])) { $creditmemo->setOfflineRequested((bool)(int)$data['do_offline']); } // saving creditmemo $creditmemo->register(); // Database update $transactionSave = Mage::getModel('core/resource_transaction') ->addObject($creditmemo) ->addObject($creditmemo->getOrder()); if ($creditmemo->getInvoice()) { $transactionSave->addObject($creditmemo->getInvoice()); } $transactionSave->save(); } |