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

     File:              API_plan_extern.asp
     Description:       API om in een extern planbord plan-voorstellen op te halen

     Parameters:        Een xml
     Status:
     Context:
     Notes:             Zie "z:\Project\Implementaties\Customers\MARX\DOC\POC Planbord via reserveringen\marx_plannen_jgl.docx"
                        voor een overzicht van de verschillende XML-stadia
*/
    DOCTYPE_Disable = 1;
    THIS_FILE = "appl/marx/api_plan_extern.asp";
%>
<!-- #include file="../../appl/Shared/common.inc" -->
<!-- #include file="../Shared/xml_converter.inc" -->
<!-- #include file="../api/api.inc" -->
<!-- #include file="../shared/putorders.inc" -->
<%
Session.Codepage = 65001;
Response.Charset = 'utf-8';

var API = new API_func();

/*
  De inkomende stylesheet van de API heeft weet van het bron-systeem: Tobias, Umbrella, enzovoorts
  De stylesheet zal de XML 'verrijken' met de XML-node van de leverancier (/bedrijf_key waar de request naar toe moet):
       <!-- prs_bedrijf heeft mogelijk als waarde: prs_bedrijf_key, prs_bedrijf_naam, prs_leverancier_nr of prs_bedrijf_key2 -->
        <mareon>
          <uitvoerende>
			  <prs_bedrijf_key>2884</prs_bedrijf_id>
	          <prs_bedrijf_naam>Test</prs_bedrijf_naam>
			  <prs_leverancier_nr>123456</prs_leverancier_nr>
			  <prs_bedrijf_key2>5678</prs_leverancier_nr>
		  </uitvoerende>
		  <datum fclt_dateformat="ISO8601">2020-10-21T12:03:00+0200</datum>
        </mareon>
  Daarnaast worden datumvelden verrijkt met een aanduiding of ze van localtime naar ISO 8601 moeten worden omgezet
  Denk hierbij aan <EarliestExecutionDate fclt="translate">2020-10-01</EarliestExecutionDate>

*/
var xmlReq = styledRequestXML(API); // Deze eventuele stylesheet is hier onafhankelijk van het
                                    // aanvragende systeem (user_key) en niet direct zinvol (gebruik identity)

if (0)
xmlReq.loadXML(
  "<mareon>"
+ "  <uitvoerende>"
+ "	  <prs_bedrijf_key>2884</prs_bedrijf_key>"
+ "   <prs_bedrijf_naam>Test</prs_bedrijf_naam>"
+ "	  <prs_leverancier_nr>123456</prs_leverancier_nr>"
+ "	  <prs_bedrijf_key2>5678</prs_bedrijf_key2>"
+ "  </uitvoerende>"
+ "  <datum1 fclt_dateformat=\"ISO8601\">2020-10-21T12:01:00+02:00</datum1>"
+ "  <datum2 fclt_dateformat=\"ISO8601\">2020-10-21T12:02:00+02:00</datum2>"
+ "  <datum3 fclt_dateformat=\"localtime\">2020-10-21 12:03:00</datum3>"
+ "  <datum4 fclt_dateformat=\"localtime\">2020-10-21 12:04:00</datum4>"
+ "</mareon>"
);

function xmlNodeVal(xml, strQuery)
{
    var node = xml.selectSingleNode(strQuery);
    if (node)
        return node.text;
    else
        return null;
}

// Parse 2020-10-21 17:00:12 naar een Date object
function local_parsedate(str)
{
    var a;
    a = /^(\d{4})-(\d{2})-(\d{2})[ T](\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)$/.exec(str);
    if (a) {
        return new Date(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]);
    }
    return null;
};

