<%@ LANGUAGE = JavaScript %>
<% /*
     $Revision$
     $Id$

    File:               bez_edit_afspraak_save.asp
    Description:        Sla de wijzigingen van formulier bez_edit_afspraak.asp op
    Parameters:
        urole
        print
        afspr_key
        res_key
        rsv_ruimte_key  ...and all other register_input.asp form u2 fields
    Context:            POST formulier vanuit register_input
    Note:               Eventueel wordt een BEZ_AFSPRAAK record aangemaakt
                        Eventueel worden ook parkeerplaatsen gereserveerd

*/
var JSON_Result = true;
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="./bez.inc" -->
<!-- #include file="./bez_edit_bezoekers_save.inc" -->
<%
var urole = getQParamSafe("urole");
var ismobile = getQParamInt("mobile", 0) == 1;
var afspr_key = getQParamInt("afspr_key");
var rsv_ruimte_key = getQParamInt("rsv_ruimte_key", -1);
var fronto = urole=="fo"; // DEPRECATED
var backo = urole=="bo"; // DEPRECATED
var noNoti = true; // deafult no notification of BEZUPD

if (afspr_key < 0)
{
  var autfunction = fronto?'WEB_BEZFOF':backo?'WEB_BEZBOF':'WEB_BEZUSE';
  var authparams = user.checkAutorisation(autfunction);
  user.auth_required_or_abort(authparams.ALGwritelevel < 9); // Dat is toch wel het minste

  // De begin- en einddatum zoals door de gebruiker ingevoerd
  var date_from = getFParamDate("date_from"); // Startdatum moet aanwezig zijn.
  var date_to = getFParamDate("date_to");     // Einddatum moet aanwezig zijn.
}
else
{
  var this_bez = bez.func_enabled_afspraak(afspr_key);
  user.auth_required_or_abort(this_bez.canChange);

  // De begin- en einddatum zoals door de gebruiker ingevoerd. Beide datums kunnen readonly zijn.
  var date_from = getFParamDate("date_from", null);
  var date_to = getFParamDate("date_to", null);
}

// tamper check
if (S("fac_tamper_check") > 0 && !user.has(["WEB_BEZFOF", "WEB_BEZBOF"]))
{
    __Log("Tamper checking frontend");
    var person_key = getFParamInt("person", user_key);
    user.auth_required_or_abort(user.isCollega(person_key));
    if ((S("vis_afspraak_host_uses_keys") & 1) == 1)
    {
        var personH_key = getFParamInt("personH", user_key);
        if (personH_key != user_key) // geen onnodig dure controle
        {
            var bresult = user.func_enabled2("BEZ", {
                                                       loc_key: getFParamInt("locatiekey", null),
                                                       prs_key: personH_key
                                                    }
                                            )
            user.auth_required_or_abort(bresult.canWrite("WEB_BEZUSE"));
        }
    }
}

// Deze velden altijd opslaan
var fields =  [ { dbs: "prs_perslid_key",          typ: "key",      val: user_key           /* invoerder, notrack */ },
                { dbs: "bez_actie_key",            typ: "key",      frm: "actie",           track: L("lcl_action"), foreign: "bez_actie" },
                { dbs: "bez_afspraak_telefoonnr",  typ: "varchar",  frm: "phone",           track: L("lcl_phone"),  len: 20 },
                { dbs: "alg_locatie_key",          typ: "key",      frm: "locatiekey",
                                                                    savewhen: "locatiekey", track: true /* afzonderlijke tracking, wel oldjsval */ },
                { dbs: "bez_afspraak_contact_key", typ: "key",      frm: "person",          track: L("lcl_vis_contactperson"), foreign: "prs_perslid" }
              ];

