【问题标题】:Mark a Magento order as complete programmatically以编程方式将 Magento 订单标记为完整
【发布时间】:2012-02-12 23:15:17
【问题描述】:

当我从第三方服务收到特定响应时,我正尝试将“处理中”订单标记为完成。我已经为此设置了一切,但唯一的问题是订单处于处理状态。

我正在生成发票(但我认为我不需要这个,因为每个项目在 Magento 后端都标记为“已开票”)和这样的发货:

$order = Mage::getModel('sales/order')... (etc)
$shipment = $order->prepareShipment($quantities);
$shipment->register();
$shipment->setOrder($order);
$shipment->save();

$invoice = $order->prepareInvoice($quantities);
$invoice->register();
$invoice->setOrder($order);
$invoice->save();

这似乎并没有这样做 - 我没有从这段代码中得到任何错误,但订单仍然在处理中。在后端我仍然可以看到订单顶部的“Ship”按钮,并且每件商品都处于“invoiced”状态。

任何提示将不胜感激。

【问题讨论】:

    标签: php magento magento-1.4


    【解决方案1】:

    试试

    $order->setStateUnprotected('complete',
        'complete',
        'Order marked as complete automatically',
        false);
    

    这个方法在app/code/local/Mage/Sales/Model/Order.php (in v1.6.1)

    938:    public function setStateUnprotected($state, $status = false, $comment = '', $isCustomerNotified = null)
    

    在 Magento 1.7.0.0 中,此方法已被删除。试试这个:

        $order->setData('state', "complete");
        $order->setStatus("complete");
        $history = $order->addStatusHistoryComment('Order marked as complete automatically.', false);
        $history->setIsCustomerNotified(false);
        $order->save();
    

    【讨论】:

    • 感谢您的回复。这在 Magento 1.4 中似乎没有任何影响
    • 在 1.7.0.2 中抛出错误,Call to a member function getMethodInstance() on a non-object
    【解决方案2】:

    您可以查看this article(俄语)。

    这是文章中的代码:

    $order = $observer->getEvent()->getOrder();
    
    if (!$order->getId()) {
        return false;
    }
    
    if (!$order->canInvoice()) {
        return false;
    }
    
    $savedQtys = array();
    $invoice = Mage::getModel('sales/service_order', $order)->prepareInvoice($savedQtys);
    if (!$invoice->getTotalQty()) {
        return false;
    }
    $invoice->setRequestedCaptureCase(Mage_Sales_Model_Order_Invoice::CAPTURE_OFFLINE);
    $invoice->register();
    
    $invoice->getOrder()->setCustomerNoteNotify(false);
    $invoice->getOrder()->setIsInProcess(true);
    
    $transactionSave = Mage::getModel('core/resource_transaction')
        ->addObject($invoice)
        ->addObject($invoice->getOrder());
    
    $transactionSave->save();
    

    【讨论】:

    • 谢谢,在我改为发货而不是发票后,文章中的代码起到了作用。
    • 很遗憾,链接现在已损坏。
    • 如果有更新的链接真是太好了。如果有人感兴趣,archive.org 仍然有一个版本的链接。 web.archive.org/web/20110414102634/http://snowcore.net/…。使用谷歌浏览器获取翻译。
    • @Mike 域名将在几天后可用,您可以稍后查看
    • @gregdev 你能分享你的解决方案吗? (发货而不是发票)
    【解决方案3】:

    我就是这样做的:

    $order->setState('complete', true, $this->__('Your Order History Message Here.'))
          ->save();
    

    【讨论】:

    • 感谢您的回复。这引发了错误“不能手动设置订单状态“完成”。”
    【解决方案4】:

    以编程方式处理订单的代码。 可以放在成功事件或 cron 上

    $order = Mage::getModel('sales/order')->loadByIncrementId($orderIncrementId);
    
    $order->setData('state', Mage_Sales_Model_Order::STATE_COMPLETE);
    $order->setStatus(Mage_Sales_Model_Order::STATE_COMPLETE);
    
    $history = $order->addStatusHistoryComment('Order is complete', false);
    $history->setIsCustomerNotified(false);
    
    $order->save();
    

    【讨论】:

    • 为什么要将 state 和 status 设置为相同的值?
    • @MarcusWolschon:为了更好地理解,请查看“sales_order_status”表。状态是状态的表示,基于它,状态标签被显示出来。
    • 商店特定状态代码的名称(及其翻译标签)通常与固定的 Magento 状态值不同。一个状态被分配给一个状态,一个状态可以被分配为 Magento 状态的默认状态。所以问题仍然存在。为什么将状态和状态设置为相同的值。状态是特定于商店的,不应来自状态的 Magento 常量。
    【解决方案5】:

    如果出现以下情况,Magento 会自动将订单标记为完成:

    • 已付款。
    • 存在发票。
    • 有货件。

    如果您不能这样做,请尝试创建自定义“状态”并进行设置。同时,要将订单设置为处理,请尝试以下操作:

     $order = Mage::getModel('sales/order')->load($id);
     $order->setState(Mage_Sales_Model_Order::STATE_PROCESSING, true)->save();
    

    应该可以正常工作。在 Magento 1.7.0.2 中测试

    【讨论】:

    • 但是您不能创建自定义状态。只是一个自定义状态,并为一个状态分配一个或多个状态值。
    【解决方案6】:

    在我的例子中,我需要最终用户在订单网格中看到已完成,但订单状态确实没有任何区别。所以我只是去了

    系统->订单状态 创建一个名为 Completed 的新状态(注意 d 以便于区分) 将该状态分配给状态处理/未决,无论如何。

    这适用于我们的客户 - 但如果您严重依赖订单状态(不同于订单状态),则无法正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      • 2016-01-12
      相关资源
      最近更新 更多