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

Dans un document de la gestion commerciale, ajouter des frais de port si un seuil n'est pas dépassé

0000002211     -      27/08/2017

L'objectif de cette programmation est d'ajouter dans la vente en cours un article "Frais de port" si le total du document ne dépasse pas un certain seuil spécifié par l'utilisateur. La valeur par défaut de ce seuil est de 200. Si le seuil n'est pas atteint, l'article "Frais de port", préalablement créé avec un S_ID=TRANSP, est ajouté à la vente en cours, juste avant la saisie des modes de paiement. Si le seuil est dépassé et que cet article était présent dans la vente, les lignes correspondantes sont supprimées.

Le code doit être placé dans un customizer Billing créé à partir de la séquence correspondante. Il implémente les interfaces suivantes :

Il exploite essentiellement l'évènement BeforePayment du BillingEngine du document en cours. Il est aussi un bon exemple de l'utilisation de la méthode InsertItem qui permet d'ajouter un article dans un document de la gestion commerciale.

Le code est le suivant :

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

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

        public void BillingEngineClosed(MercatorUi.Engine.Gescom.BillingEngine BillingEngine)
        {
            BillingEngine.BeforePayment -= BillingEngine_BeforePayment;
        }

        void BillingEngine_BeforePayment(object sender, EventArgs e)
        {
            MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
            double seuil = Dialogs.AskDouble("Quel est le seuil ?", 200, billingEngine.DisplayFormatPu); // seuil vaut double.MinValue si on clique sur "Annuler"
            if (billingEngine.PiedsVRecord.TOT_BAS_DV.CompareTo(seuil, billingEngine.NDec) < 0)
            {
                double valeur = Dialogs.AskDouble("Quel est le montant des frais ?", 0, billingEngine.DisplayFormatPu);
                if (valeur != double.MinValue) // on n'a pas cliqué sur "Annuler"
                {
                    var lignesVTransp = billingEngine.LignesVRecords.Where(l => l.ID_ARTICLE == "TRANSP"); // TRANSP est le S_ID de l'article "frais de port"
                    if (lignesVTransp.Count() == 0) // pas de ligne existante avec cet article
                    {
                        DataSet ds = Api.Zselect(Globals.RepData, "select * from stock (NOLOCK) where s_id='TRANSP'");
                        if (ds == null) // si erreur SQL à ce stade, on bloque le processus de sauvegarde
                            return;
                        Api.TrimEndDataTable(ds.Tables[0]);
                        int n = billingEngine.AppendLine(true);
                        if (!billingEngine.InsertItem(ds.Tables[0].Rows[0], billingEngine.LIGNES.Rows[n]))
                            return;
                        billingEngine.LignesVRecords[n].PU = valeur;
                    }
                    else // une ligne avec l'article frais de port existe déjà : on va l'utiliser
                    {
                        MercatorDatabase.LIGNES_V l = lignesVTransp.First();
                        l.DataRow[billingEngine.VarQ] = 1;
                        l.PU = valeur;
                    }
                    billingEngine.UpdateAmounts(); // recalculer le document
                }
            }
            else if (seuil > double.MinValue) // on est sous le seuil des frais de port -> on retire les frais de port si la ligne était déjà présente
            {
                billingEngine.LignesVRecords.Remove(l => l.ID_ARTICLE == "TRANSP");
                billingEngine.UpdateAmounts(); // recalculer le document
            }
        }
    }
}

Si la saisie des modes de paiement n'est pas utilisée dans cette séquence, il faut utiliser l'évènement BeforeSave en lieu et place de BeforePayment. Le code devient alors :

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

namespace Billing
{
    public class Customizer : MercatorUi.ICustomizers.IBillingEngineCreated, MercatorUi.ICustomizers.IBillingEngineClosed
    {

        public void BillingEngineCreated(MercatorUi.Engine.Gescom.BillingEngine BillingEngine)
        {
            BillingEngine.BeforeSave += BillingEngine_BeforeSave;
        }

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

        void BillingEngine_BeforeSave(object sender, MercatorUi.Engine.Gescom.BillingEngine.BeforeSaveEventArgs e)
        {
            ...
        }
    }
}