if (date_from && date_to) // De begin- en einddatum kunnen readonly zijn.
{
  if (S("bez_multiday")!=1)
  {
    date_to.setYear(date_from.getFullYear());
    date_to.setMonth(date_from.getMonth());
    date_to.setDate(date_from.getDate());

    if ((S("bez_use_buildinghours") & 2) == 2)
    { // Geen bezoek in het weekend en op vrije dagen.
      var kalender_id = getFParamSafe("vrije_dagen_id", "Default");
      var sql = "SELECT fac.iswerkdag(" + date_to.toSQL() +","+ safe.quoted_sql(kalender_id) + ") iswerkdag"
              + "  FROM DUAL";
      var oRs = Oracle.Execute(sql);
      var is_werkdag = oRs("iswerkdag").Value == 1;
      oRs.Close();
      if (!is_werkdag)
          abort_with_warning(L("lcl_vis_bad_day1"));
    }
  }

  // Wordt er niet te ver terug of vooruit geplanned?
  var daysPast   = ((urole == "fe")? 0 : S("vis_afspraak_limiet"));
  var daysFuture = ((urole == "fe" && S("vis_fe_afspraak_limiet") > 0)? S("vis_fe_afspraak_limiet") : S("vis_afspraak_limiet"));
  var maxPast    = new Date();
  var maxFuture  = new Date();
  maxPast.setDate(maxPast.getDate() - daysPast - 1);
  maxFuture.setDate(maxFuture.getDate() + daysFuture + 1);
  if (!date_to) date_to = date_from;
  if (date_from > date_to)
    abort_with_warning(L("lcl_vis_bad_period"));
  else
  {
    if ((daysPast >= 0 && date_from < maxPast) || (daysFuture >= 0 && date_to > maxFuture))
      abort_with_warning(L("lcl_vis_error_date"));
  }

  // Controle van begin en einddtijd.
  var date_limit1 = new Date();
  var date_limit2 = new Date();
  var date_chk1 = new Date();
  var date_chk2 = new Date();

  // Zijn er voor het gebouw een begin en eindtijd gedefinieerd.
  var geb_key = getFParamInt("gebouwkey", -1);

  if (geb_key < 0 && rsv_ruimte_key != -1)
  { // Afspraak wordt gevuld vanuit een reservering.
    var sql = "SELECT rr2ar.alg_ruimte_key"
            + "     , v.alg_gebouw_key"
            + "  FROM res_v_rsv_ruimte_2_alg_ruimte rr2ar"
            + "     , alg_ruimte r"
            + "     , alg_verdieping v"
            + " WHERE rr2ar.alg_ruimte_key = r.alg_ruimte_key"
            + "   AND r.alg_verdieping_key = v.alg_verdieping_key"
            + "   AND res_rsv_ruimte_key = " + rsv_ruimte_key;
    var oRs = Oracle.Execute(sql);
    if (!oRs.Eof)
    {
      geb_key = oRs("alg_gebouw_key").Value;
    }
    oRs.Close();
  }

  var vis_t1 = (fronto && S("vis_t1_fo") >= 0 ? S("vis_t1_fo") : S("vis_t1"));
  var vis_t2 = (fronto && S("vis_t2_fo") >= 0 ? S("vis_t2_fo") : S("vis_t2"));
  if ((S("bez_use_buildinghours") & 1) && geb_key > 0)
  { // Gebouwtijden als tijdgrenzen van afspraken gebruiken.
    sql = "SELECT COALESCE(g.alg_gebouw_beginuur, -1) alg_gebouw_beginuur"
        + "     , COALESCE(g.alg_gebouw_einduur, -1) alg_gebouw_einduur"
        + "  FROM alg_gebouw g"
        + " WHERE g.alg_gebouw_key = " + geb_key;
    oRs = Oracle.Execute(sql);
    if (!oRs.eof)
    {
      if (oRs("alg_gebouw_beginuur").Value > 0)
        vis_t1 = oRs("alg_gebouw_beginuur").Value;
      if (oRs("alg_gebouw_einduur").Value > 0)
        vis_t2 = oRs("alg_gebouw_einduur").Value;
    }
    oRs.Close();
  }

  date_limit1.setHours(Math.floor(vis_t1));
  date_limit1.setMinutes((vis_t1 - Math.floor(vis_t1)) * 60, 0, 0);
  date_limit2.setHours(Math.floor(vis_t2));
  date_limit2.setMinutes((vis_t2 - Math.floor(vis_t2)) * 60, 0, 0);

  // Controle begintijd.
  date_chk1.setHours(date_from.getHours());
  date_chk1.setMinutes(date_from.getMinutes(),0,0);
  if ((date_chk1 < date_limit1) || (date_chk1 > date_limit2))
  {
    date_from.setHours(date_limit1.getHours());
    date_from.setMinutes(date_limit1.getMinutes(),0,0);
  }
  // Controle eindtijd
  date_chk2.setHours(date_to.getHours());
  date_chk2.setMinutes(date_to.getMinutes(),0,0);
  if ((date_chk2 < date_limit1) || (date_chk2 > date_limit2))
  {
    date_to.setHours(date_limit2.getHours());
    date_to.setMinutes(date_limit2.getMinutes(),0,0);
  }

  fields.push({ dbs: "bez_afspraak_datum",       typ: "datetime", val: date_from,         track: L("lcl_vis_start_date") });
  fields.push({ dbs: "bez_afspraak_eind",        typ: "datetime", val: date_to,           track: L("lcl_vis_end_date") });
}
//else // De begin- en einddatum niet opslaan. Ze Waren readonly en dus niet gewijzigd.

