In een commercieel beheersdocument portkosten toevoegen indien een bepaalde drempel niet bereikt werd

0000002211     -      27-08-2017

Met deze programmering wordt een artikel 'Portkosten' toegevoegd in een lopende verkoop indien het totaal van het document een door de gebruiker bepaalde drempel niet overschrijdt. Deze waarde van deze drempel staat standaard ingesteld op 200. Indien de drempel niet wordt bereikt dan wordt het artikel 'Portkosten' dat voorheen aangemaakt werd met een S_ID=TRANSP, aan de huidige verkoop toegevoegd, net voor het ingeven van de betaalwijzen. Indien deze drempel overschreden worden en dit artikel in de verkoop vermeld stond, dan worden de bijbehorende lijnen verwijderd.

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 BeforePayment van de BillingEngine van het huidige document. Dit vormt ook een goed voorbeeld van het gebruik van de methode InsertItem waarmee een artikel in een commercieel beheersdocument kan worden toegevoegd.

De code is:

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

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

        public void BillingEngineClosed(MercatorUi.Engine.Gescom.BillingEngine BillingEngine)
        {
            BillingEngine.BeforePayment -= BillingEngine_BeforePayment;
        }

        void BillingEngine_BeforePayment(object sender, EventArgs e)
        {
            MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
            double seuil = Dialogs.AskDouble("Hoeveel bedraagt is de drempel?", 200, billingEngine.DisplayFormatPu); // drempel is double.MinValue indien er op "Annuleren" wordt geklikt
            if (billingEngine.PiedsVRecord.TOT_BAS_DV.CompareTo(seuil, billingEngine.NDec) < 0)
            {
                double valeur = Dialogs.AskDouble("Hoeveel bedragen de kosten?", 0, billingEngine.DisplayFormatPu);
                if (valeur != double.MinValue) // er werd niet op "Annuleren" geklikt
                {
                    var lignesVTransp = billingEngine.LignesVRecords.Where(l => l.ID_ARTICLE == "TRANSP"); // TRANSP est le S_ID de l'article "portkosten"
                    if (lignesVTransp.Count() == 0) // er bestaat geen lijn met dit artikel
                    {
                        DataSet ds = Api.Zselect(Globals.RepData, "select * from stock (NOLOCK) where s_id='TRANSP'");
                        if (ds == null) // indien SQL-fout in deze fase, dan wordt het bewaarproces geblokkeerd
                            return;
                        Api.TrimEndDataTable(ds.Tables[0]);
                        int n = billingEngine.AppendLine(true);
                        if (!billingEngine.InsertItem(ds.Tables[0].Rows[0], billingEngine.LIGNES.Rows[n]))
                            return;
                        billingEngine.LignesVRecords[n].PU = valeur;
                    }
                    else // er bestaat al een lijn met het artikel portkosten: deze wordt gebruikt
                    {
                        MercatorDatabase.LIGNES_V l = lignesVTransp.First();
                        l.DataRow[billingEngine.VarQ] = 1;
                        l.PU = valeur;
                    }
                    billingEngine.UpdateAmounts(); // het document herberekenen
                }
            }
            else if (seuil > double.MinValue) // onder de drempel voor de portkosten -> de portkosten worden verwijderd indien deze lijn er al stond
            {
                billingEngine.LignesVRecords.Remove(l => l.ID_ARTICLE == "TRANSP");
                billingEngine.UpdateAmounts(); // het document herberekenen
            }
        }
    }
}

Indien het ingeven van de betaalwijzen in deze sequentie niet wordt gebruikt, dan moet het event BeforeSave in de plaats van BeforePayment worden gebruikt. De code wordt dan:

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.BeforeSave += BillingEngine_BeforeSave;
        }

        public void BillingEngineClosed(MercatorUi.Engine.Gescom.BillingEngine BillingEngine)
        {
            BillingEngine.BeforeSave -= BillingEngine_BeforeSave;
        }

        void BillingEngine_BeforeSave(object sender, MercatorUi.Engine.Gescom.BillingEngine.BeforeSaveEventArgs e)
        {
            ...
        }
    }
}