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

     File:              API_mareon_opdracht.asp
     Description:       API om (bekend formaat) opdracht (T365, SALES005, REMS, FCLT) te verwerken en realtime / direct te versturen

     Parameters:        Een xml
     Status:
     Context:           Initiele opdracht (1) OF geupdate (meerwerk)opdracht (2) OF statusupdate ANN (3) van opdrachtgever naar opdrachtnemer.
     Notes:
*/
    DOCTYPE_Disable = 1;
    THIS_FILE = "appl/marx/API_mareon_opdracht.asp";
%>
<!-- #include file="../../appl/Shared/common.inc" -->
<!-- #include file="../Shared/xml_converter.inc" -->
<!-- #include file="../api/api.inc" -->
<!-- #include file="../shared/putorders.inc" -->
<!-- #include file="../MARX/UploadBijlage.inc" -->
<!-- #include file="../../appl/api/api_gen_import.inc" -->
<!-- #include file="../MARX/API_mareon.inc" -->
<script language="javascript" src="../imp/imp_shared.js" runat="server"></script>
<%
Session.Codepage = 65001;
Response.Charset = 'utf-8';

var contenttype = getQParam("contenttype", "text/xml"); // of "application/soap+xml"

function marx_get_mld_opdr_key (p_xml)
{ var l_mld_opdr_key;
  var l_xml_query = "//mld_opdr_key";
  var l_mld_opdr_key = xmlNodeVal(p_xml, l_xml_query);
  return (l_mld_opdr_key);
}




function api_F_PutOpdr_Bijlage(p_mld_opdr_key, p_bestandsnaam, p_bijlage_base64, p_kenmerk_key)
{
  __Log("Start api_F_PutOpdr_Bijlage: ");

  var l_module = "MLD";
  var l_niveau = "O";
  marx_upload_bijlage(l_module, p_mld_opdr_key, p_kenmerk_key, l_niveau, p_bestandsnaam, p_bijlage_base64);
}


function marx_upload_rems_bijlages (p_mld_opdr_key, p_xml){
  marx_upload_bijlages(p_mld_opdr_key, p_xml,"Document", "MediaId", "MediaType", "DocumentInhoud", 10, "ByTagName", null);
}

function marx_upload_fclt_bijlages (p_mld_opdr_key, p_xml){
  marx_upload_bijlages(p_mld_opdr_key, p_xml,"TMP_Attachment", "name", "idontexist", "attachment", 10, "ByTagName", null);
}

function marx_upload_sales005_bijlages (p_mld_opdr_key, p_xml){
  marx_upload_bijlages(p_mld_opdr_key, p_xml, "//sales005m:Attachment", "sales005m:FileName", "sales005m:FileType", "sales005m:AttachedData", 10, "BySelectNodes", "xmlns:sales005m='http://www.ketenstandaard.nl/onderhoudsopdracht/SALES/005'");
}


