Magento 2: ¿Cómo actualizar el estado del pedido mediante programación en un 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();

¿Dime cómo actualizo el estado del pedido en Magento 2?

Rahul Katoch
fuente

Respuestas:

19

Puedes hacerlo de la siguiente manera

declarar debajo del espacio de nombres

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 esto ayude

Dhaval Solanki
fuente
gracias por responder @Dhaval Drcsystems solo quiero actualizar el estado del pedido
Rahul Katoch
Puede referir este modelo para tener una mejor idea Magento \ Sales \ Model \ Order \ Payment Compruebe aquí cómo procesan el pedido con el código.
Dhaval Solanki
el código anterior muestra \ Magento \ Sales \ Model \ Error de pedido no encontrado
Jaisa
¿Me puede mostrar su archivo?
Dhaval Solanki el
¿Cómo actualizar el estado del pedido personalizado? ¿Si tengo un estado llamado 'sent_to_print'?
jafar pinjar
12

Actualización del estado del pedido

Para actualizar el estado y el estado del pedido de forma programática, defina el estado y el estado en este formato. Inicie el objeto de orden en la función de construcción y use ese objeto de orden en la función personalizada para actualizarlo. Para actualizar el estado de orden mediante programación en el modelo, obtenga el objeto de orden de la función de construcción.

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

Nuevo correo electrónico 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
fuente
muchas gracias por responder @calypso pero quiero actualizar solo el estado del pedido
Rahul Katoch
@Rahulocodewire También está en comentario.
gelanivishal
@ calypso por favor explique dónde puse este código en mi módulo
Rahul Katoch
¿Cómo muestro el estado pendiente en el controlador?
Rahul Katoch el
5

Dado que load () y save () están en desuso ahora (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.

He utilizado el OrderRepositoryInterface para cargar y guardar el orden:

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 eso ayude

medmek
fuente
¿Cómo actualizar el estado del pedido personalizado?
jafar pinjar
3

Magento 2.2.2 ¡Esto solo funciona de la siguiente manera!

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

Pero el único problema que tengo es que no actualiza completamente el estado: ingrese la descripción de la imagen aquí

Solo actualiza el en la cuadrícula y lo siguiente: ingrese la descripción de la imagen aquí

Tampoco es posible crear una nueva factura, envío y nota de crédito. Gracias

Juliano Vargas
fuente
3

Gracias a @medmek y @ prince-patel responden. Como pregunta de @ jafar-pinjar sobre el estado del pedido personalizado, las llamadas setState y setStatus pueden tomar el Código de estado. Por ejemplo, se crea el código de estado personalizado "pagado". Para actualizar el estado / estado de un 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 actualizar el estado del pedido:

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

Espero que ayude a alguien por ahí.

qgor
fuente
1
la identificación incremental es como # 3000001469-1, no 1234. 1234 es más bien la identificación del pedido
Greck
Gracias por señalar eso @Greck. Se actualizó la respuesta.
qgor