Parametrering van elektronische facturen

0000002718     -      28-10-2025

Voor de parametrering van elektronische facturen beschikt de BillingEngine over 4 events:

  • BeforeEinvoiceExport : bij het initialiseren van de export. Door de property e.Cancel = true te plaatsen, is het mogelijk de export te annuleren. Met e.AllLines kunt u de inhoud van de geëxporteerde lijnen behandelen.
  • EinvNodeAdding: tijdens het toevoegen van elke node in de XML-structuur. Door de property e.Cancel = true te plaatsen, hebben we de mogelijkheid om een node niet toe te voegen.
  • EinvNodeAdded: wanneer een node toegevoegd wordt aan de XML-tree
  • EinvFileCreating: wanneer de gehele XML-tree klaar is net alvorens het XML-bestand gegenereerd wordt. De property e.FileName laat ons toe om de naam van het bestand dat geproduceerd zal worden te wijzigen.

Zie ook:

Opmerking: sinds versie 11.0.821 van MercatorUi.dll is het mogelijk om de Peppol contactnaam en e-mail op te geven in "Tools/ Identificatie".

Hieronder staan enkel voorbeelden van parameterinstellingen. Voor al deze voorbeelden is de basis-customizer als volgt. Die kan eenvoudig worden aangepast afhankelijk van de inhoud van de gedelegeerden BillingEngine_EinvNodeAdding, BillingEngine_EinvNodeAdded en BillingEngine_EinvFileCreating.

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Windows.Forms;
using MercatorApi;
using MercatorUi;
using System.Xml;
using MercatorExtensions;

namespace Billing
{
    public class Customizer : MercatorUi.ICustomizers.IBillingEngineCreated, MercatorUi.ICustomizers.IBillingEngineClosed
    {
        public void BillingEngineCreated(MercatorUi.Engine.Gescom.BillingEngine BillingEngine)
        {
            BillingEngine.EinvNodeAdding += BillingEngine_EinvNodeAdding;
            BillingEngine.EinvNodeAdded += BillingEngine_EinvNodeAdded;
            BillingEngine.EinvFileCreating += BillingEngine_EinvFileCreating;
        }

        public void BillingEngineClosed(MercatorUi.Engine.Gescom.BillingEngine BillingEngine)
        {
            BillingEngine.EinvNodeAdding -= BillingEngine_EinvNodeAdding;
            BillingEngine.EinvNodeAdded -= BillingEngine_EinvNodeAdded;
            BillingEngine.EinvFileCreating -= BillingEngine_EinvFileCreating;
        }

        void BillingEngine_EinvNodeAdding(object sender, MercatorUi.Engine.Gescom.BillingEngine.EinvNodeAddingEventArgs e)
        {
        }

        void BillingEngine_EinvNodeAdded(object sender, MercatorUi.Engine.Gescom.BillingEngine.EinvNodeAddedEventArgs e)
        {
        }

        void BillingEngine_EinvFileCreating(object sender, MercatorUi.Engine.Gescom.BillingEngine.EinvFileCreatingEventArgs e)
        {
        }

    }
}

De inhoud van PIEDS_V.NOTE1 niet verzenden

Zoom
void BillingEngine_EinvNodeAdding(object sender, MercatorUi.Engine.Gescom.BillingEngine.EinvNodeAddingEventArgs e)
{
    if ((e.Node.Name == "cbc:Note") && e.ParentNode.LocalName.EqualsOr("Invoice""CreditNote"))
        e.Cancel = true;
}

De bankrekening van de afzender wijzigen

Zoom
void billingEngine_EinvNodeAdded(object sender, MercatorUi.Engine.Gescom.BillingEngine.EinvNodeAddedEventArgs e)
{
    MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
    if ((e.Node.Name == "cbc:ID") && (e.Node.ParentNode != null) && (e.Node.ParentNode.Name == "cac:PayeeFinancialAccount"))
    {
        e.Node.InnerText = "BE99999999999999";
    }
}

Vervang note1 door note2 (note1 mag niet leeg zijn als Mercator de node "cbc:Note" wil maken)

Zoom
void BillingEngine_EinvNodeAdding(object sender, MercatorUi.Engine.Gescom.BillingEngine.EinvNodeAddingEventArgs e)
{
    MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
    if ((e.Node.Name == "cbc:Note") && e.ParentNode.LocalName.EqualsOr("Invoice""CreditNote"))
    {
        if (billingEngine.PIEDS["note2"].ToString().Trim() == string.Empty)
            e.Cancel = true;
        else
            e.Node.InnerText = billingEngine.PIEDS["note2"].ToString().Trim();
    }
}