var alert_txt = "";

if ((S("vis_afspraak_host_uses_keys") & 1) == 0)
  fields.push({ dbs: "bez_afspraak_gastheer", typ: "varchar", frm: "personH", track: L("lcl_vis_visit") });
else
    fields.push({ dbs: "bez_afspraak_host_key", typ: "key",     frm: "personH", track: L("lcl_vis_visit"), foreign: "prs_perslid" });

if (S("vis_afspraak_onrgoed_uses_keys") == 0)
{
  if (S("vis_mandatory_alg_level") != "L") {  // Bij L bestaat het veld niet
    fields.push({ dbs: "bez_afspraak_ruimte",  typ: "varchar", frm: "room", savewhen: "locatiekey", track: true /* afzonderlijke tracking, wel oldjsval */ });
  }
  fields.push({ dbs: "res_rsv_ruimte_key",   typ: "key",     val: rsv_ruimte_key});  // volgens mij dan -1 dus leeg
}
else
{
  var loc_key   = getFParamInt("locatiekey", -1);
  var bld_key   = getFParamInt("gebouwkey", -1);
  var floor_key = getFParamInt("verdiepingkey", -1);
  var room_key = getFParamInt("ruimtekey", -1);

  if (rsv_ruimte_key != -1)
  {
    // Afspraak wordt gevuld vanuit een reservering.
    var sql = "SELECT alg_ruimte_key"
            + "  FROM res_v_rsv_ruimte_2_alg_ruimte"
            + " WHERE res_alg_ruimte_verwijder IS NULL"
            + "   AND res_rsv_ruimte_key = " + rsv_ruimte_key;
    var oRs = Oracle.Execute(sql);
    if (!oRs.Eof)
    {
      room_key = oRs("alg_ruimte_key").value;
      fields.push({ dbs: "res_rsv_ruimte_key", typ: "key", val: rsv_ruimte_key});
    }
    oRs.Close();
  }

  if (room_key!=-1)
      alg_onrg_key = room_key;
  else if (floor_key!=-1)
      alg_onrg_key = floor_key;
  else if (bld_key!=-1)
      alg_onrg_key = bld_key;
  else alg_onrg_key = -1;
  fields.push({ dbs: "alg_onrgoed_keys",      typ: "key",   val: alg_onrg_key, savewhen: "locatiekey", track: true /* afzonderlijke tracking, wel oldjsval */ });
}


