Toutes les clefs pour réussir dans le e-commerce

Mes modules Prestashop

Corriger le module de statistique “meilleurs clients” de Prestashop

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.

Poster un Commentaire

6 Commentaires sur "Corriger le module de statistique “meilleurs clients” de Prestashop"

Recevoir un email pour
avatar
Trier par:   plus récent | plus vieux | Plus de vote
xavier
Invité
xavier

Hello, pourquoi ne pas faire un pull request sur github ?
https://github.com/PrestaShop/PrestaShop/tree/development/modules/statsbestcustomers

Webbax
Invité

Merci pour le retour… c’est toujours chaud de faire confiances aux statistiques, il faut dire que c’est vite sensible et que ça peut-être facilement faux… il suffit de 3 fois rien.

Pour le pull request… je sais pas ce qui est vraiment le mieux, c’est pas mieux de poster dans la forge ? A voir…

Camille
Invité

Bonjour,

Le code tel quel sur Presta 1.4.9 ne fonctionnait pas et le module tournait en boucle sans afficher les résultats. J’ai effectué ces changements pour le faire fonctionner:

Remplacer:
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:
WHERE co.date_add BETWEEN ‘.$this->getDate().’
GROUP BY c.`id_customer`, c.`lastname`, c.`firstname`, c.`email`’;

Merci pour ce fix qui est très utile.

Camille

Kev
Invité
Kev

En plus rapide, remplacer :

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

WHERE ( co.date_add BETWEEN ‘.$this->getDate()
.Shop::addSqlRestriction(Shop::SHARE_CUSTOMER, ‘c’).’ or co.date_add is NULL )
GROUP BY c.`id_customer`, c.`lastname`, c.`firstname`, c.`email`’;

Et c’est tout bon :)

wpDiscuz