Voeg de referentie toe van het contract vertrekkende vanuit het veld PIEDS_V.LIBRE1

Zoom
void BillingEngine_EinvNodeAdded(object sender, MercatorUi.Engine.Gescom.BillingEngine.EinvNodeAddedEventArgs e)
{
    MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
    if ((e.Node.Name == "cac:OrderReference") && (billingEngine.PIEDS["libre1"].ToString().Trim() != string.Empty))
    {
        XmlNode n = billingEngine.EinvAddNode(e.eInvoiceEnum, e.ParentNode, "cac:ContractDocumentReference");
        billingEngine.EinvAddNode(e.eInvoiceEnum, n, "cbc:ID", billingEngine.PIEDS["libre1"].ToString().Trim());
        billingEngine.EinvAddNode(e.eInvoiceEnum, n, "cbc:DocumentTypeCode", "105", new MercatorUi.Engine.Gescom.Tools.EinvNodeAttribute("listID", "UNCL1001"));
        billingEngine.EinvAddNode(e.eInvoiceEnum, n, "cbc:DocumentType", "Purchase order");
    }
}

105 = aankoopbestelling volgens deze lijst


Voeg de referentie van het contract toe vertrekkende vanuit het veld PIEDS_V.LIBRE1, met de begin- en einddatum van het contract (PIEDS_V.DATE_CTRAT_1 en DATE_CTRAT_2)

Zoom
void BillingEngine_EinvNodeAdded(object sender, MercatorUi.Engine.Gescom.BillingEngine.EinvNodeAddedEventArgs e)
{
    MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
    if ((e.Node.Name == "cac:OrderReference") && (billingEngine.PIEDS["libre1"].ToString().Trim() != string.Empty))
    {
        XmlNode n1 = billingEngine.EinvAddNode(e.eInvoiceEnum, e.ParentNode, "cac:ContractDocumentReference");
        billingEngine.EinvAddNode(e.eInvoiceEnum, n1, "cbc:ID", billingEngine.PIEDS["libre1"].ToString().Trim());
        billingEngine.EinvAddNode(e.eInvoiceEnum, n1, "cbc:DocumentTypeCode", "105", new MercatorUi.Engine.Gescom.Tools.EinvNodeAttribute("listID", "UNCL1001"));
        billingEngine.EinvAddNode(e.eInvoiceEnum, n1, "cbc:DocumentType", "Purchase order");
        XmlNode n2 = billingEngine.EinvAddNode(e.eInvoiceEnum, n1, "cac:ValidityPeriod");
        billingEngine.EinvAddNode(e.eInvoiceEnum, n2, "cbc:StartDate", Convert.ToDateTime(billingEngine.PIEDS["date_ctrat_1"]));
        billingEngine.EinvAddNode(e.eInvoiceEnum, n2, "cbc:EndDate", Convert.ToDateTime(billingEngine.PIEDS["date_ctrat_2"]));
    }
}

Voeg de periodiciteit van de factuur toe: op basis van PIEDS_V.DATE_1 en DATE_2

Zoom
void BillingEngine_EinvNodeAdding(object sender, MercatorUi.Engine.Gescom.BillingEngine.EinvNodeAddedEventArgs e)
{
    MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
    if (e.Node.Name == "cac:OrderReference")
    {
        XmlNode n = billingEngine.EinvAddNode(e.eInvoiceEnum, e.ParentNode, "cac:InvoicePeriod");
        billingEngine.EinvAddNode(e.eInvoiceEnum, n, "cbc:StartDate", Convert.ToDateTime(billingEngine.PIEDS["date_1"]));
        billingEngine.EinvAddNode(e.eInvoiceEnum, n, "cbc:EndDate", Convert.ToDateTime(billingEngine.PIEDS["date_2"]));
    }
}

Inclusief alle PDF-bestanden van het tabblad Bestanden

