<%@ language = "JavaScript" %>
<% /*
     $Id$

     File:          hmail_factuur.asp
     Description:   Voor per e-mail ontvangen van SIDB/UBL facturen
                    Voorheen via CUST\MARX\import\ScanMail2Api.js

     Parameters:    Een xml
     Context:       vanuit \UTILS\mail_receive\EventHandlers.js omdat bij diverse email instellingen bijlagen staat ingesteld:
                    @/appl/marx/hmail_factuur.asp?multifile=1 en een fac_email_settings.prs_perslid_key_auth is ingevuld
     Notes:         De body die binnenkomt bevat een heel uitgebreide JSON
                    De meegestuurde bijlagen vind je onder "attachments" en dan telkens de tempfilename
                    De settings uit de database staan voor het gemak in "emlSetting"
                    Allerlei details over de binnenkomende e-mail staan in "mailParams"
                    {
                        "success": true,
                        "path": "http://marx.facws001.sg.nl/trunk/appl/marx/hmail_factuur.asp?multifile=1",
                        "kenmerkpath": "",
                        "attachments": [
                            {
                                "sequence": 0,
                                "safefilename": "2020-207 Woonforte Uitkoop foto (002).pdf",
                                "tempfilename": "D:\\Apps\\Facilitor\\trunk\\temp\\MARX\\API_HMAIL_bsAR6tHQdc9Jzy049BcM1xDvcyQTXLPe_2020-207 Woonforte Uitkoop foto (002).pdf",
                                "extension": "pdf",
                                "safeurl": "http://marx.facws001.sg.nl/trunk/appl/marx/hmail_factuur.asp?multifile=1",
                                "headers": {}
                            },
                            {
                                "sequence": 1,
                                "safefilename": "dummy.pdf",
                                "tempfilename": "D:\\Apps\\Facilitor\\trunk\\temp\\MARX\\API_HMAIL_SLTnrjw7zoTmdHSh_EYNzBqT96xU6Zz0_dummy.pdf",
                                "extension": "pdf",
                                "safeurl": "http://marx.facws001.sg.nl/trunk/appl/marx/hmail_factuur.asp?multifile=1",
                                "headers": {}
                            }
                        ],
                        "tempfolder": "D:\\Apps\\Facilitor\\trunk\\temp\\MARX",
                        "loglevel": 0,
                        "maillog": "Verder geen database process_email actie gedefinieerd",
                        "isMulti": true,
                        "emlSetting": {
                            "key": 1621,
                            "volgnr": 10,
                            "action": null,
                            "expire": null,
                            "allowed_attachext": "pdf",
                            "required_attachext": null,
                            "prs_perslid_key_auth": null,
                            "attachpath": "@/appl/marx/hmail_factuur.asp?multifile=1",
                            "fromMode": 0,
                            "from": null,
                            "loglevel": 0,
                            "path": "http://marx.facws001.sg.nl/trunk/appl/marx/hmail_factuur.asp?multifile=1",
                            "theFrom": "no-reply@facilitor.nl",
                            "allowedFiles": [
                                {
                                    "sequence": 0,
                                    "safefilename": "2020-207 Woonforte Uitkoop foto (002).pdf",
                                    "attsize": 586894
                                },
                                {
                                    "sequence": 1,
                                    "safefilename": "dummy.pdf",
                                    "attsize": 258320
                                }
                            ],
                            "requiredFound": false
                        },
                        "mailParams": {
                            "sessionId": "49025918",
                            "Subject": "TestMon Aug 7 12:01:29 UTC+-0200 2023",
                            "fromAddr": "no-reply@facilitor.nl",
                            "from": "<no-reply@facilitor.nl>",
                            "toAddr": "facturen.3bwonen.9021@marxtrunk.facws001",
                            "RecipientNr": null,
                            "htmlBody": "Lege body",
                            "Body": "Lege body\n",
                            "CC": null,
                            "originalto": "<facturen.3bwonen.9021@marxtrunk.facws001>",
                            "datum": "Mon, 7 Aug 2023 12:01:29 +0200",
                            "emlpath": "C:\\Program Files (x86)\\hMailServer\\Data\\",
                            "emlfile": "{5BF9C22E-8AB8-4D17-B6D1-BFB3D99FB7E1}.eml",
                            "emlsize": "1083",
                            "mailuser": "facturen.3bwonen.9021"
                        }
                    }

                    Bij foutsituaties genereren we altijd een http 500 (via _AiAi)
                    Dat maakt dat EventHandlers.js de ontvangen e-mail zal bouncen naar de afzender
*/
DOCTYPE_Disable = 1;
// Niet: ANONYMOUS_Allowed = 1, zorg maar dat je fac_email_settings.prs_perslid_key_auth

