De code die hierboven beschreven is, kan gebruikt worden om de inhoud van de PeppolBox te filteren om facturen en creditnota's te verbergen die niet voor de actieve gebruiker bestemd zijn. De code is gebaseerd op een PeppolBox customizer die de MercatorUi.ICustomizers.IPeppolBoxHelperCreated interface implementeert. Het wordt uitgevoerd wanneer de PeppolBox wordt geopend.
De zichtbaarheidsvoorwaarden voor facturen en creditnota's worden hier als voorbeeld gegeven. Ze kunnen worden aangepast aan meer specifieke vereisten. We gaan ervan uit dat leverancierscategorieën 1 en 2 elk een lijst van gebruikersafdelingen bevatten die deze facturen en creditnota's kunnen zien. (Met andere woorden, een lijst waarbij elk element een letter is) De leverancier wordt geïdentificeerd aan de hand van zijn btw-nummer, dat in het XML-bericht wordt ingelezen.
Het systeem verwijdert de berichten als zichtbare berichten. Deze berichten blijven echter zichtbaar voor andere gebruikers. (Ze worden niet verwijderd uit de tabel PEPPPOL_RECEIVED_MESSSAGES in de database.
In deze eerste versie van de code identificeren we de leverancier op basis van zijn btw-nummer dat wordt gelezen in parsedContent.SupplierVatNo. Dit is aanbevolen omdat Mercator het btw-nummer zoekt in een hele reeks velden die (al dan niet) aanwezig zijn in het XML-bestand.
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("Kan de inhoud van het ontvangen document {0} niet lezen: {1}\r\n{2}", message.Moment.ToShortDateShortTimeString(), parsedContent.Error, message.Id));
peppolBoxHelper.Messages.Remove(message); // het bericht kan niet gelezen worden. Uit veiligheidsoverwegingen wordt het verwijderd.
continue;
}
if (string.IsNullOrEmpty(parsedContent.SupplierVatNo))
{
Dialogs.Stop(string.Format("Kan het btw-nummer van het ontvangen document {0} van leverancier \"{1}\" niet lezen!\r\n{2}", message.Moment.ToShortDateShortTimeString(), parsedContent.SupplierName, message.Id));
peppolBoxHelper.Messages.Remove(message); // het bericht kan niet gelezen worden. Uit veiligheidsoverwegingen wordt het verwijderd.
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); // SQL-fout. Uit veiligheidsoverwegingen wordt het bericht verwijderd.
continue;
}
if (!fou.Any())
{
Dialogs.Stop(string.Format("De leverancier \"{0}\" met btw-nummer {1} bestaat niet!\r\n{2}", parsedContent.SupplierName, parsedContent.SupplierVatNo, message.Id));
peppolBoxHelper.Messages.Remove(message); // De leverancier werd niet geïdentificeerd. Uit veiligheidsoverwegingen wordt het bericht verwijderd.
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); // De gebruiker verwerkt geen facturen van deze leverancier. Het bericht wordt verwijderd.
}
}
}
}
}
De code in deze tweede versie is identiek, maar toont hoe men in het XML-bestand een willekeurig gegeven kan opzoeken om de leverancier te identificeren. Dit gebeurt via de methode parsedContent.XmlSelectNodes.
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("Kan de inhoud van het ontvangen document {0} niet lezen: {1}\r\n{2}", message.Moment.ToShortDateShortTimeString(), parsedContent.Error, message.Id));
peppolBoxHelper.Messages.Remove(message); // het bericht kan niet gelezen worden. Uit veiligheidsoverwegingen wordt het verwijderd.
continue;
}
XmlNode nodeNumTva = parsedContent.XmlSelectNodes("cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID").FirstOrDefault();
if (string.IsNullOrEmpty(nodeNumTva?.InnerText))
{
Dialogs.Stop(string.Format("Kan het btw-nummer van het ontvangen document {0} van leverancier \"{1}\" niet lezen!\r\n{2}", message.Moment.ToShortDateShortTimeString(), parsedContent.SupplierName, message.Id));
peppolBoxHelper.Messages.Remove(message); // het bericht kan niet gelezen worden. Uit veiligheidsoverwegingen wordt het verwijderd.
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); // SQL-fout. Uit veiligheidsoverwegingen wordt het bericht verwijderd.
continue;
}
if (!fou.Any())
{
Dialogs.Stop(string.Format("De leverancier \"{0}\" met btw-nummer {1} bestaat niet!\r\n{2}", parsedContent.SupplierName, nodeNumTva.InnerText, message.Id));
peppolBoxHelper.Messages.Remove(message); // De leverancier werd niet geïdentificeerd. Uit veiligheidsoverwegingen wordt het bericht verwijderd.
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); // De gebruiker verwerkt geen facturen van deze leverancier. Het bericht wordt verwijderd.
}
}
}
}
}