Zoom
void BillingEngine_EinvNodeAdding(object sender, MercatorUi.Engine.Gescom.BillingEngine.EinvNodeAddingEventArgs e)
{
    MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
    if (e.Node.Name == "cac:AccountingSupplierParty")
    {
        string dirSqlFiles = "<" + Api.SqlFilePathRoots.Files + "\\" + billingEngine.Journal + "\\" + billingEngine.Id;
        foreach (string file in Api.GetFiles(dirSqlFiles, "*.pdf"))
        {
            XmlNode n1 = billingEngine.EinvAddNode(e.eInvoiceEnum, e.ParentNode, "cac:AdditionalDocumentReference");
            billingEngine.EinvAddNode(e.eInvoiceEnum, n1, "cbc:ID", Api.JustFName(file));
            billingEngine.EinvAddNode(e.eInvoiceEnum, n1, "cbc:DocumentType", "Appendix");
            XmlNode n2 = billingEngine.EinvAddNode(e.eInvoiceEnum, n1, "cac:Attachment");
            billingEngine.EinvAddNode(e.eInvoiceEnum, n2, "cbc:EmbeddedDocumentBinaryObject", Convert.ToBase64String(Api.SqlFileToBytes(file)), new MercatorUi.Engine.Gescom.Tools.EinvNodeAttribute("mimeCode""application/pdf"), new MercatorUi.Engine.Gescom.Tools.EinvNodeAttribute("filename", Api.JustFName(file)));
        }
    }
}

De onderstaande code voert dezelfde bestandstoevoeging uit, maar biedt de mogelijkheid om bestanden die moeten worden bijgevoegd te selecteren, via een lijst met selectievakjes. De PDF's worden samengevoegd tot één bestand.   

Zoom
void BillingEngine_EinvNodeAdding(object sender, MercatorUi.Engine.Gescom.BillingEngine.EinvNodeAddingEventArgs e)
{
    MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
    if (e.Node.Name == "cac:AccountingSupplierParty")
    {
        string dirSqlFiles = "<" + Api.SqlFilePathRoots.Files + "\\" + billingEngine.Journal + "\\" + billingEngine.Id + "\\";
        string[] pdfs = Api.GetFiles(dirSqlFiles, "%.pdf");
        if (pdfs.Length > 0)
        {
            ListViewItem[] selectedListViewItems = Dialogs.AskListEx("Welk(e) PDF-bestand(en) bijvoegen?", new ColumnHeader[]
            {
                new ColumnHeader { Text = "", Width = 20 },
                new ColumnHeader { Text = "Bestand", Width = 250 }
            }, pdfs.Select(pdf => new ListViewItem(new string[] { "", Api.JustFName(pdf) })).ToArray(), showCheckBox: true, removeCancelButton: true);

            byte[] pdfBytes = null;
            if (selectedListViewItems?.Where(i => i.Checked).Count() == 1)
            {
                pdfBytes = Api.SqlFileToBytes(dirSqlFiles + selectedListViewItems.First(i => i.Checked).SubItems[1].Text);
            }
            else if (selectedListViewItems?.Where(i => i.Checked).Count() > 1)
            {
                List<byte[]> pdfBytesList = new List<byte[]>();
                foreach (ListViewItem lvi in selectedListViewItems.Where(i => i.Checked))
                {
                    pdfBytesList.Add(Api.SqlFileToBytes(dirSqlFiles + lvi.SubItems[1].Text));
                }
                pdfBytes = MercatorUi.Reporting.ReportingStatic.Reporting.MergePdfToBytes(pdfBytesList.Where(b => b != null).ToArray(), out string error);
                if (!string.IsNullOrEmpty(error))
                    Dialogs.Stop("PDF samenvoegen: " + error);
            }
            if (pdfBytes != null)
            {
                XmlNode n1 = billingEngine.EinvAddNode(e.eInvoiceEnum, e.ParentNode, "cac:AdditionalDocumentReference");
                billingEngine.EinvAddNode(e.eInvoiceEnum, n1, "cbc:ID", "Bijlagen.pdf");
                billingEngine.EinvAddNode(e.eInvoiceEnum, n1, "cbc:DocumentType", "Appendix");
                XmlNode n2 = billingEngine.EinvAddNode(e.eInvoiceEnum, n1, "cac:Attachment");
                billingEngine.EinvAddNode(e.eInvoiceEnum, n2, "cbc:EmbeddedDocumentBinaryObject", Convert.ToBase64String(pdfBytes), new MercatorUi.Engine.Gescom.Tools.EinvNodeAttribute("mimeCode", "application/pdf"), new MercatorUi.Engine.Gescom.Tools.EinvNodeAttribute("filename", "Bijlagen.pdf"));
            }
        }
    }
}

Voeg een PDF-bestand toe van op de harde schijf