%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/save2db.inc" -->
<!-- #include file="../Shared/flexfiles.inc" -->
<!-- #include file="../api/api.inc" -->
<script language="javascript" src="../imp/imp_shared.js" runat="server"></script>
<%
Session.Abandon(); // Voor de zekerheid

var jsonrequest = RequestJSON();
if (jsonrequest.loglevel > 0)
{
   __Logging = jsonrequest.loglevel || __Logging || 0; // GLOBAL: Voor de rest van dit bestand
}

// var marxAPI = getQParam("marxAPI", ""); // We doen altijd autodetect (FIN_FACTUUR_SIDB, FIN_FACTUUR_SIDB4, UBL)

// user_key is ondertussen gevuld met de leverancier zoals geconfigureerd in FAC_EMAIL_SETTINGS.prs_perslid_key_auth
var prs_perslid_contractant_key = user_key;

// Stap 2: Nu bepalen we het unieke contract bij de contractant uit stap 1
var sql = "SELECT check_of_contract_bestaat(" + prs_perslid_contractant_key + ") cnt_contract_key FROM dual";
var oRs = Oracle.Execute(sql);
var cnt_contract_key = oRs("cnt_contract_key").Value;
oRs.Close();
__Log("Bijbehorende Contractkey: " + cnt_contract_key);

if (cnt_contract_key > 0) // niet iedereen heeft een contract
{
    // Stap 3: Nu bepalen we de woco (prs_bedrijf) die bij het contract (uit stap 2) staat geregistreerd.
    var sql = "SELECT a.prs_bedrijf_key"
            + "  FROM cnt_contract c, prs_afdeling a"
            + " WHERE c.cnt_contract_key = " + cnt_contract_key
            + " AND c.prs_afdeling_key_eig = a.prs_afdeling_key";
    var oRs = Oracle.Execute(sql);
    var prs_bedrijf_woco_key = oRs("prs_bedrijf_key").Value;
    oRs.Close();
    __Log("Bijbehorende Woco bedrijfkey: " + prs_bedrijf_woco_key);
}
else
{
    prs_bedrijf_woco_key = -1;
    //hmaillogtekst.push("Geen contract");
}

// jsonrequest.attachments bevat alle bijlagen van de mail
// Dat kunnen meerdere XML bestanden zijn en ook meerdere bijbehorende pdf's
// Die pdf heeft exact dezelfde naam als de XML of de naam wordt genoemd in de XML

