Forcer une commande à passer au statut terminé


11

Nous utilisons un module personnalisé qui nécessite le statut: "complet" (je ne peux pas changer le module car il utilise ioncube)

Nous utilisons également un système de paiement qui n'offre pas l'option de statut: "terminé"

Ma question est donc: comment puis-je forcer une commande à passer au statut complet?

PS: cela ne fonctionne pas:

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

La solution fournie ici: magento.stackexchange.com/a/244601/15769 Cela fonctionne pour moi. <br/> J'espère que cela sera utile pour tous ceux qui utilisent Magento 1.9.2.4 <br/> Merci @ ctrl-z pls

Réponses:


12

Il n'est pas autorisé de définir manuellement l'état de la commande sur «terminé» et vous devriez obtenir cette exception lorsque vous appelez setStatela commande avec l'état «terminé»:

L'état de la commande "terminé" ne doit pas être défini manuellement.

La raison en est simple: l'état «complet» (et le statut, puisqu'il s'agit du seul état ayant le statut «terminé») est destiné à indiquer qu'une commande a été entièrement exécutée. C'est-à-dire qu'il a été placé, facturé et expédié au client.

Une fois la commande facturée et expédiée, Magento définira automatiquement cet état sur la commande.

Si votre système de paiement "n'autorise pas" le statut "complet", alors je ne lui ferais pas confiance, en particulier avec le codage ionCube. Si, cependant, c'est parce qu'il gère la facturation en dehors de Magento, vous devrez générer manuellement une facture "Hors ligne" pour la commande afin que Magento reconnaisse qu'elle a été payée.

N'essayez pas de vous changer vous-même en contournant le problème des commandes qui n'atteignent pas l'état terminé comme elles le devraient normalement. Au lieu de cela, corrigez le problème réel en vous assurant que les commandes sont à la fois facturées et expédiées dans Magento afin qu'elles soient marquées comme terminées par le système.


Cela ne répond pas à la question. Bien qu'il traite des raisons pour lesquelles cela ne devrait pas être fait, ce n'est pas un fourre-tout pour tout. J'ai moi-même acquis une situation où la majeure partie de Magento pour le traitement des commandes est ignorée et la commande doit être définie sur l'état complet.
Navarr

1
@Navarr en fait ... voir la partie sur la génération manuelle d'une facture hors ligne pour la commande. Faites-le, et la commande sera exécutée quel que soit le processeur de paiement utilisé.
davidalger


2
@Navarr Bien sûr, on pourrait aussi écrire directement dans la base de données via SQL, mais cela ne nie pas qu'il s'agisse d'un état protégé par l'implémentation du modèle. Les meilleures réponses ne répondent pas aveuglément à "accomplissons x" sans aborder la question sous-jacente. Quoi qu'il en soit, c'est le dernier que je commenterai ici à ce sujet.
davidalger

Voyant de contrôle Engin allumé sur le tableau de bord de la voiture. Je ne savais pas comment résoudre le problème. J'ai ensuite retiré le fusible qui allume cette petite lumière. Je pense que mon moteur fonctionne bien maintenant.
Mohammed Joraid

0

Pour changer l'état:

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

Pour modifier le statut:

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

Puis $order->save();

Vous devez modifier l'état à l'aide de setDatapour éviter que l'exception vous indique que vous ne pouvez pas appeler manuellementsetState


-3

Essaye ça.

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

Cela fonctionne pour moi sur mon projet ..


Aha, vous avez donc «redémarré» la commande, puis paramétré sur: nouveau-> en attente-> terminé?
Bob van Luijt

non J'ai chargé la commande, puis affecté le nouveau statut et l'état à la commande.
Kuldeep

Il s'agit de l'état / état nouveau / en attente, ce qui ne pose aucun problème. Le vrai problème est de savoir comment le configurer pour qu'il se termine manuellement.
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);

Je découragerais l'utilisation de l'exécution SQL directe et je compterais sur l'implémentation Magento ORM.
7ochem
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.