我正在研究Magento 1.7版本。我下了订单并使用Paypal付款并离线退款。订单状态发生了以下变化: -
订单状态仍显示处理但应完成。
答案 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;
}
我希望这有助于其他人,因为我花了一些时间来追查那个错误。