var hmaillogtekst = []; // verzamelen voor logging die terug gaat naar hMailserver
var xml_data = null;
for (var i = 0; i < jsonrequest.attachments.length; i++)
{
    var data = jsonrequest.attachments[i];
    if (data.extension.toLowerCase() != 'xml')
    {
        __Log("Skipping: " + data.safefilename);
    }
    else
    {
        xml_data = data;
        __Log("Processing file:");
        __Log(xml_data);

        var oCrypto = new ActiveXObject("SLNKDWF.Crypto");
        var filehash = oCrypto.hex_sha1_file(xml_data.tempfilename);

        var fso = Server.CreateObject("Scripting.FileSystemObject");
        var fsoFile = fso.GetFile(xml_data.tempfilename);

        if (prs_bedrijf_woco_key > 0)
        {
            var fields =  [ { dbs: "mar_factuur_queue_key",         typ: "key",      seq: "mar_s_mar_factuur_queue_key" },
                            { dbs: "prs_bedrijf_key",               typ: "key",      val: prs_bedrijf_woco_key},
                            //{ dbs: "mar_factuur_queue_klantid",     typ: "varchar",  val: klantid,    len: 64 },
                            { dbs: "mar_factuur_queue_from",        typ: "varchar",  val: jsonrequest.emlSetting.theFrom, len: 64 },
                            { dbs: "mar_factuur_queue_to",          typ: "varchar",  val: jsonrequest.mailParams.toAddr,  len: 64 },
                            { dbs: "mar_factuur_queue_subject",     typ: "varchar",  val: jsonrequest.mailParams.Subject, len: 4000 },
                            { dbs: "mar_factuur_queue_filename",    typ: "varchar",  val: xml_data.safefilename,          len: 256 },
                            { dbs: "mar_factuur_queue_filesize",    typ: "number",   val: fsoFile.Size },
                            { dbs: "mar_factuur_queue_filehash",    typ: "varchar",  val: filehash,   len: 64 },
                            { dbs: "mar_factuur_queue_backupfile",  typ: "varchar",  val: xml_data.tempfilename,          len: 256 },
                            { dbs: "prs_perslid_key",               typ: "key",      val: prs_perslid_contractant_key }
                            //{ dbs: "mar_factuur_queue_requestid",   typ: "varchar",  val: request_id, len: 64 }
                          ];
            var marIns = buildInsert("mar_factuur_queue", fields, { noValidateToken: true});
            var mar_queue_key = marIns.sequences["mar_factuur_queue_key"];
            hmaillogtekst.push("mar_queue_key " + mar_queue_key);
            Oracle.Execute(marIns.sql);
        }
        else
        {
            mar_queue_key = -1; // Latere UPDATE mar_factuur_queue doen dan vanzelf niets
        }

        var l_xml = Read_XML(xml_data.tempfilename);

        if (l_xml && l_xml.xml != '')
        {
            var pdf_name = xml_data.safefilename.replace(/\.xml$/i, ".pdf"); // zelfde naam als XML heeft voorkeur
            var pdf_data = findPDF(pdf_name);

            var l_api_and_xml = try_merge_pdf_2_xml(l_xml, pdf_data);

            if (!l_api_and_xml.api)
            {
                var warn = "Ongeldige XML {0}, kan api niet bepalen".format(xml_data.safefilename);
                var sql = "UPDATE mar_factuur_queue"
                        + "   SET mar_factuur_queue_response = " + safe.quoted_sql(warn, 64)
                        + " WHERE mar_factuur_queue_key = " + mar_queue_key;
                __DoLog("Import XML mislukt: {0}".format(warn), "#ffff00");
                _AiAi(warn); // Abort met 500-status
            }
            else (l_api_and_xml.api) // nu het echte importeren
            {
                var API = new API_func(l_api_and_xml.api);
                var import_app_key = API.apidata.options['import_app_key'];

                var fileStream = Server.CreateObject("ADODB.Stream");
                fileStream.CharSet = 'utf-8'; // voorkomt BOM?
                fileStream.Type = 2; // adTypeText
                fileStream.Open();
                fileStream.WriteText(l_api_and_xml.xml.xml);

                var res = impReadStream(fileStream, import_app_key,
                                                    { fac_home: Server.MapPath(rooturl + "/") + "/",
                                                      filepathname: "API " + API.APIname,
                                                      customerId: customerId,
                                                      keep_old: 300, // Parallelle import 300 seconden ondersteunen
                                                      user_key: user_key,
                                                      stylesheet: API.apidata.stylesheet,
                                                      keep_backup: true // mits fac_import_app_folder gezet
                                                    });
                var import_key = res.import_key;

                if (res.success)
                {
                    var warn = L("lcl_imp_read_lines") + res.read_lines;
                    var res = impProcessStream(res.import_key, { customerId: customerId,
                                                                 user_key: user_key });
                    var fin_factuur_key = -1;
                    var sql = "SELECT MAX(fin_factuur_key) fin_factuur_key"
                            + "  FROM fac_imp_factuur"
                            + " WHERE fac_import_key = " + import_key;
                    var oRs = Oracle.Execute(sql);
                    if (!oRs.EOF)
                    {
                        var fin_factuur_key = oRs("fin_factuur_key").Value;
                    }
                    oRs.Close();
                    if (fin_factuur_key > 0)
                    {
                      hmaillogtekst.push("fin_factuur_key " + fin_factuur_key);
                    }
                    else
                    {
                      Response.Status = '400 Bad Request';
                      hmaillogtekst.push("fin_factuur_key niet aangemaakt?");
                    }

                    // Registreer de effectieve fin_factuur_key zoals aangemaakt
                    var sql = "UPDATE mar_factuur_queue"
                            + "   SET mar_factuur_queue_response = " + safe.quoted_sql("OK", 64)
                            + "     , fin_factuur_key = " + (fin_factuur_key>0?fin_factuur_key:"NULL")
                            + " WHERE mar_factuur_queue_key = " + mar_queue_key;
                    Oracle.Execute(sql);
                }
                else
                {
                    var warn = res.warning;
                    var sql = "UPDATE mar_factuur_queue"
                            + "   SET mar_factuur_queue_response = " + safe.quoted_sql(warn, 64)
                            + " WHERE mar_factuur_queue_key = " + mar_queue_key;
                    __DoLog("Import (app_key={0}) mislukt: {1}".format(import_app_key, warn), "#ffff00");
                    _AiAi(warn); // Abort met 500-status
                }
            }
        }
    }
}

