如何在magento退款时更改订单状态?

时间:2014-04-30 09:12:20

标签: magento paypal magento-1.7 paypal-ipn

我正在研究Magento 1.7版本。我下了订单并使用Paypal付款并离线退款。订单状态发生了以下变化: -

  1. 待付款
  2. 发票#100000001已创建
  3. 处理(IPN“已完成”。有关获取的1英镑金额的已注册通知。交易ID:“0CT123456789874521”。)
  4. 处理(有关发票#100000001的通知客户。)
  5. 贷项凭证#100000001已创建
  6. 处理(退还金额1英镑离线。)
  7. 处理(IPN“已退款”。注意:可退款的最高金额为0.00英镑)
  8. 处理(测试订单已退款。)
  9. 订单状态仍显示处理但应完成。

4 个答案:

答案 0 :(得分:5)

在Magento中,订单仅在为其创建发票和发货后标记为完成。为订单创建贷记凭证时,它将被标记为已关闭。

如果您尝试使用setStatus方法直接将订单设置为完成或关闭,则会出现例外情况:订单状态“完成”不得手动设置。同样,这些状态应该由Magento自动设置。

话虽这么说,如果你真的想手动设置它们,你可以像这样绕过它:

$order->setData('state', 'complete');
$order->setStatus('complete');
$history = $order->addStatusHistoryComment('Manually set order to Complete.', false);
$history->setIsCustomerNotified(false);
$order->save();

您可以查看this stackoverflow thread了解更多信息。

答案 1 :(得分:2)

查看处理退款的Mage_Sales_Model_Order_Payment::refund()

    $order->setState(Mage_Sales_Model_Order::STATE_PROCESSING, true, $message);
    Mage::dispatchEvent('sales_order_payment_refund', array('payment' => $this, 'creditmemo' => $creditmemo));

订单状态设置为处理后,将调度event sales_order_payment_refund。你可以写一个监听这个事件的观察者。如果付款方式是PayPal,您可以按照Cristian Quiroz的答案中的说明更新订单状态。

答案 2 :(得分:2)

在app \ code \ core \ Mage \ Payment \ Model \ Method \ Abstract.php

您可以将订单状态设置为完整

public function processBeforeRefund($invoice, $payment)
{
    // Add your code to set order as complete

    $payment->setRefundTransactionId($invoice->getTransactionId());
    return $this;
}

希望这会有所帮助..

答案 3 :(得分:2)

我一直在研究这个问题,看起来它实际上是一个四舍五入的问题。创建贷项通知单后,订单状态应该关闭,但在我的情况下,一些退款订单仍保持其原始状态。

创建贷记凭证时,会调用两个函数Mage_Sales_Model_Order::canCreditmemo()Mage_Sales_Model_Order_Invoice::canRefund()。如果总金额和退款金额之间的差额小于0.0001,则它们都返回false。

在我的测试中,对于某些退款订单而言,情况并非如此,无论使用何种付款方式。在两个函数中将值增加到0.001导致关闭订单状态。这也解释了为什么只有一些订单保持其状态,一些订单根据价格和税额正确关闭。

我通过覆盖本地的两个Magento核心类解决了这个问题,并用以下代码替换了以下几行:

Mage_Sales_Model_Order:

if (abs($this->getStore()->roundPrice($this->getTotalPaid()) - $this->getTotalRefunded()) < .001) {
    return false;
}

Mage_Sales_Model_Order_Invoice:

if (abs($this->getBaseGrandTotal() - $this->getBaseTotalRefunded()) < .001) {
    return false;
}

我希望这有助于其他人,因为我花了一些时间来追查那个错误。