Forzar una orden para ir al estado completo

11

Estamos utilizando un módulo personalizado que requiere el estado: "completo" (no puedo cambiar el módulo porque usa ioncube)

También estamos utilizando un sistema de pago que no ofrece la opción de estado: "completo"

Entonces mi pregunta es: ¿Cómo puedo forzar una orden para que se complete el estado?

PD: esto no funciona:

$order = Mage::getSingleton('sales/order');
$order->loadByIncrementId('12345');
$order->setState(Mage_Sales_Model_Order::STATE_COMPLETE, true);
$order->save();
Bob van Luijt
fuente
La solución provista aquí: magento.stackexchange.com/a/244601/15769 Funciona para mí. <br/> Espero que sea útil para cualquiera que use Magento 1.9.2.4 <br/> Gracias @ ctrl-z pls

Respuestas:

12

No está permitido establecer manualmente el estado del pedido en 'completo' y debería recibir esta excepción cuando llame setStateal pedido con el estado 'completo':

El estado del pedido "completo" no debe establecerse manualmente.

La razón de esto es simple: el estado 'completo' (y el estado, ya que es el único estado con un estado de 'completo') está destinado a indicar que un pedido se ha completado por completo. Es decir, se ha colocado, facturado y enviado al cliente.

Una vez que el pedido ha sido facturado y enviado, Magento establecerá este estado en el pedido automáticamente.

Si su sistema de pago "no permite" el estado 'completo', entonces no confiaría en él, especialmente si está codificado con ionCube. Sin embargo, si es porque está manejando la facturación fuera de Magento, entonces deberá generar manualmente una factura "fuera de línea" para el pedido, de modo que Magento reconozca que se ha pagado.

No intente hacer un cambio corto evitando el problema de que las órdenes no lleguen al estado completado como deberían hacerlo normalmente. En su lugar, solucione el problema real asegurándose de que los pedidos se facturen y envíen en Magento para que el sistema los marque como completos.

davidalger
fuente
Esto no responde la pregunta. Si bien aborda las razones por las que esto no debe hacerse, eso no es un todo para todo. Yo mismo he adquirido una situación en la que se omite la mayor parte de Magento para el procesamiento de pedidos y el pedido debe establecerse en el estado completo.
Navarr
1
@Navarr en realidad lo hace ... vea la parte sobre la generación manual de una factura fuera de línea para el pedido. Haga eso, y el pedido se moverá para completarse independientemente del procesador de pagos que se utilice.
davidalger
3
o, ya sabes: stackoverflow.com/a/8906785/43790
Navarr
2
@Navarr Claro, también se podría escribir directamente en la base de datos a través de SQL, pero eso no niega que sea un estado protegido según la implementación del modelo. Las mejores respuestas no responden ciegamente a "vamos a lograr x" sin abordar el asunto subyacente. De todos modos, esto es lo último que comentaré aquí con respecto a esto.
davidalger
Engin Compruebe la luz encendida en el tablero del automóvil. No sabía cómo solucionar el problema. Luego quité el fusible que enciende esa pequeña luz. Creo que mi motor funciona bien ahora.
Mohammed Joraid
0

Para cambiar el estado:

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

Para cambiar el estado:

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

Y entonces $order->save();

Debe cambiar el estado utilizando setDatapara evitar que la excepción le indique que no puede llamar manualmentesetState

Ctrl-Z PLS
fuente
-3

Prueba esto.

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

A mí me funciona en mi proyecto.

Kuldeep
fuente
Ajá, entonces has 'reiniciado' el pedido y luego lo has configurado como: nuevo-> pendiente-> completado?
Bob van Luijt
No, cargué el pedido y luego asigné el nuevo estado y estado al pedido.
Kuldeep
Este es el estado / estado nuevo / pendiente, lo cual no es un problema. El problema real es cómo configurarlo para que se "complete" manualmente.
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);
seudónimo
fuente
Desalentaría el uso de la ejecución directa de SQL y confiaría en la implementación de Magento ORM.
7ochem