CiviCRM Community Forums (archive)

*

News:

Have a question about CiviCRM?
Get it answered quickly at the new
CiviCRM Stack Exchange Q+A site

This forum was archived on 25 November 2017. Learn more.
How to get involved.
What to do if you think you've found a bug.



  • CiviCRM Community Forums (archive) »
  • Language and Locality »
  • Francophone User Group (Moderators: mathieu, xavier) »
  • Contact propre à chaque utilisateur
Pages: [1]

Author Topic: Contact propre à chaque utilisateur  (Read 686 times)

letitoa

  • I’m new here
  • *
  • Posts: 3
  • Karma: 0
  • CiviCRM version: 4.6.10
  • CMS version: Joomla 3.4.5
  • MySQL version: 5.6.21
  • PHP version: 5.6.3
Contact propre à chaque utilisateur
November 22, 2015, 09:56:27 am
Bonjour,

Tout nouveau utilisateur de CiviCRM, je me heurte à un problème que je n'avais pas avec mon précédent CRM.
En effet, chaque utilisateur doit pouvoir avoir ses propres contacts (que lui seul peut voir, gérer, et envoyer des mails).

Avec CiviCRM je n'arrive pas à reproduire ce comportement (les ACL permettent uniquement de voir tous les contacts ou uniquement la modification de l'utilisateur lui-même sur Joomla).
Avez-vous une idée pour débloquer la situation ?

Merci,
Lionel

mathieu

  • Administrator
  • Ask me questions
  • *****
  • Posts: 620
  • Karma: 36
    • Work
  • CiviCRM version: 4.7
  • CMS version: Drupal
  • MySQL version: MariaDB 10
  • PHP version: 7
Re: Contact propre à chaque utilisateur
November 22, 2015, 10:28:49 am
Bonjour Lionel,

Bienvenue à CiviCRM!

En plus des permissions du CMS (Joomla) qui permettent de "voir tous les contacts", on peut aussi décocher cette permission, puis utiliser les ACL de CiviCRM comme tel. Par contre, je préfère mettre en garde: ce n'est pas la fonctionnalité la plus facile à configurer, mais ça fonctionne bien une fois qu'on a compris le principe.

La première étape consiste à identifier comment on regroupe les contacts sur qui l'on définira les contrôles d'accès. En général, on évite d'avoir à ajouter chaque contact dans un groupe spécifique. À moins que ce soit automatique, les gens oublieront d'ajouter au bon groupe, puis n'auront plus accès à leurs contacts.

Par exemple, souvent on restreint l'accès par zones géographiques. Dans ce cas là, on peut définir un groupe pour les "contact dans la région X", puis un autre groupe "admins de la région X". On ajoute ensuite un ACL de CiviCRM qui permette aux "admins de X" de modifier les "contacts de X".

