<% /*
     $Revision$
     $Id$

    File:               bez_edit_bezoekers_save.inc
    Description:        Sla het bezoekersdeel formulier van bez_edit_bezoekers.inc op
    Parameters:
        print
        afspraak_key
        res_key
        rsv_ruimte_key  ...and all other register_input.asp form u2 fields
    Context:            POST formulier vanuit register_input
                        of reserv_Complete/reverv_changeComplete
    Note:               Eventueel wordt een BEZ_AFSPRAAK record aangemaakt (alleen RES)
                        Eventueel worden ook parkeerplaatsen gereserveerd
                        Globale variabele module zal "BEZ" of "RES" zijn

*/ %>

<!-- #include file="../Shared/save2db.inc" -->
<!-- #include file="../Shared/kenmerk_common.inc" -->
<!-- #include file="./bez.inc" -->

<%

// Bepaal eventueel het ene gebouw/terrein wat we mogen kiezen. bez.claim_park is nog niet slim genoeg
var only_prkgebter = -2;
function onlyGebouw(afspraak_key)
{
    if (only_prkgebter > -2)
        return only_prkgebter;

  var sql = "SELECT bez_afspraak_datum, bez_afspraak_eind, alg_locatie_key"
          + "  FROM bez_afspraak"
          + " WHERE bez_afspraak_key = " + afspraak_key;
  var oRs = Oracle.Execute(sql);
  var gebtersql = bez.getgebouwterrein_sql(new Date(oRs("bez_afspraak_datum").value), new Date(oRs("bez_afspraak_eind").value), oRs("alg_locatie_key").value);
  var oRs = Oracle.Execute(gebtersql);
  var aantal_gebter = 0;
  only_prkgebter = -1;
  while (!oRs.eof)
  {
    var alg_type = oRs("alg_type").value;
    only_prkgebter = (alg_type == "R"? oRs("alg_gebouw_key").value : oRs("alg_terreinsector_key").value);
    aantal_gebter++;
    oRs.MoveNext();
  }
  if (aantal_gebter != 1)
    only_prkgebter = -1; // Gebruiker heeft gekozen via Suggest en getFParamInt("gebouwkey" + bznum, "") wordt gebruikt.
  return only_prkgebter;
}

// Leest de bezoekers naam, bedrijfnaam, parkeerplaatswens en evt. badgenummer uit Request.Form
// Verondersteld dat bez_afspraak_record al bestaat! of maak hem desnoods aan als afspraak_key==-1
// (dan zal rsv_ruimte_key een waarde hebben)
// resultaat: { afspr_key, warningtext }
// params: urole, verynew,
//         loctimechanged==>locatie of tijd gewijzigd, evt. parkeerplaatsen opnieuw claimen.
function saveBezoekers(afspraak_key, rsv_ruimte_key, params)
{
  protectRequest.validateToken();

  var next_vis = getFParamInt("next_vis"); // aantal 'regels', al dan niet ingevuld


  var bdg_err = '';
  var nr_park_needed = 0;
  var nr_park_reserved = 0;
  var bznum = 1;
  var bezkeyArr = [];
  var beznewkeyArr = [];
  var beztrack = [];
  var bezBadgeArr = [];

  while ((bznum < next_vis)) {

    bzn = Request.Form("bez" + bznum).Count;
    bdn = Request.Form("bed" + bznum).Count;
    if (bzn < 1 && bdn < 1)
    {
      bznum++;
      continue;
    }

    var result = saveOneBezoeker(afspraak_key, rsv_ruimte_key, bznum, params);
    afspraak_key = result.afspr_key;
    if (result.needPark) nr_park_needed++;
    if (result.hasPark) nr_park_reserved++;
    if (result.bez_key > 0)
    {
      if (result.isNew)
          beznewkeyArr.push(result.bez_key);
      bezkeyArr.push(result.bez_key);
      bezBadgeArr.push(result.bezBadgeNr);
    }
    if (result.beztrack && result.beztrack.length > 0)
      beztrack.push(result.beztrack);
    bznum++;
  }
  var afspr_deleted = false;
  if (!params.new_mobile)
    afspr_deleted = bez.cleanAfspraak(afspraak_key); // weg als alles leeg

  alert_text = null;
  // report errors during visitors hook
  if (bdg_err != '')
    alert_text = bdg_err;

  if (nr_park_needed > nr_park_reserved)
  {
    if (L("lcl_park_alert") != "")
      alert_text = L("lcl_park_alert");
    else
      alert_text = nr_park_reserved + L("lcl_park_alert1") + nr_park_needed + L("lcl_park_alert2");
    beztrack.push(alert_text); // De melding dat niet alle parkeerplaatsen gereserveerd konden worden aan de tracking toevoegen.
  }
  return { afspr_key: afspraak_key,
           bezkeyArr: bezkeyArr,
           beznewkeyArr: beznewkeyArr,
           bezBadgeArr: bezBadgeArr,
           warning: alert_text,
           beztrack: beztrack,
           afspr_deleted: afspr_deleted};
}

