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();
Bob van Luijt
la source
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.

davidalger
la source
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
3
ou, vous savez: stackoverflow.com/a/8906785/43790
Navarr
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

ctrl-z pls
la source
-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 ..

Kuldeep
la source
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);
anonyme
la source
Je découragerais l'utilisation de l'exécution SQL directe et je compterais sur l'implémentation Magento ORM.
7ochem