Jump to content

Filtre sur liste clients dans l'Admin


Recommended Posts

Bonjour à tous et à toutes,

 

J'ai besoin dans l'admin de rendre des clients invisibles à certains profils d'employés.

Plus précisément, cette fonctionnalité permettra de cacher certains clients à un commercial loggué dans l'admin, de façon à ce qu'il ait accès uniquement aux clients qu'il gére, et pas à ceux de ses collègues.

 

J'ai donc décidé de procéder comme suit :

 

1) création d'un profil restreint 'commercial' dans l'onglet employés.

 

2) création de groupes de clients selon la logique suivante : un groupe 'Martin' regroupe les clients du commercial Martin

 

3) récupération du nom du commercial loggué dans l'admin

 

4) dans la liste des clients, n'afficher que les clients qui dépendent du groupe portant le même nom que le commercial loggué

 

Mis à part d'éventuels problèmes liés à des homonymes, il me semble que cela tient la route. Auriez-vous fait différemment ? Je veux le moins possible toucher aux bases de données pour ne pas avoir à refaire tout le travail à chaque mise à jour.

 

Pour le point 3), j'ai vu qu'il y a une globale 'lastname' dans l'objet 'Employee' qui renvoie le nom de l'administrateur loggué : object(Employee)#9 (27) { ["id"]=> int(2) ["id_profile"]=> string(1) "1" ["id_lang"]=> string(1) "2" ["lastname"]=> string(8) "xxxxxxxx"

 

J'aurais besoin d'un petit coup de main pour le point 4), à savoir la récup du groupe associé dans la liste des clients, et l'affichage sous condition de correspondance.

 

Je trouve cette fonctionnalité vraiment utilie et nécessaire lorsqu'il y a plusieurs commerciaux gérant des clients; j'espère que nous allons pouvoir l'offrir à tous les membres de ce forum.

 

Merci pour votre aide,

Dominique

Link to comment
Share on other sites

J'ai bien avancé. Il ne me reste plus qu'à ajouter à cette requête de la page AdminCustomers.php une instruction qui filtre la requête selon le champ 'id_group' de la table 'ps_customer_group', par une id que j'ai récupérée.

Voir plus bas le code de la requête, quelqu'un aurait une idée ?

Merci pour votre aide!

$this->_select = '(YEAR(CURRENT_DATE)-YEAR(`birthday`)) - (RIGHT(CURRENT_DATE, 5)<RIGHT(`birthday`, 5)) as age, (
           SELECT c.date_add FROM '._DB_PREFIX_.'guest g
           LEFT JOIN '._DB_PREFIX_.'connections c ON c.id_guest = g.id_guest
           WHERE g.id_customer = a.id_customer
           ORDER BY c.date_add DESC
           LIMIT 1
       ) as connect';

Link to comment
Share on other sites

  • 2 weeks later...

J'en suis là, mais ça ne fonctionne toujours pas. Si un membre de la pSTeam pouvait me venir en aide...

 

La variable $id_groupe_filtre contient l'id du groupe servant à filtrer la liste.

Voila le code :

 

$filtre = 'AND g.id_guest IN (SELECT id_guest FROM '._DB_PREFIX_.'guest g LEFT JOIN '._DB_PREFIX_.'customer_group cg ON g.id_customer = cg.id_customer WHERE cg.id_group = '.$id_groupe_filtre.')';
$this->_filter = $filtre;

Link to comment
Share on other sites

  • 2 weeks later...

Bon, j'ai fini par trouver, je vous partage la solution. Je trouve que c'est une fonctionalité hyper utile qui comble un vide incompréhensible dans un produit de qualité comme PS.

 

Un bref rappel de ma problématique : un de mes clients souhaitait donner à ses agents commerciaux l'accés à la liste des clients de son site. Bien évidemment, chaque commercial ne devait avoir accés et gérer que ses propres clients. Pas question d'investir dans une machine de guerre de plugin de gestion commerciale type Sage ou autre. De même, je ne voulais pas modifier la base clients de prestashop pour ne pas compliquer les mises à jour (vu leur fréquence hem hem ...).

