Les tarifs par quantité sont activés et un article est défini avec plusieurs seuils de quantité. La colonne remise 2 est en place. Dans un document de vente, j'encode une ligne article avec une certaine quantité. Je saisis aussi "manuellement" une remise 2. Lorsque je modifie ultérieurement la quantité, en restant dans le même palier ou non, la remise 2 repasse d'office à 0.
Comment préserver la remise 2 dans ce scénario ?
Lors d'un changement de quantité dans une vente, alors que les tarifs par quantité sont activés, Mercator recalcule de façon complète le prix de vente ainsi que toutes les remises. Une remise 2 pourrait, par exemple, être trouvée dans "Outils / Remises" (BAREMES). Le comportant décrit est donc souhaité et correct. Si on souhaite y déroger, il suffit de mettre en place ce customizer simple.
💡 Notez la présence du test if (e.FromChangeQ) qui permet de n'appliquer le code que si l'appel du recalcul est effectué depuis un changement de quantité en situation de tarif par quantité.
// <CompileWithRoslyn />
namespace Billing
{
public class Customizer : MercatorUi.ICustomizers.IBillingEngineCreated, MercatorUi.ICustomizers.IBillingEngineClosed
{
public void BillingEngineCreated(MercatorUi.Engine.Gescom.BillingEngine billingEngine)
{
billingEngine.BeforeApplyPricingInfo += BillingEngine_BeforeApplyPricingInfo;
billingEngine.AfterApplyPricingInfo += BillingEngine_AfterApplyPricingInfo;
}
public void BillingEngineClosed(MercatorUi.Engine.Gescom.BillingEngine billingEngine)
{
billingEngine.BeforeApplyPricingInfo -= BillingEngine_BeforeApplyPricingInfo;
billingEngine.AfterApplyPricingInfo -= BillingEngine_AfterApplyPricingInfo;
}
private (string dl_id, double remise2) tupple;
private void BillingEngine_BeforeApplyPricingInfo(object sender, MercatorUi.Engine.Gescom.BillingEngine.BeforeApplyPricingInfoEventArgs e)
{
if (e.FromChangeQ)
tupple = (e.LignesVRecord.DL_ID, e.LignesVRecord.REMISE2);
}
private void BillingEngine_AfterApplyPricingInfo(object sender, MercatorUi.Engine.Gescom.BillingEngine.AfterApplyPricingInfoEventArgs e)
{
if (e.FromChangeQ && (tupple.dl_id == e.LignesVRecord.DL_ID))
e.LignesVRecord.REMISE2 = tupple.remise2;
}
}
}