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

Enregistrer une signature manuscrite

0000002909     -      01/07/2019

Mercator 10.4 permet d'enregistrer une signature manuscrite en tant qu'image. Cela peut se faire dans tous les écrans paramétrables au départ d'un objet PictureBox. Il existe plusieurs possibilités quant au média utilisé pour "capter" cette signature : 

Une fois un SignPad correctement activé, selon une des méthodes indiquées ci-dessus, toutes les PictureBoxes associées à des champs varbinary(MAX) sont susceptibles de recevoir une signature. Pour demander une signature, il suffit d'utiliser le menu contextuel de l'image et de choisir "Depuis SignPad".

Cette même signature peut être demandée par code en utilisant la méthode SignPad de la PictureBox.


Remarque importante concernant le respect de vie privée

Au sens du RGPD, une signature est une donnée personnelle sensible. Son usage et sa durée de conservation doivent doit strictement limités et proportionnels à l'objectif recherché. Cette donnée sensible doit être protégée. Tout ceci relève des procédures internes de l'entreprise.

Dans les exemples repris ci-dessus, Mercator propose de "protéger" la signature par un stamp reprenant la date et l'heure. L'objectif est d'empêcher (réduire le risque) la réutilisation de la signature dans un autre contexte. L'utilisateur final appréciera si cette protection est suffisante.

Si on le souhaite, il est possible de mettre en place du cryptage de la signature en vue de sa sauvegarde sous forme cryptée dans la base de données. Ci-dessous un exemple de code pour le BillingEngine :

Zoom
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Data;
using System.Drawing;
using MercatorUi;
using MercatorApi;
using MercatorExtensions;
using System.ComponentModel;
using System.Data.SqlClient;
using System.Text;


namespace Billing
{
    public class Customizer :
        MercatorUi.ICustomizers.IBillingEngineCreated,
        MercatorUi.ICustomizers.IBillingEngineClosed
    {
        public void BillingEngineCreated(MercatorUi.Engine.Gescom.BillingEngine billingEngine)
        {
            billingEngine.BeforeSave += BillingEngine_BeforeSave;

            if (!((billingEngine.PIEDS["sign_img"] == DBNull.Value) || (((byte[])billingEngine.PIEDS["sign_img"]).Length == 0)))
            {
                try
                {
                    MercatorCryptorEngine.CryptorEngine.SecurityKey = getSecurityKey(billingEngine);
                    billingEngine.PIEDS["sign_img"] = MercatorCryptorEngine.CryptorEngine.Decrypt((byte[])billingEngine.PIEDS["sign_img"], false);
                    MercatorCryptorEngine.CryptorEngine.SecurityKey = null;
                }
                catch (Exception ex)
                {
                    billingEngine.PIEDS["sign_img"] = DBNull.Value;
                    MercatorUi.Dialogs.Stop("Ce document contient une signature, mais elle ne peut être décryptée. Elle sera donc supprimée !\r\n\r\n" + ex.Message + (ex.InnerException != null ? "\r\n" + ex.InnerException.Message : ""));
                    return;
                }
            }

        }

        public void BillingEngineClosed(MercatorUi.Engine.Gescom.BillingEngine billingEngine)
        {
            billingEngine.BeforeSave -= BillingEngine_BeforeSave;
        }

        private string getSecurityKey(MercatorUi.Engine.Gescom.BillingEngine billingEngine) // la clé doit faire 24 caractères de long
        {
            return "...";
        }

        void BillingEngine_BeforeSave(object sender, MercatorUi.Engine.Gescom.BillingEngine.BeforeSaveEventArgs e)
        {
            MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;

            if (!((billingEngine.PIEDS["sign_img"] == DBNull.Value) || (((byte[])billingEngine.PIEDS["sign_img"]).Length == 0)))
            {
                byte[] imagebytes = (byte[])billingEngine.PIEDS["sign_img"];
                string commandText = "update PIEDS_V set sign_img=@sign_img where (id=@id) and (journal=@journal) and (piece=@piece)";
                SqlCommand commandForFinalTransaction = new SqlCommand(commandText);
                MercatorCryptorEngine.CryptorEngine.SecurityKey = getSecurityKey(billingEngine);
                commandForFinalTransaction.Parameters.AddWithValue("@sign_img", MercatorCryptorEngine.CryptorEngine.Encrypt(imagebytes, false));
                MercatorCryptorEngine.CryptorEngine.SecurityKey = null;

                billingEngine.CommandForFinalTransaction = commandForFinalTransaction;
            }
        }

    }
}