var verynew = false;
if (afspr_key != -1)
{
  fields.push({ dbs: "bez_afspraak_opmerking",      typ: "varchar", frm: "remark", track: L("lcl_vis_remark"), len: 320 });

  var changed = false;
  if (date_from && date_to) // De begin- en einddatum kunnen readonly zijn.
  {
    var sql = "SELECT alg_locatie_key, bez_afspraak_datum, bez_afspraak_eind"
            + "  FROM bez_afspraak"
            + " WHERE bez_afspraak_key = " + afspr_key;
    oRs = Oracle.Execute(sql);
    changed =  oRs("alg_locatie_key").Value != getFParamInt("locatiekey", -1)
            || new Date(oRs("bez_afspraak_datum").Value).getTime() != date_from.getTime()
            || new Date(oRs("bez_afspraak_eind").Value).getTime() != date_to.getTime();
    oRs.Close();
  }
  if (changed)
  {
    __Log("Afspraak locatie of tijd gewijzigd. Parkeerplaatsen worden opnieuw geclaimd");
  }

  // bezUpd heeft na afloop handige oldjsvals
  var bezUpd = buildTrackingUpdate("bez_afspraak", " bez_afspraak_key = " + afspr_key, fields);
  noNoti = !(bezUpd.trackarray && bezUpd.trackarray.length); // initial true when the appointment is unchanged
  // SUBMIT THE CHANGED DATA
  Oracle.Execute(bezUpd.sql);

  var result = saveBezoekers(afspr_key, -1, { urole: urole, loctimechanged: changed, savepark: true, noNoti: noNoti });
  noNoti = result.noNoti;

  if (result.beztrack && result.beztrack.length > 0)
    bezUpd.trackarray.push(result.beztrack.join("\n"));

  alert_txt = result.warning;
  // TODO: doen of niet? shared.trackaction("BEZUPD", afspr_key);

  // tracking plaats is ingewikkelder (drie velden maar slechts één track gewenst), die doen we handmatig
  // locatiekey, alg_onrgoed_keys en bez_afspraak_ruimte bevatten reeds de nieuwe waardes
  if (S("vis_afspraak_onrgoed_uses_keys") == 0)
  { // Alleen locatie (verplicht) en ruimte omschrijving

    var oloc_key = bezUpd.oldjsvals["alg_locatie_key"];
    var loc_key = getFParamInt("locatiekey", -1);
    if (oloc_key != loc_key)
    {
      var oldsql = "SELECT alg_locatie_code FROM alg_locatie WHERE alg_locatie_key = " + oloc_key;
      var oRs_o = Oracle.Execute(oldsql);
      var oldtxt = oRs_o(0).Value;  // oude locatiecode
      oRs_o.Close();

      var newsql = "SELECT alg_locatie_code FROM alg_locatie WHERE alg_locatie_key = " + loc_key;
      var oRs_n = Oracle.Execute(newsql);
      var newtxt = oRs_n(0).Value;  // nieuwe locatiecode
      oRs_n.Close();

      bezUpd.trackarray.push(L("lcl_location") + ": " + buildTrackText("varchar", oldtxt, newtxt, { nodiff: true }));
    }

    if (S("vis_mandatory_alg_level") != "L")  // dan is er wel een Ruimte-veld
    {
        var bez_afspraak_ruimte = getFParam("room");
        var obez_afspraak_ruimte = bezUpd.oldjsvals["bez_afspraak_ruimte"];
        if (bez_afspraak_ruimte != obez_afspraak_ruimte ) {
            bezUpd.trackarray.push(L("lcl_plaatsgegevens") + ": " + buildTrackText("varchar", obez_afspraak_ruimte, bez_afspraak_ruimte, { nodiff: true }));
        }
    }
  }
  else // (S("vis_afspraak_onrgoed_uses_keys") == 1)
  { // Locatie t/m ruimte (plaatsselector). Verplichtheid afhankelijk van setting "vis_mandatory_alg_level".
    if (alg_onrg_key > 0)
      var newsql = "SELECT alg_plaatsaanduiding FROM alg_v_plaatsaanduiding WHERE alg_onroerendgoed_keys = " + alg_onrg_key;
    else
      var newsql = "SELECT alg_locatie_code FROM alg_locatie WHERE alg_locatie_key = " + loc_key;
    var oRs_n = Oracle.Execute(newsql);
    var newtxt = oRs_n(0).Value;
    oRs_n.Close();

    var oalg_onrg_key = bezUpd.oldjsvals["alg_onrgoed_keys"];
    var oloc_key = bezUpd.oldjsvals["alg_locatie_key"];
    if (oalg_onrg_key > 0)
      var oldsql = "SELECT alg_plaatsaanduiding FROM alg_v_plaatsaanduiding WHERE alg_onroerendgoed_keys = " + oalg_onrg_key;
    else // locatie key is er altijd
      var oldsql = "SELECT alg_locatie_code FROM alg_locatie WHERE alg_locatie_key = " + oloc_key;
    var oRs_o = Oracle.Execute(oldsql);
    var oldtxt = oRs_o(0).Value;
    oRs_o.Close();
    if (oldtxt != newtxt)
        bezUpd.trackarray.push(L("lcl_plaatsgegevens") + ": " + buildTrackText("varchar", oldtxt, newtxt, { nodiff: true }));
  }
}
else
{ // Nieuwe afspraak.
  // De begin- en einddatum zijn aanwezig bij een nieuwe afspraak.
  fields.push({ dbs: "bez_afspraak_key", typ: "key", seq: "bez_s_bez_afspraak_key" });

  var nr_park_needed=0;
  var nr_park_reserved=0;

  // Bepaal aantal dagen tussen begin en einddatum.
  var diff = date_to - date_from;
  var days = Math.floor(diff / (1000 * 60 * 60 * 24));

  var remark = getFParam("remark", '');
  if (days>0) { // komt niet voor bij reserveren van ruimten
    if (remark=="") remark += L("lcl_vis_more_days");
    else remark += "\n" + L("lcl_vis_more_days");
  }
  fields.push({ dbs: "bez_afspraak_opmerking",      typ: "varchar", val: remark, len: 320 });
  fields.push({ dbs: "mld_opdr_key", typ: "key", frm: "mld_opdr_key" });

  // TODO: bez_afspr_room
  var bezIns = buildInsert("bez_afspraak", fields);
  var afspr_key = bezIns.sequences["bez_afspraak_key"];
  Oracle.Execute(bezIns.sql);

  var result = saveBezoekers(afspr_key, -1, {urole: urole, verynew: true, new_mobile: ismobile, savepark: true});
  alert_txt = result.warning;
  verynew = true;
  // no tracking for a mobile appointment without visitors
  if (!(ismobile && result.bezkeyArr.length > 0))
  {
    shared.trackaction("BEZMUT", afspr_key);
  }
//          // TODO Nu alles bezoekers bekend zijn, kan een fatsoenlijke notificatie worden gegeven.
//          sql = "UPDATE bez_afspraak SET bez_afspraak_key=bez_afspraak_key WHERE bez_afspraak_key=" + afspr_key;
//          oRs = Oracle.Execute(sql);
} // nieuwe/bestaande reservering

