当refund发生在线下,需要用程序加creditmemo时,如下代码可供参考
1.可以调用sales/order_creditmemo_api的create()方法来生成creditmemo记录,
function addCreditMemo($targetMagentoGoServiceId, $orderId, $commentText) {
$product = Mage::getModel('catalog/product')->load($targetMagentoGoServiceId);
$targetMagentoGoPrice = $product->getPrice();
$targetCustomerServicePrice = $this->getCustomerServicePrice($orderId);
$targetTotalAmount = $targetMagentoGoPrice + $targetCustomerServicePrice;
$remainAmount = $this->getRemainTotalAmount($orderId);
$refundAmount = $targetTotalAmount - $remainAmount;
$data = array(
'qtys'=>array(),
'adjustment_negative' => 0,
'adjustment_positive' => $refundAmount,
'shipping_amount' => '0'
);
Mage::getModel('sales/order_creditmemo_api')->create(Mage::getModel('sales/order')->load($orderId)->getIncrementId(), $data, $commentText, true, true);
}
这里只是生成一条online的记录,这个操作会对sales_flat_order中的相应的order进行相应的amount操作,但它只是操作,并不调用真实的refund.
2.可以根据后台的refund总结出如下代码:
<?php
class Emily_Credit_Model_creditMemo extends Mage_Core_Model_Abstract {
public function addCreditMemo($orderId,$refundAmount,$commentText) {
Mage::log('*refundTotal: '.$refundAmount.' orderId: '.$orderId,null,'updateservice.log');
$data = array(
'adjustment_negative' => $refundAmount,
'adjustment_positive' => 0,
'comment_text' => $commentText,
'do_offline' => '1',
'refund_customerbalance_return_enable' => 0,
'shipping_amount' => '0'
);
if (!empty($data['comment_text'])) {
Mage::getSingleton('adminhtml/session')->setCommentText($data['comment_text']);
}
try {
$creditmemo = $this->_initCreditmemo($orderId,$data);
if ($creditmemo) {
if (($creditmemo->getGrandTotal() <= 0) && (!$creditmemo->getAllowZeroGrandTotal())) {
Mage::throwException(
$this->__('Credit memo\'s total must be positive.')
);
}
$comment = '';
if (!empty($data['comment_text'])) {
$creditmemo->addComment(
$data['comment_text'], isset($data['comment_customer_notify']), isset($data['is_visible_on_front'])
);
if (isset($data['comment_customer_notify'])) {
$comment = $data['comment_text'];
}
}
if (isset($data['do_refund'])) {
$creditmemo->setRefundRequested(true);
}
if (isset($data['do_offline'])) {
$creditmemo->setOfflineRequested((bool) (int) $data['do_offline']);
}
$creditmemo->register();
if (!empty($data['send_email'])) {
$creditmemo->setEmailSent(true);
}
$creditmemo->getOrder()->setCustomerNoteNotify(!empty($data['send_email']));
$this->_saveCreditmemo($creditmemo);
$creditmemo->sendEmail(!empty($data['send_email']), $comment);
Mage::log('orderId: '.$orderId.' The credit memo has been created.',null,'updateService.log');
//echo ('The credit memo has been created.');
//die();
} else {
return;
}
} catch (Mage_Core_Exception $e) {
Mage::log('createMemo Error, orderId: '.$orderId.' '.$e->getMessage,null,'updateServiceError.log');
} catch (Exception $e) {
Mage::log('createMemo Error, orderId: '.$orderId.' Cannot save the credit memo.',null,'updateServiceError.log');
}
}
protected function _saveCreditmemo($creditmemo) {
$transactionSave = Mage::getModel('core/resource_transaction')
->addObject($creditmemo)
->addObject($creditmemo->getOrder());
if ($creditmemo->getInvoice()) {
$transactionSave->addObject($creditmemo->getInvoice());
}
$transactionSave->save();
return $this;
}
protected function _initCreditmemo($orderId,$data) {
$order = Mage::getModel('sales/order')->load($orderId);
if (!$this->_canCreditmemo($order)) {
Mage::log('createMemo Error, orderId: '.$orderId.' cannot credit',null,'updateServiceError.log');
return false;
}
$data['qtys'] = array();
$service = Mage::getModel('sales/service_order', $order);
$creditmemo = $service->prepareCreditmemo($data);
return $creditmemo;
}
protected function _canCreditmemo($order) {
/**
* Check order existing
*/
if (!$order->getId()) {
//echo $this->__('The order no longer exists.');
Mage::log('createMemo Error, The order no longer exists.',null,'updateServiceError.log');
return false;
}
/**
* Check creditmemo create availability
*/
if (!$order->canCreditmemo()) {
//echo $this->__('Cannot create credit memo for the order.');
Mage::log('createMemo Error, orderId: '.$order->getId().' Cannot create credit memo for the order.',null,'updateServiceError.log');
return false;
}
return true;
}
}
?>