{"id":244,"date":"2011-10-28T08:31:54","date_gmt":"2011-10-28T06:31:54","guid":{"rendered":"http:\/\/www.h-hennes.fr\/blog\/?p=244"},"modified":"2013-07-24T21:10:24","modified_gmt":"2013-07-24T19:10:24","slug":"magento-module-de-detection-des-commandes-annulees-puis-payees","status":"publish","type":"post","link":"https:\/\/www.h-hennes.fr\/blog\/2011\/10\/28\/magento-module-de-detection-des-commandes-annulees-puis-payees\/","title":{"rendered":"Magento : Module de d\u00e9tection des commandes annul\u00e9es puis pay\u00e9es"},"content":{"rendered":"<p>J&rsquo;ai r\u00e9cemment \u00e9t\u00e9 confront\u00e9 \u00e0 un probl\u00e8me de commandes annul\u00e9es, mais pay\u00e9es quand m\u00eame sur un site Magento en production avec les modes de paiements Atos et Paypal.<br \/>\nCes changements de statuts emp\u00eachent le bon fonctionnement du processus de traitement de la commande.<\/p>\n<p>Pour \u00e9viter de devoir consulter l&rsquo;ensemble des commandes, j&rsquo;ai donc d\u00e9velopp\u00e9 un module Magento pour d\u00e9tecter ces commandes qui posent probl\u00e8me.<\/p>\n<p>Voici l&rsquo;arborescence des fichiers du module :<\/p>\n<p>&#8212; app<br \/>\n&#8211;code<br \/>\n&#8212; local<br \/>\n&#8212; Test<br \/>\n&#8212; Module<br \/>\n&#8212; controllers<br \/>\n&#8212; CronController.php<br \/>\n&#8212; etc<br \/>\n&#8212; config.xml<br \/>\n&#8211;etc<br \/>\n&#8212; modules<br \/>\n&#8211;Test_Module.xml<\/p>\n<p>C&rsquo;est \u00e9galement l&rsquo;occasion de voir ensemble comment cr\u00e9er un module simple sur la plateforme ecommerce Magento. (Version 1.4.1.1)<\/p>\n<p>Pour commencer nous allons cr\u00e9er le fichier de d\u00e9claration du module \u00e0 Magento.<br \/>\nCelui-ci doit \u00eatre plac\u00e9 dans le dossier \u00ab\u00a0app\/etc\/modules\u00a0\u00bb sous la forme \u00ab\u00a0MonNamespace_MonModule.xml\u00a0\u00bb<br \/>\nVoici son contenu :<\/p>\n<pre lang=\"xml\">\r\n<xml version=\"1.0\"?>\r\n<config>\r\n <modules>\r\n <Test_Module>\r\n<active>true<\/active>\r\n <codePool>local<\/codePool>\r\n <\/Test_Module>\r\n <\/modules>\r\n<\/config><\/pre>\n<p>Dans ce fichier nous d\u00e9clarons notre module \u00e0 magento, et que celui-ci appartient au codepool \u00ab\u00a0local\u00a0\u00bb c&rsquo;est \u00e0 dire au code qui est d\u00e9velopp\u00e9 par vos soins.<\/p>\n<p>Une fois cette \u00e9tape r\u00e9alis\u00e9e, nous pouvons nous atteler \u00e0 l&rsquo;\u00e9criture du fichier de configuration du module qui sera plac\u00e9 dans le dossier \u00ab\u00a0app\/code\/local\/Test\/Module\/ect\/config.xml<br \/>\nDans ce fichier nous allons d\u00e9tailler la version du module, ainsi que son nom d&rsquo;affichage dans l&rsquo;url du site ( champ frontname )<\/p>\n<pre lang=\"xml\">\r\n<xml version=\"1.0\"?>\r\n<config>\r\n<modules>\r\n<Test_Module>\r\n<version>1.0<\/version>\r\n<\/Test_Module>\r\n<\/modules>    \r\n<frontend>\r\n<routers>\r\n<monrouteur>\r\n<use>standard<\/use>\r\n<args>\r\n<module>Test_Module<\/module>\r\n<frontName>test-module<\/frontName>\r\n<\/args>\r\n<\/monrouteur>\r\n<\/routers>\r\n<\/frontend>    \r\n<\/config><\/pre>\n<p>Ainsi configur\u00e9 notre module sera accessible via le chemin suivant : http:\/\/www.votresite.com\/index.php\/test-module\/<\/p>\n<p>Une fois le module configur\u00e9, nous allons passer au code de d\u00e9tection en lui m\u00eame qui sera appel\u00e9 via une t\u00e2che cron et ins\u00e9r\u00e9 dans le fichier suivant : \u00ab\u00a0app\/code\/local\/Test\/Module\/controllers\/CronController.php\u00a0\u00bb<\/p>\n<pre lang=\"php\">\r\n<?php\r\n\/**\r\n *\r\n * T\u00e2che cron de d\u00e9tection des commandes \u00e0 probl\u00e8mes\r\n * \r\n * @author Herv\u00e9 Hennes\r\n * @version 1.0\r\n * @package Test_Module\r\n *\/\r\n\r\n class Test_Module_cronController extends Mage_Core_Controller_Front_Action {\r\n\r\n \/**\r\n * Affichage du contenu\r\n *\r\n * @input : rien\r\n * @return : mail si n\u00e9cessaire\r\n *\r\n *\/\r\n public function indexAction() {\r\n\r\n \/\/Envoi d'un email si un probl\u00e8me est d\u00e9tect\u00e9\r\n $checkList = $this->_checkOrders();\r\n\r\n if ($checkList) {\r\n\r\n $message = '<p>Bonjour,<\/p>\r\n<p>Le script de detection des erreurs de commandes a detect\u00e9 des erreurs ce jour<\/p>\r\n<p>Voici l\\'entity_id des \u00e9l\u00e9ments concern\u00e9s :<\/p>\r\n<ul>';\r\n foreach ( $checkList as $entity_id ) {\r\n $message .= '<li>'.$entity_id.'<\/li>';    \r\n }\r\n $message .= '\r\n<\/ul>\r\n<p>Ce message vous est envoy\u00e9 automatiquement par le site : http:\/\/www.site.com<\/p>';\r\n\r\n $mail = new Zend_Mail();\r\n $mail->setBodyText('Erreur commandes,merci de consulter la version html');\r\n $mail->setBodyHtml($message);\r\n $mail->setFrom('cron@email.com', 'Cron');\r\n $mail->addTo('email@email.com', 'Sender');\r\n $mail->setSubject('Erreurs Commandes');\r\n $mail->send();\r\n\r\n }\r\n }\r\n\r\n \/**\r\n * Verifie les commandes du jour\r\n *\r\n * @input : rien\r\n * @return : array => liste des commandes \u00e0 probl\u00e8mes\r\n *\/\r\n private function _checkOrders() {\r\n\r\n $dateRecherche = date('Y-m-d');\r\n\r\n \/\/ Connexion \u00e0 la base de donn\u00e9es\r\n $db = Mage::getSingleton('core\/resource')->getConnection('core_write');\r\n\r\n \/\/Recherche des commandes\r\n $req_commandes = $db->query(\"SELECT entity_id , increment_id \r\n FROM mag_sales_flat_order \r\n WHERE DATE(created_at) = '\".$dateRecherche.\"'   \r\n OR DATE(updated_at) = '\".$dateRecherche.\"'\r\n \");                             \r\n\r\n $liste_commandes = $req_commandes->fetchAll();\r\n\r\n \/\/R\u00e9cup\u00e9ration des statuts\r\n $commandes_annulees = array();\r\n $commandes_probleme = array();\r\n\r\n foreach ( $liste_commandes as $commande ) {\r\n\r\n $req_statuts = $db->query(\"SELECT * \r\n FROM mag_sales_flat_order_status_history\r\n WHERE parent_id = \".$commande['entity_id']\r\n );\r\n $cancel_flag = false;\r\n\r\n while ($liste_statuts = $req_statuts->fetch() ) {\r\n\r\n \/\/Si on a encore un statut apr\u00e8s le statut annul\u00e9 c'est qu'il y a un probl\u00e8me\r\n if ( $cancel_flag == true && $liste_statuts['status']!= 'canceled' && !in_array($commande['entity_id'],$commandes_probleme))\r\n $commandes_probleme[] = $commande['entity_id'];\r\n\r\n \/\/Si la commande a un status annul\u00e9e on la mets dans un tableau\r\n if ( $liste_statuts['status'] == 'canceled' ) {\r\n\r\n \/\/Pour \u00e9viter les doublons (commandes annul\u00e9es X fois)\r\n if ( $cancel_flag == false ) {\r\n $cancel_flag = true;\r\n $commandes_annulees[] = $commande['entity_id'];\r\n }\r\n }\r\n\r\n }\r\n }\r\n\r\n \/\/ Retours des commandes\r\n if (sizeof($commandes_probleme))\r\n return $commandes_probleme;\r\n else return false; \r\n\r\n }\r\n }\r\n\r\n?><\/pre>\n<p>Ce script sera appel\u00e9 via l&rsquo;url : http:\/\/www.votresite.com\/index.php\/test-module\/cron\/ et ex\u00e9cut\u00e9 de mani\u00e8re quotidienne vers miniuit.<br \/>\nSi il trouve des erreurs il envoie des emails pour vous tenir au courant.<\/p>\n<p>Si vous avez rencontr\u00e9 des probl\u00e8mes similaires avec Magento, n&rsquo;h\u00e9sitez pas \u00e0 partager vos exp\u00e9riences !<\/p>\n","protected":false},"excerpt":{"rendered":"<p>J&rsquo;ai r\u00e9cemment \u00e9t\u00e9 confront\u00e9 \u00e0 un probl\u00e8me de commandes annul\u00e9es, mais pay\u00e9es quand m\u00eame sur un site Magento en production avec les modes de paiements Atos et Paypal. Ces changements de statuts emp\u00eachent le bon fonctionnement du processus de traitement de la commande. Pour \u00e9viter de devoir consulter l&rsquo;ensemble des commandes, j&rsquo;ai donc d\u00e9velopp\u00e9 un [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[246,6],"tags":[150,212],"class_list":["post-244","post","type-post","status-publish","format-standard","hentry","category-magento-2","category-trucs-et-astuces","tag-magento","tag-module-magento"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/244","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/comments?post=244"}],"version-history":[{"count":8,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/244\/revisions"}],"predecessor-version":[{"id":488,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/244\/revisions\/488"}],"wp:attachment":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/media?parent=244"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/categories?post=244"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/tags?post=244"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}