Programmatically create an online refund in Magento 1.6.0.0
-
12-12-2019 - |
Question
I'm trying to create an online refund of a certain amount (e.g. 10 EUR = is lower than refundable amount). The refund is independent of order items. I can refund online in admin panel but everytime I do it programmatically it will do an offline refund. Please help! I must have overlooked something.
# $order and $invoice are given here
$service = Mage::getModel('sales/service_order', $order);
$data = array();
$data['shipping_amount'] = 0;
$data['grand_total'] = 0;
$data['base_grand_total'] = 0;
$data['adjustment_positive'] = 10;
$data['qtys'] = array(0 => 0);
$creditmemo = $service->prepareInvoiceCreditmemo($invoice, $data);
$creditmemo->setShippingAmount(0);
$creditmemo->setGrandTotal($data['adjustment_positive']);
$creditmemo->setRefundRequested(true);
$creditmemo->setOfflineRequested(false);
$creditmemo->setPaymentRefundDisallowed(false);
if(Mage::registry('current_creditmemo')) {
Mage::unregister('current_creditmemo');
}
Mage::register('current_creditmemo', $creditmemo);
$creditmemo->refund();
# here follows the transactionSave: $this->_saveCreditmemo($creditmemo);
Solution 2
I finally got it! I just had to replace the last line $creditmemo->refund(); with:
$creditmemo->register();
OTHER TIPS
Check this
1. @param string $orderIncrementId
2.
@param array $creditmemoData array('qtys' => array('sku1' => qty1, ... , 'skuN' => qtyN),
'shipping_amount' => value, 'adjustment_positive' => value, 'adjustment_negative' => value)
3. @param string|null $comment
4. @param bool $includeComment
5. @param string $refundToStoreCreditAmount
6 @return string $creditmemoIncrementId
$orderIncrementId ='200000010';
$creditmemoData = array(
'qtys' => array(
'order_item_id' => 3,
'qty' => '1'),
'shipping_amount' => null,
'adjustment_positive' => '0',
'adjustment_negative' => null);
$comment= 'comment for credit memo';
$notifyCustomer = true;
$includeComment = false;
$refundToStoreCreditAmount= '1';
$order = Mage::getModel('sales/order')->load($orderIncrementId, 'increment_id');
if ($order->getId() && $order->canCreditmemo()) {
/** @var $service Mage_Sales_Model_Service_Order */
$service = Mage::getModel('sales/service_order', $order);
$data = isset($data) ? $data : array();
if (isset($data['qtys']) && count($data['qtys'])) {
$qtysArray = array();
foreach ($data['qtys'] as $qKey => $qVal) {
// Save backward compatibility
if (is_array($qVal)) {
if (isset($qVal['order_item_id']) && isset($qVal['qty'])) {
$qtysArray[$qVal['order_item_id']] = $qVal['qty'];
}
} else {
$qtysArray[$qKey] = $qVal;
}
}
$data['qtys'] = $qtysArray;
}
/** @var $creditmemo Mage_Sales_Model_Order_Creditmemo */
$creditmemo = $service->prepareCreditmemo($creditmemoData);
// refund to Store Credit
if ($refundToStoreCreditAmount) {
// check if refund to Store Credit is available
if ($order->getCustomerIsGuest()) {
// 'cannot_refund_to_storecredit';
}
$refundToStoreCreditAmount = max(
0,
min($creditmemo->getBaseCustomerBalanceReturnMax(), $refundToStoreCreditAmount)
);
if ($refundToStoreCreditAmount) {
$refundToStoreCreditAmount = $creditmemo->getStore()->roundPrice($refundToStoreCreditAmount);
$creditmemo->setBaseCustomerBalanceTotalRefunded($refundToStoreCreditAmount);
$refundToStoreCreditAmount = $creditmemo->getStore()->roundPrice(
$refundToStoreCreditAmount*$order->getStoreToOrderRate()
);
// this field can be used by customer balance observer
$creditmemo->setBsCustomerBalTotalRefunded($refundToStoreCreditAmount);
// setting flag to make actual refund to customer balance after credit memo save
$creditmemo->setCustomerBalanceRefundFlag(true);
}
}
$creditmemo->setPaymentRefundDisallowed(true)->register();
// add comment to creditmemo
// add comment to creditmemo
if (!empty($comment)) {
$creditmemo->addComment($comment, $notifyCustomer);
}
Mage::getModel('core/resource_transaction')
->addObject($creditmemo)
->addObject($order)
->save();
// send email notification
$creditmemo->sendEmail($notifyCustomer, ($includeComment ? $comment : ''));
}
Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange