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->getevent()->getpayment(); $order = $payment->getorder(); $order->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')->getnoncancelledorders(); if (!$orderids) { $orderids = array($order->getid()); } else { $orderids[] = $order->getid(); } mage::getsingleton('adminhtml/session')->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
Post a Comment