A partir de Mercator 10.10, il faut prendre en considération cette information.
L'exemple ci-dessous montre comment ajouter un article promotionnel si la quantité d'un article de base est changée. Dans notre exemple, la vente de l'article de base pour une quantité supérieure à 10 donne droit à des articles promotionnels pour la même quantité moins 10. Le customizer ajoute une ligne avec cet article promotionnel sous l'article de base.
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 QtyChanged du BillingEngine du document en cours.
Le code s'établit comme suit :
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.QtyChanged += BillingEngine_QtyChanged;
}
public void BillingEngineClosed(MercatorUi.Engine.Gescom.BillingEngine BillingEngine)
{
BillingEngine.QtyChanged -= BillingEngine_QtyChanged;
}
void BillingEngine_QtyChanged(object sender, MercatorUi.Engine.Gescom.BillingEngine.QtyChangedEventArgs e)
{
MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
string s_id_base = "..."; // s_id de l'article qui donne droit à la promo
string s_id_promo = "..."; // s_id de l'article que l'on reçoit en promo
if (billingEngine.LignesVRecords[e.RowIndex].ID_ARTICLE != s_id_base)
return;
if ((e.QAfterChange > 10) && (e.QBeforeChange <= 10)) // on ajoute la ligne avec l'article promo
{
int n = billingEngine.AppendLine(billingEngine.LIGNES.Rows[e.RowIndex]);
if (billingEngine.InsertItem(s_id_promo, billingEngine.LIGNES.Rows[n]))
{
billingEngine.LignesVRecords[n].Q = e.QAfterChange - 10;
billingEngine.UpdateAmounts();
}
}
else if ((e.QAfterChange > 10) && (e.QBeforeChange > 10)) // on utilise la ligne qui existe déjà
{
if ((e.RowIndex + 1 < billingEngine.LIGNES.Rows.Count) && (billingEngine.LignesVRecords[e.RowIndex + 1].ID_ARTICLE == s_id_promo))
{
billingEngine.LignesVRecords[e.RowIndex + 1].Q = e.QAfterChange - 10;
billingEngine.UpdateAmounts();
}
}
else if ((e.QAfterChange <= 10) && (e.QBeforeChange > 10)) // on retire la ligne qui existe déjà
{
if ((e.RowIndex + 1 < billingEngine.LIGNES.Rows.Count) && (billingEngine.LignesVRecords[e.RowIndex + 1].ID_ARTICLE == s_id_promo))
{
billingEngine.LignesVRecords.RemoveAt(e.RowIndex + 1);
billingEngine.UpdateAmounts();
}
}
}
}
}
Le customizer a été developpé de façon "simple" et est soumis aux limites suivantes :
-
Les changements de quantités via le raccourci "q * " ne sont pas pris en compte. (Parce que cela altère le contenu de la colonne id_article qui est prise en compte dans le code)
-
Les lignes d'articles promotionnels ne peuvent pas être supprimées manuellement puisqu'elles ne sont ajoutées que quand la quantité passe d'une valeur <=10 à une valeur > 10.
-
Le customizer ne s'applique pas en transformation de documents ou en génération automatique de documents.
-
Ce code ne s'exécute pas en cas de changement automatique de quantité sur articles liés car l'évènement QtyChanged n'est pas levé en pareilles circonstances.
Ce customizer est fourni "as is" et doit être considéré comme un simple point de départ pour un développement plus ambitieux.