Zoom
void BillingEngine_EinvNodeAdding(object sender, MercatorUi.Engine.Gescom.BillingEngine.EinvNodeAddingEventArgs e)
{
    MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
    if (e.Node.Name == "cac:AccountingSupplierParty")
    {
        string file = @"C:\Test.pdf";
        XmlNode n1 = billingEngine.EinvAddNode(e.eInvoiceEnum, e.ParentNode, "cac:AdditionalDocumentReference");
        billingEngine.EinvAddNode(e.eInvoiceEnum, n1, "cbc:ID", Api.JustFName(file));
        billingEngine.EinvAddNode(e.eInvoiceEnum, n1, "cbc:DocumentType", "Appendix");
        XmlNode n2 = billingEngine.EinvAddNode(e.eInvoiceEnum, n1, "cac:Attachment");
billingEngine.EinvAddNode(e.eInvoiceEnum, n2, "cbc:EmbeddedDocumentBinaryObject"Convert.ToBase64String(System.IO.File.ReadAllBytes(file)), new MercatorUi.Engine.Gescom.Tools.EinvNodeAttribute("mimeCode""application/pdf")new MercatorUi.Engine.Gescom.Tools.EinvNodeAttribute("filename", Api.JustFName(file)));
    }
}

Verander de betaalwijze: standaard neemt Mercator code "1 = Instrument not defined" voor de tag "cbc:PaymentMeansCode". Het voorbeeld hieronder toont hoe je dit kan veranderen. Zie deze lijst.

Zoom
void BillingEngine_EinvNodeAdding(object sender, MercatorUi.Engine.Gescom.BillingEngine.EinvNodeAddingEventArgs e)
{
    if (e.Node.Name == "cbc:PaymentMeansCode")
            e.Node.InnerText = "25"; // Certified cheque
}

Inclusief de contactgegevens van de klant: op basis van PIEDS_V.ID_TACT1: naam, telefoon en email.

Zoom
void BillingEngine_EinvNodeAdded(object sender, MercatorUi.Engine.Gescom.BillingEngine.EinvNodeAddedEventArgs e)
{
    MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
    if ((e.Node.Name == "cac:PartyLegalEntity") && (e.Node.ParentNode.ParentNode.Name == "cac:AccountingCustomerParty") && (billingEngine.PIEDS["id_tact1"].ToString() != string.Empty))
    {
        DataSet ds = Api.Zselect(Globals.RepData, "select rtrim(t_nom) as nom,rtrim(t_num_tel) as num_tel,rtrim(t_email) as email from TACT where t_id=@t_id", new MercatorSqlParam("@t_id", billingEngine.PIEDS["id_tact1"], SqlDbType.Char));
        if ((ds != null) && (ds.Tables[0].Rows.Count > 0))
        {
            XmlNode n = billingEngine.EinvAddNode(e.eInvoiceEnum, e.ParentNode, "cac:Contact");
            billingEngine.EinvAddNode(e.eInvoiceEnum, n, "cbc:Name", ds.Tables[0].Rows[0]["nom"].ToString());
            if (ds.Tables[0].Rows[0]["num_tel"].ToString() != string.Empty)
                billingEngine.EinvAddNode(e.eInvoiceEnum, n, "cbc:Telephone", ds.Tables[0].Rows[0]["num_tel"].ToString());
            if (ds.Tables[0].Rows[0]["email"].ToString() != string.Empty)
                billingEngine.EinvAddNode(e.eInvoiceEnum, n, "cbc:ElectronicMail", ds.Tables[0].Rows[0]["email"].ToString());
        }
    }
}

De leverdatum toevoegen: op basis van PIEDS_V.DATE_LIVR

Zoom
void BillingEngine_EinvNodeAdding(object sender, MercatorUi.Engine.Gescom.BillingEngine.EinvNodeAddedEventArgs e)
{
    MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
    if ((billingEngine.CLI_LIV != null) && (billingEngine.CLI_LIV["c_id"].ToString() != billingEngine.CLI["c_id"].ToString()))
    {
        // Mercator voegt de node cac:Delivery toe
        if (e.Node.Name == "cac:DeliveryLocation")
        {
            billingEngine.EinvAddNode(e.eInvoiceEnum, e.ParentNode, "cbc:ActualDeliveryDate", Convert.ToDateTime(billingEngine.PIEDS["date_livr"]));
        }
    }
    else
    {
        // Mercator voegt de node cac:Delivery niet toe
        if (e.Node.Name == "cac:PaymentMeans")
        {
            XmlNode n = billingEngine.EinvAddNode(e.eInvoiceEnum, e.ParentNode, "cac:Delivery");
            billingEngine.EinvAddNode(e.eInvoiceEnum, n, "cbc:ActualDeliveryDate", Convert.ToDateTime(billingEngine.PIEDS["date_livr"]));
        }
    }
}

Inclusief de betaaltermijn in text-formaat: dit op basis van CLI.C_PAIEM

