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

     File:              api_bezsoap.asp
     Description:       API voor BEZ-soap berichten

     Parameters:        Een xml
     Status:
     Context:
     Notes:
                        Onderstaand het voorstel van RWSN/MOOP. Wij doen XML ipv JSON, daar moet getransformeerd worden

        (2) Versturen van de bezoekersregistraties
        Voor het versturen van de registraties stel ik voor om een HTTP-POST service te maken, deze is bijvoorbeeld te bereiken op ~/visitations
        In de request header geef ik de Api Key mee:
          Api-Key: 'te_bepalen_door_facilitor'
        In de body stel ik voor één key-value pair mee te geven met de naam jsonData waarin de hele json van de bezoekersregistratie in verwerkt zit:
        json_data={
          "start":"Fri, 03 Aug 2012 10:09:39 +0200", //begindatum in RFC2822 formaat
          "end":"HH:MM",
          "host_id":2934, //id van de ingelogde gebruiker
          "building_id":4712, //id van gekozen locatie
          "visitors":
            [
              {
                "name":"Pietje Puk",
                "company":"RUG"
              },
              {
                "name":"Jan Janssen",
                "company":"Achmea"
              },
              {...}
            ]
        }
        Bij een juiste verwerking wordt http status code 201 teruggegeven met enkel een succes json:
        {
          "success":true,
        }

        Anders een 4xx of 5xx code met daarin een json geformatteerde fout:
        {
          "success":false,
          "errors":
            [
              {
                "description":"start is not a valied RFC2822 format"
              },
              {
                "description":"building_id cannot be null"
              },
              {...}
            ]
        }

*/
DOCTYPE_Disable = 1;
THIS_FILE = "appl/api/api_bezsoap.asp";
%>

<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/xml_converter.inc" -->
<!-- #include file="../Shared/save2db.inc" -->
<!-- #include file="../api/api.inc" -->

<%
// We sturen het antwoord in UTF-8.
Session.Codepage = 65001;
Response.Charset = 'utf-8';

var API = new API_func();

// XML Omzetten naar equivalente JSON
// var xmlReq = Server.CreateObject("MSXML2.DOMDocument.6.0");
// xmlReq.load(Request);

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

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 elmHeader = xmlResp.createElement("header");
var headerinfo = {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]));
  elmHeader.appendChild(FCLTdata);
}
FCLTElement.appendChild(elmHeader);

// Hier zou het echte werk moeten gebeuren nav. xmlReq
// en FCLTElement moeten we uitbreiden met antwoorden.

//var afspraken = xmlReq.getElementsByTagName("afspraak");

user.checkAutorisation("WEB_BEZUSE"); // Dit is nog ongeacht de bestelling

var resultcode = -1;   /* Zolang deze -1 is, is het nog goed. Uiteindelijk eindigt het met 0 (als goed). */
var resulttekst = "";
var json_txt = Request.Form;
var json_data = eval("(" + json_txt + ")");


SaveOneAfspraak(json_data); // The one and only

// TODO: onderstaande code moet een generieke bez.afspraak_create (of afspraak_save) worden
//       en ook gebruikt worden door bez_edit_afspraak_save.asp. Zo ver zijn we nog niet...

