magento 添加Creditmemo记录

本文介绍了在Magento中如何通过程序方式添加Creditmemo记录,详细讲述了如何使用sales/order_creditmemo_api的create()方法生成online creditmemo,以及此操作对sales_flat_order表的影响,但需要注意该操作不会触发实际退款。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当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;
    }

}

?>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值