// Maak er eentje aan voor onder de reservering
function createAfspraak(rsv_ruimte_key)
{
  var actie_key = bez.default_actie();

  var sql = "SELECT res_rsv_ruimte_opmerking"
          + "    ," + lcl.xsqla('res_ruimte_nr', 'r.res_ruimte_key')
          + "    , r.alg_locatie_key"
          + "    , ar.alg_ruimte_key"
          + "    , bez_actie_key"
          + " FROM res_v_res_ruimte_gegevens r"
          + "    , res_rsv_ruimte rrr"
          + "    , res_ruimte_opstelling ro"
          + "    , res_alg_ruimte ar"
          + "    , alg_locatie l"
          + " WHERE ar.res_alg_ruimte_verwijder IS NULL"
          + "   AND r.alg_locatie_key = l.alg_locatie_key"
          + "   AND r.res_ruimte_key = ar.res_ruimte_key"
          + "   AND r.res_ruimte_key = ar.res_ruimte_key"
          + "   AND rrr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key"
          + "   AND ro.res_ruimte_key = r.res_ruimte_key"
          + "   AND rrr.res_rsv_ruimte_key = " + rsv_ruimte_key;
  var oRs = Oracle.Execute(sql);
  if (!oRs.eof)
  {
    var roomtxt = oRs("res_ruimte_nr").value;
    var loc     = oRs("alg_locatie_key").value;
    var alg_ruimte_key = oRs("alg_ruimte_key").value;
    actie_key = oRs("bez_actie_key").value || actie_key;
  }
  else // CV waarschijnlijk
  {
    sql = "SELECT res_rsv_ruimte_opmerking"
        + "     , rrr.alg_ruimte_key"
        + "     , r.alg_ruimte_aanduiding"
        + "     , r.alg_locatie_key"
        + "  FROM alg_v_ruimte_gegevens_all r"
        + "     , res_rsv_ruimte rrr"
        + " WHERE r.alg_ruimte_key = rrr.alg_ruimte_key"
        + "   AND rrr.res_rsv_ruimte_key = " + rsv_ruimte_key;
    oRs = Oracle.Execute(sql);
    var roomtxt = oRs("alg_ruimte_aanduiding").value;
    var loc     = oRs("alg_locatie_key").value;
    var alg_ruimte_key = oRs("alg_ruimte_key").value;
  }

  // S("res_copy_to_bez") (bitwise):  1=remark | 2=flex | 3=remark and flex | &4=at all changes
  var remark = [];
  if (S("res_copy_to_bez")&1 && oRs("res_rsv_ruimte_opmerking").value)
    remark.push(L("lcl_remark") + ": " + oRs("res_rsv_ruimte_opmerking").value);

  oRs = Oracle.Execute("SELECT bez_s_bez_afspraak_key.nextval FROM DUAL");
  afspraak_key = oRs(0).value;
  oRs.close();

  sql = "INSERT INTO bez_afspraak"
      + " (bez_afspraak_key"
      + ", prs_perslid_key"
      + ", bez_afspraak_datum"
      + ", bez_actie_key"
      + ", bez_afspraak_ruimte"
      + ", bez_afspraak_opmerking"
      + ", bez_afspraak_eind"
      + ", alg_locatie_key"
      + ", alg_onrgoed_keys"
      + ", bez_afspraak_host_key"
      + ", bez_afspraak_contact_key"
      + ", res_rsv_ruimte_key"
      + ") select "
      + afspraak_key
      + ", " + user_key
      + ", res_rsv_ruimte_van"
      + ", " + (actie_key > 0? actie_key: " NULL")
      + ", SUBSTR(" + safe.quoted_sql(roomtxt) + ", 1, 30)"
      + ", SUBSTR(" + safe.quoted_sql(remark.join("\n")) + ", 1, 320)"
      + ", res_rsv_ruimte_tot"
      + ", " + loc
      + ", " + alg_ruimte_key
      + ", res_rsv_ruimte_host_key"
      + ", res_rsv_ruimte_contact_key"
      + ", " + rsv_ruimte_key
      + " FROM res_rsv_ruimte"
      + " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key;

  // Voeg nieuwe afspraak toe.
  // voeg kenmerkwaarden toe aan opmerking afspraak (remark)
  var xsql = "BEGIN"
           + "  " + sql + ";"
           + "  res.follow_afspraak(" + rsv_ruimte_key + ", " + S("res_copy_to_bez") + ");"
           + " END;";
  oRs = Oracle.Execute(xsql);

  shared.trackaction("BEZMUT", afspraak_key); // Tracking onder afspraak.
  return afspraak_key;
}

