I mistakenly canceled one order and spent a day to go through magento & different forums and blogs and searching for a solution and this is how i fixed myself after few tries. I am still not sure how to extend the controller so i modified the core file and made a copy so i can paste back if overwritten when upgrade or i can copy when i find the solution how to extend or override a magento controllers.
Create a file @ app\code\local\Codefight\Adminhtml\Block\Sales\Order\Grid.php
<?php /** * Adminhtml sales orders grid * * @category Mage * @package Mage_Adminhtml * @author Damodar Bashyal */ class Codefight_Adminhtml_Block_Sales_Order_Grid extends Mage_Adminhtml_Block_Sales_Order_Grid { public function __construct() { parent::__construct(); } protected function _prepareMassaction() { $this->setMassactionIdField('entity_id'); $this->getMassactionBlock()->setFormFieldName('order_ids');if (Mage::getSingleton('admin/session')->isAllowed('sales/order/actions/cancel')) { $this->getMassactionBlock()->addItem('cancel_order', array( 'label'=> Mage::helper('sales')->__('Cancel'), 'url' => $this->getUrl('*/*/massCancel'), )); } if (Mage::getSingleton('admin/session')->isAllowed('sales/order/actions/changestatus')) { $this->getMassactionBlock()->addItem('changestatus_order', array( 'label'=> Mage::helper('sales')->__('Undo Cancel'), 'url' => $this->getUrl('*/*/massChangestatus'), )); } if (Mage::getSingleton('admin/session')->isAllowed('sales/order/actions/hold')) { $this->getMassactionBlock()->addItem('hold_order', array( 'label'=> Mage::helper('sales')->__('Hold'), 'url' => $this->getUrl('*/*/massHold'), )); } if (Mage::getSingleton('admin/session')->isAllowed('sales/order/actions/unhold')) { $this->getMassactionBlock()->addItem('unhold_order', array( 'label'=> Mage::helper('sales')->__('Unhold'), 'url' => $this->getUrl('*/*/massUnhold'), )); } $this->getMassactionBlock()->addItem('pdfinvoices_order', array( 'label'=> Mage::helper('sales')->__('Print Invoices'), 'url' => $this->getUrl('*/*/pdfinvoices'), )); $this->getMassactionBlock()->addItem('pdfshipments_order', array( 'label'=> Mage::helper('sales')->__('Print Packingslips'), 'url' => $this->getUrl('*/*/pdfshipments'), )); $this->getMassactionBlock()->addItem('pdfcreditmemos_order', array( 'label'=> Mage::helper('sales')->__('Print Credit Memos'), 'url' => $this->getUrl('*/*/pdfcreditmemos'), )); $this->getMassactionBlock()->addItem('pdfdocs_order', array( 'label'=> Mage::helper('sales')->__('Print All'), 'url' => $this->getUrl('*/*/pdfdocs'), )); return $this; } }
Now Create another file: app\etc\modules\Codefight_Adminhtml.xml
<?xml version="1.0"?> <config> <modules> <Codefight_Adminhtml> <active>true</active> <codePool>local</codePool> </Codefight_Adminhtml> </modules> <global> <blocks> <adminhtml> <rewrite> <sales_order_grid>Codefight_Adminhtml_Block_Sales_Order_Grid</sales_order_grid> </rewrite> </adminhtml> </blocks> </global> </config>
Now, add the new function on the controller: app/code/core/mage/adminhtml/controllers/sales/ordercontroller.php
public function massChangestatusAction() { $orderIds = $this->getRequest()->getPost('order_ids', array()); $countCancelOrder = 0; $countNonCancelOrder = 0; foreach ($orderIds as $orderId) { $w = Mage::getSingleton('core/resource')->getConnection('core_write'); $result = $w->query("select item_id, qty_canceled from `sales_flat_order_item` where `order_id`={$orderId}"); $_is_canceled = FALSE; while ($row = $result->fetch(PDO::FETCH_ASSOC)) { $_is_canceled = FALSE; if($row['qty_canceled'] > 0) $_is_canceled = TRUE; //If the order was canceled... if($_is_canceled) { //Reset canceled qty to 0 $update = $w->query("UPDATE `sales_flat_order_item` SET qty_canceled=0 WHERE `item_id`={$row['item_id']}"); } } //If the order was canceled... when undoing cancel change back all original values. if($_is_canceled) { $result = $w->query("select * from `sales_order` where `entity_id`={$orderId}"); while ($row = $result->fetch(PDO::FETCH_ASSOC)) { // $update = $w->query(" UPDATE `sales_order` SET shipping_invoiced = '" . $row['shipping_amount'] . "', base_shipping_invoiced = '" . $row['base_shipping_amount'] . "', tax_invoiced = '" . $row['tax_amount'] . "', base_tax_invoiced = '" . $row['tax_amount'] . "', base_subtotal_invoiced = '" . $row['base_subtotal'] . "', subtotal_invoiced = '" . $row['subtotal'] . "', total_paid = '" . $row['grand_total'] . "', total_invoiced = '" . $row['grand_total'] . "', base_total_paid = '" . $row['base_grand_total'] . "', base_total_invoiced = '" . $row['base_grand_total'] . "', status = 'processing', state = 'processing', subtotal_canceled = '0', tax_canceled = '0', shipping_canceled = '0', base_subtotal_canceled = '0', base_shipping_canceled = '0' WHERE `entity_id`={$row['entity_id']}"); $countCancelOrder++; } } else { $countNonCancelOrder++; } } if ($countNonCancelOrder) { if ($countCancelOrder) { $this->_getSession()->addError($this->__('%s order(s) could not be updated', $countNonCancelOrder)); } else { $this->_getSession()->addError($this->__('Order(s) can not be updated')); } } if ($countCancelOrder) { $this->_getSession()->addSuccess($this->__('%s order(s) successfully updated', $countCancelOrder)); } $this->_redirect('*/*/'); }
DS posted on - Saturday 5th of June 2010 01:08:51 AM
Damodar Bashyal posted on - Saturday 5th of June 2010 01:12:26 AM
I tested with Simple products only as that was required for my client, i haven't tested with configurable so i am unable to say for sure.
Alan posted on - Saturday 10th of July 2010 04:27:35 PM
As a side note line 17 on the first block of code has a 2 <p> tags which need to be deleted.
Nick posted on - Wednesday 8th of September 2010 03:13:54 PM
louis vuitton posted on - Friday 24th of September 2010 01:25:48 AM
adfab posted on - Tuesday 16th of November 2010 04:41:56 PM
$w->query("select item_id, qty_canceled from `sales_flat_order_item` where product_type= 'configurable' and `order_id`={$orderId}");
$w->query("UPDATE `sales_flat_order_item` SET qty_canceled=0 WHERE product_type= 'configurable' and `item_id`={$row['item_id']}");
Nick posted on - Saturday 11th of December 2010 03:24:29 PM
Gabriel Queiroz - Flow eCommerce posted on - Thursday 23rd of December 2010 02:55:47 AM
Here is what i did:
public function massStatusChangeAction() {
$orderIds = $this->getRequest()->getPost('order_ids', array());
$status = $this->getRequest()->getPost('status', array());
foreach ($orderIds as $orderId) {
$order = Mage::getModel('sales/order')->load($orderId);
if ($order->getEntityId()) {
if ($order->getStatus() == 'canceled') {
foreach($order->getItemsCollection() as $item)
{
if ($item->getQtyCanceled() > 0)
$item->setQtyCanceled(0)->save();
}
$order
->setBaseDiscountCanceled(0)
->setBaseShippingCanceled(0)
->setBaseSubtotalCanceled(0)
->setBaseTaxCanceled(0)
->setBaseTotalCanceled(0)
->setDiscountCanceled(0)
->setShippingCanceled(0)
->setSubtotalCanceled(0)
->setTaxCanceled(0)
->setTotalCanceled(0);
}
$order
->setStatus($status)
->setState($status)
->save();
}
}
$path_to_local_xml = Mage::getBaseDir() . "/app/etc/local.xml";
$admin_path = $this->parseLocalXML($path_to_local_xml);
$this->_redirect($admin_path . '/sales_order/index/');
}
Cheers,
Gabriel