function enhance_dates(xmlReq)
{
    var iso_nodes = xmlReq.selectNodes("//*[@fclt_dateformat='ISO8601']");
    var local_nodes = xmlReq.selectNodes("//*[@fclt_dateformat='localtime']");
    for (var i = 0; i < iso_nodes.length; i++)
    {
        var iso_node = iso_nodes.item(i);
        // isonode.tagName=="datum", .text='2020-10-21T12:03:00+0200'
        var dt = XMLtoJsDate(iso_node.text);
        var nodenew = xmlReq.createElement(iso_node.tagName);
        nodenew.setAttribute("fclt_dateformat", "localtime");
        nodenew.text = toISODateTimeString(dt); // merk op dat de functienaam misleidend is. 2020-10-21 17:05:00 is geen officieeel ISO formaat
        iso_node.parentNode.insertBefore(nodenew, iso_node);
    }
    if (API.apidata.loglevel)
        __Log2File(xmlReq.xml, "xml3");

    for (var i = 0; i < local_nodes.length; i++)
    {
        var local_node = local_nodes.item(i);
        // isonode.tagName=="datum", .text='2020-10-21 12:03:00'
        var dt = local_parsedate(local_node.text);
        var nodenew = xmlReq.createElement(local_node.tagName);
        nodenew.setAttribute("fclt_dateformat", "ISO8601");
        nodenew.text = dt.toJSON();
        local_node.parentNode.insertBefore(nodenew, local_node);
    }
    if (API.apidata.loglevel)
        __Log2File(xmlReq.xml, "xml4");
}
    var self_bedrijf_key = user.afdeling().prs_bedrijf_key();
    var uitvoerende_key = null;
    var bedrijf_key_text = xmlNodeVal(xmlReq, "//mareon/uitvoerende/prs_bedrijf_key");
    var bedrijf_naam_text = xmlNodeVal(xmlReq, "//mareon/uitvoerende/prs_bedrijf_naam");
    var leverancier_nr_text = xmlNodeVal(xmlReq, "//mareon/uitvoerende/prs_leverancier_nr");
    var prs_bedrijf_externid2_text = xmlNodeVal(xmlReq, "//mareon/uitvoerende/prs_bedrijf_externid2");
    if (bedrijf_key_text)
    {
        uitvoerende_key = parseInt(bedrijf_key_text, 10);
    }
    if (!uitvoerende_key && bedrijf_naam_text)
    {
        var sql = "SELECT prs_bedrijf_key"
                + " FROM prs_bedrijf"
                + " WHERE prs_bedrijf_verwijder IS NULL"
                + " AND prs_bedrijf_naam_upper = " + safe.quoted_sql(bedrijf_naam_text.toUpperCase());
        var oRs = Oracle.Execute(sql);
        if (!oRs.eof)
        {
            uitvoerende_key = oRs("prs_bedrijf_key").Value;
        }
        oRs.close();
    }
    if (!uitvoerende_key && leverancier_nr_text)
    {
        var sql = "SELECT prs_bedrijf_key"
                + " FROM prs_bedrijf"
                + " WHERE prs_bedrijf_verwijder IS NULL"
                + " AND prs_leverancier_nr = " + safe.quoted_sql(leverancier_nr_text);
        var oRs = Oracle.Execute(sql);
        if (!oRs.eof)
        {
            uitvoerende_key = oRs("prs_bedrijf_key").Value;
        }
        oRs.close();
    }
    if (!uitvoerende_key && prs_bedrijf_externid2_text)
    {
        var sql = "SELECT prs_bedrijf_key2"
                + " FROM prs_bedrijf_bedrijf"
                + " WHERE prs_bedrijf_externid2 = " + safe.quoted_sql(prs_bedrijf_externid2_text)
                + " AND prs_bedrijf_key1 = " + self_bedrijf_key;
        var oRs = Oracle.Execute(sql);
        if (!oRs.eof)
        {
            uitvoerende_key = oRs("prs_bedrijf_key2").Value;
        }
        oRs.close();
    }
    var bedrijf_bedrijf_xml = "";
    if (uitvoerende_key)
    {
        var sql = "SELECT *"
                + " FROM prs_bedrijf_bedrijf"
                + " WHERE prs_bedrijf_key2 = " + uitvoerende_key
                + " AND prs_bedrijf_key1 = " + self_bedrijf_key;
        var oRs = Oracle.Execute(sql);
        if (!oRs.eof)
        {
            bedrijf_bedrijf_xml = "<bedrijf_bedrijf>"
                                + " <PRS_BEDRIJF_BEDRIJF_KEY>" + oRs("PRS_BEDRIJF_BEDRIJF_KEY").Value + "</PRS_BEDRIJF_BEDRIJF_KEY>"
                                + " <PRS_BEDRIJF_KEY1>" + oRs("PRS_BEDRIJF_KEY1").Value + "</PRS_BEDRIJF_KEY1>"
                                + " <PRS_BEDRIJF_EXTERNID1>" + safe.html(oRs("PRS_BEDRIJF_EXTERNID1").Value) + "</PRS_BEDRIJF_EXTERNID1>"
                                + " <PRS_BEDRIJF_KEY2>" + oRs("PRS_BEDRIJF_KEY2").Value + "</PRS_BEDRIJF_KEY2>"
                                + " <PRS_BEDRIJF_EXTERNID2>" + safe.html(oRs("PRS_BEDRIJF_EXTERNID2").Value) + "</PRS_BEDRIJF_EXTERNID2>"
                                + " <PRS_BEDRIJF_BEDRIJF_STARTDATUM>" + oRs("PRS_BEDRIJF_BEDRIJF_STARTDATUM").Value + "</PRS_BEDRIJF_BEDRIJF_STARTDATUM>"
                                + " <PRS_BEDRIJF_BEDRIJF_EINDDATUM>" + oRs("PRS_BEDRIJF_BEDRIJF_EINDDATUM").Value + "</PRS_BEDRIJF_BEDRIJF_EINDDATUM>"
                                + " <PRS_BEDRIJF_BEDRIJF_STATUS>" + oRs("PRS_BEDRIJF_BEDRIJF_STATUS").Value + "</PRS_BEDRIJF_BEDRIJF_STATUS>"
                                + " <PRS_BEDRIJF_BEDRIJF_CHARGED>" + oRs("PRS_BEDRIJF_BEDRIJF_CHARGED").Value + "</PRS_BEDRIJF_BEDRIJF_CHARGED>"
                                + " <PRS_BEDRIJF_BEDRIJF_CHARGEMODE>" + oRs("PRS_BEDRIJF_BEDRIJF_CHARGEMODE").Value + "</PRS_BEDRIJF_BEDRIJF_CHARGEMODE>"
                                + " <PRS_BEDRIJF_BEDRIJF_FEE1>" + oRs("PRS_BEDRIJF_BEDRIJF_FEE1").Value + "</PRS_BEDRIJF_BEDRIJF_FEE1>"
                                + " <PRS_BEDRIJF_BEDRIJF_FEE2>" + oRs("PRS_BEDRIJF_BEDRIJF_FEE2").Value + "</PRS_BEDRIJF_BEDRIJF_FEE2>"
                                + " <PRS_BEDRIJF_BEDRIJF_FEE3>" + oRs("PRS_BEDRIJF_BEDRIJF_FEE3").Value + "</PRS_BEDRIJF_BEDRIJF_FEE3>"
                                + " <FIN_BTWTABELWAARDE_KEY>" + oRs("FIN_BTWTABELWAARDE_KEY").Value + "</FIN_BTWTABELWAARDE_KEY>"
                                + " <PRS_BEDRIJF_BEDRIJF_G_PCT>" + oRs("PRS_BEDRIJF_BEDRIJF_G_PCT").Value + "</PRS_BEDRIJF_BEDRIJF_G_PCT>"
                                + "</bedrijf_bedrijf>";
        }
        oRs.close();
    }
    
    
    var expertise_vertaling_xml = "";
    // Fetch expertise code van een opdrachtgever en de code die bij leverancier hiervoor staat (bekend is).
    var sql = "SELECT SUBSTR(fac_usrdata_upper, INSTR(fac_usrdata_upper,'|')+1) code_opdrachtgever, fac_usrdata_omschr code_opdrachtnemer"
            + " FROM fac_usrdata"
            + " WHERE fac_usrtab_key = 8" 
            + " AND fac_usrdata_upper like '" + uitvoerende_key + "|%'"
            + " AND fac_usrdata_verwijder IS NULL";
    var oRs = Oracle.Execute(sql);
    while (!oRs.eof)
    {
        expertise_vertaling_xml = "<expertise>"
                            + " <expertise_opdrachtgever>" + oRs("code_opdrachtgever").Value + "</expertise_opdrachtgever>"
                            + " <expertise_opdrachtnemer>" + oRs("code_opdrachtnemer").Value + "</expertise_opdrachtnemer>"
                            + "</expertise>";
        oRs.MoveNext();
    }
    oRs.close();
    if (expertise_vertaling_xml)
    {
      expertise_vertaling_xml = "<marx_expertise_vertaaltabel>" + expertise_vertaling_xml + "</marx_expertise_vertaaltabel>"
    }

    function enrichXml(xmlReq) {
        var sql_params = "'bedrijf', " + uitvoerende_key + " , "
                    + safe.quoted_sql(customerId)
                    + ", '$AspSession$', NULL, ''";
        var sql = "SELECT xml.make_xml2(" + sql_params + ") xml_blob FROM dual";
        var oRs = Oracle.Execute(sql);
        var xml_content = oRs("xml_blob").Value;
        oRs.Close();
        //__Log2File(xml_content, "xml")
        var XMLbedrijf = new ActiveXObject("Msxml2.DOMDocument.6.0");
        XMLbedrijf.loadXML(xml_content);

        var bedrijf_node = xmlReq.selectSingleNode("//mareon/uitvoerende");
        bedrijf_node.appendChild(XMLbedrijf.documentElement); // of firstChild?
        if (API.apidata.loglevel)
            __Log2File(xmlReq.xml, "xml2");


        var nodenew = xmlReq.createElement("zelf");
        var sql_params = "'perslid', " + user_key + " , "
                    + safe.quoted_sql(customerId)
                    + ", '$AspSession$', NULL, ''";
        var sql = "SELECT xml.make_xml2(" + sql_params + ") xml_blob FROM dual";
        var oRs = Oracle.Execute(sql);
        var xml_content = oRs("xml_blob").Value;
        oRs.Close();
        //__Log2File(xml_content, "xml")
        var XMLbedrijf = new ActiveXObject("Msxml2.DOMDocument.6.0");
        XMLbedrijf.loadXML(xml_content);
        nodenew.appendChild(XMLbedrijf.documentElement);

        var bedrijf_node = xmlReq.selectSingleNode("//mareon");
        bedrijf_node.appendChild(nodenew); // of firstChild?
        // enrich <mareon> with bedrijf_bedrijf info
        if (bedrijf_bedrijf_xml)
        {
            var bedrijf_node = xmlReq.selectSingleNode("//mareon");
            var XMLbedrijf = new ActiveXObject("Msxml2.DOMDocument.6.0");
            XMLbedrijf.loadXML(bedrijf_bedrijf_xml);
            bedrijf_node.appendChild(XMLbedrijf.documentElement);
        }
        var xml_id = shared.random(32);
        var XML_node_id = new ActiveXObject("Msxml2.DOMDocument.6.0");
        XML_node_id.loadXML("<xml_id>" + xml_id + "</xml_id>");
        bedrijf_node.appendChild(XML_node_id.documentElement);
        
        if (expertise_vertaling_xml)
        {
          var XML_node_expertise = new ActiveXObject("Msxml2.DOMDocument.6.0");
          XML_node_expertise.loadXML(expertise_vertaling_xml);
          bedrijf_node.appendChild(XML_node_expertise.documentElement);
        }

        if (API.apidata.loglevel)
            __Log2File(xmlReq.xml, "xml2b");
    }

    enrichXml(xmlReq);
    enhance_dates(xmlReq);

