Vous consultez une page technique concernant le logiciel de gestion Mercator. Celle-ci contient des informations spécifiques destinées aux professionnels de Mercator. Souhaitez-vous être redirigés vers des informations plus générales ?


   Ne plus poser cette question

Modifier le calcul des back-orders effectué par Mercator

0000002405     -      27/08/2017

Le BillingEngine de Mercator est doté d'un évènement AfterBo (après back-orders) qui est levé juste après le calul des reliquats. Cela permet de modifier ce calcul. L'évènement sera levé plusieurs fois si le document en cours contient plusieurs documents d'origine (transformation vers document ouvert). L'EventArgs de cet évènement contient ces propriétés spécifiques :

  • PiedOriginalDocument : une DataRow contenant le pied du document d'origine en cours de calcul de reliquats
  • LinesOriginalDocument : une DataTable contenant les lignes correspondantes. Ces lignes correspondent aux reliquats calculés par Mercator pour ce document d'origine.

Dans cet exemple de programmation, nous allons permettre d'annuler les reliquats pour certains articles et de les conserver pour d'autres. Cette situation se rencontre si, par exemple, lors d'une livraison partielle d'une commande, certains articles sont définitivement remplacés par d'autres articles, alors que d'autres articles ne peuvent être substitués et doivent donc être maintenus dans la commande. Pour mettre cela en place, il faut ajouter un champ NO_BO de type bit dans la table LIGNES_V. Dans la séquence de livraison, une colonne ayant comme source NO_BO doit être ajoutée (case à cocher).

Après la transformation de la commande en livraison et adaptation des quantités, il faut cocher "NO_BO" sur les lignes pour lesquelles on ne souhaite pas maintenir de back-orders. Lors de la validation, il convient de répondre "Oui" à la question "Gérer les reliquats ?".

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Linq;
using MercatorApi;

namespace Billing
{
    public class Customizer : MercatorUi.ICustomizers.IBillingEngineCreated, MercatorUi.ICustomizers.IBillingEngineClosed
    {

        public void BillingEngineCreated(MercatorUi.Engine.Gescom.BillingEngine BillingEngine)
        {
            BillingEngine.AfterBo += BillingEngine_AfterBo;
        }

        public void BillingEngineClosed(MercatorUi.Engine.Gescom.BillingEngine BillingEngine)
        {
            BillingEngine.AfterBo -= BillingEngine_AfterBo;
        }

        void BillingEngine_AfterBo(object sender, MercatorUi.Engine.Gescom.BillingEngine.AfterBoEventArgs e)
        {
            MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
            foreach(MercatorDatabase.LIGNES_V l in billingEngine.LignesVRecords.Where(l => l.NO_BO))
            {
                DataRow[] foundRows;
                if (l.GENERIQ)
                    foundRows = e.LinesOriginalDocument.Select(string.Format("(id_article='{0}') and (designatio='{1}') and (serie=0)",
                        Api.UnquoteSql(l.ID_ARTICLE), Api.UnquoteSql(l.DESIGNATIO)));
                else
                    foundRows = e.LinesOriginalDocument.Select(string.Format("(id_article='{0}') and (serie=0)",
                        Api.UnquoteSql(l.ID_ARTICLE)));

                foreach (DataRow dr2 in foundRows)
                    e.LinesOriginalDocument.Rows.Remove(dr2);
            }
        }

    }
}

Remarques :

  • Etant donné que le calcul des reliquats effectue par défaut un regroupement par article, il n'est pas possible de maintenir en reliquats certaines lignes d'un article et, en même temps, de supprimer d'autres lignes de ce même article. Le cas échéant, le code peut toutefois être affiné en enrichissant ce critère de sélection : "(id_article='{0}') and (serie=0)"
  • L'exemple présenté ici gère correctement les modifications de back-orders sur articles génériques
  • Les articles à n° de série sont toujours ignorés par ce processus