Zoom
void BillingEngine_EinvNodeAdded(object sender, MercatorUi.Engine.Gescom.BillingEngine.EinvNodeAddedEventArgs e)
{
    MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
    if ((e.Node.Name == "cac:PaymentMeans") && e.Position.HasFlag(MercatorUi.PositionEnum.Last))
    {
        XmlNode n = billingEngine.EinvAddNode(e.eInvoiceEnum, e.ParentNode, "cac:PaymentTerms");
        billingEngine.EinvAddNode(e.eInvoiceEnum, n, "cbc:Note", MercatorController.xFunctions.xDelai(billingEngine.CLI["c_paiem"].ToString(), billingEngine.CLI["c_langue"].ToString()));
    }
}

Vervang in de lijnen het artikel ID door S_CLE1: standaard is het artikel ID het veld LIGNES_V.ID_ARTICLE, namelijk het S_ID

Zoom
void BillingEngine_EinvNodeAdded(object sender, MercatorUi.Engine.Gescom.BillingEngine.EinvNodeAddedEventArgs e)
{
    if ((e.Node.Name == "cbc:ID") && (e.ParentNode.Name == "cac:SellersItemIdentification"))
        e.Node.InnerText = e.DrLigne["s_cle1"].ToString();
}

De EAN13 barcode meegeven op lijnniveau: in dit voorbeeld bevind deze zich in STOCK.S_CLE3

Zoom
void BillingEngine_EinvNodeAdded(object sender, MercatorUi.Engine.Gescom.BillingEngine.EinvNodeAddedEventArgs e)
{
    MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
    if (e.Node.Name == "cac:SellersItemIdentification")
    {
        string ean13 = MercatorController.xFunctions.xLookUpString("STOCK", "S_ID", e.DrLigne["id_article"], "rtrim(S_CLE3)"); // on peut aussi ajouter S_CLE3 dans LIGNES_V pour économiser ce xLookup et obtenir alors la valeur par e.DrLigne["S_CLE3"]
        if (ean13 != string.Empty)
        {
            XmlNode n = billingEngine.EinvAddNode(e.eInvoiceEnum, e.ParentNode, "cac:StandardItemIdentification");
            billingEngine.EinvAddNode(e.eInvoiceEnum, n, "cbc:ID", ean13, new MercatorUi.Engine.Gescom.Tools.EinvNodeAttribute("schemeID", "EAN13"), new MercatorUi.Engine.Gescom.Tools.EinvNodeAttribute("schemeAgencyID", "9"));
        }
    }
}

De vervaldatum van een artikel afkomstig uit een lot vermelden op lijnniveau: in dit voorbeeld bevindt deze zich in het veld ARTLOT.PEREMPT

Zoom
void BillingEngine_EinvNodeAdded(object sender, MercatorUi.Engine.Gescom.BillingEngine.EinvNodeAddedEventArgs e)
{
    MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
    if (e.Node.Name == "cbc:LotNumberID")
        billingEngine.EinvAddNode(e.eInvoiceEnum, e.ParentNode, "cbc:ExpiryDate", MercatorController.xFunctions.xLookUpDateTime("ARTLOT", "ID_LOT", e.DrLigne["id_lot"], "perempt"));
}

De Bebat- of Recupelbijdrage vermelden op lijnniveau: voorbeeld is toegepast op deze configuratie

