magento - How to prevent an order from being cancelled using event observer? -


i using following code prevent order being cancelled magento admin panel.

<?xml version="1.0"?> <config>     <modules>         <muk_ordercancel>             <version>1.0.0</version>         </muk_ordercancel>     </modules>     <global>         <models>             <ordercancel>                 <class>muk_ordercancel_model</class>             </ordercancel>         </models>         <events>              <sales_order_save_before>                 <observers>                      <ordercancel>                         <type>singleton</type>                         <class>muk_ordercancel_model_observer</class>                         <method>cancancelorder</method>                      </ordercancel>                 </observers>             </sales_order_save_before>         </events>         <helpers>             <ordercancel>                 <class>muk_ordercancel_model_helper</class>             </ordercancel>         </helpers>     </global> </config> 

in observer using following code:

<?php class muk_ordercancel_model_observer {     public function cancancelorder( varien_event_observer $observer )     {                 $incrementid = $observer->getevent()->getorder()->getdata('increment_id');          $order = mage::getmodel('sales/order')->loadbyincrementid($incrementid);          $adminusersession = mage::getsingleton('admin/session');          $adminuserid = $adminusersession->getuser()->getuserid();          $adminusername = $adminusersession->getuser()->getusername();          $adminrolename = mage::getmodel('admin/user')->load($adminuserid)                 ->getrole()->getdata('role_name');                  if($adminrolename) { //some condition                         $order->setactionflag(mage_sales_model_order::action_flag_cancel, false);                     }            } } 

but after enabling module, order getting cancelled.

how can prevent order being cancelled?

in "mage_adminhtml_sales_ordercontroller" "cancelaction" goes:

$order->cancel()        ->save(); 

which means order first cancelled observer fires. although found event:

mage::dispatchevent('sales_order_payment_cancel', array('payment' => $this)); 

in "mage_sales_model_order_payment" fires before: "mage_sales_model_order" : "registercancellation" method.

in observer method fires on event can this:

if ($adminrolename) { $payment = $observer-&gt;getevent()-&gt;getpayment(); $order = $payment-&gt;getorder(); $order-&gt;setactionflag(mage_sales_model_order::action_flag_cancel, false); //get existing non cancelled orders if exist, if not create array , add admin session. $orderids = mage::getsingleton('adminhtml/session')-&gt;getnoncancelledorders(); if (!$orderids) {     $orderids = array($order-&gt;getid()); } else {     $orderids[] = $order-&gt;getid(); } mage::getsingleton('adminhtml/session')-&gt;setnoncancelledorders($orderids); } 

next, add 1 more observer in etc/config.xml file on following event: "controller_action_predispatch":

<controller_action_predispatch>     <observers>          <check_session_message>             <type>singleton</type>             <class>muk_ordercancel_model_observer</class>             <method>checksessionmessage</method>          </check_session_message>     </observers> </controller_action_predispatch> 

then in observer method:

public function checksessionmessage($observer) {     //check if have admin order view or grid action     $request = mage::app()->getrequest();     $module = $request->getmodulename();     $controller = $request->getcontrollername();     $action = $request->getactionname();     if ($module == 'admin' && $controller == 'sales_order') {         if ($action == 'view' || $action == 'index') {             //check if have orderids             $orderids = mage::getsingleton('adminhtml/session')->getnoncancelledorders();             if ($orderids && count($orderids) > 0) {                 //unset them session                 mage::getsingleton('adminhtml/session')->unsnoncancelledorders();                 //clear success message                 mage::getsingleton('adminhtml/session')->getmessages(true);                 //add error message                 mage::getsingleton('adminhtml/session')->adderror('you not allowed cancel order(s)');             }         }     } } 

Comments