Примушуйте замовлення перейти до статусу завершеним


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 Це працює для мене. <br/> Я сподіваюся, що він буде корисний для всіх, хто використовує Magento 1.9.2.4 <br/> Спасибі @ ctrl-z pls

Відповіді:


12

Не дозволяється вручну встановлювати стан замовлення на "завершення", і ви повинні отримати це виняток, коли ви звертаєтесь setStateдо замовлення зі станом "завершення":

Держава замовлення "завершена" не повинна встановлюватися вручну.

Причина цього проста: стан "завершений" (і статус, оскільки це єдиний стан зі статусом "повний") повинен означати, що замовлення повністю заповнене. Тобто його розміщують, виставляють рахунок-фактуру та відправляють замовнику.

Після того, як замовлення буде виставлено рахунки та відправлено, Magento встановить це стан під замовлення автоматично.

Якщо ваша платіжна система "не дозволяє" статус "завершеного", я б їй не довіряв, тим більше, що вона кодується ionCube. Якщо це все-таки тому, що він обробляє виставлення рахунків за межами Magento, вам потрібно буде вручну генерувати "офлайн" рахунок-фактуру для замовлення, щоб Magento визнав, що за нього заплатили.

Не намагайтеся коротко змінити себе, вирішуючи проблему, щоб замовлення не потрапляли в завершений стан так, як вони повинні. Натомість виправте справжню проблему, переконавшись, що замовлення виставляються на рахунку та відвантажуються в Magento, щоб система їх позначала як повну.


Це не відповідає на запитання. Хоча це вирішує причини, цього не слід робити, це не привід для всього. Я сам придбав ситуацію, коли більша частина Magento для обробки замовлення пропускається і замовлення потрібно встановити до повного статусу.
Наварр

1
@Navarr насправді це робить ... дивіться частину про ручне створення офлайн-рахунку для замовлення. Зробіть це, і замовлення перейде до завершення незалежно від використовуваного платіжного процесора.
davidalger

3
або, знаєте: stackoverflow.com/a/8906785/43790
Navarr

2
@Navarr Звичайно, можна також писати безпосередньо в db через SQL, але це не скасовує, що воно є захищеним станом на реалізацію моделі. Найкращі відповіді не відповідають сліпо на "давайте виконаємо х", не звертаючись до основної справи. Так чи інакше, це останнє, що я коментую тут щодо цього.
davidalger

Engin Check світло горить на приладовій панелі автомобіля. Я не знав, як виправити проблему. Потім я вийняв запобіжник, який вмикає це маленьке світло. Я думаю, що зараз мій двигун працює нормально.
Мохаммед Жораїд

0

Щоб змінити стан:

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

Щоб змінити статус:

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

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

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


-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();

Це працює для мене на моєму проекті ..


Ага, значить, ви "перезапустили" замовлення і потім встановили його на: new-> очікує-> завершено?
Bob van Luijt

ні, я завантажував замовлення, а потім присвоював новий статус та стан замовлення.
Kuldeep

Це стан / статус новий / очікує на розгляд, що не є проблемою. Справжня проблема полягає в тому, як встановити його на "завершення" вручну.
оч.

-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.
оч.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.