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

     File:         ins_edit_deel_save.asp
     Description:  SUBMIT-form
*/
var JSON_Result = true;
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../shared/save2db.inc" -->
<!-- #include file="../Shared/kenmerk_common.inc" -->
<!-- #include file="./ins.inc" -->
<%
var obj_key = getQParamInt("ins_key", -1 );
var urole = getQParamSafe("urole");
var parent_key = getQParamInt("parent_key", -1);
var ins_copy = getFParamInt("ins_copy", 0) == 1;
var ins_copy_key = getFParamInt("ins_copy_key", -1);

var bind = "";
var bind_key = -1;
var flextrackarray = [];

var free = getFParamInt("free", 0);

var loc = getFParamInt("locatiekey", -1);
var dept_key = getFParamInt ("sDept", -1 );
var prs_key = getFParamInt ("sPerson", -1 );
var cntprs_key = getFParamInt ("sCntPers", -1 );
var bld_key = getFParamInt ("gebouwkey", -1 );
var floor_key = getFParamInt ("verdiepingkey", -1);
var room_key = getFParamInt ("ruimtekey", -1 );
var wp_key = getFParamInt ("werkplekkey", -1 );
var desc = getFParam("desc", "");

var lent_out_person = getFParamInt("lent_out_person", -1);

var srtdeel_key = getFParamInt("srtdeel");
if (ins.isSleCil(srtdeel_key, "S"))
  var autfunction = "WEB_SLEBOF";
else
  var autfunction = urole == "fo"? "WEB_INSFOF" : "WEB_INSMAN";

var authparams = user.checkAutorisation(autfunction);

if(dept_key > 0)
{
  bind_key = dept_key;
  bind = "A";
}

if(prs_key > 0)
{
  bind_key = prs_key;
  bind = "P";
}

if(cntprs_key > 0)
{
  bind_key = cntprs_key;
  bind = "C";
}

if(bld_key > 0)
 {
  bind_key = bld_key;
  bind = "T";
 }

if(room_key > 0)
{
  bind_key = room_key;
  bind = "R";
}

if(wp_key > 0)
{
  bind_key = wp_key;
  bind = "W";
}

