Le customizer illustré ici montre comment modifier le contenu XML d'un fichier bancaire, juste avant qu'il ne soit généré. Il s'applique ici aux domiciliations mais le même principe peut être appliqué aux virements.
A titre d'exemple, l'objet de ce customizer est de remplacer l'élément PmtInfId, du type
<PmtInfId>MERCATOR-F4F07B2F-C4AF-E1F3-4E</PmtInfId>
par celui ci :
<PmtInfId>M002566-F4F07B2F-C4AF-E1F3-4E</PmtInfId>
càd par la référence du fichier, soit dans cet exemple 2566
Le customizer exploite l'évènement BeforeCreateFile de la form MercatorUi.Forms.Accounting.AccountingBankDomicilForm. Cet évènement passe un BeforeCreateFileEventArgs, dont la propriété Xml (qui est un StringBuilder) reprend le contenu xml du fichier.
Pour une application aux virements, il faudrait remplacer AccountingBankDomicilForm par AccountingBankVirementForm.
Le code de ce customizer est le suivant :
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MercatorApi;
using MercatorUi;
using System.Windows.Forms;
namespace Main
{
public class Customizer : MercatorUi.ICustomizers.IExec
{
public void Main(MercatorUi.ICustomizers.ExecAction Action)
{
if (Action == MercatorUi.ICustomizers.ExecAction.DossierOpen)
{
Globals.Main.BaseFormCreating += new MercatorUi.Main.BaseFormCreatingEventHandler(Main_BaseFormCreating);
}
else if (Action == MercatorUi.ICustomizers.ExecAction.DossierClose)
{
Globals.Main.BaseFormCreating -= new MercatorUi.Main.BaseFormCreatingEventHandler(Main_BaseFormCreating);
}
}
void Main_BaseFormCreating(object sender, MercatorUi.Main.BaseFormCreatingEventArgs e)
{
if (e.Form.GetType() == typeof(MercatorUi.Forms.Accounting.AccountingBankDomicilForm))
{
e.Form.Shown += new EventHandler(Form_Shown);
e.Form.FormClosed += new FormClosedEventHandler(Form_FormClosed);
}
}
void Form_Shown(object sender, EventArgs e)
{
MercatorUi.Forms.Accounting.AccountingBankDomicilForm accountingBankDomicilForm = (MercatorUi.Forms.Accounting.AccountingBankDomicilForm)sender;
accountingBankDomicilForm.BeforeCreateFile += new MercatorUi.Forms.Accounting.AccountingBankDomicilForm.BeforeCreateFileEventHandler(accountingBankDomicilForm_BeforeCreateFile);
accountingBankDomicilForm.Shown -= new EventHandler(Form_Shown); // désinscrire l'évènement
}
void Form_FormClosed(object sender, FormClosedEventArgs e)
{
MercatorUi.Forms.Accounting.AccountingBankDomicilForm accountingBankDomicilForm = (MercatorUi.Forms.Accounting.AccountingBankDomicilForm)sender;
accountingBankDomicilForm.FormClosed -= new FormClosedEventHandler(Form_FormClosed);
accountingBankDomicilForm.BeforeCreateFile -= new MercatorUi.Forms.Accounting.AccountingBankDomicilForm.BeforeCreateFileEventHandler(accountingBankDomicilForm_BeforeCreateFile);
}
void accountingBankDomicilForm_BeforeCreateFile(object sender, MercatorUi.Forms.Accounting.AccountingBankDomicilForm.BeforeCreateFileEventArgs e)
{
MercatorUi.Forms.Accounting.AccountingBankDomicilForm accountingBankDomicilForm = (MercatorUi.Forms.Accounting.AccountingBankDomicilForm)sender;
string reference = Api.JustStem(e.Fichier);
e.Xml.Replace("<PmtInfId>MERCATOR-", "<PmtInfId>M" + Api.Right(reference, 7) + "-");
}
}
}
Comme pour tous les évènements interceptés avec une logique prenant son départ avec (Action == MercatorUi.ICustomizers.ExecAction.DossierOpen), il est nécessaire de rédémarrer Mercator pour que ce code soit pris en compte.
Attention : ce type de code doit être mis en place avec précaution, puisqu'il modifie le contenu de fichiers bancaires. Dans l'absolu, une erreur de programmation peut conduire à transmettre à la banque des fichiers qui seront bien exécutés, malgré le fait qu'ils contiennent des erreurs.