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

    File:
    Description:
    Parameters:

    Note:


*/ %>

<%
var JSON_Result = true;
%>

<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/save2db.inc" -->
<!-- #include file="../Shared/flexfiles.inc" -->
<!-- #include file="../Shared/kenmerk_common.inc" -->
<!-- #include file="./ins.inc" -->

<%
protectRequest.validateToken();
/***** Get parameters *****/
var ins_key_arr = getFParamIntArray("ins_keys");
var adapt = getFParamInt("adapt", 0) == 1;
var lendout = getFParamInt("lendout", 0) == 1;
var takein = getFParamInt("takein", 0) == 1;

var tobeLendoutTakein = 0;
var ingesloten = [];
var isSleCil = ins.isSleCil(ins_key_arr[0]); // Er is minimaal 1 ins_key anders kreeg je al een fout in getFParamIntArray.
for (var i = 0; i < ins_key_arr.length; i++)
{
  var disc_key;
  // Indien het een sleutel of cilinder betreft dan WEB_SLEFOF rechten i.p.v. WEB_INSFOF rechten.
  if (isSleCil && i == 0) // Alleen de eerste keer autorisatie bepalen.
  {
    autfunction = "WEB_SLEFOF";
    authparams = user.checkAutorisation(autfunction, true);
  }
  else
  {
    var sql = "SELECT ins_discipline_key"
            + "  FROM ins_deel"
            + " WHERE ins_deel_key = " + ins_key_arr[i];
    var oRs = Oracle.Execute(sql);
    // Als de key van het object nog niet bekend is dan neem ik de discipline niet mee en blijft die null.
    if (!oRs.eof)
      disc_key = oRs("ins_discipline_key").Value;
    oRs.Close();

    autfunction = "WEB_INSFOF";
    authparams = user.checkAutorisation(autfunction, true, disc_key);
  }

  var sql = "SELECT d.ins_deel_key"
          + "     , d.ins_srtdeel_key"
          + "     , d.ins_alg_ruimte_key"
          + "     , d.ins_alg_ruimte_type"
          + "     , d.ins_deel_omschrijving"
          + "     , s.ins_srtgroep_key"
          + "  FROM ins_v_deelenonderdeel d"
          + "     , ins_srtdeel s"
          + " WHERE d.ins_srtdeel_key = s.ins_srtdeel_key"
          + "   AND d.ins_deel_key = " + ins_key_arr[i];
          if (!adapt)
          {
            sql += (lendout
              ? "   AND d.ins_alg_ruimte_key_org IS NULL"      // Uitgeven.
                + " AND d.ins_alg_ruimte_type_org IS NULL"
              : "   AND d.ins_alg_ruimte_key_org IS NOT NULL"  // Innemen.
                + " AND d.ins_alg_ruimte_type IN ('C', 'P', 'R', 'T')");
          }
  var oRs = Oracle.Execute(sql);
  var canCheckOut = lendout && !oRs.eof; // Is het object vrij?
  var canTakein   = takein && !oRs.eof;  // Is het object uitgeleend?

  // Ik moet enige schrijfrechten hebben op de object discipline.
  if (((authparams && authparams.ALGwritelevel < 9) || (authparams && authparams.PRSwritelevel < 9)) &&
      (canCheckOut || canTakein))
  {
    if (tobeLendoutTakein == 0)
    { // Gegevens eerste object.
      sort_key = oRs("ins_srtdeel_key").Value;
      algprs_key = oRs("ins_alg_ruimte_key").Value; // alg_key (niet uitgeleend) of prs_key (uitgeleend)
      alg_ruimte_type = oRs("ins_alg_ruimte_type").Value;
      isCil = oRs("ins_srtgroep_key").Value == S("cil_ins_srt_groep_key");
      desc = oRs("ins_deel_omschrijving").Value;
    }
    ingesloten.push(ins_key_arr[i]);
    tobeLendoutTakein++;
  }
  oRs.Close()
}