if (afspr_key != -1)
{
  if (bezUpd && bezUpd.trackarray && (bezUpd.trackarray.length)) {
    bez.trackafspraakupdate(afspr_key, L("lcl_bez_is_bezupdtrack").format(afspr_key) + "\n" + bezUpd.trackarray.join("\n"), noNoti);
  }
}

// Report errors during visitors hook.
if (S("vis_warning_limit") != -1)
{ // 't is wel heel erg laat, volgende keer vroeger graag
  if (!date_from)
  {
    var startdate = new Date(date_from);
    var starttime = date_from.getHours() + date_from.getMinutes()/60;
  }
  else
  { // Er is een afspraak key.
    var sqld = "SELECT bez_afspraak_datum"
            + "  FROM bez_afspraak"
            + " WHERE bez_afspraak_key = " + afspr_key;
    oRs = Oracle.Execute(sqld);
    var bez_afspraak_datum = oRs("bez_afspraak_datum").Value;
    oRs.Close();
    var startdate = new Date(bez_afspraak_datum);
    var starttime = startdate.getHours() + startdate.getMinutes()/60;
  }

  var nowdate = new Date();
  var nowtime = nowdate.getHours() + nowdate.getMinutes()/60;

  var diffdate =  Math.round((startdate - nowdate)/(1000 * 60 * 60 * 24));

  var limittimesplit = S("vis_warning_limit").split(':')
  var limittime = parseInt(limittimesplit[0], 10) + parseFloat(limittimesplit[1])/60;

  if (diffdate < 1 || (diffdate == 1 && nowtime > limittime))
  { // Niet fataal overigens
    alert_txt = L("lcl_vis_warning_limit_cossed1") + S("vis_warning_limit") + L("lcl_vis_warning_limit_cossed2");
  }
}

// Klantspecifieke check functie (hookfunction) voor de invoer
var pResult = new HookResult();
if (!custfunc.bez_postsave(result.bezkeyArr, pResult))
{
  abort_with_warning(pResult.errmsg);
}

// autoprint: We staan toch geen bez_actie 'oproep' toe bij losse afspraken. Daarom hoeven we
// bez_actie_flags niet te controleren en moet bitje S("vis_badgeprint_enable")&4 altijd nul zijn
var closeParams = { afspr_key: afspr_key,
                    bezkeyArr: result.bezkeyArr,
                    afspr_deleted: result.afspr_deleted,
                    autoprint: verynew && (S("vis_badgeprint_enable")&1) == 1 && (S("vis_badgeprint_enable")&4) == 0,
                    verynew: verynew == 1,
                    warning: alert_txt,
                    success: true // anders hadden we wel abort_with_warning gedaan.
                  };
Response.Write(JSON.stringify(closeParams));

ASPPAGE_END();
%>
