Отметить заказ Magento как завершенный программно - PullRequest
7 голосов
/ 18 января 2012

Я пытаюсь пометить ордер "Обработка" как выполненный, когда получаю определенный ответ от сторонней службы. У меня все для этого настроено, но единственная проблема в том, что заказы остаются в состоянии Обработка.

Я генерирую счет-фактуру (хотя я не думаю, что мне это нужно, поскольку каждый элемент помечен как «выставлен счет» в бэкэнде 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 ]

17 голосов
/ 18 января 2012

Попробуйте

$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();
5 голосов
/ 18 января 2012

Вы можете взглянуть на эту статью (на русском языке).

Вот код из статьи:

$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();
3 голосов
/ 18 января 2012

Я делаю так:

$order->setState('complete', true, $this->__('Your Order History Message Here.'))
      ->save();
1 голос
/ 06 февраля 2017

Код для обработки заказа программно. Может быть задано событие успеха или 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();
0 голосов
/ 25 июня 2015

В моем случае мне нужно, чтобы конечные пользователи видели выполненные в таблице заказов, но состояние заказа действительно не имело значения. Так что я просто пошел к

Система-> Статус заказа Создайте новый статус под названием «Завершено» (обратите внимание на d, чтобы его было легко различить) Присвойте этот статус состоянию Обработка / Ожидание, что угодно.

Это сработало для нашего клиента - но не сработало бы, если вы сильно зависите от состояния заказа (отличается от состояния заказа).

0 голосов
/ 12 февраля 2013

Magento автоматически пометит заказ как завершенный, если:

  • Оплата произведена.
  • Счет существует.
  • Отгрузка существует.

Если вы не можете этого сделать, попробуйте создать собственное «состояние» и установить его. А пока, чтобы установить порядок обработки, попробуйте это:

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

Должно работать без ошибок. Протестировано в Magento 1.7.0.2

...