将Magento订单标记为完整的编程方式

时间:2012-01-18 07:35:43

标签: php magento magento-1.4

当我从第三方服务获得某个回复时,我正在尝试将“处理”订单标记为完成。我已为此设置了所有设置,但唯一的问题是订单处于处理状态。

我正在生成发票(我不认为我需要这个,因为每个项目在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();

这似乎并没有这样做 - 我从这段代码中得不到任何错误,但订单仍然是处理。在后端,我仍然可以看到订单顶部的“发货”按钮,每个项目都处于“已开发票”状态。

任何提示都将不胜感激。

6 个答案:

答案 0 :(得分:17)

尝试

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

此方法位于app/code/local/Mage/Sales/Model/Order.php(在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();

答案 1 :(得分:5)

你可以看看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();

答案 2 :(得分:3)

我这样做:

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

答案 3 :(得分:1)

以编程方式处理订单的代码。 可以成功举办活动或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();

答案 4 :(得分:0)

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

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

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

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

应该没有错误地工作。在Magento 1.7.0.2中测试

答案 5 :(得分:0)

在我的情况下,我需要最终用户在订单网格中看到已完成,但订单状态确实没有区别。所以我刚刚去了

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

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