Installatie van meerdere vervaldata voor verkoopdocumenten

0000002498     -      03-10-2015

Mercator stelt voor een compleet boekhoudkundig verkoopdocument standaard één enkele vervaldatum voor. Deze vervaldatum wordt opgeslagen op de boekingslijn die overeenkomt met het debet van de klantenrekening.

In sommige situaties kan het wenselijk zijn om een klant een betalingsfaciliteit te verlenen door hem toe te staan om de factuur op meerdere afgesproken vervaldata te betalen.

De bijgevoegde module illustreert dit proces. In het voorbeeld biedt deze module een vereenvoudigde functionaliteit: het totale factuurbedrag wordt verdeeld over 3 gelijke betalingstermijnen, in de tijd gescheiden door één maand vanaf de basisvervaldag.

Zodra het boekhoudkundige bewijsstuk via deze module is geboekt, zullen er bij raadpleging van het document (knop links van de bril in de historiek van het menu Venster) wel degelijk 3 klantendebetlijnen verschijnen met verschillende vervaldagen in plaats van één lijn. Deze lijnen komen uiteraard ook voor in het grootboek van de klant en zullen op de gebruikelijke wijze verwerkt kunnen worden via alle Mercator-functionaliteiten: afpunting, aanmaningen, berichtgevingen,…


Deze module maakt met name gebruik van het event DuringSave du BookingEgine en implementeert de volgende interfaces:

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 Booking
{
    public class Customizer : MercatorUi.ICustomizers.IBookingEngineCreated, MercatorUi.ICustomizers.IBookingEngineClosed
    {
        public void BookingEngineCreated(MercatorUi.Engine.Cpta.BookingEngine bookingEngine)
        {
            bookingEngine.DuringSave += new MercatorUi.Engine.Cpta.BookingEngine.DuringSaveEventHandler(bookingEngine_DuringSave);
        }

        public void BookingEngineClosed(MercatorUi.Engine.Cpta.BookingEngine bookingEngine)
        {
            bookingEngine.DuringSave -= new MercatorUi.Engine.Cpta.BookingEngine.DuringSaveEventHandler(bookingEngine_DuringSave);
        }

        private void bookingEngine_DuringSave(object sender, MercatorUi.Engine.Cpta.BookingEngine.DuringSaveEventArgs e)
        {
            Int16 rupture = 3;
            StringBuilder reqSql = new StringBuilder();
            reqSql.AppendLine("declare @val_der_tot float,@val_der_tot_dv float,@tot_rupt float,@tot_rupt_dv float");
            reqSql.AppendLine("select @tot_rupt = round(tot/@rupture,@n_dec),@val_der_tot = tot-@tot_rupt,@tot_rupt_dv = round(tot_dv/@rupture,@n_dec), @val_der_tot_dv = tot_dv-@tot_rupt_dv from #lignes_c_tmp where recno = 1");
            reqSql.AppendLine("update #lignes_c_tmp set  tot = @tot_rupt,tot_dv = @tot_rupt_dv where recno = 1");


            StringBuilder req_prem_part = new StringBuilder();
            StringBuilder req_sec_part = new StringBuilder();
            req_prem_part.AppendLine("(");
            req_sec_part.AppendLine("select ");
            foreach (KeyValuePair<string, MercatorUi.Engine.Cpta.Tools.FieldDescriptor> kvp in MercatorUi.Globals.EngineCpta.FieldListLignes)
            {
                req_prem_part.Append(kvp.Key + ",");

                if (kvp.Key == "DL_ID")
                    req_sec_part.Append("right(newid(),10),");
                else if (kvp.Key == "RECNO")
                    req_sec_part.Append("recno+1,");
                else if (kvp.Key == "ECHEANCE")
                    req_sec_part.Append("dbo.add_month(echeance,1),");
                else
                    req_sec_part.Append(kvp.Key + ",");
            }
            req_prem_part.Remove(req_prem_part.Length - 1, 1).Append(") ");
            req_sec_part = req_sec_part.Remove(req_sec_part.Length - 1, 1).Append(" ");



            for (int i = 1; i < rupture - 1; i++)
            {
                reqSql.AppendLine("insert into #lignes_c_tmp "
                    + req_prem_part.ToString()
                    + req_sec_part.ToString().Replace("recno+1", "recno+1+" + i.ToString()).Replace("dbo.add_month(echeance,1)", "dbo.add_month(echeance,1+" + i.ToString() + ")")
                    + "from #lignes_c_tmp where recno = 1");
                reqSql.AppendLine("select @val_der_tot = @val_der_tot-@tot_rupt,@val_der_tot_dv = @val_der_tot_dv-@tot_rupt_dv");
            }

            reqSql.AppendLine("insert into #lignes_c_tmp "
                + req_prem_part.ToString()
                + req_sec_part.ToString().Replace(",TOT,", ",@val_der_tot,").Replace(",TOT_DV,", ",@val_der_tot_dv,")
                + "from #lignes_c_tmp where recno = 1");

            e.SqlCommand.CommandText = reqSql.ToString();
            e.SqlCommand.Parameters.AddWithValue("@rupture", rupture);
            if (!Api.SqlExec(e.SqlCommand))
                e.CancelSave = true;
            /*e.SqlCommand.CommandText = "select * from #lignes_c_tmp";
            DataSet ds = Api.Zselect(Globals.RepData, e.SqlCommand);
            _Divers.ViewData(ds);*/

        }
    }
}