/*
  Nu verrijken we deze XML nog met een node <facilitor> (op dezelfde nivo als node mareon, direct onder de root “mareon_prefase_planrequest”?
  Met daarin zoals besproken
  - de header-node (met sysdate, systime etc etc),
  - de complete bedrijf-node van woco (obv apikey of user_key),
  - de bedrijf-node van aannemer (zie punt 1),
        met daarin de node van technisch adres van aannemer (type = voorraad) voor het wachtwoord?
*/
// TODO: target adres en stylesheet achterhalen
// TODO: authenticatie voor de target?

var result = putorders.send_planrequest(uitvoerende_key, xmlReq);


if (result)
{
    if (!result.response)
    {
        API.error("Error in putorders.send_planrequest: " + result.errtext); // Zie ook putorders logging voor de foutmelding
    }

     var xmldoc = new ActiveXObject("Msxml2.DOMDocument.6.0");
     xmldoc.async = false;
     xmldoc.loadXML(result.response);
     if (xmldoc.parseError.errorCode != 0)
     {
        var myErr = xmldoc.parseError;
        __Log("XML2STR3 Error in xmlfile: " + myErr.reason);
        Response.Write ("<html><body><b>Error in xmlfile:</b><br>" + safe.html(myErr.reason) + "</body></html>");
        Response.End;
     }
     enrichXml(xmldoc);
     enhance_dates(xmldoc);

    Response.ContentType = "application/soap+xml";
    if (API.apidata.stylesheet)
    {
      // Niet super efficient dat we eerst naar tekstuele xml gaan maar ach...
      STR2Stream(xmldoc.xml, API.apidata.stylesheet, Response, {});
    }
    else
    {
      Response.Write(xmldoc.xml);
    }
}
else
    API.error("Could not send planrequest");

ASPPAGE_END();
%>
