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.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *