Magento 2: Comment mettre à jour l'état des commandes par programme dans un module personnalisé?

11
$orderId = 1;
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$order = $objectManager->create('\Magento\Sales\Model\Order')->load($orderId); 
$order->setState("processing")->setStatus("processing");
$order->save();

Veuillez me dire comment je mets à jour l'état de ma commande dans Magento 2?

Rahul Katoch
la source

Réponses:

19

Vous pouvez le faire comme suit

déclarer sous l'espace de noms

use Magento\Sales\Model\Order;

$orderId = 1;
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$order = $objectManager->create('\Magento\Sales\Model\Order') ->load($orderId);
$orderState = Order::STATE_PROCESSING;
$order->setState($orderState)->setStatus(Order::STATE_PROCESSING);
$order->save();

J'espère que cela t'aides

Dhaval Solanki
la source
merci pour la réponse @Dhaval Drcsystems je veux seulement mettre à jour le statut de la commande
Rahul Katoch
Vous pouvez vous référer à ce modèle afin d'avoir une meilleure idée Magento \ Sales \ Model \ Order \ Payment Vérifiez ici comment ils traitent la commande avec le code.
Dhaval Solanki
le code ci-dessus affiche l'erreur \ Magento \ Sales \ Model \ Order not found
Jaisa
Pouvez-vous me montrer votre dossier?
Dhaval Solanki
Comment mettre à jour le statut d'une commande personnalisée? Si j'ai un statut appelé 'sent_to_print'?
jafar pinjar
12

Mise à jour de l'état de la commande

Pour mettre à jour l'état et l'état de la commande de manière programmatique afin de définir l'état et l'état dans ce format. Initiez l'objet order dans la fonction de construction et utilisez cet objet order dans la fonction personnalisée pour le mettre à jour. Pour mettre à jour l'état de la commande par programme dans le modèle, récupérez l'objet de commande à partir de la fonction de construction.

public function __construct(
    \Magento\Sales\Model\Order $order
){
    $this->order = $order;
}
public function updateorder(){
    $order = $this->order;
    $order->setState(\Magento\Sales\Model\Order::STATE_PROCESSING, true);
    $order->setStatus(\Magento\Sales\Model\Order::STATE_PROCESSING);
    $order->addStatusToHistory($order->getStatus(), 'Order processed successfully with reference');
    $order->save();
}

Nouvel e-mail de commande

$orderid = '10000000';
$order = $this->_objectManager->get('Magento\Sales\Model\Order')->loadByIncrementId($orderid);
$this->_objectManager->get('Magento\Sales\Model\Order\Email\Sender\OrderSender')->send($order);
gelanivishal
la source
grand merci pour la réponse @calypso mais je veux mettre à jour uniquement le statut de la commande
Rahul Katoch
@Rahulocodewire Il est également en commentaire.
gelanivishal
@ calypso veuillez expliquer où j'ai mis ce code dans mon module
Rahul Katoch
comment afficher l'état en attente dans le contrôleur?
Rahul Katoch
5

Puisque load () et save () sont obsolètes maintenant (parce que :)

* @deprecated 100.1.0 because entities must not be responsible for their own loading.
* Service contracts should persist entities. Use resource model "load" or collections to implement
* service contract model loading operations.

J'ai utilisé OrderRepositoryInterface pour charger et enregistrer la commande:

use Magento\Sales\Api\OrderRepositoryInterface;

public function __construct(
    OrderRepositoryInterface $orderRepository,
    ...
) {
    $this->orderRepository = $orderRepository;
}

...
$order = $this->orderRepository->get($orderId);
$order->setState(\Magento\Sales\Model\Order::STATE_PAYMENT_REVIEW);
$order->setStatus(\Magento\Sales\Model\Order::STATE_PAYMENT_REVIEW);

try {
    $this->orderRepository->save($order);
} catch (\Exception $e) {
    $this->logger->error($e);
    $this->messageManager->addExceptionMessage($e, $e->getMessage());
}

J'espère que cela aide

medmek
la source
comment mettre à jour le statut d'une commande personnalisée?
jafar pinjar
3

Magento 2.2.2 Cela ne fonctionne que de la manière suivante!

    $order = $this->order->loadByIncrementId('000000001');
    //$order = $this->order;
    $order->setState(\Magento\Sales\Model\Order::STATE_PROCESSING, true)->save();
    $order->setStatus(\Magento\Sales\Model\Order::STATE_PROCESSING, true)->save();
    $order->addStatusToHistory($order->getStatus(), 'Order processed successfully with reference again and again');
    //$order->save();

Mais le seul problème que j'ai, c'est qu'il ne met pas à jour complètement le statut: entrez la description de l'image ici

Il ne met à jour que dans la grille et ce qui suit: entrez la description de l'image ici

Il n'est également pas possible de créer de nouvelles factures, frais d'expédition et avoir. Merci

Juliano Vargas
la source
3

Merci à @medmek et @ prince-patel de répondre. À la question de @ jafar-pinjar concernant le statut de la commande personnalisée, les appels setState et setStatus peuvent prendre le code d'état. Par exemple, le code d'état personnalisé "payé" est créé. Pour mettre à jour l'état / l'état d'une commande:

...
use \Magento\Sales\Api\OrderRepositoryInterface;

class nameOfTheClass {
    ...
    protected $_orderRepository;
    ...
    public function __construct(..., OrderRepositoryInterface $orderRepository, ...){

        $this->_orderRepository = $orderRepository;
        ...
    }
    ...
    public function setOrderStatus($orderID, $statusCode){
        try{
            // obtain the order with the order ID
            $order = $this->_orderRepository->get($orderID);
            $order->setState($statusCode)->setStatus($statusCode);
            $this->_orderRepository->save($order);
            return true;
        } catch (\Exception $e){
            // add some logging here
            return false;
        }
    }
    ...
}

Pour mettre à jour le statut de la commande:

$orderID = 1234; // this is the order ID
$code = 'paid';
$this->setOrderStatus($orderID, $code);

J'espère que cela aide quelqu'un là-bas.

qgor
la source
1
l'identifiant incrémentiel est comme # 3000001469-1, pas 1234. 1234 est plutôt l'identifiant de commande
Greck
Merci d'avoir signalé @Greck. Mise à jour de la réponse.
qgor