user.auth_required_or_abort(tobeLendoutTakein > 0); // We klagen niet over enkele wel en enkele niet.

var lent_out_person_key = getFParamInt("lent_out_person", -1);
var lent_out_cperson_key = getFParamInt("lent_out_cperson", -1);
var lent_out_rsv_deel_key = getFParamInt("isres", -1);
var person_type = getFParam("person_type", (lent_out_cperson_key > 0? "C" : "P"));
var loc_key = getFParamInt("locatiekey", -1); // Locatie
var bld_key = getFParamInt("gebouwkey", -1); // Gebouw
var bttype = getFParam("bttype", ""); // Type van gebouw/terrein ("B", "T"). Bepaald of bld_key een gebouw of terreinsector key bevat.
var flr_key = getFParamInt("verdiepingkey", -1); // Verdieping
var room_key = getFParamInt("ruimtekey", -1); // Ruimte
var bijlagen_obj = {};
var result = {};

for (var i = 0; i < ingesloten.length; i++)
{
  var sql = "SELECT d.ins_alg_ruimte_key_org"
          + "     , d.ins_alg_ruimte_type_org"
          + "     , d.ins_deel_omschrijving"
          + "     , d.ins_alg_locatie_key"
          + "  FROM ins_deel d"
          + " WHERE ins_deel_key = " + ingesloten[i];
  var oRs = Oracle.Execute(sql);
  var lInsOmschrijving = oRs("ins_deel_omschrijving").value;
  var lInsKeyOrg = oRs("ins_alg_ruimte_key_org").value;
  var lInsTypeOrg = oRs("ins_alg_ruimte_type_org").value;
  var lInsAlgLoc = oRs("ins_alg_locatie_key").value;
  oRs.Close();

  var is_reservering = (lent_out_rsv_deel_key > -1);
  if (is_reservering)
  {
    var sql = "SELECT rrr.res_rsv_ruimte_host_key"
            + "  FROM res_rsv_ruimte rrr"
            + "     , res_rsv_deel rrd"
            + " WHERE rrd.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key"
            + "   AND res_rsv_deel_key = " + lent_out_rsv_deel_key;
    var oRs = Oracle.Execute(sql);
    lent_out_person_key = oRs("res_rsv_ruimte_host_key").Value;
  }

  result = { success: true};
  var update_string = "";
  var flextrackarray = [];
  if (!adapt)
  {
    var ruimte_key = -1;
    var ruimte_type = "";
    if (lendout && lent_out_person_key > 0)
    { // Uitgeven: Sla persoon op in alg_ruimte_key en sla ook de kenmerken op
      ruimte_key = lent_out_person_key;
      ruimte_type = person_type;
    }
    else if (lendout && lent_out_cperson_key > 0)
    { // Uitgeven: Sla contactpersoon op in alg_ruimte_key en sla ook de kenmerken op
      ruimte_key = lent_out_cperson_key;
      ruimte_type = "C";
    }
    else if (lendout && room_key > 0 && bttype == "B")
    { // Uitgeven: Sla ruimte op in alg_ruimte_key en sla ook de kenmerken op
      ruimte_key = room_key;
      ruimte_type = "R";
    }
    else if (lendout && bld_key > 0 && bttype == "T")
    { // bld_key is een terrein key
      // Uitgeven: Sla terrein op in alg_ruimte_key en sla ook de kenmerken op
      ruimte_key = bld_key;
      ruimte_type = "T";
    }
    // else innemen


    if (lendout && ruimte_key > 0)
    { // Uitgeven: Sla persoon/ruimte/terrein op in alg_ruimte_key en sla ook de kenmerken op
      sql = "UPDATE ins_deel"
          + "   SET ins_alg_ruimte_key_org = ins_alg_ruimte_key"
          + "     , ins_alg_ruimte_type_org = ins_alg_ruimte_type"
          + (is_reservering
            ? "   , res_rsv_deel_key = " + lent_out_rsv_deel_key
            : "")
          + "     , ins_alg_ruimte_key = " + ruimte_key
          + "     , ins_alg_ruimte_type = " + safe.quoted_sql(ruimte_type)
          + " WHERE ins_deel_key = " + ingesloten[i];
    }
    else
    { // Innemen: Maak reset de eigenaar/plaats en sla de kenmerken op
      var alg_r_key = "ins_alg_ruimte_key_org";
      // Check whether ins_alg_ruimte_key_org of object still exists
      if (lInsTypeOrg == "R")
      {
          var sql_r = "SELECT alg_ruimte_key"
                    + "  FROM alg_ruimte"
                    + " WHERE alg_ruimte_key = " + lInsKeyOrg
                    + "   AND alg_ruimte_verwijder IS NULL";
          var oRs_r = Oracle.Execute(sql_r);
          // Override alg_ruimte_key to user-alg_ruimte_key when ins_alg_ruimte_type_org no longer exists
          if (oRs_r.eof)
          {
            var alg_r_key = user.alg_ruimte_key();
            update_string = L("lcl_obj_to_user_room") + "\n";
            result.toaster = L("lcl_obj_to_user_room");
          }
          oRs_r.Close();
      }
      // Alleen uitgegeven objecten kunnen ingenomen worden (ins_alg_ruimte_key_org en ins_alg_ruimte_type_org zijn niet NULL)
      sql = "UPDATE ins_deel"
          + "   SET ins_alg_ruimte_key = " + alg_r_key
          + "     , ins_alg_ruimte_type = ins_alg_ruimte_type_org"
          + "     , ins_alg_ruimte_key_org = NULL"
          + "     , ins_alg_ruimte_type_org = NULL"
          + "     , res_rsv_deel_key = NULL"
          + " WHERE ins_deel_key = " + ingesloten[i]
          + "   AND ins_alg_ruimte_key_org IS NOT NULL"
          + "   AND ins_alg_ruimte_type_org IS NOT NULL";
      update_string += L("lcl_obj_is_ingenomen");

      // De sql is nu nog niet uitgevoerd, dus de lener is nog bekend. Zet alvast het bericht klaar dat het object ingenomen is.
      shared.trackaction("INSIN2", ingesloten[i], L("lcl_obj_is_ingenomen2").format(lInsOmschrijving));
    }

    var err = Oracle.Execute(sql, true);
    if (err.friendlyMsg)
    {
        result.message = err.friendlyMsg;
        result.success = false;
    }
    // begin: tempary fix for #57979, to be removed in 20.1
    if (lInsAlgLoc != null)
    {
      sql = "UPDATE ins_deel SET ins_alg_locatie_key = '" + lInsAlgLoc + "' WHERE ins_deel_key = " + ingesloten[i];
      Oracle.Execute(sql, true);
    }
    // end: tempary fix for #57979, to be removed in 20.1

    if (lendout && ((lent_out_person_key > 0 || lent_out_cperson_key > 0) || bld_key > 0))
    {
      if (lent_out_person_key > 0)
      { // Het kan nog een persoon (perslid) of contactpersoon zijn.
        if (person_type == "P")
          var sql = "SELECT pf.prs_perslid_naam_full"
                  + "  FROM prs_v_perslid_fullnames_all pf"
                  + " WHERE prs_perslid_key = " + lent_out_person_key;
        else if (person_type == "C")
          var sql = "SELECT " + S("prs_contactpers_string")
                  + "  FROM prs_contactpersoon cp"
                  + " WHERE cp.prs_contactpersoon_key = " + lent_out_person_key;
      }
      else if (lent_out_cperson_key > 0)
      {
        var sql = "SELECT " + S("prs_contactpers_string")
                + "  FROM prs_contactpersoon cp"
                + " WHERE cp.prs_contactpersoon_key = " + lent_out_cperson_key;
      }
      else
      {
        if (ruimte_type == "R")
        {
          var sql = "SELECT r.alg_locatie_code || '-' || r.alg_ruimte_aanduiding || ' (' || "+ lcl.xsql("r.alg_srtruimte_omschrijving", "r.alg_srtruimte_key")+" || ')' loc"
                  + "  FROM alg_v_ruimte_gegevens r"
                  + " WHERE r.alg_ruimte_key = " + ruimte_key;
        }
        else
        {
          var sql = "SELECT l.alg_locatie_code || '-' || t.alg_terreinsector_naam loc"
                  + "  FROM alg_v_aanweziglocatie l"
                  + "     , alg_terreinsector t"
                  + " WHERE l.alg_locatie_key = t.alg_locatie_key"
                  + "   AND t.alg_terreinsector_key = " + ruimte_key;
        }
      }
      var loRs = Oracle.Execute(sql);
      if (!loRs.eof)
        var lener_str = L("lcl_obj_is_uitgegeven_to").format(loRs(0).value, lInsOmschrijving);
      else
        var lener_str = L("lcl_obj_is_uitgegeven_to").format("?", lInsOmschrijving);
      loRs.close();

      update_string = lener_str;
    }
  }

  // Bijlagen bij uitgifte updaten
  clear_properties(adapt, (lendout ? 2 : 0), ingesloten[i]);  // LENDOUT

  // Kenmerken updaten.
  var flextrack = ins.updateKenmerkdeel(ingesloten[i], {multimode: (ingesloten.length > 1 ? true : false)});
  flextrackarray.push(flextrack);

  if (lendout || takein)
  {
    // get the fac_bijlage_key from the first object, if any

    if (i == 0)  // first attachment
    {
      var bijlagen_sql = "SELECT fac_bijlagen_key"
                       + "     , fac_bijlagen_kenmerk_key"
                       + "     , fac_bijlagen_filename"
                       + "  FROM fac_bijlagen"
                       + " WHERE fac_bijlagen_verwijder IS NULL"
                       + "   AND fac_bijlagen_module = 'INS'"
                       + "   AND fac_bijlagen_refkey = " + ingesloten[i];
      var bijlagen_oRs = Oracle.Execute(bijlagen_sql);
      while (!bijlagen_oRs.eof)
      {
        bijlagen_obj[bijlagen_oRs("fac_bijlagen_kenmerk_key").Value] = bijlagen_oRs("fac_bijlagen_key").Value;
        bijlagen_oRs.MoveNext();
      }
      bijlagen_oRs.Close();
    }
    else  // otherwise copy the attachments from the first object, if any
    {
      var key = "";
      for (key in bijlagen_obj)
      {
        var bijlagen_delete_sql = "SELECT fac_bijlagen_key"
                                + "  FROM fac_bijlagen"
                                + " WHERE fac_bijlagen_verwijder IS NULL"
                                + "   AND fac_bijlagen_module = 'INS'"
                                + "   AND fac_bijlagen_refkey = " + ingesloten[i]
                                + "   AND fac_bijlagen_kenmerk_key = " + key;
        var bijlagen_delete_oRs = Oracle.Execute(bijlagen_delete_sql);
        while (!bijlagen_delete_oRs.eof)
        {
            var bijlagen_delete_sql = "BEGIN flx.deleteflexbijlage({0}); END;".format(bijlagen_delete_oRs("fac_bijlagen_key").Value);
            Oracle.Execute(bijlagen_delete_sql);
            bijlagen_delete_oRs.MoveNext();
        }
        bijlagen_delete_oRs.Close();
        var bijlagen_copy_sql = "BEGIN flx.copyflexbijlage('INS',{0},{1},{2}); END;".format(ingesloten[i], key, bijlagen_obj[key]);
        Oracle.Execute(bijlagen_copy_sql, true);
      }
    }
  }

  // Bijlagen bij inname updaten
  result.toaster = clear_properties(adapt, (takein ? 1 : 0), ingesloten[i]); // TAKEIN

  if (flextrackarray.length)
    update_string += (update_string != ""? "\n" : "") + flextrackarray.join("\n");

  shared.trackaction((lendout && ((lent_out_person_key > 0 || lent_out_cperson_key > 0) || bld_key > 0)? "INSOUT" : "INSINN"), ingesloten[i], update_string);
}