for (var j = 0; j < jsonrequest.attachments.length; j++)
{
    var data = jsonrequest.attachments[j];
    if (data.extension.toLowerCase() == 'pdf' && !data.pdf_used)
    {
        __Log("Strange, pdf attachement '{0}' is unused!".format(data.safefilename))
    }
}


if (!xml_data)
{
    _AiAi("No XML attachment supplied");
}


//===
function Read_XML (v_xml_file){
    var l_xml = null;
    __Log("Read_XML: " + v_xml_file);
    try{
        l_xml=new ActiveXObject("Msxml2.DOMDocument.6.0");
        l_xml.async=false;
        l_xml.load(v_xml_file);
        return l_xml;
    }
    catch (e)
    {
        __Log("Warning Read_XML: " + v_xml_file + " - " + e.description,1);
       return l_xml;
    }
}

function Get_XML_Node(v_xml, v_node_name){
    var v_result;
    try{
        var v_result = v_xml.selectSingleNode(v_node_name);
        return v_result;
    }
    catch (e)
    {
        __Log("Warning: Get_XML_Node: '" + v_node_name + "' not found " + e.description, 1);
       return v_result;
    }
}

function Read_XML_Node(v_xml, v_node_name){
    var v_result = "";
    l_node = Get_XML_Node(v_xml, v_node_name);
    try{
      return l_node.text;
    }
    catch(e)
    {
      return "";
    }
}

// Create new XML node (= resultaat van deze functie) met de node-naam 'v_node_name' en waarde 'v_node_value'
function Create_XML_Node(v_xml, v_node_name, v_node_value, v_namespace_prefix, v_namespaces_uri){
  var l_xml=new ActiveXObject("Msxml2.DOMDocument.6.0");

  var c_XmlNodeType_Element = 1;
  var newElem = v_xml.createNode(c_XmlNodeType_Element, v_node_name, v_namespaces_uri);
  if (v_node_value != ""){
    var newTxt = v_xml.createTextNode(v_node_value);
    newElem.appendChild(newTxt);
  }
  return (newElem);
}


function encodeBase64(p_bytes){
	var l_xml=new ActiveXObject("Msxml2.DOMDocument.6.0");
  // Create temporary node with Base64 data type
  var xml_element = l_xml.createElement("tmp");
  xml_element.dataType = "bin.base64";
  // Set bytes, get encoded String
  xml_element.nodeTypedValue = p_bytes
  return xml_element.text;
}

function ReadBinaryFile (p_filename)
{
  var oStream = new ActiveXObject("ADODB.Stream");
  oStream.Open();
  oStream.Type = 1; // adTypeBinary
  oStream.LoadFromFile(p_filename);
  return oStream.Read;
}

function BinaryFile_2_Base64(p_filename)
{
  var v_base64="";
  __Log("Start BinaryFile_2_Base64: " + p_filename);
  if (fso.FileExists(p_filename)){
    __Log("File Exists: " + p_filename);
    var bytes = ReadBinaryFile(p_filename);
    v_base64 = encodeBase64(bytes);
  }
  return v_base64;
}

// zoek of er een pdf met deze naam is meegestuurd
function findPDF(pdf_name)
{
    pdf_name = pdf_name.toLowerCase();
    var pdf_data;
    __Log("Finding " + pdf_name)
    for (var j = 0; j < jsonrequest.attachments.length; j++)
    {
        var data = jsonrequest.attachments[j];
        if (data.extension.toLowerCase() == 'pdf')
        {
            if (data.safefilename.toLowerCase() == pdf_name)
            {
                pdf_data = data;
                data.pdf_used = true; // markeer als gebruikt
            }
            else
                __Log("pdf attachement '{0}' does not match name '{1}'".format(data.safefilename, pdf_name))
        }
    }
    return pdf_data;
}

