Wymuś zamówienie, aby przejść do stanu ukończonego

11

Korzystamy z niestandardowego modułu, który wymaga statusu: „ukończony” (nie mogę go zmienić, ponieważ używa modułu jonowego)

Korzystamy również z systemu płatności, który nie oferuje opcji statusu: „zakończony”

Więc moje pytanie brzmi: jak mogę zmusić zamówienie, aby przejść do statusu ukończonego?

PS: To nie działa:

$order = Mage::getSingleton('sales/order');
$order->loadByIncrementId('12345');
$order->setState(Mage_Sales_Model_Order::STATE_COMPLETE, true);
$order->save();
Bob van Luijt
źródło
Rozwiązanie dostarczone tutaj: magento.stackexchange.com/a/244601/15769 Działa dla mnie. <br/> Mam nadzieję, że przyda się każdemu, kto używa Magento 1.9.2.4 <br/> Dzięki @ ctrl-z pls

Odpowiedzi:

12

Niedozwolone jest ręczne ustawianie stanu zamówienia na „ukończone” i powinieneś otrzymywać ten wyjątek, gdy wywołujesz setStatezamówienie ze stanem „zakończonym”:

„Kompletny” stan zamówienia nie może być ustawiany ręcznie.

Powód tego jest prosty: stan „kompletny” (i status, ponieważ jest to jedyny stan o statusie „kompletny”) ma oznaczać, że zamówienie zostało całkowicie zrealizowane. Oznacza to, że został umieszczony, zafakturowany i wysłany do klienta.

Gdy zamówienie zostanie zafakturowane i wysłane, Magento automatycznie ustawi ten stan na zamówieniu.

Jeśli twój system płatniczy „nie zezwala” na status „ukończony”, nie ufałbym temu, zwłaszcza że jest zakodowany w ionCube. Jeśli jednak dzieje się tak dlatego, że obsługuje fakturowanie poza Magento, musisz ręcznie wygenerować fakturę „offline” dla zamówienia, aby Magento rozpoznał, że została opłacona.

Nie próbuj zmieniać siebie przez obejście problemu polegającego na tym, że zamówienia nie osiągają stanu ukończonego tak, jak powinny. Zamiast tego napraw rzeczywisty problem, upewniając się, że zamówienia są zarówno fakturowane, jak i wysyłane w Magento, tak aby zostały oznaczone przez system jako zrealizowane.

davidalger
źródło
To nie odpowiada na pytanie. Chociaż dotyczy to przyczyn, których nie należy robić, nie jest to jednak wszystko. Ja sam nabyłem sytuacji, w której większość Magento do przetwarzania zamówień jest pomijana, a zamówienie musi być ustawione na pełny status.
Navarr
1
@Navarr faktycznie to robi ... zobacz część dotyczącą ręcznego generowania faktury offline dla zamówienia. Zrób to, a zamówienie przejdzie do realizacji, niezależnie od używanego procesora płatności.
davidalger
3
lub wiesz: stackoverflow.com/a/8906785/43790
Navarr
2
@Navarr Oczywiście, można również pisać bezpośrednio do bazy danych przez SQL, ale to nie neguje, że jest to stan chroniony dla implementacji modelu. Najlepsze odpowiedzi nie odpowiadają na ślepo na „osiągnijmy x” bez odnoszenia się do podstawowej kwestii. W każdym razie, to będzie ostatni komentarz w tej sprawie.
davidalger
Engin Sprawdź lampkę zapaloną na desce rozdzielczej samochodu. Nie wiedziałem, jak rozwiązać problem. Następnie wyjąłem bezpiecznik, który włącza to małe światło. Myślę, że mój silnik działa teraz dobrze.
Mohammed Joraid
0

Aby zmienić stan:

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

Aby zmienić status:

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

I wtedy $order->save();

Musisz zmienić stan za pomocą, setDataaby uniknąć wyjątku informującego, że nie możesz ręcznie zadzwonićsetState

ctrl-z pls
źródło
-3

Spróbuj tego.

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

Działa dla mnie w moim projekcie.

Kuldeep
źródło
Aha, więc „zrestartowałeś” zamówienie i ustawiłeś je na: nowe-> oczekujące-> zakończone?
Bob van Luijt
Nie, załadowałem zamówienie, a następnie przypisałem nowy status i stan do zamówienia.
Kuldeep,
Jest to stan / status nowy / oczekujący, co nie stanowi problemu. Rzeczywisty problem polega na tym, jak ręcznie ustawić „ukończenie”.
7ochem
-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);
anonim
źródło
Odradzałbym stosowanie bezpośredniego wykonywania SQL i polegałbym na implementacji Magento ORM.
7ochem