// p_xmlfetch_method = ByTagName or BySelectNodes
function marx_upload_bijlages (p_mld_opdr_key, p_xml, p_root_nodenaam, p_filenaam_nodenaam, p_filetype_nodenaam, p_base64_nodenaam, p_max_uploads, p_xmlfetch_method, p_namespace)
{
  // Kenmerk-key in Mareon waarin de bijlagen terecht moet komen is key 20
  var l_kenmerk_key = 20;

  if (p_namespace)
  {
    p_xml.setProperty ("SelectionNamespaces", p_namespace);
  }
  if (p_mld_opdr_key)
  {
    if (p_xmlfetch_method == "ByTagName")
    {
      var nodes_doc = p_xml.getElementsByTagName(p_root_nodenaam);
      __Log("# Document nodes : " + nodes_doc.length);
      if (nodes_doc.length > 0)
      {
        for (i = 0; i < nodes_doc.length; i++) {
            var l_bestandsnaam = null;
            var l_bijlage_naam = null;
            var l_bijlage_ext = null;
            var l_bijlage_base64 = null;

            var node_media_id = nodes_doc[i].getElementsByTagName(p_filenaam_nodenaam);
            if (node_media_id.length !=0){
                l_temp_node = node_media_id[0].childNodes[0];
                if (l_temp_node){
                  l_bijlage_naam = node_media_id[0].childNodes[0].nodeValue;
                  __Log("l_bijlage_naam[" + i + "] : " + l_bijlage_naam);
                  l_bestandsnaam = l_bijlage_naam;
                }
            }


            var node_media_type = nodes_doc[i].getElementsByTagName(p_filetype_nodenaam);
            if (node_media_type.length !=0){
                l_temp_node = node_media_type[0].childNodes[0];
                if (l_temp_node){
                  l_bijlage_ext= node_media_type[0].childNodes[0].nodeValue;
                  __Log("p_filetype_nodenaam[" + i + "] : " + l_bijlage_ext);
                  l_bestandsnaam = l_bestandsnaam + "." + l_bijlage_ext;
                }
            }


            var node_documentinhoud64 = nodes_doc[i].getElementsByTagName(p_base64_nodenaam);
            if (node_documentinhoud64.length !=0){
                l_temp_node = node_documentinhoud64[0].childNodes[0];
                if (l_temp_node){
                  l_bijlage_base64 = node_documentinhoud64[0].childNodes[0].nodeValue;
                  if (l_bijlage_base64){
                    __Log("l_bijlage_base64[" + i + "] : " + l_bijlage_base64.substr(0,100));
                  }
                }
            }


            // We staan een maximum aantal bijlages per opdracht toe.
            if (i <= p_max_uploads && l_bijlage_base64 && l_bestandsnaam){
                __Log("l_bestandsnaam[" + i + "] : " + l_bestandsnaam);
                api_F_PutOpdr_Bijlage(l_mld_opdr_key, l_bestandsnaam, l_bijlage_base64, l_kenmerk_key);
            }
        }
      }
    }
    else
    {
      if (p_xmlfetch_method == "BySelectNodes")
      {
        // Method = BySelectNodes
        var l_added = 0;
        var Attachments = p_xml.selectNodes(p_root_nodenaam);
        for (var i=0; i < Attachments.length; i++)
        {
          var Attachments_filename = Attachments[i].selectNodes(p_filenaam_nodenaam);
          var Attachments_base64 = Attachments[i].selectNodes(p_base64_nodenaam);

          __Log ("Attachments_base64.length:" + Attachments_base64.length)

          for (var j=0; j < Attachments_base64.length; j++)
          {
            var l_filenaam_node = Attachments_filename[j];
            var l_base64_node = Attachments_base64[j];

            //var l_filenaam_node = Attachments_filename[i];
            //var l_base64_node = Attachments_base64[i];

            if (l_added <= p_max_uploads && l_filenaam_node && l_base64_node)
            {

              l_bestandsnaam = l_filenaam_node.text;
              l_bijlage_base64 = l_base64_node.text;
              __Log("l_bestandsnaam[" + i + "] : " + l_bestandsnaam);
              if (l_bijlage_base64){
                __Log("l_bijlage_base64[" + i + "] : " + l_bijlage_base64.substr(0,100));
              }
              api_F_PutOpdr_Bijlage(l_mld_opdr_key, l_bestandsnaam, l_bijlage_base64, l_kenmerk_key);
              l_added = l_added + 1;
            }
          }
        }
      }
    }
  }
}




// p_ms_namespace_url = endpoint oftewel de url van de specifieke namespace van de messageservice, b.v. "https://www.ketenstandaard.nl/WS/MessageService/3.1"
// p_ms_contentnode = naam van de XML node waar zich de plain-XML oftewel de daadwerkelijke inhoud zich bevindt, b.v. "MsgContent".

function marx_get_plainxml_of_messageservice(p_xml, p_ms_namespace_url, p_ms_contentnode)
{
  var l_cdata_node;
  var l_xml_result;

  p_xml.setProperty ("SelectionNamespaces", "xmlns:mes='" + p_ms_namespace_url + "'");
  if (xmlNodeVal(p_xml, "//mes:" + p_ms_contentnode)){
    // MessageService bericht
    var l_cdata_node = p_xml.selectSingleNode("//mes:" + p_ms_contentnode);
    if (l_cdata_node)
    {
      __Log("Cdata found: " + l_cdata_node.text);
      var l_xml_result = new ActiveXObject("Msxml2.DOMDocument.6.0");
      l_xml_result.loadXML("" + l_cdata_node.text.replace(/^\n*/, '')); // Leading \n er af voor als er een xml-declaratie vooraan staat.
    }
  }
  return l_xml_result;
}

// ***************************** START START START ****************************************


var API = new API_func();
var xmlReq = styledRequestXML(API); // originele XML die we binnenkrijgen

