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.
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"