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

     File:              api_bes_soap.asp
     Description:       API voor bes-soap berichten (bestelAANVRAGEN)
                        Interpreteert bericht zodanig dat een bestelaanvraag wordt aangemaakt/aangepast.

     Parameters:        Een xml
     Status:            Eerste implementatie in kader FSN#26296 (tbv Corsa/BCT)
     Context:
     Notes:
*/
    DOCTYPE_Disable = 1;
    THIS_FILE = "appl/api/api_bessoap.asp";
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/xml_converter.inc" -->
<!-- #include file="../Shared/save2db.inc" -->
<!-- #include file="../Shared/flexfiles.inc" -->
<!-- #include file="../Shared/upload.inc" -->
<!-- #include file="../api/api.inc" -->
<!-- #include file="../shared/kpl_ksrt_validate.inc" -->
<!-- #include file="../bes/bes.inc" -->
<%
    // We sturen het antwoord in UTF-8.
    Session.Codepage = 65001;
    Response.Charset = 'utf-8';

    var API = new API_func();
    var tsql = "-";        // Voor tijdelijke statement(s)
    var sql = "-";         // De uiteindelijke insert/update-sql
    var xmlReq = Server.CreateObject("MSXML2.DOMDocument.6.0");
    if (API.apidata.stylesheet)
    {
        var iXsl = Server.CreateObject("MSXML2.DOMDocument.6.0");
        if( ! iXsl.load(Server.MapPath(API.apidata.stylesheet)) )
        {
            API.error("Could not load XSL " + API.apidata.stylesheet + "\n" + iXsl.parseError.reason);
        }
        var inputXML = Server.CreateObject("MSXML2.DOMDocument.6.0");
        inputXML.load(Request);
        inputXML.transformNodeToObject(iXsl, xmlReq);
    }
    else
        xmlReq.load(Request);

    var xmlResp = new ActiveXObject("MSXML2.DOMDocument.6.0");
    xmlResp.appendChild(xmlResp.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"utf-8\""))

    // The response.
    var FCLTElement = xmlResp.createElement("facilitor");
    // The response header.
    var now = new Date();
    var nowtxt = now.getFullYear()+'-'+padout(now.getMonth()+1) +'-'+padout(now.getDate()) +' '
                           +padout(now.getHours()) +':'+padout(now.getMinutes())+':'+padout(now.getSeconds());
    var FCLTHeader = xmlResp.createElement("header");
    var headerinfo = {
//                      file: String(Request.ServerVariables("SCRIPT_NAME")).toLowerCase(),
                      datum: nowtxt,
                      naam: user.naam(),
                      custId: customerId,
                      language: user.lang()
                     }
    for (param in headerinfo)
    {
        var FCLTdata = xmlResp.createElement(param);
        FCLTdata.appendChild(xmlResp.createTextNode(headerinfo[param]));
        FCLTHeader.appendChild(FCLTdata);
    }
    FCLTElement.appendChild(FCLTHeader);

   // Hier zou het echte werk moeten gebeuren nav. xmlReq
   // en FCLTElement moeten we uitbreiden met antwoorden.
   var detected ="?";
