dradisso Posted April 11, 2012 Share Posted April 11, 2012 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 More sharing options...
dradisso Posted April 11, 2012 Author Share Posted April 11, 2012 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 More sharing options...
dradisso Posted April 19, 2012 Author Share Posted April 19, 2012 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 More sharing options...
dradisso Posted April 30, 2012 Author Share Posted April 30, 2012 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now