J'ai donc contourné l'utilisation des groupes de clients, qui ne sont à priori prévus que pour gérer des remises.

Et un grand merci à DrGren qui m'a mis sur la voie avec ce post

 

Donc, comment procéder:

 

1) créer un profil d'employé retreint intitulé 'Commercial', ou autre mais cet intitulé sera à changer à la ligne 49 du code. Appliquer ou non des restrictions à ce profil. Pour mon client, les commerciaux ne peuvent avoir accàs qu'à la liste des clients, produits et commandes.

 

2) créer un groupe de clients pour chaque commercial, selon la règle suivante : le groupe possède comme intitulé le nom du commercial. Ex : groupe Machin destiné à recevoir les clients du commercial Jean Machin. Si deux commerciaux ont le même nom, il est facile d'adapter le script pour prendre en compte Nom+prénom.

 

3) dans les informations d'un client, lui attribuer par défaut le groupe de son commercial

 

Et c'est tout ! Lorsqu'un commercial se loggue, le script va filtrer la liste de clients pour n'afficher que ceux qui lui sont rattachés, j'insiste encore, c'est à dire ceux qui appartiendront au groupe ayant son nom.

 

Le code nécessaire est ci-dessous. Il suffit de l'ajouter au début de la fonction __construct() du fichier AdminCustomers situé dans manager/tabs/. Aucune intervention sur la base n'est nécessaire, ni d'override.

 

Bonne utilisation à toutes et à tous, si vous avez une question, je suis là.

 

Dominique

 

public function __construct()
{

 // FILTRAGE LISTE CLIENTS PAR GROUPE DU MÊME NOM QUE L'EMPLOYE CONNECTE
 // par D. Radisson (www.domradisson.net)
 // Date : 30 avril 2012
 // Sur version PrestaShop 1.4.7.2

 // Par défaut, on ne filtre pas
 $filtrage_clients=FALSE;

 // on récupère le nom de l'employé connecté
 $employe = ($GLOBALS['employee']);
 $employe_nom = $employe->lastname;

 // on récupère l'id du profil de l'employé connecté
 $employe_idprofil = $employe->id_profile;

 // on récupère l'id du profil d'employé intitulé 'Commercial'
 $sql = 'SELECT id_profile FROM '._DB_PREFIX_.'profile_lang WHERE name = "Commercial"';
 if ($result = Db::getInstance()->getRow($sql)) $commercial_idprofil=$result['id_profile'];

 // ETAPE 1
 // Let's do the job !
 // si l'employé connecté est un administrateur ($employe_idprofil==1)
 // on déclare le filtrage sur les clients à FALSE : on ne filtre pas
 // dans le cas contraire et si l'id du profil de l'employé connecté
 // est identique à l'id du profil employé 'Commercial'
 // on déclare le filtrage sur les clients à TRUE : on filtre
 $filtrage_clients = ($employe_idprofil==1)? FALSE : (($employe_idprofil==$commercial_idprofil) ? TRUE : FALSE);

 // ETAPE 2
 // si on filtre, on récupère l'id du groupe de clients
 // ayant le même nom que l'employé connecté
 if ($filtrage_clients ==TRUE) {
  $sql = 'SELECT id_group FROM '._DB_PREFIX_.'group_lang WHERE name = "'.$employe_nom.'"';
  if ($result = Db::getInstance()->getRow($sql)) $id_groupe_filtre=$result['id_group'];
 }

 // ETAPE 3
 // si on filtre, on ajoute un filtre à la requête d'affichage des clients
 $this->_filter = ($filtrage_clients==TRUE && isset($id_groupe_filtre)) ? 'AND a.id_customer IN (SELECT cg.id_customer FROM '._DB_PREFIX_.'customer_group cg WHERE cg.id_group = '.$id_groupe_filtre.')':'';

 // FIN FILTRAGE CLIENTS

$this->table = 'customer';
etc etc

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...