var warning = "";
if (obj_key > 0)
{
  var sql = "SELECT sg.ins_discipline_key"
          + "     , ins_deel_parent_key"
          + "  FROM ins_deel d, "
          + "       ins_srtdeel sd, "
          + "       ins_srtgroep sg"
          + " WHERE d.ins_srtdeel_key = sd.ins_srtdeel_key"
          + "   AND sg.ins_srtgroep_key = sd.ins_srtgroep_key"
          + "   AND d.ins_deel_key = " + obj_key;
  var oRs = Oracle.Execute(sql);
  var disc_key = oRs("ins_discipline_key").Value;
  var parent_key = oRs("ins_deel_parent_key").Value;
  oRs.Close()

  lcl.set_dialect(disc_key, "INS_DISCIPLINE_KEY");

  // Let op als je hier nieuwe velden toevoegt: nieuwe objecten hebben eigen fields-object (MGE: Dan ook maar binnen if statement declareren)
  var fields =  [ { dbs: "ins_deel_x",                       typ: "float",   frm: "xcoord",       track: L("lcl_obj_geoxcoord") },
                  { dbs: "ins_deel_y",                       typ: "float",   frm: "ycoord",       track: L("lcl_obj_geoycoord") },
                  { dbs: "ins_alg_locatie_key",              typ: "key",     frm: "locatiekey"    /* tracking niet nodig */ },
                  { dbs: "ins_deel_vervaldatum",             typ: "date",    frm: "vervaldatum",  track: L("lcl_ins_vervaldatum") },
                  { dbs: "ins_deel_aanmaak",                 typ: "date",    frm: "aanmaakdatum", track: L("lcl_last_action") },
                  { dbs: "prs_perslid_key_beh",              typ: "key",     frm: "ins_manager",  track: L("lcl_ins_manager"), foreign: "prs_perslid"  },
                  { dbs: "ins_deel_opmerking",               typ: "varchar", frm: "opmerk",       track: L("lcl_ins_opmerking")},
                  { dbs: "ins_deel_actief",                  typ: "check0",  frm: "ins_actief",   track: L("lcl_ins_active") },
                  { dbs: "ins_deel_image",                   typ: "varchar", frm: "deel_image",   track: L("lcl_ins_deel_image") },
                  { dbs: "ins_deel_flag",                    typ: "number",  frm: "insflag",      track: L("lcl_ins_flags") } ];

  if (hasFParam("count")) // Sla gewoon op als het wordt meegegeven
    fields.push({ dbs: "ins_deel_aantal",                  typ: "float",  frm: "count",        track: L("lcl_amount") });
  // Checken of het eenheden selectveld met dagen/uren bij "Uitvoertijd" niet readonly was en wel is meegegeven.
  // Als dit eenheden selectieveld readonly was dan is er geen waarde voor uitvoertijd ingevuld en moeten beide waarden null worden.
  fields = shared.add_time_field(fields, "ins_deel_t_uitvoertijd",   "uitvoertijd",   "dayshours", {tracktijdsduur: L("lcl_ins_uitvoertijd"), trackeenheid: L("lcl_ins_uitvoertijd_eenheid")});

  var alg_ruimte_key_parent = -1;
  var alg_ruimte_type_parent = "";
  if (parent_key > 0)
  {
    var sql = "SELECT ins_alg_ruimte_key"
            + "     , ins_alg_ruimte_type"
            + "  FROM ins_deel"
            + " WHERE ins_deel_key = " + parent_key;
    var oRs = Oracle.Execute(sql);
    alg_ruimte_key_parent = oRs("ins_alg_ruimte_key").Value;
    alg_ruimte_type_parent = oRs("ins_alg_ruimte_type").Value;
    oRs.Close;
  }

  if (bind_key > 0 && bind != "")
  {
    var new_bind_key = bind_key;
    var new_bind = bind;
    if (parent_key > 0)
    {
      if (alg_ruimte_key_parent == bind_key && alg_ruimte_type_parent == bind)
      {
        new_bind_key = -1;
        new_bind = "";
      }
    }
    fields.push({ dbs: "ins_alg_ruimte_key",   typ: "key",     val: new_bind_key,  track: true /* afzonderlijke tracking, wel oldjsval */ });
    fields.push({ dbs: "ins_alg_ruimte_type",  typ: "varchar", val: new_bind,      track: true /* afzonderlijke tracking, wel oldjsval */ });
  }

  // Heb ik de juiste rechten
  var this_ins = ins.func_enabled_deel(obj_key);
  user.auth_required_or_abort(this_ins.canChange || this_ins.canChangeOwn); // dat is toch wel het minste

  if (urole != "fo")
  {
    sql = "SELECT r.alg_verdieping_key"
        + "  FROM alg_ruimte r"
        + "     , ins_v_deelenonderdeel d"
        + " WHERE R.alg_ruimte_key = d.ins_alg_ruimte_key"
        + "   AND d.ins_alg_ruimte_type = 'R'"
        + "   AND d.ins_deel_key = " + obj_key;
    oRs = Oracle.Execute(sql);
    if (!oRs.eof)
    {
      var verd_key = oRs("alg_verdieping_key").Value;
      if (verd_key != floor_key)
      {
        fields.push({ dbs: "ins_deel_dwgx", typ: "float", val: "" });
        fields.push({ dbs: "ins_deel_dwgy", typ: "float", val: "" });
      }
    }
    oRs.Close();

    fields.push({ dbs: "ins_deel_omschrijving",      typ: "varchar",      val: desc, track: L("lcl_obj_identification") });

    //sql = buildUpdate("ins_deel", fields) + " ins_deel_key = " + obj_key;
    // insUpd heeft na afloop handige oldjsvals
    var insUpd = buildTrackingUpdate("ins_deel", " ins_deel_key = " + obj_key, fields);

    // Submit the changed data
    var err = Oracle.Execute(insUpd.sql, true);
    if (err.friendlyMsg)
        warning = err.friendlyMsg;

    // tracking plaats/eigenaar is ingewikkelder (key en type en slechts één track gewenst), die doen we handmatig
    // ins_alg_ruimte_key (bind_key) en ins_alg_ruimte_type (bind) bevatten reeds de nieuwe waardes
    if (parent_key > 0)
    {
      bind = "I";
    }
    var newtxt = ins.getBindingItemString(bind, bind_key, parent_key);
    var old_bind_key = insUpd.oldjsvals["ins_alg_ruimte_key"];
    var old_bind = insUpd.oldjsvals["ins_alg_ruimte_type"];
    // Als de oude plaats/eigenaar gelijk was aan die van de parent, dan waren de ins_alg_ruimte_key en ins_alg_ruimte_type beiden null en moet die van de parent genomen worden.
    if (parent_key > 0 && old_bind_key == null && old_bind == null)
    {
      old_bind_key = alg_ruimte_key_parent;
      old_bind = alg_ruimte_type_parent;
    }
    var oldtxt = ins.getBindingItemString(old_bind, old_bind_key, parent_key); // parent_key kan niet gewijzigd worden.
    if (oldtxt != newtxt)
      insUpd.trackarray.push(L("lcl_owner_info") + ": " + buildTrackText("varchar", oldtxt, newtxt, { nodiff: true }));
  }

  if (!warning)
  {
      // Kenmerken updaten.
      flextrackarray = ins.updateKenmerkdeel(obj_key);
  }

  var updatetrackarray = [];
  if (insUpd && insUpd.trackarray)
    updatetrackarray = insUpd.trackarray;

  if (updatetrackarray.length || flextrackarray.length)
    ins.trackdeelupdate(obj_key, L("lcl_ins_is_insupd") + "\n" + updatetrackarray.concat(flextrackarray).join("\n"));
}
else
{ // Nieuw.
  // Voor nieuwe objecten worden het aantal objecten per stuk aangemaakt.
  var i_count = getFParamInt("count", -1);
  var srtdeel_key = getFParamInt("srtdeel");

  // Voor objecten die geen sleutels/cilinders zijn de schrijfrechten controleren i.v.m. scope. Voor nieuwe sleutels/cilinders is standaard autorisatie voldoende.
  // Autorisatie kan scherper
  if (ins.isSleCil(srtdeel_key, "S"))
  { //  Het is een nieuwe sleutel/cilinder. Alleen alg scope
    var iresult = user.func_enabled("SLE",
                                    null, // ins_discipline doet niet ter zake
                                    bind_key, // alg_key
                                    null); // hier zou alleen een prs_key in mogen, we testen zo afzonderlijk
    if (!iresult || !iresult.canWrite("WEB_SLEBOF"))
      abort_with_warning(L("lcl_obj_notallowed")); // Schrijven niet toegestaan
  }
  else
  { // Objecten die geen sleutel/cilinder zijn. Discipline en alg scope
    sql = "SELECT ins_discipline_key"
        + "  FROM ins_srtdeel isd, ins_srtgroep isg"
        + " WHERE isd.ins_srtgroep_key = isg.ins_srtgroep_key"
        + "   AND ins_srtdeel_key = " + srtdeel_key;
    oRs = Oracle.Execute(sql);
    var disc_key = oRs("ins_discipline_key").Value;
    oRs.Close();

    // De schrijfrechten controleren i.v.m. discipline en alg scope
    var iresult = ins.func_enabled_scope(disc_key, bind, bind_key);
    if (!iresult || !iresult.canAdd)
      abort_with_warning(L("lcl_obj_notallowed")); // combinatie niet toegestaan
    lcl.set_dialect(disc_key, "INS_TAB_DISCIPLINE_KEY");
  }

  var doExplode = S("ins_explode_objects") & 1;
  if (S("ins_explode_objects") & 2) { // Gebruiker kiest zelf
    doExplode = getFParamInt("has_explode", 0) == 1 && getFParam("explode", "off") == "on" ? 1 : 0;
  }

  if (!doExplode || i_count < 1) {
    i_count = 1;
  }

  for(c = 0; c < i_count; c++) {
    var fields =  [ { dbs: "ins_deel_x",                         typ: "float",       frm: "xcoord" },
                    { dbs: "ins_deel_y",                         typ: "float",       frm: "ycoord" },
                    { dbs: "ins_alg_locatie_key",                typ: "key",         frm: "locatiekey" },
                    { dbs: "ins_deel_vervaldatum",               typ: "date",        frm: "vervaldatum" },
                    { dbs: "ins_deel_aanmaak",                   typ: "date",        frm: "aanmaakdatum" },
                    { dbs: "prs_perslid_key_beh",                typ: "key",         frm: "ins_manager", foreign: "prs_perslid" },
                    { dbs: "ins_deel_opmerking",                 typ: "varchar",     frm: "opmerk"},
     // bewust niet: { dbs: "ins_deel_actief",                    typ: "check0",      frm: "ins_actief"}
                    { dbs: "ins_alg_ruimte_key",                 typ: "key",         val: bind_key },
                    { dbs: "ins_alg_ruimte_type",                typ: "varchar",     val: bind } ];

    if (!doExplode) {
      fields.push({ dbs: "ins_deel_aantal",                  typ: "float",  frm: "count" });
    } /* else {
      // DB default van 1 wordt gebruikt
    } */

    // Checken of het eenheden selectveld met dagen/uren bij "Uitvoertijd" niet readonly was en wel is meegegeven.
    // Als dit eenheden selectieveld readonly was dan wordt deze niet opgeslagen en dan moet de tijdsduur ook niet opgeslagen worden.
    fields = shared.add_time_field(fields, "ins_deel_t_uitvoertijd",   "uitvoertijd",   "dayshours");

    if (c == 0)
    {
        fields.push({ dbs: "ins_deel_omschrijving",   typ: "varchar",  val: desc})
    }
    else
    { // Get default description for object for sequence of inserts
      // Als een nummer is gegeven als default code voor een onderdeel dan nummeren we stug door.
      // Als voor de discipline is aangegeven dat niet automatische genummerd dient te worden zal dat voor multi objecten toch altijd moeten blijven.
      if (parent_key > 0 && !isNaN(parseInt(desc, 10)))
      {
        __Log("Stug doornummeren van onderdelen. Na " + desc + " komt ...")
        desc = '' + (1 + parseInt(desc,10))

        fields.push({ dbs: "ins_deel_omschrijving",   typ: "varchar",  val: desc})
      }
      else
      {
        sql = "SELECT ins.nextdescription(ins_srtdeel_code, " + (parent_key < 0 ? "NULL" : parent_key) + ")"
            + "  FROM ins_srtdeel"
            + " WHERE ins_srtdeel_key = " + srtdeel_key;
        oRs = Oracle.Execute(sql);
        if (!oRs.eof)
        {
          desc = oRs(0).Value;
          fields.push({ dbs: "ins_deel_omschrijving",   typ: "varchar",  val: desc})
        }
        oRs.Close();
      }
    }
      fields.push({ dbs: "ins_deel_key",           typ: "key",      seq: "ins_s_ins_inst_keys" });
      fields.push({ dbs: "ins_srtdeel_key",        typ: "key",      val: srtdeel_key });

      if (parent_key > 0)
        fields.push({ dbs: "ins_deel_parent_key",  typ: "key",      val: parent_key });

      var regIns = buildInsert("ins_deel", fields);
      var obj_key = regIns.sequences["ins_deel_key"];
      sql = regIns.sql;
      var err = Oracle.Execute(sql, true);

      if (err.friendlyMsg)
        warning = err.friendlyMsg;

      if (!warning) {
        if (ins_copy) { // Kopieer ook het ins_deel_image
          copyLinkedFile("INSPHD", ins_copy_key, obj_key);
        }
        // Kenmerken opslaan.
        flextrackarray = ins.updateKenmerkdeel (obj_key, {isnew: true, copy: ins_copy, copy_key: ins_copy_key, sort: srtdeel_key });
        // Flextrackarray wordt niet gebruikt voor tracking bij nieuw object. Alle velden zijn nieuw
        shared.trackaction("INSNEW", obj_key);
      }
  } // for i_count
}

var result = { success: (warning == "")
             , ins_key: obj_key
             , warning: warning
             , keepForm: (warning?true:false)
             , urole: urole
             , refresh: true
             };

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