function try_merge_pdf_2_xml(p_xml, p_pdf_data){
  var l_result_xml = p_xml;
  var l_xml;
  var l_xmlmatch_and_xml;
  var l_api = "";


  if (l_api == ""){
    l_xmlmatch_and_xml = try_merge_pdf_2_sales (p_xml, p_pdf_data, "", "");
    __Log("l_xmlmatch_and_xml.xml_match: " + l_xmlmatch_and_xml.xml_match);
    if (l_xmlmatch_and_xml.xml_match == 1){
      l_api = "FIN_FACTUUR_SIDB";
      __Log("API obv XML file moet zijn: " + l_api);
      if (l_xmlmatch_and_xml.xml) l_result_xml = l_xmlmatch_and_xml.xml;
    }
  }
  if (l_api == ""){
    l_xmlmatch_and_xml = try_merge_pdf_2_sales (p_xml, p_pdf_data, "insbou4", "http://www.gs1.nl/factuur/insbou/004");
    __Log("l_xmlmatch_and_xml.xml_match: " + l_xmlmatch_and_xml.xml_match);
    if (l_xmlmatch_and_xml.xml_match == 1){
      l_api = "FIN_FACTUUR_SIDB4";
      __Log("API obv XML file moet zijn: " + l_api);
      if (l_xmlmatch_and_xml.xml) l_result_xml = l_xmlmatch_and_xml.xml;
    }
  }
  if (l_api == ""){
    l_xmlmatch_and_xml = try_merge_pdf_2_sales (p_xml, p_pdf_data, "sales5", "http://www.ketenstandaard.nl/factuur/SALES/005");
    __Log("l_xmlmatch_and_xml.xml_match: " + l_xmlmatch_and_xml.xml_match);
    if (l_xmlmatch_and_xml.xml_match == 1){
      l_api = "FIN_FACTUUR_SALES005_1.0";
      __Log("API obv XML file moet zijn: " + l_api);
      if (l_xmlmatch_and_xml.xml) l_result_xml = l_xmlmatch_and_xml.xml;
    }
  }
  if (l_api == ""){
    l_xmlmatch_and_xml = try_merge_pdf_2_ubl (p_xml, p_pdf_data, "ubl", "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2");
    __Log("l_xmlmatch_and_xml.xml_match: " + l_xmlmatch_and_xml.xml_match);
    if (l_xmlmatch_and_xml.xml_match == 1){
      l_api = "FIN_FACTUUR_UBL";
      __Log("API obv XML file moet zijn: " + l_api);
      if (l_xmlmatch_and_xml.xml) l_result_xml = l_xmlmatch_and_xml.xml;
    }
  }
  __Log("API obv van XML file is geworden: "  + l_api);
  return {api: l_api, xml: l_result_xml};
}