function SaveOneAfspraak(json_data)
{
  var afspr_key;
  var bez_actie;
  var alg_locatie_key;
  var alg_onrg_key;
  var date_to;
  var date_from = new Date(json_data.start);
  if (json_data.start == "undefined" || typeof date_from != "object" || isNaN(date_from))
  {
    resultcode = 2;
    resulttekst = "Undefined aankomst datum";
  }
  else
  {
    date_to = date_from;
    date_to = new Date(date_from.getTime());

    var time_end = json_data.end;
    if (json_data.time_end != "undefined" && typeof time_end == "string")
      var time_end = time_end.split(":");
    date_to.setHours(time_end[0], time_end[1]);

    if (time_end.length != 2 || typeof date_to != "object" || isNaN(date_to))
    {
      resultcode = 2;
      resulttekst = "Undefined vertrek tijd";
    }
    else if (date_to < date_from)
    {
      resultcode = 2;
      resulttekst = "Vertrek tijd voor aankomst tijd";
    }
    else
    {
      // Standaard actie voor mobile: Opbellen en op laten halen.
      var sql = " SELECT bez_actie_key FROM bez_actie WHERE bez_actie_omschrijving LIKE 'Op laten halen (bellen)'"
      var oRs = Oracle.Execute(sql);
      bez_actie = oRs("bez_actie_key").Value;

      var alg_gebouw_key = json_data.building_id;
      if (!alg_gebouw_key || alg_gebouw_key < 0)
      {
        resultcode = 2;
        resulttekst = "Undefined alg_gebouw_key";
      }
      else if (S("vis_afspraak_onrgoed_uses_keys") == 0)
      {
        sql = "SELECT SUBSTR (alg_plaatsaanduiding, 1, 30) plaats"
            + "  FROM alg_v_plaatsaanduiding_all"
            + " WHERE alg_onroerendgoed_keys = " + alg_gebouw_key
            + "   AND alg_onroerendgoed_type <> 'L'";
        if (!oRs.eof)
          var plaats = oRs("plaats").Value;
        else
        {
          resultcode = 5;
          resulttekst = "Building_id not found";
        }
      }
      else
      {
        sql = "SELECT alg_locatie_key FROM alg_gebouw WHERE alg_gebouw_key = " + alg_gebouw_key;
        oRs = Oracle.Execute(sql);
        alg_locatie_key = oRs("alg_locatie_key").Value;

        if (!alg_locatie_key || alg_locatie_key < 0)
        {
          resultcode = 2;
          resulttekst = "Undefined alg_locatie_key";
        }
        else
        {
          var fields = []; // Bij te werken velden.
          // Altijd nieuwe afspraak vooralsnog
          fields.push({ dbs: "bez_afspraak_key", typ: "key", seq: "bez_s_bez_afspraak_key" });
          fields.push({ dbs: "bez_afspraak_opmerking",      typ: "varchar", val: "Created by mobile", len: 320 });

          // Deze velden altijd opslaan (geen bez_afspraak_telefoonnr)
          var fields =  [ { dbs: "prs_perslid_key",          typ: "key",      val: user_key         /* invoerder, notrack */ },
                          { dbs: "bez_afspraak_datum",       typ: "datetime", val: date_from,       track: L("lcl_vis_start_date") },
                          { dbs: "bez_actie_key",            typ: "key",      val: bez_actie,       track: L("lcl_action"), foreign: "bez_actie" },
                          { dbs: "bez_afspraak_eind",        typ: "datetime", val: date_to,         track: L("lcl_vis_end_date") },
                          { dbs: "alg_locatie_key",          typ: "key",      val: alg_locatie_key, track: true /* afzonderlijke tracking, wel oldjsval */ },
                          { dbs: "bez_afspraak_contact_key", typ: "key",      val: user_key,        track: L("lcl_vis_contactperson"), foreign: "prs_perslid" }
                        ];

          if (S("vis_afspraak_host_uses_keys") == 0)
            fields.push({ dbs: "bez_afspraak_gastheer", typ: "varchar", val: user.naam(),  track: L("lcl_vis_visit") });
          else
            fields.push({ dbs: "bez_afspraak_host_key", typ: "key",     val: user_key,     track: L("lcl_vis_visit"), foreign: "prs_perslid" });

          if (S("vis_afspraak_onrgoed_uses_keys") == 0)
          {
            fields.push({ dbs: "bez_afspraak_ruimte",   typ: "varchar", val: plaats,       track: true /* afzonderlijke tracking, wel oldjsval */ });
          }
          else
          {
            alg_onrg_key = alg_gebouw_key; // Building_id is meegegeven
            fields.push({ dbs: "alg_onrgoed_keys",      typ: "key",     val: alg_onrg_key, track: true /* afzonderlijke tracking, wel oldjsval */ });
          }

          fields.push({  dbs: "bez_afspraak_key",     typ: "key",      seq: "bez_s_bez_afspraak_key" });

          var bezIns = buildInsert("bez_afspraak", fields, { noValidateToken: true });
          afspr_key = bezIns.sequences["bez_afspraak_key"];
          Oracle.Execute(bezIns.sql);

          for (var i = 0; i < json_data.visitors.length; i++)
          {
            var visitor_data = json_data.visitors[i];
            var naam = visitor_data.name;
            var bedrijf = visitor_data.company;

            // Geen prs_contactpersoon_key, prs_perslid_key en bez_bezoekers_pasnr
            var bezfields = [ { dbs: "bez_afspraak_key",       typ: "key",     val: afspr_key },
                              { dbs: "bez_afspraak_naam",      typ: "varchar", val: naam,     track: L("lcl_vis_name"), len: 30 },
                              { dbs: "bez_afspraak_bedrijf",   typ: "varchar", val: bedrijf,  track: L("lcl_vis_company") + (S("bez_sel_internpersoon") == 1? "/" + L("lcl_department") : ""), len: 60 }
                            ];

            bezfields.push({ dbs: "bez_bezoekers_key",      typ: "key",     seq: "bez_s_bez_bezoekers_key" });
            // Niet door BO aangemeld. Niet direct 'in' boeken.

            var bezIns = buildInsert("bez_bezoekers", bezfields, { noValidateToken: true });
            var bez_key = bezIns.sequences["bez_bezoekers_key"];
            Oracle.Execute(bezIns.sql);
            //var bezUpd = {trackarray: [L("lcl_bez_is_bezadd") + ": " + naam + "/" + bedrijf]};
          }
          shared.trackaction("BEZMUT", afspr_key);
        }
      }
    }
  }

  if (resultcode == -1) // nog steeds geen fouten
    resultcode = 0; // Ik heb gedaan wat ik moest en mocht doen voor deze reservering.

  var ainfo = {returncode: resultcode,
               returntekst: resulttekst,
               // executed:sql, // debug
               user_key: user_key,
               afspr_key: afspr_key,
               bez_afspraak_datum: date_from, // TODO: Beter ook xml-datum???
               bez_afspraak_eind: date_to,
               bez_actie_key: bez_actie,
               alg_locatie_key: alg_locatie_key,
               alg_onrgoed_keys: alg_onrg_key
              }

  if (S("vis_afspraak_host_uses_keys") == 0)
    ainfo.gastheer = user.naam();
  else
    ainfo.host_key = user_key;

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

  FCLTElement.appendChild(FCLTBody);
}

xmlResp.appendChild(FCLTElement);

Response.ContentType = "text/xml";
Response.Write(xmlResp.xml)
%>