Vous consultez une page technique concernant le logiciel de gestion Mercator. Celle-ci contient des informations spécifiques destinées aux professionnels de Mercator. Souhaitez-vous être redirigés vers des informations plus générales ?


   Ne plus poser cette question

Assurer le login utilisateur via un code personnalisé

0000002321     -      27/08/2017

L'exemple illustré ici permet, en Mercator Majuro, d'assurer la fonctionnalité de login utilisateur via un code personnalisé. Cela se fait en exploitant l'évènement BeforeLogin de la classe MercatorUi.Main. Cet évènement est installé à l'ouverture du dossier grâce à l'implémentation de l'interface MercatorUi.ICustomizers.ExecAction et la détection de l'action DossierOpen

L'objet de type MercatorUi.Main.BeforeLoginEventArgs passé au délégué de l'évènement BeforeLogin contient plusieurs propriétés :

  • LoginMode : énuméré qui indique dans quel cadre le login est effectué :
    • AtStartup : au démarrage
    • FromMenu : après un changement d'utilisateur demandé à partir du menu "Fichier"
    • InSequenceV /  InSequenceA : en tant qu'évènement dans une séquence de vente ou d'achat
    • OpenCashDrawer : lors de l'ouverture du tiroir-caisse à partir du menu "Fichier"
  • IdLoggedUser : à compléter, si souhaité, avec l'ID de l'utilisateur avec lequel le login doit être effectué
  • NoAsk : propriété à mettre à true si on souhaite supprimer quoi qu'il arrive la saisie du code par Mercator
  • NoHello : propriété à mettre à true si on souhaite ne pas afficher la boîte de dialogue "Hello ...".

Un exemple est repris ci-dessous. Il permet seulement de comprendre la mécanique mais ne doit pas être utilisé tel quel. En effet, il met en place une sélection de l'utilsateur sur base d'une simple requête SQL. A cet endroit du code, il convient de mettre une logique de login personnalisée et adéquate.

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MercatorApi;
using MercatorUi;

namespace Main
{
    public class Customizer : MercatorUi.ICustomizers.IExec
    {

        public void Main(MercatorUi.ICustomizers.ExecAction Action)
        {
            if (Action == MercatorUi.ICustomizers.ExecAction.DossierOpen)
            {
                Globals.Main.BeforeLogin += new MercatorUi.Main.BeforeLoginEventHandler(Main_BeforeLogin);
            }
            else if (Action == MercatorUi.ICustomizers.ExecAction.DossierClose)
            {
                Globals.Main.BeforeLogin -= new MercatorUi.Main.BeforeLoginEventHandler(Main_BeforeLogin);
            }
        }

        void Main_BeforeLogin(object sender, MercatorUi.Main.BeforeLoginEventArgs e)
        {
            if (e.LoginMode == LoginModeEnum.AtStartup) // uniquement au démarrage de Mercator
            {
                DataSet ds = Api.Zselect(MercatorUi.Globals.RepData, "select id from users where ...");
                if ((ds != null) && (ds.Tables[0].Rows.Count > 0))
                {
                    MercatorUi.Dialogs.Stop("Vous allez entrer dans Mercator en tant que ... !");
                    e.IdLoggedUser = ds.Tables[0].Rows[0]["id"].ToString(); // effectuer le login sur cet utilisateur
                    e.NoAsk = true; // supprimer quoi qu'il arrive la saisie du code par Mercator
                    e.NoHello = true; // Ne pas afficher "Hello ..."
                }
                else
                {
                    MercatorUi.Dialogs.Stop("Accès refusé !");
                    e.NoAsk = true; // supprimer quoi qu'il arrive la saisie du code par Mercator
                }
            }
        }
    }
}

Attention : il convient d'être prudent lors du placement de tel code. En effet, un simple bug ou une erreur de logique dans la construction du code peut empêcher le démarrage de Mercator. Dans ce cas, il sera peut être nécessaire de retirer le customizer via les outils SQL. Celui-ci se trouve dans la table ASSEMBLIES où id vaut CMZER=Main.

Pour que ce code fonctionne correctement, il est nécessaire de mettre à NON l'option "Login dans un thread de démarrage séparé" (PRE_LOGIN).