function getPrkOmschrijving(key, keytype)
{
  var sqlPOB = "SELECT pa.alg_plaatsaanduiding"
             + "  FROM res_rsv_deel rrd"
             + "     , res_deel rd"
             + "     , ins_deel d"
             + "     , alg_v_plaatsaanduiding pa"
             + " WHERE rrd.res_deel_key = rd.res_deel_key"
             + "   AND rd.res_ins_deel_key = d.ins_deel_key"
             + "   AND d.ins_alg_ruimte_key = pa.alg_onroerendgoed_keys"
             + "   AND pa.alg_onroerendgoed_type IN ('R', 'V', 'G', 'T')" // Parkeerplaats is ruimte, verdieping, gebouw of terrein key en GEEN locatie key.
             + (keytype == "B"
               ? " AND rrd.bez_bezoekers_key = " + key
               : " AND rrd.res_rsv_deel_key = " + key); // keytype ==  "R" (res_rsv_deel_key)
  var oRsPOB = Oracle.Execute(sqlPOB);
  var txt;
  if (!oRsPOB.eof)
    txt = oRsPOB("alg_plaatsaanduiding").value;
  oRsPOB.Close();
  return txt;
}

function saveBezAction(afspraak_key, bez_actie_key)
{
  if (bez_actie_key > -1)
  {
    var sql = "UPDATE bez_afspraak"
            + "   SET bez_actie_key = " + bez_actie_key
            + " WHERE bez_afspraak_key = " + afspraak_key;
    Oracle.Execute(sql);
  }
}


