Modifier le sujet et ajouter des pièces jointes dans un mail envoyé depuis un document de la gestion commerciale

0000002355     -      06/05/2025

L'objet de ce customizer est de modifier le sujet et d'ajouter des pièces jointes dans un mail envoyé depuis un document de la gestion commerciale. Il exploite l'évènement BeforeSendMail du BillingEngine. Cet évènement passe un BeforeSendMailEventArgs qui permet d'agir sur :

  • string Subject : le sujet du courriel
  • string Name : le nom du destinataire
  • string MailTo : l'adresse mail du destinataire
  • string Content : le contenu du message (source HTML si le contenu doit être formaté en HTML)
  • List<string> Attachments : liste des fichiers à attacher au mail

Si on veut bloquer l'envoi du mail, il suffit de mettre la propriété Cancel à true.

Cet évènement est levé que le mail soit envoyé via Outook ou via le CRM de Mercator.

Le code de ce customizer est le suivant :

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Windows.Forms;
using MercatorApi;


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

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

        void BillingEngine_BeforeSendMail(object sender, MercatorUi.Engine.Gescom.BillingEngine.BeforeSendMailEventArgs e)
        {
            e.Subject = "Nouveau sujet";
            e.Attachments.Add(@"C:\Test\test.html");
        } 
    }
}

 


Si on souhaite joindre les fichiers SQL des documents liés (par exemple de la commande et/ou de la livraison précédant une facture), ce code peut être utilisé :

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Windows.Forms;
using MercatorApi;
using MercatorExtensions;


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

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

        void BillingEngine_BeforeSendMail(object sender, MercatorUi.Engine.Gescom.BillingEngine.BeforeSendMailEventArgs e)
        {
            MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
            if (!string.IsNullOrEmpty(billingEngine.PiedsVRecord.PIECE_LIEE))
            {
                string reqSql = @"
                    select '<Files\'+rtrim(t.journal)+'\'+t.id+'\'+files.filename as filefullname
                        from pieds_v
                        cross apply dbo.DOC_LIES2(pieds_v.doc_lies) t
                        inner join FILES on files.filepath='<Files\'+t.journal+'\'+t.id+'\'
                        where (pieds_v.id=@id) and (pieds_v.journal=@journal) and (pieds_v.piece=@piece) and (files.filename is not null) ".UnIndent(5);
                List<string> l = Api.Zselect<string>(MercatorUi.Globals.RepData, reqSql, new MercatorSqlParam("@id", billingEngine.PiedsVRecord.ID, SqlDbType.Char), new MercatorSqlParam("@journal", billingEngine.PiedsVRecord.JOURNAL, SqlDbType.Char), new MercatorSqlParam("@piece", billingEngine.PiedsVRecord.PIECE));
                if (l != null)
                    e.Attachments.AddRange(l);
            }
        }
    }
}

Si on souhaite joindre les duplicatas PDF des documents liés (par exemple de la commande et/ou de la livraison précédant une facture), ce code peut être utilisé :

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Windows.Forms;
using MercatorApi;
using MercatorExtensions;

// <CompileWithRoslyn />

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

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

        void BillingEngine_BeforeSendMail(object sender, MercatorUi.Engine.Gescom.BillingEngine.BeforeSendMailEventArgs e)
        {
            MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
            if (!string.IsNullOrEmpty(billingEngine.PiedsVRecord.PIECE_LIEE))
            {
                string reqSql = @"
                    select t.type,t.id,t.journal,t.piece
                        from pieds_v
                        cross apply dbo.DOC_LIES2(pieds_v.doc_lies) t
                        where (pieds_v.id=@id) and (pieds_v.journal=@journal) and (pieds_v.piece=@piece
".UnIndent(5);
                List<(int type, string id, string journal, Int64 piece)> l = Api.Zselect< (int type, string id, string journal, Int64 piece)> (MercatorUi.Globals.RepData, reqSql, new MercatorSqlParam("@id", billingEngine.PiedsVRecord.ID, SqlDbType.Char), new MercatorSqlParam("@journal", billingEngine.PiedsVRecord.JOURNAL, SqlDbType.Char), new MercatorSqlParam("@piece", billingEngine.PiedsVRecord.PIECE));
                if (l != null)
                {
                    foreach ((Int16 type, string id, string journal, Int64 piece) tuple in l)
                    {
                        MercatorUi.Engine.Gescom.Tools.BillingDocDescriptor billingDocDescriptor = new MercatorUi.Engine.Gescom.Tools.BillingDocDescriptor(MercatorUi.Engine.Gescom.Billing.TypeVAEnum.V, tuple.type, tuple.id, tuple.journal, tuple.piece);
                        string lastPdfDuplicateFileName = billingDocDescriptor.LastPdfDuplicateFileName(out string error);
                        if (error != null)
                            MercatorUi.Dialogs.Stop(string.Format("Duplicata PDF {0} {1} : {2}", tuple.journal, tuple.piece, error));
                        else if (lastPdfDuplicateFileName != null)
                            e.Attachments.Add(lastPdfDuplicateFileName);
                    }
                }
            }
        }
    }
}


Cookies fonctionnels : Cookies nécessaires à l'utilisation du site et cookies de préférence. Ils ne contiennent aucune donnée à caractère personnel. (En savoir plus)

Cookies statistiques : Captation de statistiques liées aux comportements des internautes. (En savoir plus)

Cookies marketing : Pour effectuer le suivi des visiteurs au travers des sites web, à des fins publicitaires. (En savoir plus)