Pour certaines raisons, il peut s’avérer utile de vérifier les informations d’un avoir (remboursement, creditmemo pour les intimes) avant de l’autoriser. Voici un petit tuto et les conditions que j’ai mis en place :
– La commande doit avoir une expédition
– La commande doit avoir un numéro de tracking
– La commande doit être remboursée « Hors Ligne »
– Chaque ligne de commande doit être remboursée intégralement
Commençons d’abord par mettre en place notre observer :
<events> <sales_order_payment_refund> <observers> <check_exp_before_creditmemo> <type>singleton</type> <class>MiniMax_Mymodule_Model_Observer</class> <method>beforeCreditMemo</method> </check_exp_before_creditmemo> </observers> </sales_order_payment_refund> </events>
Dans notre classe, qui s’appelle ici MiniMax_Mymodule_Model_Observer, voici la méthode que j’ai mise en place :
<?php class Minimax_Mymodule_Model_Observer { /** * Check if order is shipped before make a refund * * @param Varien_Event_Observer $observer */ public function beforeCreditMemo(Varien_Event_Observer $observer) { $creditmemo = $observer->getCreditmemo(); $payment = $observer->getPayment(); // you can get some infos, don't mind here but can be helpfull $offlineRequested = $creditmemo->getOfflineRequested(); $order = $creditmemo->getOrder(); $orderId = $order->getId(); $explainMessage = Mage::helper('minimax_mymodule')->__('An order must order must :'); $explainMessage .= '<br />'.Mage::helper('minimax_mymodule')->__('- Have a shipment'); $explainMessage .= '<br />'.Mage::helper('minimax_mymodule')->__('- Have a tracking number'); $explainMessage .= '<br />'.Mage::helper('minimax_mymodule')->__('- Be refunded offline'); $explainMessage .= '<br />'.Mage::helper('minimax_mymodule')->__('- Have a refunded quantity equal to invoiced quantity for one item'); // If not refunded offline, exception if(!$offlineRequested){ $message = Mage::helper('minimax_mymodule')->__('This order must be refunded offline'); Mage::throwException($message.'<br />'.$explainMessage); } // If no shipment, exception if(!$order->hasShipments()) { $message = Mage::helper('minimax_mymodule')->__('This order must be shipped before refund'); Mage::throwException($message.'<br />'.$explainMessage); } // If no tracking number, exception if(!$order->getTracksCollection()->count()){ $message = Mage::helper('minimax_mymodule')->__('This order must be have a tracking number'); Mage::throwException($message.'<br />'.$explainMessage); } $items = $creditmemo->getAllItems(); foreach($items AS $item){ $refundedQty = (float) $item->getQty(); $invoicedQty = (float) $item->getOrderItem()->getQtyInvoiced(); if($refundedQty != $invoicedQty){ $message = Mage::helper('minimax_mymodule')->__('You must refund an item completely for this order'); Mage::throwException($message.'<br />'.$explainMessage); } } // Everything is OK, we can continue return $this; } }
Et voilà ! Les différentes vérifications sont présentes lors d’un remboursement. Pour les traductions, vous les mettrez dans le XML de votre module, et les voici pour les flemmards :
"An order must :","Une commande doit :" "- Have a shipment","- Être expédiée" "- Have a tracking number","- Avoir un numéro de tracking" "- Be refunded offline","- Être remboursée Hors Ligne" "This order must be refunded offline","Cette commande doit être remoursée Hors Ligne" "This order must be shipped before refund","Cette commande doit être expédiée avant remboursement" "This order must be have a tracking number","Cette commande doit avoir un numéro de tracking" "- Have a refunded quantity equal to invoiced quantity for one item","- Pour une ligne de commande, la quantité remboursée doit être égale à la quantité facturée" "You must refund an item completely for this order","Il faut rembourser intégralement une ligne de commande pour cette commande"
Et voilà, on ajoute nos vérification et cela, sans surcharge du core de Magento !