Si c'est pour restreindre selon la personne qui a créé le contact, on peut créer des groupes dynamiques par la recherche avancée (ou "recherche multi-critère" selon la traduction). Dans la critères de recherche, déplier l'onglet: "Journal", choisir l'option "ajouté" (plutôt que "modifié"), puis entrer le nom d'une personne/employée. Cliquer "rechercher", puis dans les actions, choisir "créer un nouveau groupe dynamique", et nommer le groupe, par exemple, "contacts de X". (voir la saisie d'écran en pièce-jointe). Il faudra répéter la procédure pour chaque employé.

On peut aussi combiner des critères de recherche. Par exemple: "contacts créé par X", et "champ personnalisé dont la valeur est X", comme ça on peut aussi donner accès à certains contacts à X, mais qui n'ont pas nécessairement été créés par X.

Enfin, si jamais il y a beaucoup de groupes (ex: beaucoup de régions, employés, etc), on peut implémenter les règles d'accès de façon programmatique, en PHP. Il faut voir du côté des "hooks" de CiviCRM, plus spécifiquement hook_civicrm_aclGroup et hook_civicrmWhereClause. Par exemple, si on définit un champ personnalisé pour les zones géographiques, et un autre champ personnalisé où l'on indique à quelle zone les employés ont accès, les hooks peuvent générer le SQL nécessaire pour s'assurer que les deux champs correspondent. De cette façon, pas besoin de créer deux groupes pour chaque zone géographique.

Pour référence, la documentation en anglais:
http://gitbook.civicrm.org/initial-set-up/permissions-and-access-control.html

Il y a aussi:
http://wiki.civicrm.org/confluence/display/CRMDOC/Access+Control

Les "hooks":
http://wiki.civicrm.org/confluence/display/CRMDOC/Hook+Reference
CiviCamp Montréal, 29 septembre 2017 | Co-founder / consultant / turn-key CiviCRM hosting for Quebec/Canada @ SymbioTIC.coop

letitoa

  • I’m new here
  • *
  • Posts: 3
  • Karma: 0
  • CiviCRM version: 4.6.10
  • CMS version: Joomla 3.4.5
  • MySQL version: 5.6.21
  • PHP version: 5.6.3
Re: Contact propre à chaque utilisateur
November 24, 2015, 07:27:18 am
Bonjour Mathieu,

Merci beaucoup pour votre réponse si rapide.
Concernant vos propositions j'ai retenu les groupes dynamiques.
Cette fonctionnalité me donne le résultat recherché (à savoir chaque utilisateur accède à ses contacts).

Afin de ne pas avoir à gérer cela à la main, j'ai mis en place un script php qui se déclenche lors de la première connexion de l'utilisateur au back-end de Joomla.

Pour résumer le script, il lance les actions SQL dans cet ordre :
  • Création de l'enregistrement de recherche dans "civicrm_saved_search"
  • Création de l'enregistrement du groupe dans "civicrm_group"
  • Ajout de l'utilisateur dans le groupe dans "civicrm_group_contact"
  • Création des ACL pour l'utilisateur dans "civicrm_acl_entity_role" puis "civicrm_acl"

Cela fonctionne bien mais j'ai juste un problème concernant la création de la recherche.
Dans ma table ("civicrm_group") CiviCRM créé un groupe avec les paramètres suivants :

Pour le champs where_clause :
Code: [Select]
( ( ( `civicrm_group_contact-2`.group_id IN ( 2 ) ) OR ( `civicrm_group_contact_cache_2`.group_id IN ("2") ) ) )
Pour le champs select_tables :
Code: [Select]
a:9:{s:15:"civicrm_contact";i:1;s:15:"civicrm_address";i:1;s:15:"civicrm_country";i:1;s:13:"civicrm_email";i:1;s:13:"civicrm_phone";i:1;s:10:"civicrm_im";i:1;s:19:"civicrm_worldregion";i:1;s:25:"`civicrm_group_contact-2`";s:165:" LEFT JOIN civicrm_group_contact `civicrm_group_contact-2` ON (contact_a.id = `civicrm_group_contact-2`.contact_id AND `civicrm_group_contact-2`.status IN ("Added"))";s:31:"`civicrm_group_contact_cache_2`";s:132:" LEFT JOIN civicrm_group_contact_cache `civicrm_group_contact_cache_2` ON contact_a.id = `civicrm_group_contact_cache_2`.contact_id ";}
Et pour le champs where_tables :
Code: [Select]
a:3:{s:15:"civicrm_contact";i:1;s:25:"`civicrm_group_contact-2`";s:165:" LEFT JOIN civicrm_group_contact `civicrm_group_contact-2` ON (contact_a.id = `civicrm_group_contact-2`.contact_id AND `civicrm_group_contact-2`.status IN ("Added"))";s:31:"`civicrm_group_contact_cache_2`";s:132:" LEFT JOIN civicrm_group_contact_cache `civicrm_group_contact_cache_2` ON contact_a.id = `civicrm_group_contact_cache_2`.contact_id ";}
Mon problème et que je ne trouve pas quoi modifier dans ces trois champs pour affecter la recherche à un autre utilisateur sachant que dans mon script php j'ai les infos suivantes de l'utilisateur stockées en variable :
  • ID de la table civicrm_saved_search
  • ID de la table civicrm_group
  • ID de la table civicrm_contact
  • ID de la table civicrm_group_contact
  • ID de la table civicrmacl_entity_role
  • ID de la table civicrm_acl

Si vous avez une idée qui puisse me débloquer ?
Merci,
Lionel

mathieu

  • Administrator
  • Ask me questions
  • *****
  • Posts: 620
  • Karma: 36
    • Work
  • CiviCRM version: 4.7
  • CMS version: Drupal
  • MySQL version: MariaDB 10
  • PHP version: 7
Re: Contact propre à chaque utilisateur
November 25, 2015, 06:09:31 am
Bonjour Lionel,

Je viens de penser à un truc.. ce serait possible d'utiliser les relations de CiviCRM.

Les relations ont le concept de permissions. "tel contact est relié à tel-autre, et la relation donne des permissions sur le contact". Par contre, par défaut cette case à cocher ne donne pas beaucoup de permissions. Il y a une extension qui permet d'aller plus loin, et de faire fonctionner les relations comme de vrais ACLs:
https://civicrm.org/extensions/relationship-permissions-acls

À noter que cette extension dépend de:
https://github.com/eileenmcnaughton/nz.co.fuzion.entitysettings

Avec ces extensions, on donc créer des contacts et les relier à qui ils "appartiennent". La seule chose qu'il faudrait peut-être programmer, c'est un hook_civicrm_post(), pour créer automatiquement une relation lorsqu'on crée un nouveau contact. Avec hook_civicrm_post(), et l'API "Relationship.create", ça devrait être que quelques lignes de code dans une extension (http://wiki.civicrm.org/confluence/display/CRMDOC/Create+an+Extension).

Sinon, je recommanderais fortement de regarder du côté des hooks des ACLs pour éviter d'avoir à créer des groupes dynamiques. Les saved-search n'ont pas un bon API d'exposé (de mémoire), donc ça peut briser assez facilement. L'extension "relatedpermission" est un bon exemple d'utilisation de ces hooks.

Mathieu
CiviCamp Montréal, 29 septembre 2017 | Co-founder / consultant / turn-key CiviCRM hosting for Quebec/Canada @ SymbioTIC.coop

Pages: [1]
  • CiviCRM Community Forums (archive) »
  • Language and Locality »
  • Francophone User Group (Moderators: mathieu, xavier) »
  • Contact propre à chaque utilisateur

This forum was archived on 2017-11-26.