Magento 1.7 – How to Reorder via Code & Set New Payment Method

magento-1.7magento-community

I'm attempting to reorder via code using the follow code from: https://stackoverflow.com/a/7122181/2758139

$orderId= $YOUR_ORDER_NUMBER;
$personsOrder = Mage::getModel('sales/order')->load($orderId);
$order_model = Mage::getSingleton('adminhtml/sales_order_create');
$personsOrder->setReordered(true);
$order_model->initFromOrder($personsOrder);
$order_model->createOrder();

This code works great. However, I am trying to set a different payment method while trying to do this. The following is what I have:

$orderId= $YOUR_ORDER_NUMBER;
$personsOrder = Mage::getModel('sales/order')->load($orderId);
$order_model = Mage::getSingleton('adminhtml/sales_order_create');
$personsOrder->setReordered(true);
$order_model->initFromOrder($personsOrder);
/* Trying this */
$order_model->getQuote()->setPayment(array('method' => 'free'));
/* ---- */
$order_model->createOrder();

The new code trying to set the different payment method doesn't seem to be working. I've debugged and followed the code to where it validates the payment method in the core of Adminhtml/Model/Order/Create.php and where it get the method $method = $this->getQuote()->getPayment()->getMethodInstance(); but it is still the original payment method.

How do I set a new payment method when reordering via code?

Best Answer

After quite a bit of debugging the code and following how the admin side reorders, I found the solution. Instead of editing the quote, I could edit the original order before setReorder(true).

Below is my final code that works (which works for any active payment method).

Example for reordering on the Check Method.

$personsOrder = Mage::getModel('sales/order')->load($orderId);

/* Set different payment method */
$personsOrder->getPayment()->setMethod('checkmo');
$personsOrder->getPayment()->setMethodInstance(
    Mage::getModel('payment/method_checkmo')->setInfoInstance(
        $personsOrder->getPayment()->getMethodInstance()->getInfoInstance()));
/* /Set different payment method */

Mage::getSingleton('adminhtml/sales_order_create')->initFromOrder($personsOrder->setReordered(true))->createOrder();
Related Topic