var xmlReq_org = new ActiveXObject("Msxml2.DOMDocument.6.0");
xmlReq_org.loadXML(xmlReq.xml);



var v_API_org = API.APIname;
var v_API;

switch (v_API_org)
  {
    case "FCLT_OPDRACHT":                   { v_API = "FCLT_OPDRACHT_IMPORT"; break;}
    case "REMS_OPDRACHT":                   { v_API = "REMS_OPDRACHT_IMPORT"; break;}
    case "TWINQ_OPDRACHT":                  { v_API = "TWINQ_OPDRACHT_IMPORT"; break;}
    case "MLD_OPDRACHT_SALES005_1.0":       { v_API = "MLD_OPDRACHT_SALES005_1.0_IMPORT"; break;}
    case "MLD_OPDRACHT_SALES005_MS31_1.0":  { v_API = "MLD_OPDRACHT_SALES005_1.0_IMPORT"; xmlReq = marx_get_plainxml_of_messageservice(xmlReq, "https://www.ketenstandaard.nl/WS/MessageService/3.1", "MsgContent"); break;}
    case "AX_PUSH_OPDR":                    { v_API = "AX_PUSH_OPDR_IMPORT"; break;}
  }

__Log("v_API:" + v_API);

if (!v_API)
{
  if (xmlNodeVal(xmlReq, "//mld_opdr/mld_opdr_externnr")){
    // FCLT OPDRACHTBERICHT
    var v_API = "FCLT_OPDRACHT_IMPORT";
  }
  if (xmlNodeVal(xmlReq, "//ServiceOpdracht/_OpdrachtUitvoerder/Opdracht/Opdrachtnummer")){
    // FCLT OPDRACHTBERICHT
    var v_API = "REMS_OPDRACHT_IMPORT";
  }

  var l_plainxml;
  if (!l_plainxml) var l_plainxml = marx_get_plainxml_of_messageservice(xmlReq, "https://www.ketenstandaard.nl/WS/MessageService/3.1", "MsgContent");
  if (!l_plainxml) var l_plainxml = marx_get_plainxml_of_messageservice(xmlReq, "https://www.ketenstandaard.nl/WS/MessageService/3.0", "MsgContent");
  if (!l_plainxml) var l_plainxml = marx_get_plainxml_of_messageservice(xmlReq, "https://www.ketenstandaard.nl/WS/MessageService/2.4", "MsgContent");
  if (l_plainxml) xmlReq = l_plainxml;

  xmlReq.setProperty ("SelectionNamespaces", "xmlns:sales005m='http://www.ketenstandaard.nl/onderhoudsopdracht/SALES/005'");
  if (xmlNodeVal(xmlReq, "//sales005m:MaintenanceInstruction")){
    // SALES005 1.0 OPDRACHTBERICHT
    var v_API = "MLD_OPDRACHT_SALES005_1.0_IMPORT";
    //switch (l_mes)
    //{
    //  case "3.1": { v_API = "MLD_OPDRACHT_SALES005_MS31_1.0"; break;}
    //}
  }

  xmlReq.setProperty ("SelectionNamespaces", "xmlns:sales005s='http://www.ketenstandaard.nl/onderhoudsstatus/SALES/005'");
  if (xmlNodeVal(xmlReq, "//sales005s:MaintenanceStatus")){
    // SALES005 1.0 STATUSBERICHT
    var v_API = "MLD_OPDRACHT_SALES005_1.0_IMPORT";
    //switch (l_mes)
    //{
    //  case "3.1": { v_API = "MLD_OPDRACHT_SALES005_MS31_1.0"; break;}
    //}
  }
  xmlReq.setProperty ("SelectionNamespaces", "xmlns:t365='http://schemas.datacontract.org/2004/07/SG.Services.Repositories'");
  if (xmlNodeVal(xmlReq, "//t365:SupplierTaskSpec")){
  // TOBIAS OPDRACHTBERICHT
    var v_API = "AX_PUSH_OPDR_IMPORT";
  }
}

// Mogelijke waarden van v_API :
// FCLT_OPDRACHT_IMPORT
// REMS_OPDRACHT_IMPORT
// TWINQ_OPDRACHT_IMPORT
// MLD_OPDRACHT_SALES005_1.0_IMPORT
// AX_PUSH_OPDR_IMPORT

