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

Appliquer un tarif par quantité en fonction de la quantité totale par article dans le document

0000003028     -      17/01/2022

Mercator 10.9 ou ultérieur dispose de l'event GettingPricingByQty qui permet de modifier la valeur de la quantité utilisée pour déterminer le tarif à utiliser en fonction des seuils de quantité définis. Dans l'exemple ci-dessous, nous montrons comment changer la quantité en sommant toutes les quantités pour l'article en cours. Ensuite, une fois le prix obtenu, celui-ci est réappliqué par code (pour PU et REMISE) dans les autres lignes comportant aussi cet article. Ceci permet d'appliquer une remise même si la quantité du seuil n'est atteinte qu'en sommant plusieurs lignes.

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

// <CompileWithRoslyn />

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

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

        private void BillingEngine_GettingPricingByQty(object sender, MercatorUi.Engine.Gescom.BillingEngine.GettingPricingByQtyEventArgs e)
        {
            MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
            double totQ = billingEngine.LignesVRecords.Where(l => l.ID_ARTICLE == e.LigneVRecord.ID_ARTICLE).Sum(l => l.Q);
            if (totQ.CompareTo(e.Q, Globals.N_DEC_Q) != 0)
            {
                e.Q = totQ;
                MercatorUi.Engine.Gescom.BillingEngine.AfterApplyPricingInfoEventHandler afterApplyPricingInfoEventHandler = null;
                afterApplyPricingInfoEventHandler = (s, e2) =>
                {
                    billingEngine.AfterApplyPricingInfo -= afterApplyPricingInfoEventHandler;
                    if (e.DataRowLignes == e2.DataRowLignes) // est-on toujours sur la même ligne ?
                    {
                        // mettre à jour les autres lignes avec ce même article
                        foreach (var l in billingEngine.LignesVRecords.Where(l => (l.ID_ARTICLE == e.LigneVRecord.ID_ARTICLE) && (l.DataRow != e.DataRowLignes)))
                        {
                            l.PU = e.LigneVRecord.PU;
                            l.REMISE = e.LigneVRecord.REMISE;
                        }
                    }
                };
                billingEngine.AfterApplyPricingInfo += afterApplyPricingInfoEventHandler;
            }
        }
    }
}

 

Le principe est similaire à celui appliqué au customizer associé aux soldes et promotions par quantité.

Note : le code illustré ici ne gère pas le changement de prix en cas de suppression de ligne. Ceci doit donc être géré via un appel de ChangeAllPrices dans un événement BeforeBeforePaymentOrSave.

 


Informations complémentaires : Fonctionnalités de "Outils > Remises"