Vous avez sans doute dû être bien étonné des résultats que vous donne le module « meilleurs clients » dans les statistiques de votre boutique. Voici une solution pour obtenir des résultats corrects.
Ce module tente d’afficher les clients qui se sont connectés au site pendant une période donnée et, si aucune connexion n’a été enregistrée, pour ce client pendant cette période il ne l’affiche pas.
C’est à priori logique étant donné que « normalement » un client ne peut passer commande sans avoir au préalable visité le site. Le problème c’est qu’avec prestashop tout n’est pas toujours normal et il s’avère que souvent un client passe commande sans qu’aucune visite ne soit pour autant comptabilisée (Il y a donc certainement un bug à corriger dans la partie qui cumule les connexions, mais je verrai ça un autre jour :)).
Pour que le module affiche des valeurs correctes j’ai remplacé la requête d’origine du module par deux nouvelles.
La première sera appelée lorsque l’on veut afficher les meilleurs clients triés par « argent dépensé » l’autre sera utilisée pour tous les autres cas.
Il vous suffit d’ouvrir le fichier « modules/statsbestcustomers/statsbestcustomers.php » et de remplacer le code suivant:
$this->_query = ' SELECT SQL_CALC_FOUND_ROWS c.`id_customer`, c.`lastname`, c.`firstname`, c.`email`, COUNT(co.`id_connections`) as totalVisits, IFNULL(( SELECT ROUND(SUM(IFNULL(o.`total_paid_real`, 0) / cu.conversion_rate), 2) FROM `'._DB_PREFIX_.'orders` o LEFT JOIN `'._DB_PREFIX_.'currency` cu ON o.id_currency = cu.id_currency WHERE o.id_customer = c.id_customer AND o.invoice_date BETWEEN '.$this->getDate().' AND o.valid ), 0) as totalMoneySpent FROM `'._DB_PREFIX_.'customer` c LEFT JOIN `'._DB_PREFIX_.'guest` g ON c.`id_customer` = g.`id_customer` LEFT JOIN `'._DB_PREFIX_.'connections` co ON g.`id_guest` = co.`id_guest` WHERE co.date_add BETWEEN '.$this->getDate() .Shop::addSqlRestriction(Shop::SHARE_CUSTOMER, 'c'). 'GROUP BY c.`id_customer`, c.`lastname`, c.`firstname`, c.`email`';
Par celui-ci:
if($this->_sort=="totalMoneySpent") { $this->_query = ' SELECT SQL_CALC_FOUND_ROWS c.`id_customer`, c.`lastname`, c.`firstname`, c.`email`, COUNT(co.`id_connections`) as totalVisits, ( SELECT ROUND(SUM(IFNULL(o.`total_paid_real`, 0) / cu.conversion_rate), 2) FROM `'._DB_PREFIX_.'orders` o LEFT JOIN `'._DB_PREFIX_.'currency` cu ON o.id_currency = cu.id_currency WHERE o.id_customer = c.id_customer AND o.invoice_date BETWEEN '.$this->getDate().' AND o.valid ) as totalMoneySpent FROM `'._DB_PREFIX_.'customer` c LEFT JOIN `'._DB_PREFIX_.'guest` g ON c.`id_customer` = g.`id_customer` LEFT JOIN `'._DB_PREFIX_.'connections` co ON g.`id_guest` = co.`id_guest` LEFT JOIN `'._DB_PREFIX_.'orders` o ON o.id_customer = c.id_customer WHERE o.invoice_date BETWEEN '.$this->getDate() .Shop::addSqlRestriction(Shop::SHARE_CUSTOMER, 'c'). 'GROUP BY c.`id_customer`, c.`lastname`, c.`firstname`, c.`email`'; } else { $this->_query = ' SELECT SQL_CALC_FOUND_ROWS c.`id_customer`, c.`lastname`, c.`firstname`, c.`email`, COUNT(co.`id_connections`) as totalVisits, ( SELECT ROUND(SUM(IFNULL(o.`total_paid_real`, 0) / cu.conversion_rate), 2) FROM `'._DB_PREFIX_.'orders` o LEFT JOIN `'._DB_PREFIX_.'currency` cu ON o.id_currency = cu.id_currency WHERE o.id_customer = c.id_customer AND o.invoice_date BETWEEN '.$this->getDate().' AND o.valid ) as totalMoneySpent FROM `'._DB_PREFIX_.'customer` c LEFT JOIN `'._DB_PREFIX_.'guest` g ON c.`id_customer` = g.`id_customer` LEFT JOIN `'._DB_PREFIX_.'connections` co ON g.`id_guest` = co.`id_guest` WHERE co.date_add BETWEEN '.$this->getDate() .Shop::addSqlRestriction(Shop::SHARE_CUSTOMER, 'c'). 'GROUP BY c.`id_customer`, c.`lastname`, c.`firstname`, c.`email`'; }
Désormais si vous cliquez sur l’une des flèches au-dessous de « argent dépensé » dans l’en-tête du tableau, vous verrez bien tous les clients ayant dépensé de l’argent pendant la période donnée. Certains clients auront par contre 0 visite, ce n’est donc pas parfait mais je pense que cette astuce aidera pas mal de monde.