Lors de l'import de factures Peppol en gestion commerciale, il est possible de modifier la requête SQL qui permet d'identifier les articles se trouvant dans cette facture. Cela se fait via un customizer Gescom qui implémente IStringUpdater. L'id de la requête à modifier est EINVOICE_IMPORT_ITEM. Elle reçoit ces paramètres : @cle1, @cle2, @cle3, @modele, @f_id et @c_id. Ces deux derniers peuvent être à blanc si le fournisseur (ou le client en cas de self-billing) n'a pas être identifié préalablement.
Elle reçoit aussi le paramètre @InvoiceLineXml dont le type SQL est XML. Il correspond au nœud XMLcac:InvoiceLine pour lequel Mercator tente de reconnaître l'article.
Le code ci-dessous montre comment populer un paramètre SQL @name avec la valeur de cac:InvoiceLine/cac:Item/cbc:Name.
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Linq;
using MercatorApi;
using MercatorExtensions;
using MercatorUi;
using MercatorDatabase;
namespace Gescom
{
public class Customizer : MercatorUi.ICustomizers.IStringUpdater
{
public string StringUpdate(string stringToModify)
{
string id = Api.StrExtract(stringToModify, "<ID>", "</ID>");
if (id == "EINVOICE_IMPORT_ITEM")
{
stringToModify = stringToModify.Replace("/*search on s_modele*/",
@"declare @name varchar(100)
select @name = @InvoiceLineXml.value(
'declare namespace cac=""urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"";
declare namespace cbc=""urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"";
(/cac:InvoiceLine/cac:Item/cbc:Name/text())[1]', 'varchar(100)')
if (@name is not null) and exists (select * from STOCK (NOLOCK) where s_cle1=@name)
begin
select top 1 * from STOCK (NOLOCK) where s_cle1=@name
return
end
/*search on s_modele*/".UnIndent(5));
}
return stringToModify;
}
}
}
✅ Même si le fichier reçu n'utilise pas les namespaces habituels (cac: et cbc:), ce code reste valide car ces namespaces sont correctement définis dans la requête XQuery.