Erzwingen Sie, dass eine Bestellung in den Status "Abgeschlossen" wechselt

11

Wir verwenden ein benutzerdefiniertes Modul, für das der Status "abgeschlossen" erforderlich ist (ich kann das Modul nicht ändern, da es ioncube verwendet).

Wir verwenden auch ein Zahlungssystem, das die Statusoption "vollständig" nicht bietet.

Meine Frage lautet also: Wie kann ich eine Bestellung erzwingen, um zum Status "Vollständig" zu gelangen?

PS: Das funktioniert nicht:

$order = Mage::getSingleton('sales/order');
$order->loadByIncrementId('12345');
$order->setState(Mage_Sales_Model_Order::STATE_COMPLETE, true);
$order->save();
Bob van Luijt
quelle
Die hier bereitgestellte Lösung: magento.stackexchange.com/a/244601/15769 Sie funktioniert für mich. <br/> Ich hoffe, dass sie für alle nützlich ist, die Magento 1.9.2.4 verwenden. <br/> Danke @ ctrl-z pls

Antworten:

12

Es ist nicht zulässig, den Bestellstatus manuell auf "Abgeschlossen" zu setzen. Diese Ausnahme sollte auftreten, wenn Sie setStatedie Bestellung mit dem Status "Abgeschlossen" aufrufen :

Der Bestellstatus "abgeschlossen" darf nicht manuell eingestellt werden.

Der Grund dafür ist einfach: Der Status "vollständig" (und der Status, da dies der einzige Status mit dem Status "vollständig" ist) soll anzeigen, dass eine Bestellung vollständig ausgeführt wurde. Dh es wurde platziert, in Rechnung gestellt und an den Kunden versendet.

Sobald die Bestellung in Rechnung gestellt und versendet wurde, setzt Magento diesen Status automatisch auf die Bestellung.

Wenn Ihr Zahlungssystem den Status "vollständig" nicht "zulässt", würde ich ihm nicht vertrauen, insbesondere wenn es ionCube-codiert ist. Wenn dies jedoch darauf zurückzuführen ist, dass die Rechnungsstellung außerhalb von Magento erfolgt, müssen Sie manuell eine "Offline" -Rechnung für die Bestellung erstellen, damit Magento erkennt, dass sie bezahlt wurde.

Versuchen Sie nicht, sich zu verändern, indem Sie das Problem umgehen, dass die Bestellungen nicht den abgeschlossenen Zustand erreichen, wie sie normalerweise sollten. Beheben Sie stattdessen das eigentliche Problem, indem Sie sicherstellen, dass Bestellungen in Magento in Rechnung gestellt und versendet werden, damit sie vom System als vollständig markiert werden.

Davidalger
quelle
Dies beantwortet die Frage nicht. Es werden zwar Gründe angesprochen, warum dies nicht getan werden sollte, aber das ist nicht alles. Ich selbst habe eine Situation erlangt, in der der größte Teil von Magento für die Auftragsabwicklung übersprungen wird und die Bestellung auf den vollständigen Status gesetzt werden muss.
Navarr
1
@Navarr tatsächlich tut es ... siehe den Teil über das manuelle Generieren einer Offline-Rechnung für die Bestellung. Wenn Sie dies tun, wird die Bestellung unabhängig vom verwendeten Zahlungsprozessor abgeschlossen.
Davidalger
3
oder, wissen Sie: stackoverflow.com/a/8906785/43790
Navarr
2
@Navarr Sicher, man könnte auch über SQL direkt in die Datenbank schreiben, aber das negiert nicht, dass es sich um einen geschützten Zustand gemäß der Modellimplementierung handelt. Die besten Antworten antworten nicht blind auf "Lasst uns x erreichen", ohne die zugrunde liegende Angelegenheit anzusprechen. Jedenfalls ist dies das Letzte, was ich hier dazu kommentieren werde.
Davidalger
Motor Kontrollleuchte leuchtet am Armaturenbrett des Autos. Ich wusste nicht, wie ich das Problem beheben sollte. Ich habe dann die Sicherung entfernt, die das kleine Licht einschaltet. Ich denke, mein Motor funktioniert jetzt gut.
Mohammed Joraid
0

So ändern Sie den Status:

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

So ändern Sie den Status:

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

Und dann $order->save();

Sie müssen den Status mit ändern setData, um die Ausnahme zu vermeiden, dass Sie nicht manuell anrufen könnensetState

Strg-Z pls
quelle
-3

Versuche dies.

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

Es funktioniert für mich bei meinem Projekt ..

Kuldeep
quelle
Aha, Sie haben die Bestellung also neu gestartet und dann auf "Neu-> Ausstehend-> Abgeschlossen" gesetzt.
Bob van Luijt
nein Ich habe die Bestellung geladen und dann der Bestellung den neuen Status und Status zugewiesen.
Kuldeep
Dies ist Status / Status neu / ausstehend, was kein Problem ist. Das eigentliche Problem besteht darin, wie man es manuell auf "Fertig stellen" setzt.
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);
anonym
quelle
Ich würde von der Verwendung der direkten SQL-Ausführung abraten und mich auf die Magento ORM-Implementierung verlassen.
7ochem