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

     File:         sle_edit_srtdeel_save.asp
     Description:  SUBMIT-form
*/ %>

<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../shared/save2db.inc" -->
<!-- #include file="../Shared/kenmerk_common.inc" -->
<%
FCLTHeader.Requires({ plugins:["jQuery"],
                      js: []
                    });

// De functie checkAutorisation(autfunction) geeft een Response.End indien er geen autorisatie voor autfunction wordt gevonden
var authparamsSLEBOF = user.checkAutorisation("WEB_SLEBOF");
user.auth_required_or_abort(authparamsSLEBOF.ALGwritelevel < 9 && authparamsSLEBOF.PRSwritelevel < 9);

var ins_srtdeel_key = getQParamInt("ins_srtdeel_key", -1);
var sletype = getFParam("sletype");

// Is er een ruimte string meegegeven? Dan sleutels en cilinders koppelen/gekoppeld.
var couple = Request.Form("roomArray").count > 0;

var BIND_RUIMTE = 0x01;
var BIND_WERKPL = 0x02;
var BIND_TERREI = 0x04;
var BIND_AFDELI = 0x08;
var BIND_PERSOO = 0x10;
var BIND_INSDEE = 0x20; // Onderdeel
srtdeel_binding = 0xFF; // Veronderstel nog even dat alles mag
var binding = 0;
var sleutel_binding = srtdeel_binding & (BIND_RUIMTE + BIND_TERREI + BIND_PERSOO);
var cilinder_binding = srtdeel_binding & (BIND_RUIMTE + BIND_TERREI);

function saveSrtKenmerkdeel(srtdeel_key, params)
{
    params = params || [];
    var currentKenmerkenSQL = "SELECT v.ins_kenmerk_key"
                            + "     , v.ins_kenmerkdeel_waarde"
                            + "     , ik.ins_kenmerk_toonbaar"
                            + "     , ik.fac_functie_key"
                            + "  FROM ins_kenmerkdeel v"
                            + "     , ins_kenmerk ik"
                            + " WHERE v.ins_kenmerkdeel_verwijder IS NULL"
                            + "   AND v.ins_kenmerk_key = ik.ins_kenmerk_key"
                            + "   AND ik.ins_kenmerk_bewerkniveau = 'S'"
                            + "   AND v.ins_deel_key = " + srtdeel_key; // herge/misbruik ins_deel_key

    var allKenmerkenSQL = "SELECT COALESCE (" + lcl.xsql("k.ins_kenmerk_omschrijving", "k.ins_kenmerk_key")
                        + "              ,  " + lcl.xsql("t.ins_srtkenmerk_omschrijving", "t.ins_srtkenmerk_key") + ") kenmerk_omschrijving"
                        + "     , t.ins_srtkenmerk_kenmerktype kenmerk_kenmerktype"
                        + "     , t.ins_srtkenmerk_systeem     kenmerk_systeem"
                        + "     , k.ins_kenmerk_toonbaar       kenmerk_readonly"
                        + "     , k.ins_kenmerk_uniek          kenmerk_uniek"
                        + "     , fac_kenmerkdomein_key"
                        + "  FROM ins_kenmerk k"
                        + "     , ins_srtkenmerk t"
                        + " WHERE k.ins_srtkenmerk_key = t.ins_srtkenmerk_key"
                        + "   AND k.ins_kenmerk_key = "; /* wordt in saveFlexkenmerken uitgebreid */

    var flextrack = saveFlexKenmerken(srtdeel_key,
                                      { kenmerkTable: "ins_kenmerkdeel",
                                        kenmerkParentKey : "ins_deel_key", // zal in de praktijk srtdeel_key zijn
                                        kenmerkWaarde: "ins_kenmerkdeel_waarde",
                                        kenmerkKey: "ins_kenmerk_key",
                                        kenmerkToonbaar: "ins_kenmerk_toonbaar",
                                        currentKenmerkenSQL: currentKenmerkenSQL,
                                        allKenmerkenSQL: allKenmerkenSQL,
                                        requestQF: Request.Form,
                                        flexPath: "INS/S",
                                        tracking: true,
                                        module: "INS",
                                        isNew: params.isNew,
                                        nameprefix: params.nameprefix ? params.nameprefix : null,
                                        extraserie: params.extraserie ? params.extraserie : null
                                      });
    return flextrack;
}
function doUpdateSrtDeel(ins_srtdeel_key, fields, params)
{
  sql = buildUpdate("ins_srtdeel", fields) + " ins_srtdeel_key = " + ins_srtdeel_key;

  var error = "";
  var err = Oracle.Execute(sql, true);
  if (err.friendlyMsg)
    error = err.friendlyMsg;
  else // de flex
  {
    saveSrtKenmerkdeel(ins_srtdeel_key, params);
  }

  return error;
}