Zoom
void BillingEngine_EinvNodeAdding(object sender, MercatorUi.Engine.Gescom.BillingEngine.EinvNodeAddingEventArgs e)
{
    MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
    if (e.Node.Name == "cac:Item")
    {
        double tot_bebat = e.DrLigne.Value<double>("q") * e.DrLigne.Value<double>("s_bebat") * (billingEngine.PiedsVRecord.REGIME == RegimesEnum.VatIncluded ? (1 + e.DrLigne.Value<double>("taux_tva") / 100) : 1) / billingEngine.Conversion;
        if (tot_bebat.CompareTo(0d, 2) != 0)
        {
            bool isVatExemption = (billingEngine.PiedsVRecord.REGIME != RegimesEnum.Normal) && (billingEngine.PiedsVRecord.REGIME != RegimesEnum.VatIncluded);
            XmlNode n1 = billingEngine.EinvAddNode(e.eInvoiceEnum, e.ParentNode, "cac:AllowanceCharge");
            billingEngine.EinvAddNode(e.eInvoiceEnum, n1, "cbc:ChargeIndicator", "true"); // true = charge
            billingEngine.EinvAddNode(e.eInvoiceEnum, n1, "cbc:AllowanceChargeReason", "Bebat");
            billingEngine.EinvAddNode(e.eInvoiceEnum, n1, "cbc:Amount", Api.Transform(tot_bebat, "#########0.00"), new MercatorUi.Engine.Gescom.Tools.EinvNodeAttribute("currencyID", billingEngine.LibDev));
            XmlNode n2 = billingEngine.EinvAddNode(e.eInvoiceEnum, n1, "cac:TaxCategory");
            billingEngine.EinvAddNode(e.eInvoiceEnum, n2, "cbc:ID", billingEngine.PeppolVatRegimeCode(e.DrLigne.Value<double>("taux_tva")), new MercatorUi.Engine.Gescom.Tools.EinvNodeAttribute("schemeID", "UNCL5305"));
            billingEngine.EinvAddNode(e.eInvoiceEnum, n2, "cbc:Percent", Api.Transform((billingEngine.PiedsVRecord.REGIME == RegimesEnum.Normal) || (billingEngine.PiedsVRecord.REGIME == RegimesEnum.VatIncluded) ? e.DrLigne.Value<double>("taux_tva") : 0d, "#0.00"));
            if (isVatExemption)
                billingEngine.EinvAddNode(e.eInvoiceEnum, n2, "cbc:TaxExemptionReason", MercatorController.xFunctions.xRegime((int)billingEngine.PiedsVRecord.REGIME, billingEngine.CliRecord.C_LANGUE));
            XmlNode n3 = billingEngine.EinvAddNode(e.eInvoiceEnum, n2, "cac:TaxScheme");
            billingEngine.EinvAddNode(e.eInvoiceEnum, n3, "cbc:ID", "VAT");
        }
    }
}

De hoeveelheidseenheid wijzigen op lijnniveau: standaard gebruikt Mercator de code C62 = STUK. de verschillende bruikbare codes zijn bruikbaar in deze lijst.

Zoom
void BillingEngine_EinvNodeAdded(object sender, MercatorUi.Engine.Gescom.BillingEngine.EinvNodeAddedEventArgs e)
{
    if ((e.Node.Name == "cbc:InvoicedQuantity") || (e.Node.Name == "cbc:CreditedQuantity"))
    {
        string s_unite = e.DrLigne["s_unite"].ToString();
        if (s_unite == "litre")
            e.Node.Attributes["unitCode"].Value = "LTR";
        else if (s_unite == "m")
            e.Node.Attributes["unitCode"].Value = "MTR";
        else if (s_unite == "m²")
            e.Node.Attributes["unitCode"].Value = "MTK";
        else if (s_unite == "m³")
            e.Node.Attributes["unitCode"].Value = "MTQ";
        else if (s_unite == "ångström") // ;-)
            e.Node.Attributes["unitCode"].Value = "A11";
    }
}

De referentie uit de bestelling meegeven op lijnniveau

Zoom
void BillingEngine_EinvNodeAdded(object sender, MercatorUi.Engine.Gescom.BillingEngine.EinvNodeAddedEventArgs e)
{
    MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
    if ((e.Node.Name == "cbc:LineExtensionAmount") && ((e.ParentNode.Name == "cac:InvoiceLine") || (e.ParentNode.Name == "cac:CreditNoteLine")) && (e.DrLigne["commande"].ToString() != string.Empty))
    {
        XmlNode n = billingEngine.EinvAddNode(e.eInvoiceEnum, e.ParentNode, "cac:OrderLineReference");
        billingEngine.EinvAddNode(e.eInvoiceEnum, n, "cbc:LineID", e.DrLigne["commande"].ToString());
    }
}

De leverdatum meegeven op lijnniveau: vertrekkend vanuit LIGNES_V.DATE_LIVR

Zoom
void BillingEngine_EinvNodeAdded(object sender, MercatorUi.Engine.Gescom.BillingEngine.EinvNodeAddedEventArgs e)
{
    MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
    if ((e.Node.Name == "cbc:LineExtensionAmount") && ((e.ParentNode.Name == "cac:InvoiceLine") || (e.ParentNode.Name == "cac:CreditNoteLine")) && (Convert.ToDateTime(e.DrLigne["date_livr"]) > new DateTime(1900, 1, 1)))
    {
        XmlNode n = billingEngine.EinvAddNode(e.eInvoiceEnum, e.ParentNode, "cac:Delivery");
        billingEngine.EinvAddNode(e.eInvoiceEnum, n, "cbc:ActualDeliveryDate", Convert.ToDateTime(e.DrLigne["date_livr"]));
    }
}

Een opmerking toevoegen op lijnniveau: vertrekkend vanuit LIGNES_V.MEMO

