Utiliser Drupal pour gérer des comptes clients

Contributeurs

Statut du tutoriel : 

En cours de rédaction

Catégorie du tutoriel : 

Niveau du tutoriel : 

Modules utilisés : 

Au cours de ce tutoriel, nous allons voir comment utiliser Drupal pour gérer des comptes clients. À la fin de ce tuto, vous serez capable de :

  • Créer des comptes pour vos utilisateurs
  • Voir leur solde actuel
  • Pour ajouter ou retirer de l'argent sur leur compte
  • Voir l'historique des transactions pour chaque compte
  • Permettre à chaque utilisateur de voir l'historique de son compte
  • Gérer une transaction récurrente plus facilement (Ne fonctionne pas correctement à cause d'un bug dans flag : l'historique des transactions n'est pas correct.)

Ce tutoriel est assez long et vous êtes libre de ne faire que les parties dont vous avez besoin. N'activez les modules que lorsqu'on vous le demandera, certains ne sont pas utiles pour les premières parties.

Dernière précision avant de commencer : ce tutoriel utilise des fonctionnalités du cœur de Drupal et quelques modules connus. Cela permet de couvrir les cas d'usages simples facilement. Si vous avez des besoins poussés, regardez une solution dédiée qui fera ce travail avec plus de possibilités que cette solution.

Création du type de contenu Compte

Les comptes de nos utilisateurs seront gérés par un type de contenu dédié. Cela permet aux utilisateurs n'ayant pas de compte utilisateur sur votre site d'avoir un compte pour les transactions. Si vous considérez que seuls les utilisateurs enregistrés doivent bénéficié de ce système, ne créez pas le type de contenu, ajoutez les champs au compte utilisateur et remplacer les références au type de contenu par le compte utilisateur dans la suite de ce tuto.

Pour le créer, allez dans : Menu d'administration : Structure > Type de contenu > Ajouter un type de contenu. Dans le Nom, mettez "Compte". Dans les options de publication, décochez Promu en page d'accueil et cochez Créer une nouvelle révision (c'est indispensable pour avoir l'historique du compte). Dans Paramètres des commentaires, fermez les commentaires. Cliquez maintenant sur Enregistrer et ajouter les champs.

Supprimez le champ Body. Ajoutez les champs suivant :

  • Solde de type Réel (flottant) en tant que champ requis. Libre à vous de mettre un solde minimum, maximum et une valeur par défaut. Je vous conseille de remplir le champ Suffixe avec une espace et le caractère € pour afficher la monnaie avec le champ. Idem pour les autres champs.
  • Transaction précédente de type Réel (flottant). Ce champ n'est pas requis et sera rempli automatiquement avec la valeur de la transaction. Il permet ainsi dans l'historique de voir le montant de chaque transaction.
  • Transaction courante de type Réel (flottant). Ce champ n'est pas requis et sera rempli par le membre de l'association avec la somme à ajouter ou à retirer du compte.

Réglons maintenant les droits associés à ce type de contenu. A priori, seuls certains membres de l'association avec un rôle particulier peuvent éditer ces comptes. Pour cela, nous allons créer le rôle Guichetier (vous pouvez évidemment utiliser un rôle déjà existant). Allez dans Menu d'administration : Personnes > Droits > Rôles puis ajoutez ce rôle. Modifiez ensuite les droits de ce rôle pour qu'il puisse créer et modifier n'importe quel compte.

Si vous êtes passés par des champs sur le compte utilisateur, il faut gérer les permissions champ par champ avec le module Field Permissions.

Gestion des transactions

Lorsqu'un guichetier modifie le champ Transaction courante d'un compte (avec une valeur positive pour ajouter de l'argent, ou une valeur négative pour en retirer), il faut que les champs Transaction précédente et Solde soit mis à jour. Pour cela, nous allons utiliser des régles grâce auxquelles on peut définir les actions à effectuer après certains événement et si certaines conditions sont remplies. Commençons par activer les modules Rules et Rules UI.

Ensuite, allez dans Menu d'administration : Configuration > Processus > Rules. Ajoutez une nouvelle règle nommée Transaction précédente. Dans Réagir sur l'évènenement, sélectionnez Avant d'enregistrer le contenu. Dans Restrict by type, sélectionnez Compte. Enregistrez.

Dans la nouvelle page, ajoutez une action de type Données : Calculer une valeur. Pour la valeur 1, dans Sélecteur de données, entrez node:field-solde (normalement le champ est en auto-complétion. Si l'interface vous propose Basculer vers la sélection de données, acceptez pour utiliser l'auto-complétion). Vérifiez que l'opérateur est bien l'addition. Pour la valeur 2, le Sélecteur de données est node:field-diff. Dans l'étiquette de la variable, entrez Nouveau solde et comme nom, choisissez nouveau_solde. Enregistrez.

Ajoutez maintenant une action de type Données : Définir une valeur de donnée. Dans Sélecteur des données, entrez node:field-solde puis continuez. Dans Valeur, basculer vers la sélection de données et entrez nouveau-solde. Enregistrez.

Ajouter une action de type Données : Définir une valeur de données. Comme précédemment, pour le champ Transaction précédente avec la valeur du champ Transaction courante.

Ajouter enfin une action de type Données : Définir une valeur de données pour le champ Transaction courante avec comme valeur directe 0 (il ne faut pas basculer vers la sélection de données).

Vous devez maintenant comprendre l'utilité des champs Transaction courante et Transaction précédente : si on utilisait directement le champ transaction, il serait possible de modifier la valeur d'un compte par inadvertance.

Test des transactions

Créer un type de contenu Compte. On pourra avantageusement utiliser le nom du détenteur du compte comme titre avec un solde initial (par exemple 34.56). Enregistrez. Modifiez ensuite ce contenu et entrez une valeur dans le champ Transaction courante (par exemple -34.55). Constatez que les valeurs de Solde, Transaction précédente et Transaction courante sont correctement mises à jour.

Ce calcul n'est pas anodin car en réalité, il n'est pas juste du fait de la façon dont un ordinateur calcule avec les nombres décimaux. On peut s'en convaincre en lançant l'interpréteur PHP (php -a) et en entrant :

echo 34.56 - 34.55;

PHP répond alors :

0.010000000000005

Cependant, notre champ est paramétré pour une précision de deux chiffres après la virgule (valeur par défaut que l'on peut changer). Les résultats des calculs flottants sont suffisamment précis pour qu'avec cet arrondi les calculs soient justes. On peut même vérifier en base de données (si vous avez les droits) que la valeur stockée par Drupal dans le champ est correcte.

Affichage de l'historique

Nous allons maintenant créer une page qui regroupe l'historique des comptes. Commencez par activer les modules Views et Views UI.

Ajoutez une nouvelle vue (Menu d'administration : Structure > Vue > Ajouter une nouvelle vue). Cette vue que l'on nommera Historique des comptes doit afficher des révisions de contenu. Une fois ce paramètre réglé, cliquez sur Continuer & modifier.

Dans Format, cliquez sur Liste non mise en forme et passez en mode tableau. Retirez tours les champs déjà présents et ajoutez Solde, Transaction précédente et Titre. Sélectionnez la version qui commence par Révision de contenu ou Contenu (données historiques). Pour le champ Titre, sélectionnez Exclure de l'affichage. Vous pouvez ajouter l'autres champs comme la date de modification si vous en ressentez le besoin.

Dans Format, cliquez sur paramètres et choisissez comment champ de groupement le champ titre.

Dans critères de filtrage, ajoutez un critère de type Contenu (données historiques) : Solde (field_solde) avec comme opéreteur N'est pas vide (NOT NULL). Retirez le critère sur l'état publié.

Si vous cliquez sur Actualiser l'aperçu vous pouvez voir à quoi ressemble la page actuellement.

Afficher l'utilisateur qui a exécuté la transaction

Nous allons maintenant ajouter le nom de l'utilisateur qui a effectué la transaction. Pour cela, cliquez sur avancé puis dans Relations sur ajouter. Ajoutez la relation Révision de contenu : Utilisateur. Ajouter maintenant le champ Utilisateur : nom avec la relation utilisateur de la révision. Si vous actualisez l'aperçu, vous devriez voir apparaître l'identifiant de l'utilisateur qui a effectué la révision. On peut utiliser un autre champ du compte utilisateur (de préférence obligatoire).

Filtrer les comptes

Ajoutez un critère de filtrage sur Révision de contenu : Titre. Exposez le aux visiteurs et choisissez Contient comme opérateur.

Enregistrez votre vue.

Vous pouvez également ajouter un critère de tri si vous le désirez.

Voir la liste complète des comptes

Nous allons ajouter une nouvelle vue intitulée Consultation des comptes qui affiche du contenu de type Compte. Modifiez le format de la vue pour afficher un tableau. Retirez le filtre sur l'état publié. Ajoutez le champ Solde. Ajoutez un critère de filtrage exposé sur le titre de type Contient.

Si vous actualisez l'aperçu, vous devez voir la liste des comptes avec leur solde. Enregistrez la vue.

Interface plus agréable de modification des comptes

Ne fonctionne pas encore à cause d'un bug dans VBO : l'historique des transactions n'est pas correct.

Nous allons maintenant ajouter la possibilité de modifier un compte depuis la vue créée précédement. Éditez là et activez le module Views Bulk Operation (VBO).

Dans la vue Consultation des comptes, ajoutez un champ de type Bulk operations : Contenu. Sous Paramètres des opérations en masse, sélectionnez Chaque action dans un bouton séparé. Sous Opérations en masse sélectionnées, sélectionnez Modifier les valeurs de l'entité. Cochez Passer l'étape de confirmation. Cochez également Supplanter l'étiquette et entrez dans le champ qui s'affiche : Exécuter une transaction. Décochez Montrer les jetons disponibles. Sous Valeurs, sélectionnez Transaction courante (dans la section Champs de type Compte). Appliquez.

Enregistrez la vue.

Dorénavant, pour modifier un solde, allez sur la page de la vue, sélectionnez le compte (ou les comptes) à modifier puis cliquez sur Exécuter une transaction. Entrez la valeur dont il faut modifier le compte et cliquez sur suivant.

Je vous laisse tester et vérifier que l'historique est bon.

Permettre à chaque utilisateur de voir l'historique de son compte

Dans cette partie, nous allons lié chaque contenu Compte à un compte utilisateur du site pour permettre à cet utilisateurs de voir son compte et son historique. Cette partie est optionnelle.

Commencez par activer le module Entity Reference. Ensuite, ajoutez un champ Propriétaire de type Entity Reference en mode Auto-complétion. Choisissez Utilisateur comme Type cible et enregistrez. Modifiez un Compte existant et lié le à un utilisateur en entrant son identifiant dans le champ Propriétaire. Pour faciliter les tests, je vous recommande d'utiliser votre compte.

Éditez la vue Historique des comptes. Sous Affichages, cliquez sur Ajouter puis Ajouter bloc. Dans Avancé, ajoutez un filtre contextuel Contenu (données historiques) : Propriétaire (field_proprietaire) pour cet affichage seulement. Dans Quand la valeur de filtre N'EST PAS disponible sélectionnez Fournir une valeur par défaut. Mettez Identifiant (ID) de l'utilisateur connecté. Appliquez et enregistrez la vue.

Si vous rafraîchissez l'aperçu, vous ne verrez plus que l'historique des comptes dont vous êtes le propriétaire. Attention toute fois, seules les révisions dont le champ propriétaire est correctement complété sont visibles.

Il ne vous reste plus qu'à placer le bloc sur la page du compte utilisateur. Dans Menu d'administration : Structure > Blocs, déplacez le bloc Vue : Historique des comptes dans Contenu principal. Enregistrez puis cliquez sur le lien configurer à côté du bloc. Dans Paramètres de visibilité, section Pages, sélectionnez Seulement les pages listées et entrez dans le bloc :

users/*

Vous pouvez aller sur la page de votre compte et constater que tout s'affiche correctement.

Gérer facilement une transaction récurrente

Ne fonctionne pas correctement à cause d'un bug dans flag : l'historique des transactions n'est pas correct.

Si vous devez gérer une transaction récurrente avec une somme donnée pour plusieurs utilisateurs, il est peu productif d'entrer la somme à chaque fois. Heureusement, il y a plus simple en utilisant les flags. Nous allons ajouter dans sur la page qui liste des comptes des liens qui lorsqu'on clique dessus exécute la transaction. Cette partie est optionnelle.

Commencez par activer le module Flag. Puis allez dans Menu d'administration : Structure > Flag > Add flag. Choisissez Nœud comme Type de marqueur. Donnez le nom de la transaction récurrente comme titre, Panier Bio pour nous. Les textes qui suivent sont à adapter à votre cas précis. Dans Texte du lien du marqueur entrez Achat panier bio. Dans Flag access, autorisez le rôle Guichetier à Signaler un contenu et à le Démarquer. Dans Paquet, sélectionnez compte. Dans Type de lien, le Basculement JavaScript permet de prendre en compte la transaction sans recharger la page ce qui peut être agréable pour les utilisateurs. Cependant, le solde ne sera pas mis à jour tant que la page ne sera pas rechargée. Le Lien standard, fait la transaction avec une requête ce qui recharge la page et donc le solde affiché sera correct. Libre à vous de choisir le fonctionnement qui vous convient le mieux. De plus, vous pourrez en changer si vous le désirez.

Ajoutez une règle qui réagit sur l'événement Un(e) nœud a été  marqué(e), sous le titre "Panier Bio" avec un nom explicite comme Achat Panier Bio.

Ajoutez une condition Le nœud est de type avec flagged-node comme sélecteur de données et Compte comme valeur.

Ajoutez les actions suivantes :

  • Unflag a Nœud avec votre flag comme marqueur et flagged-node dans Sélecteur de données. Pensez à sélectionner Skip permission check: True. Cette règle vous permet d'acheter plusieurs paniers bio sans clic supplémentaire.
  • Définir une valeur de données avec flagged-node:field-diff comme Sélecteur de données et la valeur de la transaction comme valeur.

Allez sur la page d'un contenu et vérifier que le flag fonctionne correctement.

Nous allons maintenant ajouter le flag sur la page qui liste les comptes.

Éditez la vue. Dans Avancé, ajoutez une relation de type Flags : Nœud flag. Donner un identifiant explicite à cette relation, décochez Inclure uniquement du contenu flaggé, cochez Panier Bio dans Signaler un contenu par n'importe quel utilisateur. Ajoutez un champ Flags : Lien du flag. Vous pouvez réordonner les champs si vous le désirez. Enregistrez la vue.

Vérifiez que le nouveau lien fonctionne correctement.