function try_merge_pdf_2_sales (p_xml, p_pdf_data, p_namespace_prefix, p_namespace_uri){
  var l_result_xml;
  var l_namespace_prefix_and_colon = "";
  var l_xml_match = 0;

  if (p_namespace_uri != ""){
    l_namespace_prefix_and_colon = p_namespace_prefix + ":";
    p_xml.setProperty ("SelectionNamespaces", "xmlns:" + p_namespace_prefix + "='" + p_namespace_uri + "'");
  }
  var l_node_str = "//" + l_namespace_prefix_and_colon + "Invoice";
  __Log("l_node_str: " + l_node_str);
  var l_invoice_node = Get_XML_Node(p_xml, l_node_str);

  if (l_invoice_node){
    // We hebben van doen met INSBOU003, INSBOU004 of SALES005
    l_xml_match = 1;
    __Log("l_xml_match: " + l_xml_match);
    var l_node_str = "//" + l_namespace_prefix_and_colon + "Invoice/" + l_namespace_prefix_and_colon + "Attachment";
    __Log("l_node_str: " + l_node_str);
    var l_attachment_node = Get_XML_Node(p_xml, l_node_str);

    if (!l_attachment_node){
      // Er is geen attachment node, die gaan we eerst nu toevoegen (maar alleen als p_pdf_data niet leeg is, want anders heeft dat helemaal geen zin)
      if (p_pdf_data){
        // pdf is er, attachment kunnen we nu toevoegen...
        var l_attachment_node = Create_XML_Node(p_xml, "Attachment", "", p_namespace_prefix, p_namespace_uri);
        l_invoice_node.appendChild(l_attachment_node);
      }
    }

    if (l_attachment_node){
      var l_node_str = "//" + l_namespace_prefix_and_colon + "Invoice/" + l_namespace_prefix_and_colon + "Attachment/" + l_namespace_prefix_and_colon + "FileName";
      __Log("l_node_str: " + l_node_str);
      var l_attached_filename_node = Get_XML_Node(p_xml, l_node_str);

      if (!l_attached_filename_node){
        // Er is geen attached filename node, die gaan we eerst nu toevoegen (maar alleen als p_pdf_data niet leeg is, want anders heeft dat helemaal geen zin)
        if (p_pdf_data){
          // pdf is er, attached filename kunnen we nu toevoegen...
          var l_attached_filename_node = Create_XML_Node(p_xml, "FileName", p_pdf_data.safefilename, p_namespace_prefix, p_namespace_uri);
          l_attachment_node.appendChild(l_attached_filename_node);
        }
      }
      else{
        // Er is wel een filename-node, als die waarde heeft EN de fysieke pdf met dezelfde naam als XML bestaat niet (dwz p_pdf_data is leeg), dan proberen we de pdf uit de XML....


        var l_node_str = "//" + l_namespace_prefix_and_colon + "Invoice/" + l_namespace_prefix_and_colon + "Attachment/" + l_namespace_prefix_and_colon + "FileName";
        p_pdf_filename_from_xml = Read_XML_Node (p_xml, l_node_str);

        if (!p_pdf_data){
          // Fysieke pdf gelijk aan XML naam bestaat dus niet, misschien dat die in de XML wel bestaat (en andere naam heeft?, we doen een poging..
          if (p_pdf_filename_from_xml != "")
          {
            var p_pdf_data = findPDF(p_pdf_filename_from_xml);

            if (p_pdf_data){
              __Log("PDF File from XML exists: " + p_pdf_data.tempfilename, 1);
            }
            else{
              //PDF niet meegeleverd, p_pdf_data blijft leeg, als teken dat deze niet bestaat
              __Log("PDF File from XML also NOT exists: " + p_pdf_filename_from_xml, 1);
            }
          }
        }
        else{
          // filenaam node bestaat maar is leeg, en pdf file is meegeleverd, dan gaan we deze node natuurlijk vullen met de PDF filenaam (en mocht XML node filenaam wel gevuld zijn, dan doen we niets en gebruiken die waarde)
          if (p_pdf_filename_from_xml == ""){
            __Log("PDF File node in XML is empty, fill it with: " + p_pdf_data.safefilename, 1);
            var l_txtnode = p_xml.createTextNode(p_pdf_data.safefilename);
            l_attached_filename_node.appendChild(l_txtnode);
          }
        }
      }

      if (p_pdf_data){
        // Alleen zinvol om als base64 toe te voegen als PDF echt bestaat

        var l_node_str = "//" + l_namespace_prefix_and_colon + "Invoice/" + l_namespace_prefix_and_colon + "Attachment/" + l_namespace_prefix_and_colon + "AttachedData";
        __Log("l_node_str: " + l_node_str);

        var l_attacheddata_node = Get_XML_Node(p_xml, l_node_str);
        if (!l_attacheddata_node){
          // Er is geen attached filename node, die gaan we eerst nu toevoegen
          var l_pdf_base64 = BinaryFile_2_Base64(p_pdf_data.tempfilename);
          var l_new_elem = Create_XML_Node(p_xml, "AttachedData", l_pdf_base64, p_namespace_prefix, p_namespace_uri);
          l_attachment_node.appendChild(l_new_elem);
          var l_result_xml = p_xml;
        }
        else{
          // Er is wel attached filename node, die gaan we alleen vullen als deze leeg is
          var l_attacheddata = Read_XML_Node(p_xml,l_node_str);
          if (l_attacheddata == ""){
            var l_pdf_base64 = BinaryFile_2_Base64(p_pdf_data.tempfilename);
            var l_txtnode = p_xml.createTextNode(l_pdf_base64);
            l_attacheddata_node.appendChild(l_txtnode);
            var l_result_xml = p_xml;
          }
        }
      }
    }
  }
  return {xml_match: l_xml_match, xml: l_result_xml};
}