//   xmlReq.setProperty("SelectionLanguage", "XPath");   // Weet niet of noodzakelijk

   // Dit is de bestellingenloop (mochten er ooit nog anderen gaan volgen).
   var bestellingen = xmlReq.getElementsByTagName("bestelling");
   for (i=0; i < bestellingen.length; i++)
   {
      var resultcode = -1;   /* Zolang deze -1 is, is het nog goed. Uiteindelijk eindigt het met 0 (als goed). */
      var resulttekst = "";

      // Lees per node de (optionele) tags en waarden.
      var fields = []; // Bij te werken velden.
      var besid         = bestellingen[i].getAttribute("key"); // Bij type=update/delete
      var besaction     = bestellingen[i].getAttribute("type").toLowerCase();
      var nwStatus      = XMLval(bestellingen[i], "status");

      if (besid == null) { // Voorkom problemen als key-attribuut ontbreekt!
       besid = '';
      }
      var bestelling_key   = parseInt(besid, 10); // En anders bepaald bij insert!

      user.checkAutorisation("WEB_BESUSE"); // Dit is nog ongeacht de reservering

      if (besaction == 'insert') {
         resultcode = 999;
         resulttekst = "Insert unsupported";
      }
      else if (besaction == 'update')
      {
         if (besid == '') {
            resultcode = 2;
            resulttekst = "Undefined bestelling (key)";
         }
         else if (isNaN (bestelling_key)) {
            resultcode = 2;
            resulttekst = "Invalid bestelling (key) "+besid;
         }
         else {
            tsql = "SELECT bes_bestelling_key"
                 + "  FROM bes_bestelling"
                 + " WHERE bes_bestelling_key="+bestelling_key
                 + "   AND 1=1"; // Niet verwijderd, ...???
            var toRs = Oracle.Execute(tsql);
            if (!toRs.eof) {
               // Hier heb ik een geldige bes_bestelling_key.
               bes_bestelling_key = toRs("bes_bestelling_key").value;

               var bes_info = bes.bestelling_info(bes_bestelling_key); // Globale variabele met alle bes_bestelling informatie
          	   var this_bes = bes.func_enabled_bestelling(bes_info); // Wat heb ik zoal aan rechten op deze specifieke reservering
          	   if(!this_bes.canChange) {
                  resultcode = 9;
                  resulttekst = "Niet geautoriseerd voor bestelling "+besid;
               }
               else {
             	   if (nwStatus != null) { // Bij update optioneel
                     // statusdiagram afdwingen:
                     // * BESFIT alleen vanuit status 2
                     // * BESREJ alleen vanuit status 2 en 3
                     sql = "SELECT bes_bestelling_status"
                         + "  FROM bes_bestelling"
                         + " WHERE bes_bestelling_key="+bestelling_key;
                     var oRs = Oracle.Execute(sql);
                     if (!oRs.eof) {
                        curStatus = oRs("bes_bestelling_status").value;

                        // Feitelijke UPDATE status.
                        // BESFIT: alleen vanuit status 2
                        if (nwStatus == "BESFIT") {
                           if (curStatus == 2) {
                              bes.setbestellingstatus(bes_bestelling_key, 3);  // Gefiatteerd
                              sql = "SELECT bes_bestelling_status"
                                  + "  FROM bes_bestelling"
                                  + " WHERE bes_bestelling_key="+bestelling_key;
                              var oRs = Oracle.Execute(sql);
                              if (!oRs.eof) {
                                 var bes_status = oRs("bes_bestelling_status").value;
                                 if (bes_status == 3) {
                                    resulttekst = "Bestelling "+bes_bestelling_key+" gefiatteerd";
                                    resultcode = 0;
                                 }
                                 else {
                                    resulttekst = "Bestelling "+bes_bestelling_key+" niet gefiatteerd";
                                    resultcode = 308;
                                 }
                              }
                              else {
                                 resulttekst = "Fout bij ophalen nieuwe status";
                                 resultcode = 307;
                              }
                           }
                           else if (curStatus == 3) {
                              resulttekst = "Bestelling "+bes_bestelling_key+" is al gefiatteerd";
                              resultcode = 306;
                           }
                           else {
                              resulttekst = "Kan niet fiatteren; ongeldige beginstatus";
                              resultcode = 305;
                           }
                        }
                        // BESREJ: alleen vanuit status 2 en 3
                        else if (nwStatus == "BESREJ") {
                           if (curStatus == 2 || curStatus == 3) {
                              bes.setbestellingstatus(bes_bestelling_key, 1);  // Afgewezen
                              sql = "SELECT bes_bestelling_status"
                                  + "  FROM bes_bestelling"
                                  + " WHERE bes_bestelling_key="+bestelling_key;
                              var oRs = Oracle.Execute(sql);
                              if (!oRs.eof) {
                                 var bes_status = oRs("bes_bestelling_status").value;
                                 if (bes_status == 1) {
                                    resulttekst = "Bestelling "+bes_bestelling_key+" afgewezen";
                                    resultcode = 0;
                                 } else {
                                    resulttekst = "Bestelling "+bes_bestelling_key+" niet afgewezen";
                                    resultcode = 108;
                                 }
                              } else {
                                 resulttekst = "Fout bij ophalen nieuwe status";
                                 resultcode = 107;
                              }
                           }
                           else if (curStatus == 1) {
                              resulttekst = "Bestelling "+bes_bestelling_key+" is al afgewezen";
                              resultcode = 106;
                           }
                           else {
                              resulttekst = "Kan niet afwijzen; ongeldige beginstatus";
                              resultcode = 105;
                           }
                        }
                        else {
                           resultcode = 3;
                           resulttekst = "Ongeldige status "+nwStatus;
                        }

                     } else {
                        resultcode = 4;
                        resulttekst = "Ongedefinieerde huidige status";
                     }
                  } // nwStatus != null

                  if (resultcode == -1) { // nog steeds geen fouten
                     resultcode = 0; // Ik heb gedaan wat ik moest en mocht doen voor deze bestelling.
                  }
               }
////////////////////////////////////////////////////////////////////////////////
          	} else {
              resultcode = 5;
              resulttekst = "Not updatable bestelling "+besid;
          	}
          	toRs.Close();
          }
      }
      else if (besaction == 'delete')
      {
         resultcode = 999;
         resulttekst = "Delete unsupported";
      }
      else {
         resultcode = 2;
         resulttekst = "Undefined operation (type)";
      }

      var binfo = {
                  returncode: resultcode,
                  returntekst: resulttekst,
                  // executed:sql, // debug
                  datum: nowtxt, // TODO: Beter ook xml-datum???
                  besid: besid
                  }

      var FCLTBody = xmlResp.createElement("bestelling");   // type=response
      FCLTBody.setAttribute('key', besid);
      FCLTBody.setAttribute('type', 'response');
      for (param in binfo)
      {
         var FCLTdata = xmlResp.createElement(param);
         FCLTdata.appendChild(xmlResp.createTextNode(binfo[param]));
         FCLTBody.appendChild(FCLTdata);
      }

      FCLTElement.appendChild(FCLTBody);
   } // end for
   // Alle bestelling-nodes zijn behandeld.

   xmlResp.appendChild(FCLTElement);

   //__DoLog("Ik gebruik stylesheet '"+API.apidata.stylesheet+"'");
   if (API.apidata.stylesheet)
   {
      var outputXML = Server.CreateObject("MSXML2.DOMDocument.6.0");
      xmlResp.transformNodeToObject(iXsl, outputXML);
      Response.ContentType = "text/xml";
      Response.Write(outputXML.xml)
   }
   else
   {
      Response.ContentType = "text/xml";
      Response.Write(xmlResp.xml)
   }
%>
