magento 添加Creditmemo记录

来源:互联网 发布:sql server rowguid 编辑:程序博客网 时间:2024/05/22 15:03

当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总结出如下代码:

<?phpclass 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;    }}?>