function try_merge_pdf_2_ubl (p_xml, p_pdf_data, p_namespace_prefix, p_namespace_uri){
  var l_result_xml;
  var l_namespace_prefix_and_colon = "";
  var l_xml_match = 0;
  var l_SelectionNamespaces = "";
  if (p_namespace_uri != ""){
    l_namespace_prefix_and_colon = p_namespace_prefix + ":";
    l_SelectionNamespaces = "xmlns:" + p_namespace_prefix + "='" + p_namespace_uri + "' ";
    //p_xml.setProperty ("SelectionNamespaces", "xmlns:" + p_namespace_prefix + "='" + p_namespace_uri + "'");
  }
  var cbc_namespace_uri = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2";
  var cac_namespace_uri = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2";

  l_SelectionNamespaces = l_SelectionNamespaces + "xmlns:" + "cbc" + "='" + cbc_namespace_uri + "' ";
  l_SelectionNamespaces = l_SelectionNamespaces + "xmlns:" + "cac" + "='" + cac_namespace_uri + "'";

  p_xml.setProperty ("SelectionNamespaces", l_SelectionNamespaces);

  //p_xml.setProperty ("SelectionNamespaces", "xmlns:cbc='" + cbc_namespace_uri + "'");
  //p_xml.setProperty ("SelectionNamespaces", "xmlns:cac='" + cac_namespace_uri + "'");


  var l_node_str = "//" + l_namespace_prefix_and_colon + "Invoice";
  __Log("l_node_str: " + l_node_str);
  var l_invoice_node = Get_XML_Node(p_xml, l_node_str);

  if (l_invoice_node){
    // We hebben van doen met UBL
    l_xml_match = 1;
    var l_node_str = "//" + l_namespace_prefix_and_colon + "Invoice/" + "cac:AdditionalDocumentReference";
    __Log("l_node_str: " + l_node_str);
    var l_docref_node = Get_XML_Node(p_xml, l_node_str);

    if (!l_docref_node){
      // Er is geen docreference node, die gaan we eerst nu toevoegen (maar alleen als p_pdf_filename niet leeg is, want anders heeft dat helemaal geen zin)
      if (p_pdf_data){
        // pdf is er, attachment kunnen we nu toevoegen...
        var l_docref_node = Create_XML_Node(p_xml, "cac:AdditionalDocumentReference", "", "cac", cac_namespace_uri);
        l_invoice_node.appendChild(l_docref_node);
      }
    }

    var l_node_str = "//" + l_namespace_prefix_and_colon + "Invoice/" + "cac:AdditionalDocumentReference/" + "cac:Attachment";
    __Log("l_node_str: " + l_node_str);
    var l_attachment_node = Get_XML_Node(p_xml, l_node_str);

    if (!l_attachment_node){
      // Er is geen attachment node, die gaan we eerst nu toevoegen (maar alleen als p_pdf_filename niet leeg is, want anders heeft dat helemaal geen zin)
      if (p_pdf_data){
        // pdf is er, attachment kunnen we nu toevoegen...
        var l_attachment_node = Create_XML_Node(p_xml, "cac:Attachment", "", "cac", cac_namespace_uri);
        l_docref_node.appendChild(l_attachment_node);
      }
    }
    if (l_docref_node){
      var l_node_str = "//" + l_namespace_prefix_and_colon + "Invoice/" + "cac:AdditionalDocumentReference/" + "cbc:ID";
      __Log("l_node_str: " + l_node_str);
      var l_attached_filename_node = Get_XML_Node(p_xml, l_node_str);

      if (!l_attached_filename_node){
        // Er is geen attached filename node, die gaan we eerst nu toevoegen (maar alleen als p_pdf_filename niet leeg is, want anders heeft dat helemaal geen zin)
        if (p_pdf_data){
          // pdf is er, attached filename kunnen we nu toevoegen...
          var l_attached_filename_node = Create_XML_Node(p_xml, "cbc:ID", p_pdf_data.safefilename, "cbc", cbc_namespace_uri);
          l_docref_node.appendChild(l_attached_filename_node);
        }
      }
      else{
        // Er is wel een filename-node, als die waarde heeft EN de fysieke pdf met dezelfde naam als XML bestaat niet (dwz p_pdf_filename is leeg), dan proberen we de pdf uit de XML....


        var l_node_str = "//" + l_namespace_prefix_and_colon + "Invoice/" + "cac:AdditionalDocumentReference/" + "cbc:ID";
        p_pdf_filename_from_xml = Read_XML_Node (p_xml, l_node_str);

        if (!p_pdf_data){
          // Fysieke pdf gelijk aan XML naam bestaat dus niet, misschien dat die in de XML wel bestaat (en andere naam heeft?, we doen een poging..
          if (p_pdf_filename_from_xml != "")
          {
            var p_pdf_data = findPDF(p_pdf_filename_from_xml);

            if (p_pdf_data){
              __Log("PDF File from XML exists: " + p_pdf_data.tempfilename, 1);
            }
            else{
              //PDF niet meegeleverd, p_pdf_data blijft leeg, als teken dat deze niet bestaat
              __Log("PDF File from XML also NOT exists: " + p_pdf_filename_from_xml, 1);
            }
          }
        }
        else{
          // Fysieke pdf file is meegeleverd

          if (p_pdf_filename_from_xml == ""){
            // pdf filenaam node bestaat maar is leeg, en dan gaan we deze node natuurlijk vullen met de PDF filenaam
            __Log("PDF File node in XML is empty, fill it with: " + p_pdf_data.safefilename, 1);
            var l_txtnode = p_xml.createTextNode(p_pdf_data.safefilename);
            l_attached_filename_node.appendChild(l_txtnode);
          }
          else
          {
             // pdf filenaam NODE (from XML) is wel gevuld, maar als deze niet eindigt op PDF, dan zetten we dat er ff achter
             if (!p_pdf_filename_from_xml.match("\.pdf$"/ i))
             {
              // Bestandsnaam eindigt NIET op .PDF, gaan we voor zorgen door .pdf te appenden achter de naam (cbc:Id)
              // Maar omdat p_pdf_filename is meegeleverd, gaan we deze daar neerzetten...
              l_attached_filename_node.childNodes[0].replaceData(0, p_pdf_filename_from_xml.length, p_pdf_data.safefilename);
             }
          }
        }
      }

      if (p_pdf_data){
        // Alleen zinvol om als base64 toe te voegen als PDF echt bestaat

        var l_node_str = "//" + l_namespace_prefix_and_colon + "Invoice/" + "cac:AdditionalDocumentReference/" + "cac:Attachment/" + "cbc:EmbeddedDocumentBinaryObject";
        __Log("l_node_str: " + l_node_str);

        var l_attacheddata_node = Get_XML_Node(p_xml, l_node_str);
        if (!l_attacheddata_node){
          // Er is geen attached filename node, die gaan we eerst nu toevoegen
          var l_pdf_base64 = BinaryFile_2_Base64(p_pdf_data.tempfilename);
          var l_new_elem = Create_XML_Node(p_xml, "cbc:EmbeddedDocumentBinaryObject", l_pdf_base64, "cbc", cbc_namespace_uri);
          if (!l_attachment_node){
            if (!l_docref_node){
              // Er is geen docreference node, dit kon, als pdf naam niet overeenkwam met xml naam
              l_docref_node = Create_XML_Node(p_xml, "cac:AdditionalDocumentReference", "", "cac", cac_namespace_uri);
              l_invoice_node.appendChild(l_docref_node);
            }
            l_attachment_node = Create_XML_Node(p_xml, "cac:Attachment", "", "cac", cac_namespace_uri);
            l_docref_node.appendChild(l_attachment_node);
          }
          l_attachment_node.appendChild(l_new_elem);
          var l_result_xml = p_xml;
        }
        else{
          // Er is wel attached filename node, die gaan we alleen vullen als deze leeg is
          var l_attacheddata = Read_XML_Node(p_xml,l_node_str);
          if (l_attacheddata == ""){
            var l_pdf_base64 = BinaryFile_2_Base64(p_pdf_data.tempfilename);
            var l_txtnode = p_xml.createTextNode(l_pdf_base64);
            l_attacheddata_node.appendChild(l_txtnode);
            var l_result_xml = p_xml;
          }
        }
      }
    }
  }
  return {xml_match: l_xml_match, xml: l_result_xml};
}

// komt terug in hMail logging
Response.Write(hmaillogtekst.join(", "));

ASPPAGE_END();
%>