Пометьте заказ Magento как завершенный программно
Я пытаюсь пометить заказ "Обработка" как завершенный, когда получаю определенный ответ от сторонней службы. У меня все готово для этого, но единственная проблема в том, что заказы остаются в состоянии обработки.
Я создаю счет-фактуру (я не думаю, что мне это нужно, хотя, поскольку каждый товар помечен как "выставленный счет" в бэкэнде 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 answers
Вы можете ознакомиться с этой статьей (на русском языке).
Вот код из статьи:
$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();
Попробуйте
$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();
Я делаю это таким образом:
$order->setState('complete', true, $this->__('Your Order History Message Here.'))
->save();
Код для обработки заказа программным способом. Может быть включен в событие успеха или 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();
Magento автоматически отметит заказ как выполненный, если:
- Оплата произведена.
- Счет-фактура существует.
- Отгрузка существует.
Если вы не можете этого сделать, попробуйте создать пользовательское "состояние" и установить его. Тем временем, чтобы настроить порядок обработки, попробуйте сделать следующее:
$order = Mage::getModel('sales/order')->load($id);
$order->setState(Mage_Sales_Model_Order::STATE_PROCESSING, true)->save();
Должно работать без ошибок. Протестировано в Magento 1.7.0.2
В моем случае мне нужно было, чтобы конечные пользователи видели заполнение в таблице заказов, но состояние заказа действительно не имело значения. Так что я просто пошел в
Система->Статус заказа Создайте новый статус под названием Завершено (обратите внимание на букву d, чтобы его было легко отличить) Назначьте этот статус состоянию Обработка/ожидание, что угодно.
Это сработало для нашего клиента, но не сработало бы, если бы вы сильно зависели от состояния заказа (отличного от статуса заказа).