De import van facturen en creditnota's afkomstig van Peppol kan uitgevoerd worden via de interface van Mercator. Het is ook mogelijk om dit proces volledig te automatiseren. Het proces dat deze automatische import activeert, kan een taak in consolemodus zijn. In deze code moet gebruik moet gebruik worden gemaakt van de tools die beschikbaar zijn via de PeppolBoxHelper.
De methode ImportIntoBilling van MercatorUi.Forms.Other.OtherClasses.PeppolBoxHelper.PeppolMessage wordt gebruikt. Deze verwacht een parameter van het type ImportFromEinvoiceDescriptor die volgende eigenschappen bevat:
- bool Silent : moet op true gezet worden voor een import zonder gebruikersinterface.
- string Journal : het boekhoudjournaal van bestemming. Verplicht indien Silent gelijk is aan true. Dit journaal kan een reeks facturen of een reeks klad zijn (indien Silent geactiveerd is).
- string ReplacementItemId : de S_ID van een artikel dat tijdelijk gebruikt wordt indien een artikel niet geïdentificeerd kan worden door het herkenningsproces van de XML-inhoud.
- Engine.Gescom.Tools.BillingDocDescriptor[] PreviousDocs : de lijst van bestellingen / leveringen van de leverancier die geïdentificeerd werd in de eFactuur en die moeten opgenomen worden in deze factuur. Deze lijst mag enkel bestellingen of enkel leveringen bevatten. Deze parameter mag null zijn. Hij moet null zijn als er naar een klad geïmporteerd wordt.
Het bevat ook deze read-only eigenschappen, die worden ingevuld tijdens het importeren:
- string Warning : een eventueel bericht, zoals datgene dat weergegeven wordt bij een import via de Mercator-interface. Bijvoorbeeld: "Verschil bedragen excl. btw".
- DataRow[] ItemsNotFound : de lijst van artikelen die niet geïdentificeerd konden worden via het herkenningsproces van de XML-inhoud en waarvoor automatisch artikelen werden aangemaakt.
De methode ImportIntoBilling retourneert een BillingEngine. Deze BillingEngine is nog niet opgeslagen. Het is dus eenvoudig om gewenste wijzigingen aan te brengen alvorens zijn methode Save aan te roepen. Het PDF-bestand dat in XML zit, wordt automatisch gekoppeld aan de boeking door Mercator (in de SQL-bestanden). De XML-inhoud wordt ook gekoppeld als XML-bestand. Hierdoor kan het bericht uit de PeppolBox veilig verwijderd worden.
Bij een import in stille modus is de context van de BillingEngine ContextEnum.ImportEinvoiceSilent.
Onderstaande code toont een eenvoudig voorbeeld van import naar een kladaankoop:
public void ImportEinvoiceIntoBilling1()
{
using (MercatorUi.Forms.Other.OtherClasses.PeppolBoxHelper peppolBoxHelper = new MercatorUi.Forms.Other.OtherClasses.PeppolBoxHelper())
{
if (peppolBoxHelper.DataTable == null)
{
MercatorUi.Globals.MercatorTasksToMain.Log("Fout bij de initialisatie van de PeppolBoxHelper: " + Api.LastError, isError: true);
return;
}
var message = peppolBoxHelper.Messages.FirstOrDefault(m => m.IsInvoiceOrCreditNote); // voeg hier een logica toe om het te importeren bericht te selecteren
if (message == null)
{
MercatorUi.Globals.MercatorTasksToMain.Log("Bericht niet gevonden", isError: true);
return;
}
MercatorUi.Forms.Gescom.GescomClasses.ImportFromEinvoiceDescriptor importFromEinvoiceDescriptor = new MercatorUi.Forms.Gescom.GescomClasses.ImportFromEinvoiceDescriptor
{
Silent = true,
Journal = "KladA", // importeer naar een kladaankoop
ReplacementItemId = "ARTIMC6XS9" // als het artikel niet geïdentificeerd is, zal dit artikel gebruikt worden
};
using (MercatorUi.Engine.Gescom.BillingEngine billingEngine = message.ImportIntoBilling(importFromEinvoiceDescriptor, out string error))
{
if (error != null)
{
MercatorUi.Globals.MercatorTasksToMain.Log(error, isError: true);
return;
}
billingEngine.PeppolBoxId = message.Id;
// hier kunnen boekhoudkundige gegevens toegevoegd worden die uit de XML-inhoud komen, zoals de naam en het e-mailadres van de contactpersoon
MercatorPeppol.ReceivedDoc.ParseContentRet parsedContent = message.ReceivedDoc.ParseContent(MercatorUi.Globals.Langue);
billingEngine.PiedsVRecord.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;
// haal eventuele waarschuwingen op
if (!string.IsNullOrEmpty(importFromEinvoiceDescriptor.Warning))
billingEngine.PiedsVRecord.NOTE2 = importFromEinvoiceDescriptor.Warning;
if (!billingEngine.Save())
{
MercatorUi.Globals.MercatorTasksToMain.Log("Fout bij het opslaan van het document: " + billingEngine.LastError, isError: true);
return;
}
if (!message.RemoveFromListAndDb()) // verwijder het bericht uit de PeppolBox
{
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", billingEngine.Journal, billingEngine.Piece));
}
}
}
In dit tweede voorbeeld wordt de eFactuur geïmporteerd in een reeks facturen. De code bevat een identificatie van de bestelling die aan deze factuur gekoppeld is. Deze identificatie gebeurt op basis van het veld BuyerReference dat het bestelnummer moet bevatten. Een geavanceerdere logica kan opgezet worden. Deze bestelling zal worden opgenomen in de geïmporteerde factuur.
public void ImportEinvoiceIntoBilling2()
{
using (MercatorUi.Forms.Other.OtherClasses.PeppolBoxHelper peppolBoxHelper = new MercatorUi.Forms.Other.OtherClasses.PeppolBoxHelper())
{
if (peppolBoxHelper.DataTable == null)
{
MercatorUi.Globals.MercatorTasksToMain.Log("Fout bij de initialisatie van de PeppolBoxHelper: " + Api.LastError, isError: true);
return;
}
var message = peppolBoxHelper.Messages.FirstOrDefault(m => m.IsInvoiceOrCreditNote);
if (message == null)
{
MercatorUi.Globals.MercatorTasksToMain.Log("Bericht niet gevonden", isError: true);
return;
}
MercatorPeppol.ReceivedDoc.ParseContentRet parsedContent = message.ReceivedDoc.ParseContent(MercatorUi.Globals.Langue);
if (string.IsNullOrEmpty(parsedContent.BuyerReference) || string.IsNullOrEmpty(Api.NumOnly(parsedContent.BuyerReference)) || !Int64.TryParse(Api.NumOnly(parsedContent.BuyerReference), out Int64 pieceCommande))
{
MercatorUi.Globals.MercatorTasksToMain.Log("De referentie is leeg of ongeldig. Bestelling niet gevonden. " + parsedContent.BuyerReference, isError: true);
return;
}
List<(string id, string journal, Int64 piece, Int16 type)> pieds_a = Api.Zselect<(string id, string journal, Int64 piece, Int16 type)>(MercatorUi.Globals.RepData,
"select id,journal,piece,type from PIEDS_A (NOLOCK) where (journal='COMMF') and (piece=@piece) and (pieds_a.n_lignes2 > 0)",
new MercatorSqlParam("@piece", pieceCommande));
if (pieds_a == null)
{
MercatorUi.Globals.MercatorTasksToMain.Log("Zoeken naar bestelling: " + Api.LastError, isError: true);
return;
}
if (!pieds_a.Any())
{
MercatorUi.Globals.MercatorTasksToMain.Log("Bestelling niet gevonden: " + pieceCommande, isError: true);
return;
}
MercatorUi.Forms.Gescom.GescomClasses.ImportFromEinvoiceDescriptor importFromEinvoiceDescriptor = new MercatorUi.Forms.Gescom.GescomClasses.ImportFromEinvoiceDescriptor
{
Silent = true,
Journal = "FactF",
ReplacementItemId = "ARTIMC6XS9",
PreviousDocs = new MercatorUi.Engine.Gescom.Tools.BillingDocDescriptor[] { new MercatorUi.Engine.Gescom.Tools.BillingDocDescriptor(MercatorUi.Engine.Gescom.Billing.TypeVAEnum.A, pieds_a[0].type, pieds_a[0].id, pieds_a[0].journal, pieds_a[0].piece) }
};
using (MercatorUi.Engine.Gescom.BillingEngine billingEngine = message.ImportIntoBilling(importFromEinvoiceDescriptor, out string error))
{
if (error != null)
{
MercatorUi.Globals.MercatorTasksToMain.Log(error, isError: true);
return;
}
if (!string.IsNullOrEmpty(importFromEinvoiceDescriptor.Warning))
billingEngine.PiedsVRecord.NOTE1 = importFromEinvoiceDescriptor.Warning;
if (!billingEngine.Save())
{
MercatorUi.Globals.MercatorTasksToMain.Log("Fout bij het opslaan van het document: " + billingEngine.LastError, isError: true);
return;
}
if (!message.RemoveFromListAndDb())
{
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", billingEngine.Journal, billingEngine.Piece));
}
}
}