Magento 2: Como atualizar o status do pedido programaticamente no módulo personalizado?

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

Diga-me como atualizo o status do pedido no Magento 2?

Rahul Katoch
fonte

Respostas:

19

Você pode fazer isso da seguinte maneira

declarar abaixo do espaço para nome

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

Espero que isto ajude

Dhaval Solanki
fonte
Obrigado pela resposta @Dhaval Drcsystems eu quero status do pedido actualização só
Rahul Katoch
Você pode consultar este modelo para ter uma ideia melhor Magento \ Vendas \ Modelo \ Pedido \ Pagamento Verifique aqui como eles estão processando o pedido com o código.
Dhaval Solanki
o código acima mostra erro \ Magento \ Sales \ Model \ Order not found #
Jaisa
Você pode me mostrar seu arquivo?
Dhaval Solanki
Como atualizar o status do pedido personalizado? Se eu tiver um status chamado 'sent_to_print'?
Jafar pinjar
12

Atualização do estado do pedido

Para atualizar o estado e o status do pedido de forma programática, defina o status e o estado nesse formato. Inicie o objeto de pedido na função de construção e use esse objeto de pedido na função personalizada para atualizá-lo. Para atualizar programaticamente o estado do pedido no modelo, obtenha o objeto de pedido na função de construção.

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

Novo e-mail de pedido

$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
fonte
grandes agradecimentos para @calypso resposta, mas eu quero atualizar apenas o status do pedido
Rahul Katoch
@Rahulocodewire Também está nos comentários.
gelanivishal
@ Calypso explique onde eu colocar esse código no meu módulo
Rahul Katoch
como mostro o status pendente no controlador?
Rahul Katoch
5

Como load () e save () estão obsoletos agora (porque :)

* @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.

Eu usei o OrderRepositoryInterface para carregar e salvar o pedido:

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

Espero que ajude

medmek
fonte
como atualizar o status do pedido personalizado?
Jafar pinjar
3

Magento 2.2.2 Isso funciona da seguinte maneira!

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

Mas o único problema que tenho é que ele não atualiza totalmente o status: insira a descrição da imagem aqui

Ele atualiza apenas o na grade e o seguinte: insira a descrição da imagem aqui

Também não é possível criar nova fatura, remessa e nota de crédito. obrigado

Juliano Vargas
fonte
3

Graças à resposta @medmek e @ prince-patel. Como pergunta de @ jafar-pinjar sobre o status do pedido personalizado, as chamadas setState e setStatus podem assumir o Código de Status. Por exemplo, o código de status personalizado "pago" é criado. Para atualizar o status / estado para um pedido:

...
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;
        }
    }
    ...
}

Para atualizar o status do pedido:

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

Espero que ajude alguém lá fora.

qgor
fonte
11
ID incremental é como # 3000001469-1, não 1234. 1234 é bastante id fim
Greck
Obrigado por apontar isso para @Greck. Atualizado a resposta.
qgor