function clear_properties(adapt, balie, ingesloten_i)
{
    var toaster = "";
    if (!adapt && (balie==1 || balie==2))
    {
        var clr_kenmerk_wis = false;
        var clr_kenmerk_arr = [];
        var clr_bijlage_arr = [];
        var sql = "SELECT k.ins_kenmerk_key"
                + "     , COALESCE (" + lcl.xsql("k.ins_kenmerk_omschrijving", "k.ins_kenmerk_key")
                + "              ,  " + lcl.xsql("s.ins_srtkenmerk_omschrijving", "s.ins_srtkenmerk_key") + ") kenmerk_omschrijving"
                + "     , w.ins_kenmerkdeel_waarde"
                + "     , s.ins_srtkenmerk_kenmerktype"
                + "     , k.ins_kenmerk_wissen"
                + "     , b.fac_bijlagen_key"
                + "  FROM ins_kenmerk k"
                + "     , ins_srtkenmerk s"
                + "     , ins_kenmerkdeel w"
                + "     , fac_bijlagen b"
                + " WHERE k.ins_kenmerk_key = w.ins_kenmerk_key"
                + "   AND k.ins_srtkenmerk_key = s.ins_srtkenmerk_key"
                + "   AND k.ins_kenmerk_niveau <> 'C'"
                + "   AND k.ins_kenmerk_verwijder IS NULL"
                + "   AND BITAND(k.ins_kenmerk_rolcode, 4) = 4"
                + "   AND k.ins_kenmerk_wissen = " + balie  //(lendout ? 2 : 1) // Als uitgeleend dan wissen bij inname.
                + "   AND w.ins_deel_key = " + ingesloten_i
                + "   AND b.fac_bijlagen_kenmerk_key(+) = k.ins_kenmerk_key"
                + "   AND b.fac_bijlagen_refkey(+) = w.ins_deel_key"
                + "   AND b.fac_bijlagen_module(+) = 'INS'"
                + "   AND b.fac_bijlagen_verwijder IS NULL";
        var oRs = Oracle.Execute(sql);
        while (!oRs.eof)
        {
            if (balie == 1) // Alleen voor TAKEIN
            {
                clr_kenmerk_wis = (clr_kenmerk_wis || (oRs("ins_kenmerk_wissen").Value == 1));
                clr_kenmerk_arr.push(oRs("ins_kenmerk_key").Value);
                if (oRs("ins_kenmerkdeel_waarde").Value)
                {
                    var track_oms = oRs("kenmerk_omschrijving").Value + ": "
                                  + oRs("ins_kenmerkdeel_waarde").Value + " --> "
                                  + "(" + L("lcl_empty") + ")";
                    flextrackarray.push(track_oms);
                }
            }
            if (oRs("fac_bijlagen_key").Value)
            {
                var params = flexProps("INS", ingesloten_i, String(oRs("ins_kenmerk_key").Value), "I");
                clr_bijlage_arr.push(params);
            }
            oRs.MoveNext();
        }
        oRs.Close();

        if (clr_kenmerk_arr.length > 0)
        {
            var clr_kenmerk_sql = "DELETE FROM ins_kenmerkdeel"
                                + " WHERE ins_deel_key = " + ingesloten_i
                                + "   AND ins_kenmerk_key IN (" + clr_kenmerk_arr.join(",") + ")";
            Oracle.Execute(clr_kenmerk_sql);
        }
        for (var i=0; i<clr_bijlage_arr.length; i++)
        {
            DeleteFile("", clr_bijlage_arr[i]);
        }
        if (balie == 1 && clr_kenmerk_wis)
        {
            toaster = L("lcl_obj_property_clear"); // toaster alleen bij innemen tonen.
        }
    }
    return toaster;
}


result.refresh = true;
Response.Write(JSON.stringify(result));
%>
<% ASPPAGE_END(); %>
