Réinitialiser une commande annulée (Undo Cancel)

  • De le 23 juillet 2012
  • Difficulté : 2/4

Réinitialiser une commande annulée (Undo Cancel) Si une commande a été annulée par mégarde, Magento ne permet pas de revenir en arrière (il est juste possible de renouveler la commande). Un petit module va nous permettre de le faire rapidement (compatible avec toutes les versions de Magento).

La réinitialisation de la commande à son statut initial (pending) s'effectuera depuis la liste des commandes, menu Actions :

Réinitialiser une commande

Ce module est compatible avec la totalité des versions de Magento.

Architecture du module

  • app/code/local/Magentix/UndoCancel/Block/Sales/Order/
  • Grid.php
  • app/code/local/Magentix/UndoCancel/controllers/Adminhtml/
  • UndoController.php
  • app/code/local/Magentix/UndoCancel/etc/
  • config.xml
  • app/code/local/Magentix/UndoCancel/Helper/
  • Data.php
  • app/code/local/Magentix/UndoCancel/Model/
  • Undo.php
  • app/etc/modules/
  • Magentix_UndoCancel.xml

Développement du module

Le module dispose d'un helper, d'un model, d'un contrôleur et de la réécriture d'un bloc pour ajouter la nouvelle sélection au menu Actions. Indiquons le dans le fichier config.xml :

app/code/local/Magentix/UndoCancel/etc/config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Magentix_UndoCancel>
            <version>0.1.0</version>
        </Magentix_UndoCancel>
    </modules>
    <global>
        <models>
            <undocancel>
                <class>Magentix_UndoCancel_Model</class>
            </undocancel>
        </models>
        <helpers>
            <undocancel>
                <class>Magentix_UndoCancel_Helper</class>
            </undocancel>
        </helpers>
        <blocks>
            <adminhtml>
                <rewrite>
                    <sales_order_grid>Magentix_UndoCancel_Block_Sales_Order_Grid</sales_order_grid>
                </rewrite>
            </adminhtml>
        </blocks>
    </global>
    <admin>
        <routers>
            <!-- Edit 24/07/12 : Obsolète -->
            <!--<undocancel>
                <use>admin</use>
                <args>
                    <module>Magentix_UndoCancel</module>
                    <frontName>undocancel</frontName>
                </args>
            </undocancel>-->

            <!-- Meilleure déclaration (suggérée par SeL) -->
            <adminhtml>
                <args>
                    <modules>
                        <Magentix_UndoCancel before="Mage_Adminhtml">Magentix_UndoCancel_Adminhtml</Magentix_UndoCancel>
                    </modules>
                </args>
            </adminhtml>
        </routers>
    </admin>
</config>

Ajoutons la méthode chargée de réinitialiser la commande :

app/code/local/Magentix/UndoCancel/Model/Undo.php

<?php

class Magentix_UndoCancel_Model_Undo extends Mage_Core_Model_Abstract {

    public function undoCancel($orderId) {
        $order = Mage::getModel('sales/order')->load($orderId);

        if (!$order->getEntityId()) Mage::throwException(Mage::helper('undocancel')->__('Invalid Order'));

        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)
              ->setState(Mage_Sales_Model_Order::STATE_NEW,true,Mage::helper('undocancel')->__('Order successfully updated.'));

        $order->save();

        return $order;
    }

}

Puis le contrôleur constituée d'une unique action :

app/code/local/Magentix/UndoCancel/controllers/Adminhtml/UndoController.php

<?php

class Magentix_UndoCancel_Adminhtml_UndoController extends Mage_Adminhtml_Controller_Action {

    public function indexAction() {
        $orderIds = $this->getRequest()->getPost('order_ids', array());

        if(count($orderIds) == 1) {
            try {
                $order = Mage::getModel('undocancel/undo')->undoCancel(reset($orderIds));
                $this->_getSession()->addSuccess($this->__('The order '.$order->getIncrementId().' was successfully updated.'));
            } catch(Exception $e) {
                $this->_getSession()->addError($this->__('Cannot update the order : %s.',$e->getMessage()));
            }
        } else {
            $this->_getSession()->addError($this->__('Select only a single command.'));
        }

        $this->_redirect('adminhtml/sales_order');
    }

    public function _getSession() {
        return Mage::getSingleton('adminhtml/session');
    }

}

Notez que par mesure de sécurité, une seule commande peut être réinitialisée à la fois.

Nous pouvons maintenant surcharger la classe Mage_Adminhtml_Block_Sales_Order_Grid pour ajouter la sélection au menu. Cette classe est surchargée par de nombreux modules. Il est fort possible que cette surcharge entre en conflit avec un autre module déjà installé, et que par conséquent rien ne s'affiche. Il faudra alors adapter.

app/code/local/Magentix/UndoCancel/Block/Sales/Order/Grid.php

<?php

class Magentix_UndoCancel_Block_Sales_Order_Grid extends Mage_Adminhtml_Block_Sales_Order_Grid {

    protected function _prepareMassaction() {
        parent::_prepareMassaction();
        $this->getMassactionBlock()->addItem('undocancel',array(
                'label'=> $this->__('Undo Cancel'),
                'url'  => $this->getUrl('*/undo'),
            )
        );

    }
}

Reste le Helper pour la gestion des traductions :

app/code/local/Magentix/UndoCancel/Helper/Data.php

<?php

class Magentix_UndoCancel_Helper_Data extends Mage_Core_Helper_Abstract {

}

Le module est prêt, il nous suffit de l'activer, puis de rafraîchir le cache.

app/etc/modules/Magentix_UndoCancel.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Magentix_UndoCancel>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Sales />
            </depends>
        </Magentix_UndoCancel>
    </modules>
</config>

Nous pouvons maintenant réinitialiser une commande dont le statut est "annulé".

Réinitialiser une commande annulée
commentaires

Commentez cet article : Réinitialiser une commande annulée (Undo Cancel)