Het importeren van facturen en creditnota's afkomstig van Peppol kan gebeuren via de interface van Mercator. Het is echter ook mogelijk om dit proces volledig te automatiseren. De trigger voor dit automatische importproces kan een taak in consolemodus zijn. In deze code moet gebruikgemaakt worden van de tools die beschikbaar zijn via de PeppolBoxHelper.
De methode ImportIntoAccounting van MercatorUi.Forms.Other.OtherClasses.PeppolBoxHelper.PeppolMessage wordt hiervoor gebruikt. Deze verwacht een parameter van het type ImportFromEinvoiceDescriptor, die volgende eigenschappen bevat:
- bool Silent : op true zetten voor een import zonder gebruikersinterface.
- string Journal : het boekhoudjournaal van bestemming. Verplicht indien Silent op true staat.
- string IdGen : de algemene rekening die moet worden gebruikt. Mag leeg zijn indien de leveranciersfiche een standaard algemene rekening bevat.
De methode ImportIntoAccounting retourneert een BookingEngine. Deze BookingEngine is nog niet opgeslagen, waardoor het makkelijk is om nog wijzigingen aan te brengen alvorens de methode Save aan te roepen. Het PDF-bestand dat in de XML zit, wordt automatisch toegevoegd aan het boekhoudkundig document door Mercator (in de SQL-bestanden). Ook de XML-inhoud wordt toegevoegd als XML-bestand. Zo kan het bericht uit de PeppolBox veilig verwijderd worden.
De code ziet er als volgt uit:
public void ImportEinvoiceIntoAccounting()
{
using (MercatorUi.Forms.Other.OtherClasses.PeppolBoxHelper peppolBoxHelper = new MercatorUi.Forms.Other.OtherClasses.PeppolBoxHelper())
{
if (peppolBoxHelper.DataTable == null)
{
MercatorUi.Globals.MercatorTasksToMain.Log("Fout bij het initialiseren van de PeppolBoxHelper: " + Api.LastError, isError: true);
return;
}
MercatorUi.Forms.Other.OtherClasses.PeppolBoxHelper.PeppolMessage message = peppolBoxHelper.Messages.FirstOrDefault(m => m.IsInvoiceOrCreditNote); // hier logica voorzien om het te importeren bericht te selecteren
if (message == null)
{
MercatorUi.Globals.MercatorTasksToMain.Log("Bericht niet gevonden", 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;
// hier kunnen in het boekhoudkundig document extra gegevens uit de XML worden toegevoegd, zoals naam en e-mailadres van de contactpersoon
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("Fout bij het opslaan van het boekhoudkundig document: " + bookingEngine.LastError, isError: true);
return;
}
if (!message.RemoveFromListAndDb()) // bericht uit de PeppolBox verwijderen
{
MercatorUi.Globals.MercatorTasksToMain.Log("Fout bij het verwijderen van het bericht: " + Api.LastError, isError: true);
return;
}
MercatorUi.Globals.MercatorTasksToMain.Log(string.Format("Import voltooid {0} {1} succesvol", bookingEngine.Journal, bookingEngine.Piece));
}
}
}
Bij een stille import is de context van de BookingEngine ContextEnum.ImportEinvoiceSilent.