Dans Mercator, il est possible d’enregistrer une signature manuscrite selon divers moyens. Par ailleurs, Mercator est connectable au portail de eSignature de Ok!Sign. L'application MercatorPenguin peut être utilisée comme moyen de saisie de cette signature.
Pour mettre en place cette fonctionnalité, il faut :
- Mercator version 10.10 ou ultérieure,
- disposer d'un compte chez Ok!Sign,
- prendre connaissance de cette page,
- copier la valeur x-oksign-authorization dans l'option "Matériel Caisse > Signature via Penguin & Ok!Sign : authorization" (id = PGSGN_OKID)
- un appareil mobile (smartphone ou tablette), connecté à Internet et disposant d'un MercatorPenguin 2.10.18 ou ultérieur,
- dans ce MercatorPenguin, activer et accepter les notifications; cela se fait au départ de l'écran d'information accessible depuis le bouton "i",
- noter l'ID qui apparaît une fois les notifications activées.
Dans les options "Matériel Caisse", il faut compléter la valeur de "Signature via MercatorPenguin : player id" (id = PGPAY_PLID) avec l'identifiant noté dans MercatorPenguin dans l'écran d'information. Cet identifiant peut être obtenu facilement via cette requête, où xyz correspondent aux trois premiers caractères lus dans MercatorPenguin :
select id from PENGUIN_PLAYERS where id like 'xyz%'
Dans l'exemple illustré ici, nous considérons que les colonnes suivantes ont été ajoutée dans la table PIEDS_V.
alter table PIEDS_V add NOM char(30) not null default ''
alter table PIEDS_V add FONCTION char(20) not null default ''
alter table PIEDS_V add EMAIL char(40) not null default ''
alter table PIEDS_V add NUM_GSM char(20) not null default ''
Pour afficher ces champs, nous suggérons d'utiliser le fichier Commande_oksign.mpge présent dans le zip ci-dessous pour charger le paramétrage de l'onglet correspondant.
Les paramètres envoyés à Ok!Sign sont toujours déterminés via un customizer Billing. Il doit implémenter l'interface MercatorSignPad.ISignPadPenguin et, dès lors, fournir une méthode SignPadPenguinRet FormDescriptorForOkSign.
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using MercatorApi;
using MercatorExtensions;
using MercatorUi;
using System.Text.RegularExpressions;
using System.Linq;
using MercatorSignPad;
namespace Billing
{
public class Customizer : MercatorSignPad.ISignPadPenguin
{
public SignPadPenguinRet FormDescriptorForOkSign(Form form)
{
MercatorUi.Forms.Billing.BillingForm billingForm = (MercatorUi.Forms.Billing.BillingForm)form;
Dictionary<string, string> dicoNotEmpty = new Dictionary<string, string>
{
{ "NOM", _Divers.Iif_langue(Globals.Langue, "Name", "Naam", "Nom") },
{ "EMAIL", _Divers.Iif_langue(Globals.Langue, "Email", "Email", "Email") },
{ "FONCTION", _Divers.Iif_langue(Globals.Langue, "Function", "Functie", "Fonction") },
{ "NUM_GSM", _Divers.Iif_langue(Globals.Langue, "Mobile", "GSM", "GSM") },
};
foreach (KeyValuePair<string, string> kvp in dicoNotEmpty)
{
if (string.IsNullOrWhiteSpace(billingForm.BillingEngine.PIEDS[kvp.Key].ToString()))
{
return new SignPadPenguinRet
{
CancelMessage = string.Format(_Divers.Iif_langue(Globals.Langue,
"The \"{0}\" field is mandatory!",
"Het veld \"{0}\" is verplicht!",
"Le champ \"{0}\" est obligatoire !"), kvp.Value)
};
}
}
Regex regex = new Regex(@"^\+?[1-9]\d{1,14}$");
if (!regex.IsMatch(billingForm.BillingEngine.PIEDS["NUM_GSM"].ToString()))
{
return new SignPadPenguinRet
{
CancelMessage = _Divers.Iif_langue(Globals.Langue,
"The mobile phone number must start with + and contain only digits!",
"Het GSM nummer moet beginnen met + en mag alleen cijfers bevatten!",
"Le numéro de GSM doit commencer par + et ne contenir que des chiffres !")
};
}
MercatorUi._BaseClasses.SqlFileView sqlFileView = billingForm.MovableControls.Values.OfType<MercatorUi._BaseClasses.SqlFileView>().FirstOrDefault(p => !p.ReadOnly);
if (sqlFileView == null)
return new SignPadPenguinRet { CancelMessage = "No SqlFileView!" };
string signedPdfFileName = string.Format("{0}_{1}_signed.pdf", billingForm.BillingEngine.Journal, billingForm.BillingEngine.PiedsVRecord.DATE.ToShortDateString().Replace("/", "_"));
MercatorSigning.OkSign.FormDescriptor.FormHelper formHelper1 = new MercatorSigning.OkSign.FormDescriptor.FormHelper
{
FieldMarker = "_Signature_",
FieldWidth = 175,
FieldHeight = 70,
FieldSigningOptions = MercatorSigning.OkSign.FormDescriptor.FormHelper.SigningOptionsEnum.Tan | MercatorSigning.OkSign.FormDescriptor.FormHelper.SigningOptionsEnum.Pen,
SignerInfoName = billingForm.BillingEngine.PiedsVRecord.NOM,
SignerInfoMobile = billingForm.BillingEngine.PiedsVRecord.NUM_GSM,
SignerInfoActingAs = billingForm.BillingEngine.PiedsVRecord.FONCTION,
SignerInfoEmail = billingForm.BillingEngine.PiedsVRecord.EMAIL
};
MercatorSigning.OkSign.FormDescriptor formDescriptor = new MercatorSigning.OkSign.FormDescriptor
{
SendToMeEmail = "info@mercator.eu", // pas obligatoire si le mail à utiliser est celui dans le compte OkSign
Logo = "https://www.mercator.eu/assets/images/logo.png", // pas obligatoire si le logo à utiliser est celui dans le compte OkSign
FileName = signedPdfFileName // nom du fichier visible par le signataire. Peut contenir une chaîne libre terminant par .pdf
};
formDescriptor.FormHelpers.Add(formHelper1);
return new SignPadPenguinRet
{
FormDescriptor = formDescriptor,
SignedFileName = Api.AddBS(sqlFileView.BasePath) + signedPdfFileName
};
}
}
}
Dans ce code, on voit qu'une validation des données est effectuée et que, le cas échéant, une chaîne de caractères est placée dans CancelMessage. Cela permet d'afficher ce message à l'utilisateur et d'annuler le processus de signature.
La propriété SignedFileName doit contenir le chemin complet du fichier signé qui sera téléchargé en fin de processus. Ce chemin peut être un chemin physique ou compatible SqlFileView. Dans cet exemple, nous utilisons toujours un stockage du fichier signé dans l'explorateur de fichiers SQL du document. Dès lors, il est obligatoire de placer un SqlFileView via le paramétrage d'écran.
Le FieldMarker est _Signature_. Il est donc nécessaire que cette chaîne de caractères soit présente dans le modèle d'impression associé à la séquence, à l'endroit où on souhaite faire apparaître le cadre de signature. (Voir exemple de repx dans le zip ci-dessous)
Utilisation
Lors de la demande de saisie d'une signature, Mercator affiche cet écran, qui permet de suivre les différents statuts de cette demande :
La chronologie de la séquence de signature est la suivante :
- Mercator envoie une notification au mobile dont le player id correspond à la valeur indiquée dans l'option "Signature via MercatorPenguin : player id".
- L'utilisateur doit ouvrir cette notification sur le mobile. Ceci va, le cas échéant, ouvrir MercatorPenguin.
- MercatorPenguin affiche alors une page web du portail Ok!Sign. (Le contenu de cette page ne dépend pas de Mercator et ne peut dès lors être modifié)
- Mercator se met à l'écoute des réponses du portail Ok!Sign.
- Dès que la signature est effectuée, Mercator télécharge le document signé et le place à l'endroit déterminé par SignedFileName .
La communication entre Mercator et MercatorPenguin se fait sur base d'une notification. En principe, la transmission de cette notification est immédiate et donc la signature peut être effectuée sans délai. En fonction de l'infrastructure utilisée ou de la couverture "data" à disposition, ce délai peut être allongé. Ceci peut rendre cette fonctionnalité inutilisable. Il est donc nécessaire d'effectuer des essais d'envois-réceptions de notifications dans l'environnement qui sera celui dans lequel sera utilisée cette fonctionnalité.
Rappel : les notifications ne sont jamais reçues si l'application n'a jamais été démarrée ou si on l'a forcé à quitter. -> démarrez au moins une fois MercatorPenguin.
Cette page donne des pistes de solutions pour réduire des retards de notifications.
Mots clés : OkSignA télécharger :
0000003143.zip (31 Kb - 20/03/2023)