Forçar um pedido a ir para o status completo

11

Estamos usando um módulo personalizado que requer o status: "completo" (não consigo alterar o módulo porque ele usa o ioncube)

Também estamos usando um sistema de pagamento que não oferece a opção de status: "completo"

Portanto, minha pergunta é: como forçar um pedido para ir ao status completo?

PS: Isso não funciona:

$order = Mage::getSingleton('sales/order');
$order->loadByIncrementId('12345');
$order->setState(Mage_Sales_Model_Order::STATE_COMPLETE, true);
$order->save();
Bob van Luijt
fonte
A solução fornecida aqui: magento.stackexchange.com/a/244601/15769 Funciona para mim. <br/> Espero que seja útil para quem usa o Magento 1.9.2.4 <br/> Thanks @ ctrl-z pls

Respostas:

12

Não é permitido definir manualmente o estado do pedido como 'concluído' e você deve receber essa exceção ao chamar setStateo pedido com o estado 'concluído':

O estado do pedido "concluído" não deve ser definido manualmente.

A razão para isso é simples: o estado 'completo' (e o status, já que é o único estado com o status 'completo') pretende indicar que um pedido foi completamente preenchido. Ou seja, foi colocado, faturado e enviado ao cliente.

Depois que o pedido for faturado e enviado, o Magento definirá esse estado no pedido automaticamente.

Se o seu sistema de pagamento "não permitir" o status 'completo', não confiaria nele, especialmente com a codificação do ionCube. Se, no entanto, é porque está lidando com o faturamento fora do Magento, você precisará gerar manualmente uma fatura "Off-line" para o pedido, para que o Magento reconheça que foi pago.

Não tente se enganar, contornando o problema de os pedidos não atingirem o estado concluído, como normalmente deveriam. Em vez disso, corrija o problema real, certificando-se de que os pedidos sejam faturados e enviados no Magento para que sejam marcados como concluídos pelo sistema.

davidalger
fonte
Isso não responde à pergunta. Apesar de abordar os motivos pelos quais isso não deveria ser feito, isso não é um problema para tudo. Eu mesmo adquiri uma situação em que a maioria do Magento para processamento de pedidos é ignorada e o pedido precisa ser definido com o status completo.
Navarr 26/03
1
@ Navarr, na verdade, ele faz ... veja a parte sobre a geração manual de uma fatura offline para o pedido. Faça isso e o pedido será concluído, independentemente do processador de pagamento utilizado.
26615 davidalger
3
ou, você sabe: stackoverflow.com/a/8906785/43790
Navarr 26/15
2
@ Navarr Claro, também é possível gravar diretamente no banco de dados via SQL, mas isso não nega que seja um estado protegido pela implementação do modelo. As melhores respostas não respondem cegamente a "vamos realizar x" sem abordar a questão subjacente. De qualquer forma, esta é a última vez que vou comentar aqui sobre isso.
davidalger
Engin Verifique a luz acesa no painel do carro. Eu não sabia como resolver o problema. Em seguida, removi o fusível que liga a pouca luz. Acho que meu motor está funcionando bem agora.
Mohammed Joraid 17/02
0

Para alterar o estado:

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

Para alterar o status:

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

E depois $order->save();

Você deve alterar o estado usando setDatapara evitar que a exceção diga que você não pode ligar manualmentesetState

ctrl-z pls
fonte
-3

Tente isso.

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

Funciona para mim no meu projeto ..

Kuldeep
fonte
Ah, então você 'reiniciou' o pedido e o definiu para: novo-> pendente-> concluído?
Bob van Luijt
Não, carreguei o pedido e, em seguida, atribui o novo status e estado ao pedido.
Kuldeep
Este é o estado / status novo / pendente, o que não é problema. O problema real é como configurá-lo para 'concluir' manualmente.
7ochem 29/10/2015
-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);
anonimato
fonte
Eu desencorajaria o uso da execução direta do SQL e confiaria na implementação do Magento ORM.
7ochem 29/10/2015