function doInsertDeel(fields)
{
  fields.push({ dbs: "ins_deel_key",               typ: "key",          seq: "ins_s_ins_inst_keys" });
  var regIns = buildInsert("ins_deel", fields);
  var ins_deel_key = regIns.sequences["ins_deel_key"];
  sql = regIns.sql;
  var err = Oracle.Execute(sql, true);

  var error = "";
  if (err.friendlyMsg)
    error = err.friendlyMsg;

  return {ins_deel_key: ins_deel_key, warning: error};
}

function doInsertSrtDeel(fields, params)
{
  fields.push({ dbs: "ins_srtdeel_key",            typ: "key",          seq: "ins_s_ins_srtinst_keys" });
  var regIns = buildInsert("ins_srtdeel", fields);
  var ins_srtdeel_key = regIns.sequences["ins_srtdeel_key"];
  sql = regIns.sql;
  var err = Oracle.Execute(sql, true);

  var error = "";
  if (err.friendlyMsg)
    error = err.friendlyMsg;
  else // de flex
  {
    saveSrtKenmerkdeel(ins_srtdeel_key, params);
  }

  return {ins_srtdeel_key: ins_srtdeel_key, warning: error};
}

var fields =  [ { dbs: "ins_srtgroep_key",           typ: "key",          val: sletype=="S"?S("sle_ins_srt_groep_key"):S("cil_ins_srt_groep_key") },
                { dbs: "ins_srtdeel_code",           typ: "varchar",      frm: "srtcode" },
                { dbs: "ins_srtdeel_omschrijving",   typ: "varchar",      frm: "srtomschr" },
                { dbs: "ins_srtdeel_uitleenbaar",    typ: "key",          val: 1 },
                { dbs: "ins_srtdeel_module",         typ: "varchar",      val: "INS" }];

var warning = "";
var message = "";
var params = { isNew: ins_srtdeel_key <= 0
             };
