Forza un ordine per passare allo stato completo


11

Stiamo utilizzando un modulo personalizzato che richiede lo stato: "completo" (non riesco a modificare il modulo perché utilizza ioncube)

Stiamo anche utilizzando un sistema di pagamento che non offre l'opzione di stato: "completo"

Quindi la mia domanda è: come posso forzare un ordine per passare allo stato completo?

PS: Questo non funziona:

$order = Mage::getSingleton('sales/order');
$order->loadByIncrementId('12345');
$order->setState(Mage_Sales_Model_Order::STATE_COMPLETE, true);
$order->save();

La soluzione fornita qui: magento.stackexchange.com/a/244601/15769 Funziona per me. <br/> Spero che sia utile per chiunque usi Magento 1.9.2.4 <br/> Grazie @ ctrl-z pls

Risposte:


12

Non è consentito impostare manualmente lo stato dell'ordine su "completo" e si dovrebbe ottenere questa eccezione quando si chiama setStatel'ordine con lo stato "completo":

Lo stato dell'ordine "completo" non deve essere impostato manualmente.

Il motivo è semplice: lo stato "completo" (e lo stato, poiché è l'unico stato con uno stato "completo") è inteso a indicare che un ordine è stato completamente evaso. Vale a dire che è stato inserito, fatturato e spedito al cliente.

Una volta che l'ordine è stato fatturato e spedito, Magento imposterà automaticamente questo stato sull'ordine.

Se il tuo sistema di pagamento "non consente" lo stato "completo", non mi fiderei, specialmente con la sua codifica ionCube. Se, tuttavia, è perché gestisce la fatturazione al di fuori di Magento, allora dovrai generare manualmente una fattura "Offline" per l'ordine in modo che Magento riconosca che è stata pagata.

Non tentare di cambiare te stesso aggirando il problema degli ordini che non colpiscono lo stato completato come dovrebbero normalmente. Invece, risolvi il problema reale assicurandoti che gli ordini siano entrambi fatturati e spediti in Magento in modo che vengano contrassegnati come completi dal sistema.


Questo non risponde alla domanda. Mentre affronta i motivi per cui ciò non dovrebbe essere fatto, non è un problema per tutto. Io stesso ho acquisito una situazione in cui la maggior parte di Magento per l'elaborazione degli ordini viene ignorata e l'ordine deve essere impostato sullo stato completo.
Navarr,

1
@Navarr effettivamente lo fa ... vedi la parte sulla generazione manuale di una fattura offline per l'ordine. Fallo e l'ordine si sposterà per completare indipendentemente dal processore di pagamento utilizzato.
davidalger,


2
@Navarr Certo, si potrebbe scrivere direttamente sul db anche tramite SQL, ma ciò non nega che sia uno stato protetto per l'implementazione del modello. Le risposte migliori non rispondono ciecamente a "realizziamo x" senza affrontare la questione di fondo. Comunque, questa è l'ultima che commenterò qui a riguardo.
davidalger,

Engin Controlla la luce accesa sul cruscotto dell'auto. Non sapevo come risolvere il problema. Ho quindi rimosso il fusibile che accende quella piccola luce. Penso che il mio motore funzioni bene ora.
Mohammed Joraid,

0

Per cambiare lo stato:

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

Per modificare lo stato:

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

E poi $order->save();

Devi cambiare lo stato usando setDataper evitare che l'eccezione ti dica che non puoi chiamare manualmentesetState


-3

Prova questo.

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

Funziona per me nel mio progetto ..


Ah, quindi hai "riavviato" l'ordine e poi impostato su: new-> in sospeso-> completato?
Bob van Luijt,

no Ho caricato l'ordine e quindi assegnato il nuovo stato e stato all'ordine.
Kuldeep,

Questo è stato / stato nuovo / in sospeso, il che non è un problema. Il vero problema è come impostarlo su "Completa" manualmente.
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);

Scoraggerei l'uso dell'esecuzione diretta di SQL e mi affiderei all'implementazione di Magento ORM.
7
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.