Принудительно завершить ордер на переход в статус

11

Мы используем пользовательский модуль, который требует статуса «завершен» (я не могу изменить модуль, потому что он использует ioncube)

Мы также используем платежную систему, которая не предлагает вариант статуса: «завершено»

Поэтому мой вопрос: как я могу заставить ордер перейти в статус «завершен»?

PS: это не работает:

$order = Mage::getSingleton('sales/order');
$order->loadByIncrementId('12345');
$order->setState(Mage_Sales_Model_Order::STATE_COMPLETE, true);
$order->save();
Боб ван Луийт
источник
Решение, представленное здесь: magento.stackexchange.com/a/244601/15769 Это работает для меня. Я надеюсь, что это будет полезно для всех, кто использует Magento 1.9.2.4 <br/> Спасибо @ ctrl-z пожалуйста

Ответы:

12

Не разрешается вручную устанавливать состояние заказа на «завершено», и вы должны получить это исключение при вызове setStateзаказа с состоянием «завершено»:

Состояние заказа «завершено» не должно устанавливаться вручную.

Причина этого проста: состояние «завершено» (и статус, поскольку это единственное состояние со статусом «завершено») предназначено для указания того, что заказ полностью выполнен. Т.е. он был размещен, выставлен счет и отправлен заказчику.

Как только заказ выставлен и выставлен счет, Magento автоматически установит это состояние в заказе.

Если ваша платежная система «не разрешает» статус «завершено», я бы не стал доверять ему, особенно в том случае, если он закодирован в ionCube. Однако, если это происходит потому, что он обрабатывает счета за пределами Magento, вам нужно вручную сгенерировать счет «Оффлайн» для заказа, чтобы Magento распознал, что он оплачен.

Не пытайтесь изменить себя, решая проблему, когда ордера не попадают в завершенное состояние, как обычно. Вместо этого исправьте реальную проблему, убедившись, что заказы выставляются в Magento и выставляются как счета, и они будут помечены системой как завершенные.

davidalger
источник
Это не отвечает на вопрос. Хотя в нем рассматриваются причины, по которым это не следует делать, это еще не все. Я сам столкнулся с ситуацией, когда большая часть Magento для обработки заказа пропускается, и заказ должен быть установлен в полный статус.
Наварр
1
@Navarr на самом деле это делает ... см. Часть о создании автономной накладной для заказа. Сделайте это, и заказ будет перемещен к выполнению независимо от используемого обработчика платежей.
Давидгер
3
или, вы знаете: stackoverflow.com/a/8906785/43790
Navarr
2
@Navarr Конечно, можно также напрямую писать в базу данных через SQL, но это не отменяет того, что это защищенное состояние для реализации модели. Лучшие ответы не отвечают вслепую на «давайте сделаем х», не затрагивая основной вопрос. Во всяком случае, это последнее, что я буду комментировать здесь по этому поводу.
Давиджер
Индикатор проверки двигателя горит на приборной панели автомобиля. Я не знал, как решить проблему. Затем я удалил предохранитель, который включает этот маленький свет. Я думаю, что мой двигатель работает нормально.
Мохаммед Джорайд
0

Чтобы изменить состояние:

$order->setData('state', Mage_Sales_Model_Order::STATE_COMPLETE);

Чтобы изменить статус:

$order->addStatusToHistory(Mage_Sales_Model_Order::STATE_COMPLETE);

А потом $order->save();

Вы должны изменить состояние, используя, setDataчтобы исключение сообщало вам, что вы не можете вызвать вручнуюsetState

CTRL-Z PLS
источник
-3

Попробуй это.

$order = Mage::getModel('sales/order')->load(Mage::getSingleton('checkout/session')->getLastOrderId());
$order_id=$order->getData('entity_id');
$order2 = Mage::getModel('sales/order')->load($order_id); 
$order2->setData('state', "new");
    $order2->setStatus("pending");
$order2->save();

Это работает для меня на моем проекте ..

Kuldeep
источник
Ага, значит, вы «перезапустили» заказ, а затем установили его: new-> pending-> complete?
Боб ван Луийт
Нет, я загрузил заказ, а затем присвоил ему новый статус и состояние.
Кулдип
Это состояние / статус новый / ожидающий, что не проблема. Актуальная проблема заключается в том, как установить «завершить» вручную.
7
-3
$oResource = Mage::getSingleton('core/resource'); 

$oConnection = $oResource->getConnection('core_write'); 

$sSql = "UPDATE " . ' ' . $oResource->getTableName('sales_flat_order') .
        " SET status = '" . Mage_Sales_Model_Order::STATE_COMPLETE . "', state = '" . Mage_Sales_Model_Order::STATE_COMPLETE . "' WHERE
entity_id = " . $oOrder->getId();

$oConnection->query($sSql);
аноним
источник
Я бы не рекомендовал использовать прямое выполнение SQL и полагаться на реализацию Magento ORM.
7