In een commercieel beheersdocument een promoartikel toevoegen afhankelijk van de hoeveelheid van een basisartikel

0000002226     -      05-07-2022

Vanaf Mercator 10.10 moet u deze informatie raadplegen.

 

Onderstaand voorbeeld toont hoe u een promoartikel toevoegt indien de hoeveelheid van een basisartikel wordt gewijzigd. In ons voorbeeld geeft de verkoop van een basisartikel voor een hoeveelheid hoger dan 10 recht op promoartikels voor diezelfde hoeveelheid min 10. De customizer voegt een lijn met dit promoartikel toe onder het basisartikel.

De code moet in een Billing-customizer geplaatst worden die gecreëerd werd vanuit de bijbehorende sequentie. Dit implementeert de volgende interfaces:

Maakt vooral gebruik van het event QtyChanged van de BillingEngine van het huidige document.

De code wordt als volgt samengesteld:

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.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 van het artikel dat recht geeft op de promo
            string s_id_promo = "..."; // s_id van het artikel dat als promo wordt gegeven
            if (billingEngine.LignesVRecords[e.RowIndex].ID_ARTICLE != s_id_base)
                return;

            if ((e.QAfterChange > 10) && (e.QBeforeChange <= 10)) // de lijn met het promoartikel wordt toegevoegd
            {
                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)) // de bestaande lijn wordt verwijderd
            {
                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();
                }
            }
        }
    }
}

De customizer werd op 'eenvoudige' wijze ontwikkeld en is onderworpen aan de volgende beperkingen:

  • Er wordt geen rekening gehouden met de via de sneltoets 'q *' gewijzigde hoeveelheden. (Want dit wijzigt de inhoud van de kolom id_article waarmee rekening wordt gehouden in de code)
  • De promoartikellijnen kunnen niet handmatig worden verwijderd aangezien deze slechts worden toegevoegd wanneer de waarde <=10 naar een waarde > 10 gaat.
  • De customizer wordt niet toegepast in het omzetten van documenten of bij het automatisch genereren van documenten.
  • Deze code wordt niet uitgevoerd bij het automatisch wijzigen van de hoeveelheid van verbonden artikels aangezien het event QtyChanged in dergelijke omstandigheden niet wordt opgeheven.

Deze customizer wordt 'as is' geleverd en moet als een eenvoudig uitgangspunt worden beschouwd voor een meer ambitieuze ontwikkeling.