Filtrer le contenu de la PeppolBox en fonction du profil utilisateur et du contenu du message

0000003282     -      10/04/2025

Le code décrit ci-dessus permet de filtrer le contenu de la PeppolBox pour masquer les factures et notes de crédit qui ne sont pas destinées à l'utilisateur actif. Le code se fonde sur un customizer PeppolBox qui implémente l'interface MercatorUi.ICustomizers.IPeppolBoxHelperCreated. Il est exécuté lors de l'ouverture de la PeppolBox.

Les conditions de visibilité des factures et notes de crédit sont prises ici pour l'exemple. Elles seront adaptées selon des desiderata plus précis. On pose l'hypothèse que les catégories fournisseurs 1 et 2 contiennent chacune une liste de départements d'utilisateur qui peuvent voir ces factures et notes de crédit. (Donc, une liste où chaque élément est une lettre) Le fournisseur est identifié par son numéro de TVA qui est lu dans le message XML.

Le système retire les messages en tant que messages visibles. Ces messages resteront toutefois visibles pour les autres utilisateurs. (Ils ne sont pas retirés de la table PEPPPOL_RECEIVED_MESSSAGES dans la base de données.

Dans cette première version du code, nous identifions le fournisseur sur base de son numéro de TVA lu dans parsedContent.SupplierVatNo. Ceci est recommandé car Mercator cherche le numéro de TVA dans toute une série de zones présentes (ou pas) dans le fichier XML.

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Linq;
using MercatorApi;
using MercatorExtensions;
using MercatorUi;
using MercatorDatabase;
using System.Xml;
using MercatorUi.Forms.Other.OtherClasses;

// <CompileWithRoslyn />

namespace PeppolBox
{
    public class Customizer : MercatorUi.ICustomizers.IPeppolBoxHelperCreated, MercatorUi.ICustomizers.IPeppolBoxHelperClosed
    {
        public void PeppolBoxHelperCreated(PeppolBoxHelper peppolBoxHelper)
        {
            peppolBoxHelper.Downloading += PeppolBoxHelper_Downloading;
            FilterMessages(peppolBoxHelper, peppolBoxHelper.Messages);
        }

        public void PeppolBoxHelperClosed(PeppolBoxHelper peppolBoxHelper)
        {
            peppolBoxHelper.Downloading -= PeppolBoxHelper_Downloading;
        }

        private void PeppolBoxHelper_Downloading(object sender, PeppolBoxHelper.DownloadingEventArgs e)
        {
            PeppolBoxHelper peppolBoxHelper = (PeppolBoxHelper)sender;
            FilterMessages(peppolBoxHelper, e.Messages);
        }

        private void FilterMessages(PeppolBoxHelper peppolBoxHelper, PeppolBoxHelper.PeppolMessagesCollection messages)
        {
            foreach (var message in messages.Where(m => m.IsInvoiceOrCreditNote).ToArray())
            {
                var parsedContent = message.ReceivedDoc.ParseContent(Globals.Langue, MercatorPeppol.ReceivedDoc.ParseContentEnum.WithSupplierName);
                if (!string.IsNullOrEmpty(parsedContent.Error))
                {
                    Dialogs.Stop(string.Format("Impossible de lire le contenu du document reçu {0} : {1}\r\n{2}", message.Moment.ToShortDateShortTimeString(), parsedContent.Error, message.Id));
                    peppolBoxHelper.Messages.Remove(message); // on ne sait pas lire le message. Par sécurité on le supprime.
                    continue;
                }

                if (string.IsNullOrEmpty(parsedContent.SupplierVatNo))
                {
                    Dialogs.Stop(string.Format("Impossible de lire le numéro de TVA du document reçu {0} du fournisseur \"{1}\" !\r\n{2}", message.Moment.ToShortDateShortTimeString(), parsedContent.SupplierName, message.Id));
                    peppolBoxHelper.Messages.Remove(message); // on ne sait pas lire le message. Par sécurité on le supprime.
                    continue;
                }

                List<(string f_cat1, string f_cat2)> fou = Api.Zselect<(string f_cat1, string f_cat2)>(Globals.RepData, "select f_cat1,f_cat2 from FOU where f_num_tva=@num_tva", new MercatorSqlParam("@num_tva", parsedContent.SupplierVatNo, SqlDbType.Char));
                if (fou == null)
                {
                    peppolBoxHelper.Messages.Remove(message); // Erreur SQL. Par sécurité on supprime le message.
                    continue;
                }

                if (!fou.Any())
                {
                    Dialogs.Stop(string.Format("Le fournisseur \"{0}\" avec numéro de TVA {1} n'existe pas !\r\n{2}", parsedContent.SupplierName, parsedContent.SupplierVatNo, message.Id));
                    peppolBoxHelper.Messages.Remove(message); // Le fournisseur n'est pas identifié. Par sécurité on supprime le message.
                    continue;
                }

                if (!string.IsNullOrEmpty(fou[0].f_cat1) && !Globals.CurrentUserRecord.DEPT.Contains(fou[0].f_cat1)
                    || !string.IsNullOrEmpty(fou[0].f_cat2) && !Globals.CurrentUserRecord.DEPT.Contains(fou[0].f_cat2))
                {
                    peppolBoxHelper.Messages.Remove(message); // L'utilisateur ne traite pas les factures de ce fournisseur. On supprime le message.
                }
            }
        }
    }
}

Le code de cette seconde version est identique, mais il montre comment trouver dans le fichier XML une information au choix permettant d'identifier le fournisseur. Ceci se fait via la méthode parsedContent.XmlSelectNodes.

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Linq;
using MercatorApi;
using MercatorExtensions;
using MercatorUi;
using MercatorDatabase;
using System.Xml;
using MercatorUi.Forms.Other.OtherClasses;

// <CompileWithRoslyn />

namespace PeppolBox
{
    public class Customizer : MercatorUi.ICustomizers.IPeppolBoxHelperCreated, MercatorUi.ICustomizers.IPeppolBoxHelperClosed
    {
        public void PeppolBoxHelperCreated(PeppolBoxHelper peppolBoxHelper)
        {
            peppolBoxHelper.Downloading += PeppolBoxHelper_Downloading;
            FilterMessages(peppolBoxHelper, peppolBoxHelper.Messages);
        }

        public void PeppolBoxHelperClosed(PeppolBoxHelper peppolBoxHelper)
        {
            peppolBoxHelper.Downloading -= PeppolBoxHelper_Downloading;
        }

        private void PeppolBoxHelper_Downloading(object sender, PeppolBoxHelper.DownloadingEventArgs e)
        {
            PeppolBoxHelper peppolBoxHelper = (PeppolBoxHelper)sender;
            FilterMessages(peppolBoxHelper, e.Messages);
        }

        private void FilterMessages(PeppolBoxHelper peppolBoxHelper, PeppolBoxHelper.PeppolMessagesCollection messages)
        {
            foreach (var message in messages.Where(m => m.IsInvoiceOrCreditNote).ToArray())
            {
                var parsedContent = message.ReceivedDoc.ParseContent(Globals.Langue, MercatorPeppol.ReceivedDoc.ParseContentEnum.WithSupplierName);
                if (!string.IsNullOrEmpty(parsedContent.Error))
                {
                    Dialogs.Stop(string.Format("Impossible de lire le contenu du document reçu {0} : {1}\r\n{2}", message.Moment.ToShortDateShortTimeString(), parsedContent.Error, message.Id));
                    peppolBoxHelper.Messages.Remove(message); // on ne sait pas lire le message. Par sécurité on le supprime.
                    continue;
                }

                XmlNode nodeNumTva = parsedContent.XmlSelectNodes("cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID").FirstOrDefault();
                if (string.IsNullOrEmpty(nodeNumTva?.InnerText))
                {
                    Dialogs.Stop(string.Format("Impossible de lire le numéro de TVA du document reçu {0} du fournisseur \"{1}\" !\r\n{2}", message.Moment.ToShortDateShortTimeString(), parsedContent.SupplierName, message.Id));
                    peppolBoxHelper.Messages.Remove(message); // on ne sait pas lire le message. Par sécurité on le supprime.
                    continue;
                }

                List<(string f_cat1, string f_cat2)> fou = Api.Zselect<(string f_cat1, string f_cat2)>(Globals.RepData, "select f_cat1,f_cat2 from FOU where f_num_tva=@num_tva", new MercatorSqlParam("@num_tva", nodeNumTva.InnerText, SqlDbType.Char));
                if (fou == null)
                {
                    peppolBoxHelper.Messages.Remove(message); // Erreur SQL. Par sécurité on supprime le message.
                    continue;
                }

                if (!fou.Any())
                {
                    Dialogs.Stop(string.Format("Le fournisseur \"{0}\" avec numéro de TVA {1} n'existe pas !\r\n{2}", parsedContent.SupplierName, nodeNumTva.InnerText, message.Id));
                    peppolBoxHelper.Messages.Remove(message); // Le fournisseur n'est pas identifié. Par sécurité on supprime le message.
                    continue;
                }

                if (!string.IsNullOrEmpty(fou[0].f_cat1) && !Globals.CurrentUserRecord.DEPT.Contains(fou[0].f_cat1)
                    || !string.IsNullOrEmpty(fou[0].f_cat2) && !Globals.CurrentUserRecord.DEPT.Contains(fou[0].f_cat2))
                {
                    peppolBoxHelper.Messages.Remove(message); // L'utilisateur ne traite pas les factures de ce fournisseur. On supprime le message.
                }
            }
        }
    }
}


Cookies fonctionnels : Cookies nécessaires à l'utilisation du site et cookies de préférence. Ils ne contiennent aucune donnée à caractère personnel. (En savoir plus)

Cookies statistiques : Captation de statistiques liées aux comportements des internautes. (En savoir plus)

Cookies marketing : Pour effectuer le suivi des visiteurs au travers des sites web, à des fins publicitaires. (En savoir plus)