// leest in principe uit Request.Form nummer bznum behalve als bznum==-1, dan uit params.
// Wordt ook aangroepen vanuit bez_show_bezoekers met deeplink bezoeker
// resultaat: { afspr_key, warningtext }
// params:
//        urole
//        verynew (direct binnenmelden)
//        naam, bedrijf direct aanmaken. bznum moet -1 zijn.
//        loctimechanged==>locatie of tijd gewijzigd, evt. parkeerplaatsen opnieuw claimen.
function saveOneBezoeker(afspraak_key, rsv_ruimte_key, bznum, params)
{
  var hasPark = false;
  var prk = "off";
  var beztrack = [];
  var isNew = false;
  if (bznum > 0)
  {
    var bez_key = getFParamInt("bez_key" + bznum, -1);
    var beznaam = getFParam("bez" + bznum); // naam
    var bed = getFParam("bed" + bznum); // bedrijf
    var opm = getFParam("opm" + bznum, ""); // opmerking
  }
  else // deeplink pacta?
  {
    var bez_key = -1;
    var beznaam = params.naam;
    var bed = params.bedrijf;
    var opm = params.opmerking || "";
  }

  if (bez_key < -1)
  {
    bez.deleteBezoekers(-bez_key, false);
    beztrack = L("lcl_bez_is_bezdel") + ": " + beznaam + "/" + bed;
  }
  else if ((beznaam == '' && bed == '') || bez_key == 0)
  { // Geen waarden (bezoekersnaam en bedrijfsnaam) ingevuld of verwijderde nieuwe bezoeker
    if (bez_key > 0)
    {
      bez.deleteBezoekers(bez_key, false);
      beztrack = L("lcl_bez_is_bezdel") + ": " + beznaam + "/" + bed;
    }
  }
  else
  {
    if (afspraak_key == -1)
    {
      afspraak_key = createAfspraak(rsv_ruimte_key);
      params.verynew = true;
    }

    var sql = "SELECT bez_afspraak_datum"
            + "  FROM bez_afspraak"
            + " WHERE bez_afspraak_key = " + afspraak_key;
    var oRs = Oracle.Execute(sql);
    var afspraak_datum = new Date(oRs("bez_afspraak_datum").value);
    oRs.Close();

    var prk = getFParam("prk" + bznum, "off");
    var prkselect = getFParam("prkselect" + bznum, "");
    var prkgebter = getFParamInt("gebouwkey" + bznum, ""); // Nieuwe parkeerterrein key. Is een gebouw of terrein key.
    var bdg = getFParam("bdg" + bznum, "");
    var badge_prev = "";
    var park_prev = null;
    var flags_prev = 0;
    var vis_done = null;
    var newbez = bez_key < 0;

    var bezfields = [ { dbs: "bez_afspraak_key",        typ: "key",     val: afspraak_key },
                      { dbs: "prs_contactpersoon_key",  typ: "key",     frm: "contkey" + bznum, track: L("lcl_vis_contactperson"), foreign: "prs_contactpersoon" },
                      { dbs: "prs_perslid_key",         typ: "key",     frm: "prskey" + bznum,  track: L("lcl_intern_pers"),       foreign: "prs_perslid" },
                      { dbs: "bez_afspraak_naam",       typ: "varchar", val: beznaam,           track: L("lcl_vis_name"), len: 30 },
                      { dbs: "bez_afspraak_bedrijf",    typ: "varchar", val: bed,               track: L("lcl_vis_company") + (S("bez_sel_internpersoon") == 1? "/" + L("lcl_department") : ""), len: 60 },
                      { dbs: "bez_bezoekers_pasnr",     typ: "varchar", val: bdg,               track: L("lcl_vis_badgenr") },
                      { dbs: "bez_bezoekers_opmerking", typ: "varchar", val: opm,               track: L("lcl_vis_remark") }
                    ];

    if (bez_key == -1)
    {
      bezfields.push({ dbs: "bez_bezoekers_key",      typ: "key",     seq: "bez_s_bez_bezoekers_key" });
      // Bo iemand aangemeld? Direct 'in'boeken
      if (params.verynew && params.urole == "bo")
      {
          vis_done = new Date();
          var bezoeker_datum = new Date();
          if (bezoeker_datum.midnight().getTime()  === afspraak_datum.midnight().getTime() )
              bezfields.push({ dbs: "bez_bezoekers_done",      typ: "datetime",     val: vis_done });
      }

      var bezIns = buildInsert("bez_bezoekers", bezfields, { noValidateToken: params.noValidateToken });
      isNew = true;
      var bez_key = bezIns.sequences["bez_bezoekers_key"];
      Oracle.Execute(bezIns.sql);
      var bezUpd = {trackarray: [L("lcl_bez_is_bezadd") + ": " + beznaam + "/" + bed]};
    }
    else // bestaande bezoeker
    {
      // bezUpd heeft na afloop handige oldjsvals
      var bezUpd = buildTrackingUpdate("bez_bezoekers", " bez_bezoekers_key = " + bez_key, bezfields);
      // SUBMIT THE CHANGED DATA
      oRs = Oracle.Execute(bezUpd.sql);

      sql = "SELECT rrd.res_rsv_deel_key"
          + "     , b.bez_bezoekers_pasnr"
          + "     , bez_bezoekers_flags"
          + "     , bez_bezoekers_done"
          + "     , pa.alg_plaatsaanduiding"
          + "       , alg_onroerendgoed_keys"
          + "  FROM bez_bezoekers b"
          + "     , res_rsv_deel rrd"
          + "     , res_deel rd"
          + "     , ins_deel id"
          + "     , alg_v_plaatsaanduiding pa"
          + " WHERE b.bez_bezoekers_key = rrd.bez_bezoekers_key(+)"
          + "   AND b.bez_bezoekers_key = " + bez_key
          + "   AND rrd.res_deel_key = rd.res_deel_key(+)"
          + "   AND rd.res_ins_deel_key = id.ins_deel_key(+)"
          + "   AND id.ins_alg_ruimte_key = pa.alg_onroerendgoed_keys(+)"
          + "   AND pa.alg_onroerendgoed_type(+) IN ('R', 'V', 'G', 'T')"
      oRs = Oracle.Execute(sql);
      var badge_prev = oRs("bez_bezoekers_pasnr").value || "";
      var bez_flags = oRs("bez_bezoekers_flags").Value;
      park_prev = oRs("res_rsv_deel_key").value;
      // Parkeerplaats (ins_alg_ruimte_key) kan een ruimte, gebouw of verdieping zijn. Nu Gebouw/Terreinsector key afleiden.
      var prkter_key = oRs("alg_onroerendgoed_keys").value; // Oude parkeerterrein key.
      if ((params.loctimechanged || prkter_key != prkgebter) && park_prev)
      {
          sql = "DELETE FROM res_rsv_deel WHERE bez_bezoekers_key = " + bez_key;
          Oracle.Execute(sql);
          park_prev = null; // sta opnieuw claimen toe
          oldtxt = oRs("alg_plaatsaanduiding").Value;
          if (prkselect == "S")
            bezUpd.trackarray.push(L("lcl_park") + ": " + buildTrackText("varchar", oldtxt, null, { nodiff: true }));
          else
            bezUpd.trackarray.push(L("lcl_park") + ": " + buildTrackText("varchar", L("lcl_Yes"), L("lcl_No"), { nodiff: true }));
      }
      vis_done = new Date(oRs("bez_bezoekers_done").value);
    }
    if (S("bez_set_remote_flags") > 0)
    {
        var remote = getFParam("remote" + bznum, "off") == "on";
        var was_remote = (bez_flags & S("bez_set_remote_flags")) == S("bez_set_remote_flags");
        var flagsql = "";
        if (remote)
        {
            if (!was_remote) // bitor becomes:  (x + y) - BitAND(x, y);
            {   // Vlaggetje resetten
                flagsql = "bez_bezoekers_flags + {0} - BITAND(bez_bezoekers_flags, {0})".format(S("bez_set_remote_flags"))
            }
        }
        else
        {
            if (was_remote)
            {   // Vlaggetje resetten, NOT x is (0 - x - 1)
                flagsql = "BITAND(bez_bezoekers_flags, 0-{0}-1)".format(S("bez_set_remote_flags"))
            }
        }
        if (flagsql)
        {
            sql = "UPDATE bez_bezoekers"
                + "   SET bez_bezoekers_flags = " + flagsql
                + " WHERE bez_bezoekers_key = " + bez_key;
            Oracle.Execute(sql);
        }
    }
    if (bdg != badge_prev)
    {
      trackstr = L("lcl_bez_badgeassigned_1") + bdg + L("lcl_bez_badgeassigned_2") + beznaam;
      shared.trackaction("BEZBAD", bez_key, trackstr);
    }

    if (S("vis_bo_uses_badgenrs") == 1 && bdg != badge_prev && vis_done != null)
    {
      // customer hook
      pResult = new HookResult();
      custfunc.bez_checkdone(bez_key, pResult);
      if (pResult.errmsg != null)
      {
        bdg_err = pResult.errmsg;
      }
    }

    if ((bez_flags&16)!=16) // +16 is parkeerplaats bevroren
    {
        if (prk == "on" && park_prev == null && (prkselect == "S" || prkselect == "C"))
        {
          var gebouwterreinkey = "null";
          if (prkselect == "S")
              gebouwterreinkey = prkgebter; // de gekozen
          else
          {
               var prkgebter = onlyGebouw(afspraak_key)
               gebouwterreinkey = prkgebter > 0? prkgebter: "null"; // de enige goede
          }
          sql = "BEGIN bez.claim_parking(" + bez_key + ", " + gebouwterreinkey + "); END;"
          Oracle.Execute(sql);
          sql = "SELECT bez.hasparking(" + bez_key + ") FROM DUAL"
          var oRsP = Oracle.Execute(sql);

          hasPark = (oRsP(0).value > 0);
          oRsP.close();
          if (hasPark)
          {
            if (prkselect == "S")
            {
              new_prk_oms = getPrkOmschrijving(bez_key, "B");
              bezUpd.trackarray.push(L("lcl_park") + ": " + buildTrackText("varchar", null, new_prk_oms, { nodiff: true }));
            }
            else
              bezUpd.trackarray.push(L("lcl_park") + ": " + buildTrackText("varchar", L("lcl_No"), L("lcl_Yes"), { nodiff: true }));
          }
        }
        else if (prk == "off" && park_prev != null)
        {
          sql = "DELETE FROM res_rsv_deel WHERE bez_bezoekers_key = " + bez_key;
          Oracle.Execute(sql);
          if (prkselect == "S")
          {
            old_prk_oms = getPrkOmschrijving(park_prev, "R");
            bezUpd.trackarray.push(L("lcl_park") + ": " + buildTrackText("varchar", old_prk_oms, null, { nodiff: true }));
          }
          else
              bezUpd.trackarray.push(L("lcl_park") + ": " + buildTrackText("varchar", L("lcl_Yes"), L("lcl_No"), { nodiff: true }));
        }
        else if (prk == "on" && park_prev != null)
        {
          hasPark = true; // wel meetellen
          if (prkselect == "S")
          {
            new_prk_oms = getPrkOmschrijving(bez_key, "B");
            old_prk_oms = getPrkOmschrijving(park_prev, "R");
            if (new_prk_oms != old_prk_oms)
              bezUpd.trackarray.push(L("lcl_park") + ": " + buildTrackText("varchar", old_prk_oms, new_prk_oms, { nodiff: true }));
          }
        }
    }

    if (bznum > 0) // pacta/deeplink heeft geen flexkenmerken/k_all
    {
      var currentKenmerkenSQL = "SELECT kl.bez_kenmerk_key "
                              + "     , kl.bez_kenmerkwaarde_waarde"
                              + "  FROM bez_kenmerkwaarde kl, bez_kenmerk k "
                              + " WHERE  k.bez_kenmerk_key = kl.bez_kenmerk_key "
                              + "   AND bez_kenmerkwaarde_VERWIJDER IS NULL "
                              + "   AND bez_bezoekers_key = " + bez_key;

      var allKenmerkenSQL = " SELECT " + lcl.xsql('k.bez_kenmerk_omschrijving', 'k.bez_kenmerk_key') + " kenmerk_omschrijving"
                          + "      , bez_kenmerk_key srtkenmerk_key"
                          + "      , fac_kenmerkdomein_key"
                          + "   FROM bez_kenmerk k"
                          + "  WHERE k.bez_kenmerk_verwijder IS NULL"
                          + "    AND k.bez_kenmerk_key = "; /* wordt in saveFlexkenmerken uitgebreid */

      var flextrack = saveFlexKenmerken(bez_key,
                                        { kenmerkTable: "bez_kenmerkwaarde",
                                          kenmerkParentKey : "bez_bezoekers_key",
                                          kenmerkWaarde: "bez_kenmerkwaarde_waarde",
                                          kenmerkKey: "bez_kenmerk_key",
                                          currentKenmerkenSQL: currentKenmerkenSQL,
                                          allKenmerkenSQL: allKenmerkenSQL,
                                          requestQF: Request.Form,
                                          nameprefix: "flex" + bznum + "_",
                                          tmpfolderNum: bznum,
                                          isNew: isNew,
                                          flexPath: "BEZ/B",
                                          tracking: true,
                                          noFlexCleanup: true,
                                          module: "BEZ"
                                        })
    }
    if (bezUpd && bezUpd.trackarray && (bezUpd.trackarray.length || flextrack.length))
      beztrack = (newbez? "" : beznaam + ": ") + bezUpd.trackarray.concat(flextrack).join("\n");
  }

  return { afspr_key: afspraak_key,
           bez_key: bez_key,
           bezBadgeNr: bdg,
           isNew: isNew,
           needPark: prk == "on",
           hasPark: hasPark,
           beztrack: beztrack };
}
%>