if (v_API)
{

  var API_imp = new API_func(v_API);
  // utf-8 moet als parameter mee, b.v. een €-teken in een omschrijving van de XML zorgt ervoor dat de XML ongeldig wordt...
  var resultdata = api_gen_import(API_imp, xmlReq.xml, "utf-8");
  var result = resultdata.xmldom;

  if (API.apidata.errorhandling == 1 && user.errorhandling() == 1)
  {
      if (resultdata.anyError) // een 'E' in imp_log
      {
          Response.Status = '400 Bad Request';
      }
  }

  __Log("result:" + result.xml);
  if (result)
  {

    // Fetch eerst indien alles gelukt is (dwz opdracht aangemaakt of gewijzigd), de mld_opdr_key, die hebben we eerst nodig....
    var l_mld_opdr_key = marx_get_mld_opdr_key (result);
    __Log("l_mld_opdr_key:" + l_mld_opdr_key);

    var xmldoc = new ActiveXObject("Msxml2.DOMDocument.6.0");
    xmldoc.async = false;
    xmldoc.loadXML(result.xml);
    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;
    }

    __Log("xmldoc.xml:" + xmldoc.xml);
    Response.ContentType = contenttype; // default text/xml
    if (API.apidata.stylesheet_out)
    {
      // Niet super efficient dat we eerst naar tekstuele xml gaan maar ach...
      STR2Stream(xmldoc.xml, API.apidata.stylesheet_out, Response, {});
    }
    else
    {
      Response.Write(xmldoc.xml);
    }
    if (l_mld_opdr_key > 0)
    {
      // Nu eerst nog bijlages uploaden bij de opdracht...
      switch (v_API)
      {
        case "FCLT_OPDRACHT_IMPORT":                   { marx_upload_fclt_bijlages(l_mld_opdr_key, xmlReq) ; break; }
        case "REMS_OPDRACHT_IMPORT":                   { marx_upload_rems_bijlages(l_mld_opdr_key, xmlReq) ; break; }
        case "TWINQ_OPDRACHT_IMPORT":                  { marx_upload_sales005_bijlages(l_mld_opdr_key, xmlReq) ; break; }
        case "MLD_OPDRACHT_SALES005_1.0_IMPORT":       { marx_upload_sales005_bijlages(l_mld_opdr_key, xmlReq) ; break; }
      }

      // Als deze variabele true (1) wordt, dan overruled deze ALLES en wordt immediate puo geskipped.
      var l_puo_skip_immediate = 0;
      if (v_API == "AX_PUSH_OPDR_IMPORT")
      { // DEEL A uit MARX#81805 Bijlagen in ORG opdracht / (near)realtime opdrachten vanuit Tobias (365)
        // ALs er bijlagen bij de T365 opdracht zitten (of het veld is onbekend/nog niet meegestuurd ivm oude T365 versie), dan moeten we geen immediate putorders doen, dus skippen
        l_puo_skip_immediate = xmlNodeVal_NS_default(xmlReq, "xmlns:b='http://schemas.datacontract.org/2004/07/SG.Services.Repositories'", "//b:numberOfAttachments", 1);
        __Log("l_puo_skip_immediate: " + l_puo_skip_immediate);
      }

      // Oke, LAATSTE STAP nog: nu gaan we als teverzenden staat ingevuld, de opdracht direct PUSHen via putorders.

      // 2025.1:
      // De opdracht is in PROCEDURE mar_update_gen_opdrachten aangemaakt (of bijgewerkt)
      // Dat aanmaken is direct met status 5 ('uitgegeven') gedaan
      // Daarna is er tracking van #ORDNEW of #ORDUPD gedaan. Door het hekje is er *nog niets genotificeerd*.
      // De PROCEDURE mar_post_opdr_putorders heeft eventueel al mld_opdr_teverzenden op 2 gezet
      // Daarmee is er een ORDUPD (nooit ORDNEW!!!!) notificatie aangemaakt.
      // Zoek die notificatie op en zet de notbefore op 5 seconde (als het immediate mag) of 30 seconden (als Tobias365 nog bijlagen toevoegt)
      var delay = 5; // generiek maar kan kleiner zijn dan setting S(noti_delay_mode)
      if (l_puo_skip_immediate != 0)
      {
        delay = 30; // seconde waarin Tobias nog de bijlagen er bij mag zetten
      }
      marx_force_putorders (l_mld_opdr_key, delay)
    }
  }
  else
  {
    API.error("Could not send " + v_API);
  }
}
else
{
  API.error("Unknown/empty API: " + v_API);
}

ASPPAGE_END();
%>