Zoom
void BillingEngine_EinvNodeAdded(object sender, MercatorUi.Engine.Gescom.BillingEngine.EinvNodeAddedEventArgs e)
{
    MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
    if ((e.Node.Name == "cbc:ID") && ((e.ParentNode.Name == "cac:InvoiceLine") || (e.ParentNode.Name == "cac:CreditNoteLine")) && (e.DrLigne["memo"].ToString() != string.Empty))
        billingEngine.EinvAddNode(e.eInvoiceEnum, e.ParentNode, "cbc:Note", e.DrLigne["memo"].ToString());
}

De maat en kleur meegeven op lijnniveau (gamma's)

Zoom
void BillingEngine_EinvNodeAdded(object sender, MercatorUi.Engine.Gescom.BillingEngine.EinvNodeAddedEventArgs e)
{
    MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
    if ((e.Node.Name == "cac:ClassifiedTaxCategory") && (e.ParentNode.Name == "cac:Item"))
    {
        if (e.DrLigne["s_gamenum1"].ToString() != string.Empty)
        {
            XmlNode n = billingEngine.EinvAddNode(e.eInvoiceEnum, e.ParentNode, "cac:AdditionalItemProperty");
            billingEngine.EinvAddNode(e.eInvoiceEnum, n, "cbc:Name", Api.Iif_langue(billingEngine.CLI["c_langue"].ToString(), "Size", "Maat", "Taille"));
            billingEngine.EinvAddNode(e.eInvoiceEnum, n, "cbc:Value", MercatorController.xFunctions.xGamEnum(null, e.DrLigne["s_gamenum1"].ToString(), billingEngine.CLI["c_langue"].ToString()));
        }
        if (e.DrLigne["s_gamenum2"].ToString() != string.Empty)
        {
            XmlNode n = billingEngine.EinvAddNode(e.eInvoiceEnum, e.ParentNode, "cac:AdditionalItemProperty");
            billingEngine.EinvAddNode(e.eInvoiceEnum, n, "cbc:Name", Api.Iif_langue(billingEngine.CLI["c_langue"].ToString(), "Color", "Kleur", "Couleur"));
            billingEngine.EinvAddNode(e.eInvoiceEnum, n, "cbc:Value", MercatorController.xFunctions.xGamEnum(null, e.DrLigne["s_gamenum2"].ToString(), billingEngine.CLI["c_langue"].ToString()));
        }
    }
}

Houdt rekening met artikelen die vrijgesteld zijn van BTW: bij voorbeeld leeggoed, uitbetalingen voor rekening van derden,...

Bij de verkoop van een artikel aan 0% BTW beschouwt Mercator dit standaard als een verkoop aan 0% BTW (Vak 00 in de BTW-aangifte). In vele gevallen gaat dit vaak over een BTW-vrijstelling. Het voorbeeld hieronder toont een BTW-vrijstelling voor LEEGGOED (waarborg). Het artikel "leeggoed" is gekend door zijn S_ID (VIDA06B416). Standaard zal Mercator een node <cac:TaxSubtotal> aanmaken in een XML-bestand voor dit tarief van 0%.

  • Hetzij dat alle artikelen van 0% BTW leeggoed zijn. In dit geval kan de node <cac:TaxSubtotal> van 0% BTW gewijzigd worden door deze te vervangen door de instellingen voor BTW-vrijstelling.
  • Hetzij andere artikelen echt verkocht worden aan 0% BTW. In dit geval wordt de node <cac:TaxSubtotal> van 0% gedupliceerd. De oorspronkelijke knoop ziet zijn bedrag TaxableAmount van het bedrag van het leeggoed verminderen, terwijl de nieuwe knoop de parameters van de vrijstelling van BTW op leeggoed bevat.
Zoom
void BillingEngine_EinvFileCreating(object sender, MercatorUi.Engine.Gescom.BillingEngine.EinvFileCreatingEventArgs e)
{
    MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;

    double totVidanges = Api.ConvertToDouble(billingEngine.LIGNES.Compute("sum(total)", "id_article='VIDA06B416'"));
    if (totVidanges.CompareTo(0d, 2) != 0)
    {
        XmlNodeList nodeTaxCategoryVatZero = e.XmlDocument.ChildNodes[1].SelectNodes("cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory[cbc:Percent='0.00']", e.XmlNamespaceManager);
        if (nodeTaxCategoryVatZero.Count > 0)
        {
            XmlNode nodeTaxSubtotalZero = nodeTaxCategoryVatZero[0].ParentNode; // <cac:TaxSubtotal>
            double taxableAmount = Api.ValSafeDouble(nodeTaxSubtotalZero.ChildNodes[0].InnerText);
            XmlNode xmlNodeTaxSubtotalZeroVidanges;
            if (taxableAmount.CompareTo(totVidanges, 2) != 0) // er zijn andere artikels waarop echt 0% btw van toepassing is. We moeten de node dupliceren
            {
                xmlNodeTaxSubtotalZeroVidanges = nodeTaxSubtotalZero.Clone();
                nodeTaxSubtotalZero.ChildNodes[0].InnerText = Api.Transform(Api.ValSafeDouble(nodeTaxSubtotalZero.ChildNodes[0].InnerText) - totVidanges, "#########0.00"); // <cbc:TaxableAmount saldo btw 0%
                xmlNodeTaxSubtotalZeroVidanges.ChildNodes[0].InnerText = Api.Transform(totVidanges, "#########0.00"); // <cbc:TaxableAmount leeggoed
                nodeTaxSubtotalZero.ParentNode.AppendChild(xmlNodeTaxSubtotalZeroVidanges);
            }
            else
            {
                xmlNodeTaxSubtotalZeroVidanges = nodeTaxSubtotalZero; // we kunnen doorgaan met de bestaand 0% btw node
            }
            XmlNodeList nodeTaxCategoryId = xmlNodeTaxSubtotalZeroVidanges.SelectNodes("cac:TaxCategory/cbc:ID", e.XmlNamespaceManager);
            nodeTaxCategoryId[0].InnerText = "E"; // Excluded from VAT
            XmlNodeList nodeTaxCategoryName = xmlNodeTaxSubtotalZeroVidanges.SelectNodes("cac:TaxCategory/cbc:Name", e.XmlNamespaceManager);
            nodeTaxCategoryName[0].InnerText = "NA"; // belgische code
            XmlNodeList nodeTaxCategoryPercent = xmlNodeTaxSubtotalZeroVidanges.SelectNodes("cac:TaxCategory/cbc:Percent", e.XmlNamespaceManager);

            XmlNode nodeReason = billingEngine.EinvAddNode(e.eInvoiceEnum, nodeTaxCategoryName[0].ParentNode, "cbc:TaxExemptionReason", "Leeggoed");
            nodeTaxCategoryName[0].ParentNode.InsertAfter(nodeReason, nodeTaxCategoryPercent[0]); // plaats deze node onder <cbc:Percent>
        }
    }
}

Lijnen wijzigen

Via de BeforeEinvoiceExport event kunt u met e.AllLines de geëxporteerde lijnen wijzigen. Deze eigenschap is een lijst: u kunt lijnen invoegen of verwijderen zonder dat de BillingEngine.LIGNES DataTable wordt gewijzigd. Onderstaande code laat zien hoe u een bijdrage van 10 EUR kunt toevoegen. U moet er echter voor zorgen dat het documenttotaal correct blijft.

 De DataRows in deze lijst zijn dezelfde als die in de BillingEngine.LIGNES DataTable. Alleen de container van deze DataRows is anders.

Zoom
void BillingEngine_BeforeEinvoiceExport(object sender, MercatorUi.Engine.Gescom.BillingEngine.BeforeEinvoiceExportEventArgs e)
{
    MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
    DataRow newLine = billingEngine.LIGNES.NewRow();
    Api.DataRowResetContent(newLine);
    newLine["id_article"] = "BIJDRAGE";
    newLine[billingEngine.VarQ] = 1;
    newLine["pu"] = 10;
    newLine["total"] = 10;
    newLine["taux_tva"] = 21;
    newLine["designatio"] = "Bijdrage";
    e.AllLines.Add(newLine);
}

De PeppolId van de afzender forceren

Standaard wordt de PeppolId van de afzender altijd berekend op basis van zijn BTW-nummer. Via deze Main customizer is het mogelijk om hiervan af te wijken :

Zoom
using MercatorUi;

namespace Main
{
    public class Customizer : MercatorUi.ICustomizers.IExec
    {
        public void Main(MercatorUi.ICustomizers.ExecAction action)
        {
            if (action == MercatorUi.ICustomizers.ExecAction.DossierOpen)
            {
                Globals.PeppolIdCustom = "9925:1234567890";
            }
            else if (action == MercatorUi.ICustomizers.ExecAction.DossierClose)
            {
                Globals.PeppolIdCustom = null;
            }
        }
    }
}


Functionele cookies: Cookies die nodig zijn voor het gebruik van de website en voorkeurscookies. Ze bevatten geen persoonsgegevens. (Meer informatie)

Analytische cookies: Verzamelen van statistieken met betrekking tot het gedrag van internetgebruikers. (Meer informatie)

Marketingcookies: Om bezoekers op verschillende websites te volgen voor advertentiedoeleinden. (Meer informatie)