if (!couple)
{
  if (sletype == "S")
  { // Sleutel
    binding = sleutel_binding;
  }
  else
  { // Cilinder
    binding = cilinder_binding;
  }

  fields.push({ dbs: "ins_srtdeel_binding",        typ: "key",          val: binding });

  if (ins_srtdeel_key > 0)
  {
    warning = doUpdateSrtDeel(ins_srtdeel_key, fields, params);
  }
  else
  { // nieuw objectsoort
    var insertInfo = doInsertSrtDeel(fields);
    warning = insertInfo.warning;
    ins_srtdeel_key = insertInfo.ins_srtdeel_key;
  }
}
else
{ // Sleutels en cilinders koppelen/gekoppeld.
  if (ins_srtdeel_key > 0)
  {
    // Kan deze situatie voorkomen
    // warning = doUpdateSrtDeel(ins_srtdeel_key, fields, params);

    // Cilinders toevoegen
  }
  else
  { // Nieuwe sleutels en cilinders aanmaken en aan elkaar koppelen.
    var sleaantal = getFParamInt("sleaantal");
    var roomArray = getFParamIntArray("roomArray");

    // Uitgangspunt is dat iedere ruimte (maximaal) één cilinder bevat (UWVA#22765).
    // Als de ruimte al een cilinderslot heeft dan beschouwen we dat als gebruikersfout.
    sql = "SELECT COUNT(ins_deel_key) aantal, MIN(alg_ruimte_aanduiding) alg_ruimte_aanduiding"
        + "  FROM ins_deel, alg_v_ruimte_gegevens arg"
        + " WHERE ins_alg_ruimte_key IN (" + roomArray.join(",") + ")"
        + "   AND ins_alg_ruimte_key = arg.alg_ruimte_key"
        + "   AND ins_alg_ruimte_type = 'R'"
        + "   AND ins_deel_verwijder IS NULL"
        + "   AND (ins_deel_vervaldatum IS NULL OR ins_deel_vervaldatum > TRUNC(SYSDATE))"
        + "   AND ins_srtdeel_key IN " // Alleen cilinders natuurlijk
        + "       (SELECT ins_srtdeel_key"
        + "          FROM ins_srtdeel"
        + "         WHERE ins_srtgroep_key = " + S("cil_ins_srt_groep_key") + ")";
    oRs = Oracle.Execute(sql);
    if (oRs("aantal").Value > 0)
    {
      abort_with_warning(L("lcl_cil_multiple").format(oRs("alg_ruimte_aanduiding").Value));
    }
    oRs.Close();

    // Sleutelsoort toevoegen
    var fields =  [ { dbs: "ins_srtgroep_key",           typ: "key",          val: S("sle_ins_srt_groep_key") },
                    { dbs: "ins_srtdeel_code",           typ: "varchar",      frm: "srtcode" },
                    { dbs: "ins_srtdeel_omschrijving",   typ: "varchar",      frm: "srtomschr" },
                    { dbs: "ins_srtdeel_binding",        typ: "key",          val: sleutel_binding },
                    { dbs: "ins_srtdeel_uitleenbaar",    typ: "key",          val: 1 },
                    { dbs: "ins_srtdeel_module",         typ: "varchar",      val: "INS" }];
    var insertInfo = doInsertSrtDeel(fields, params);
    warning = insertInfo.warning;
    if (warning)
        abort_with_warning(warning);
    var sle_srtdeel_key = insertInfo.ins_srtdeel_key;
    ins_srtdeel_key = sle_srtdeel_key;

    // Cilindersoort toevoegen
    // TODO: Wat moet er voor de code en omschrijving van de cilindersoort?
    //       Nu tijdelijk maar "CIL" en "Cilinder "
    var fields =  [ { dbs: "ins_srtgroep_key",           typ: "key",          val: S("cil_ins_srt_groep_key") },
                    { dbs: "ins_srtdeel_code",           typ: "varchar",      frm: "srtcode" },
                    { dbs: "ins_srtdeel_omschrijving",   typ: "varchar",      frm: "srtomschr" },
                    { dbs: "ins_srtdeel_binding",        typ: "key",          val: cilinder_binding },
                    { dbs: "ins_srtdeel_uitleenbaar",    typ: "key",          val: 1 },
                    { dbs: "ins_srtdeel_module",         typ: "varchar",      val: "INS" }];

    insertInfo = doInsertSrtDeel(fields, { isNew: params.isNew, nameprefix: "kk", extraserie: true });
    if (insertInfo.warning)
        abort_with_warning(insertInfo.warning);

    var cil_srtdeel_key = insertInfo.ins_srtdeel_key;

    // Sleutelsoort koppelen aan cilindersoort.
    sql = "INSERT INTO ins_srtdeel_srtdeel"
        + " ( ins_srtdeel_key_2"
        + " , ins_srtdeel_key_1"
        + " , ins_module)"
        + " VALUES "
        + " (" + sle_srtdeel_key
        + ", " + cil_srtdeel_key
        + ", 'SLE')";
    Oracle.Execute(sql);

    // Eigen werkplek
    var locatie_key = user.alg_locatie_key();
    //var gebouw_key = user.alg_gebouw_key();
    //var verdieping_key = user.alg_verdieping_key();
    var ruimte_key = user.alg_ruimte_key();

    // Sleutels toevoegen
    for (var i = 0; i < sleaantal; i++)
    {
      var fields = [ { dbs: "ins_srtdeel_key",            typ: "key",          val: sle_srtdeel_key },
                     { dbs: "ins_alg_locatie_key",        typ: "key",          val: locatie_key },
                     { dbs: "ins_alg_ruimte_key",         typ: "key",          val: ruimte_key },
                     { dbs: "ins_alg_ruimte_type",        typ: "varchar",      val: "R" }];

      // Als voor de discipline is aangegeven dat niet automatische genummerd dient te worden zal dat voor multi objecten toch altijd moeten blijven.
      // Omschrijving met uniek volgnummer erin bepalen.
      sql = "SELECT ins.nextdescription(ins_srtdeel_code, NULL) description"
          + "  FROM ins_srtdeel"
          + " WHERE ins_srtdeel_key = " + sle_srtdeel_key;
      oRs = Oracle.Execute(sql);
      if (!oRs.eof)
      {
        var desc =  oRs("description").value;
        fields.push({ dbs: "ins_deel_omschrijving",      typ: "varchar",      val: desc});
      }

      var insertInfo = doInsertDeel(fields);
      if (insertInfo.warning)
          abort_with_warning(insertInfo.warning);

      var sle_deel_key = insertInfo.ins_deel_key;
    }

    // Cilinders toevoegen en koppelen aan een ruimte
    sql = "SELECT aob.alg_ruimte_key"
        + "     , aob.alg_verdieping_key"
        + "     , aob.alg_gebouw_key"
        + "     , aob.alg_locatie_key"
        + "  FROM alg_v_onrgoed_boom aob"
        + " WHERE aob.alg_ruimte_key IN (" + roomArray.join(",") + ")";
    oRs = Oracle.Execute(sql);

    while (!oRs.eof)
    {
      var fields =  [ { dbs: "ins_srtdeel_key",            typ: "key",          val: cil_srtdeel_key },
                      { dbs: "ins_alg_locatie_key",        typ: "key",          val: oRs("alg_locatie_key").value },
                      { dbs: "ins_alg_ruimte_key",         typ: "key",          val: oRs("alg_ruimte_key").value },
                      { dbs: "ins_alg_ruimte_type",        typ: "varchar",      val: "R" },
                      { dbs: "ins_alg_ruimte_key_org",     typ: "key",          val: ruimte_key },
                      { dbs: "ins_alg_ruimte_type_org",    typ: "varchar",      val: "R" }];

      // Omschrijving met uniek volgnummer erin bepalen.
      sql = "SELECT ins.nextdescription(ins_srtdeel_code, NULL) description"
          + "  FROM ins_srtdeel"
          + " WHERE ins_srtdeel_key = " + cil_srtdeel_key;
      oRs1 = Oracle.Execute(sql);
      var desc = oRs1("description").value;
      fields.push({ dbs: "ins_deel_omschrijving",      typ: "varchar",      val: desc});
      oRs1.Close();

      var insertInfo = doInsertDeel(fields);
      if (insertInfo.warning)
          abort_with_warning(insertInfo.warning);

      var cil_deel_key = insertInfo.ins_deel_key;
      oRs.MoveNext();
    }
  }
}
%>
<html>
  <head>
    <%  FCLTHeader.Generate() %>
    <script>
        $(function()
        {
          FcltMgr.closeDetail(window, { ins_srtdeel_key: <%=ins_srtdeel_key%>,
                                        warning: "<%=safe.jsstring(warning || message)%>",
                                        keepForm: <%=warning != ""? "true" : "false"%>,
                                        couple: <%=couple? "true" : "false"%>,
                                        refresh: true
                                      });
        });
    </script>
  </head>
  <body>
  </body>
</html>
<% ASPPAGE_END(); %>
