void BillingEngine_EinvFileCreating(object sender, MercatorUi.Engine.Gescom.BillingEngine.EinvFileCreatingEventArgs e)
{
    MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;

    string s_id_vidange = "VIDA06B416";
    double totVidanges = Api.ConvertToDouble(billingEngine.LIGNES.Compute("sum(total)", string.Format("id_article='{0}'", s_id_vidange)));
    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 solde TVA 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 nodeTaxCategoryPercent = xmlNodeTaxSubtotalZeroVidanges.SelectNodes("cac:TaxCategory/cbc:Percent", e.XmlNamespaceManager);

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

        // vervang Z par E voor de betrokken lijnen

        var invoiceLines = e.XmlDocument.SelectNodes(string.Format("//cac:InvoiceLine[cac:Item/cac:SellersItemIdentification/cbc:ID='{0}']", s_id_vidange), e.XmlNamespaceManager);
        if (invoiceLines != null)
        {
            foreach (XmlNode line in invoiceLines)
            {
                var taxCategoryId = line.SelectSingleNode("cac:Item/cac:ClassifiedTaxCategory/cbc:ID", e.XmlNamespaceManager);
                if ((taxCategoryId != null) && (taxCategoryId.InnerText == "Z"))
                    taxCategoryId.InnerText = "E";
            }
        }
    }
}