L'import des factures et notes de crédit provenant de Peppol peut se faire dans l'interface de Mercator. Il est aussi possible d'automatiser totalement le processus. Le processus déclenchant de cet import automatique peut être une tâche en mode console. Dans ce code, il faut utiliser les outils mis à disposition via le PeppolBoxHelper.
La méthode ImportIntoAccounting du MercatorUi.Forms.Other.OtherClasses.PeppolBoxHelper.PeppolMessage est utilisée. Elle attend un paramètre de type ImportFromEinvoiceDescriptor qui contient ces propriétés :
- bool Silent : à mettre à true pour un import sans interface utilisateur.
- string Journal : le journal comptable de destination. Obligatoire si Silent vaut true.
- string IdGen : le compte général à utiliser. Peut-être vide si la fiche du fournisseur contient un compte général par défaut.
La méthode ImportIntoAccounting renvoie un BookingEngine. Ce BookingEngine n'est pas déjà sauvegardé. Il est dès lors aisé d'apporter toutes les modifications souhaitées avant d'appeler sa méthode Save. Le fichier PDF inclus dans le XML sera automatiquement joint à l'écriture par Mercator (dans les fichiers SQL). Le contenu XML sera aussi attaché en tant que fichier XML. Ce qui permet de supprimer le message de la PeppolBox sans inquiétude.
Le code s'établit comme suit :
public void ImportEinvoiceIntoAccounting()
{
using (MercatorUi.Forms.Other.OtherClasses.PeppolBoxHelper peppolBoxHelper = new MercatorUi.Forms.Other.OtherClasses.PeppolBoxHelper())
{
if (peppolBoxHelper.DataTable == null)
{
MercatorUi.Globals.MercatorTasksToMain.Log("Erreur lors de l'initialisation du PeppolBoxHelper : " + Api.LastError, isError: true);
return;
}
MercatorUi.Forms.Other.OtherClasses.PeppolBoxHelper.PeppolMessage message = peppolBoxHelper.Messages.FirstOrDefault(m => m.IsInvoiceOrCreditNote); // mettre ici une logique de sélection du message à importer
if (message == null)
{
MercatorUi.Globals.MercatorTasksToMain.Log("Message non trouvé", isError: true);
return;
}
using (MercatorUi.Engine.Cpta.BookingEngine bookingEngine = message.ImportIntoAccounting(new MercatorUi.Forms.Accounting.AccountingClasses.ImportFromEinvoiceDescriptor { Silent = true, Journal = "ACH" }, out string error))
{
if (error != null)
{
MercatorUi.Globals.MercatorTasksToMain.Log(error, isError: true);
return;
}
bookingEngine.PeppolBoxId = message.Id;
// ici on peut ajouter dans l'écriture comptable des informations provenant du contenu XML. Par exemple le nom et l'adresse mail du contact
MercatorPeppol.ReceivedDoc.ParseContentRet parsedContent = message.ReceivedDoc.ParseContent(MercatorUi.Globals.Langue);
bookingEngine.PiedsCRecord.NOTE1 = parsedContent.XmlSelectNodes("cac:AccountingSupplierParty/cac:Party/cac:Contact/cbc:Name").FirstOrDefault()?.InnerText + " "
+ parsedContent.XmlSelectNodes("cac:AccountingSupplierParty/cac:Party/cac:Contact/cbc:ElectronicMail").FirstOrDefault()?.InnerText;
if (!bookingEngine.Save())
{
MercatorUi.Globals.MercatorTasksToMain.Log("Erreur lors de l'enregistrement du document comptable : " + bookingEngine.LastError, isError: true);
return;
}
if (!message.RemoveFromListAndDb()) // supprimer le message de la PeppolBox
{
MercatorUi.Globals.MercatorTasksToMain.Log("Erreur lors de la suppression du message : " + Api.LastError, isError: true);
return;
}
MercatorUi.Globals.MercatorTasksToMain.Log(string.Format("Import terminé {0} {1} correctement", bookingEngine.Journal, bookingEngine.Piece));
}
}
}
Lors d'une importation en mode silencieux, le contexte du BookingEngine est ContextEnum.ImportEinvoiceSilent.