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


     File:               cnt_edit_scope_save.asp
     Description:        SUBMIT-form
                         cnt_srtcontract_type                Scope
                         [1] Onderhoud/Maintenance           Objecten
                         [2] Huur/Rental                     Onroerend goed (ruimten/terreinen)
                         [3] Ondersteuning/Support           Plaats (locatie, gebouw, verdieping, ruimte, terrein) en/of objecten
                         [4] Algemeen/Generic                Geen
                         [5] Leverancier/Supplier            Plaats (locatie, gebouw, verdieping, ruimte, terrein)
                         [6] Mantel/Master                   Geen
     Parameters:


     Context:
     Note:
*/
var JSON_Result = true;

%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../shared/save2db.inc" -->
<%
protectRequest.validateToken();

var autfunction = "WEB_CNTMAN";
var authparams = user.checkAutorisation(autfunction);

var cnt_key = getFParamInt("cnt_key");
var trackScope = [];

// Hier zelf uitzoeken welke scope selectoren opgeslagen moeten worden afhankelijk van contracttype
sql = "SELECT cdp.cnt_srtcontract_type"
    + "  FROM cnt_contract c"
    + "     , cnt_disc_params cdp"
    + " WHERE c.ins_discipline_key = cdp.cnt_ins_discipline_key"
    + "   AND c.cnt_contract_key = " + cnt_key;
oRs = Oracle.Execute(sql);
var cnt_srtcontract_type = oRs("cnt_srtcontract_type").value;
oRs.Close();

// Bijwerken object scope (INS)
if (cnt_srtcontract_type == 1)
{
  var object_key;
  var contract_object_key_arr = [];
  var cnt_obj = getFParamInt("objcnt");

  // Verwijderen van de items die niet geselecteerd waren
  // Geselecteerde items hoeven niet verwijderd te worden (NOT IN(...))
  for (i = 1; i <= cnt_obj; i++)
  {
    object_key = getFParamInt("k" + i, -2);
    // object_key is -2 voor verwijderde items, -1 voor nieuwe items en een key voor alle andere gevallen
    if (object_key > 0)
    {
      contract_object_key_arr.push(object_key);
    }
  }

  // Eerst de DELETE
  var sql = "SELECT co.cnt_contract_object_key"
          + "     , id.ins_deel_omschrijving"
          + "       || CASE WHEN sd.ins_srtdeel_omschrijving IS NULL"
          + "               THEN ''"
          + "               ELSE ' (' || sd.ins_srtdeel_omschrijving || ')'"
          + "          END omschrijving"
          + "  FROM cnt_contract_object co"
          + "     , ins_deel id"
          + "     , ins_srtdeel sd"
          + " WHERE sd.ins_srtdeel_key = id.ins_srtdeel_key"
          + "   AND co.cnt_ins_deel_key = id.ins_deel_key"
          + "   AND co.cnt_contract_key = " + cnt_key
          + ( contract_object_key_arr.length > 0
            ? "   AND co.cnt_contract_object_key NOT IN (" + contract_object_key_arr.join(",") + ")"
            : "   AND co.cnt_ins_deel_key IS NOT NULL"
            );
  var oRs = Oracle.Execute(sql);
  while (!oRs.eof)
  {
    trackScope.push(L("lcl_deleted0").format(oRs("omschrijving").Value));
    oRs.MoveNext();
  }
  oRs.Close();
  var sql = "DELETE FROM cnt_contract_object"
          + " WHERE cnt_contract_key = " + cnt_key
          + ( contract_object_key_arr.length > 0
            ? "   AND cnt_contract_object_key NOT IN (" + contract_object_key_arr.join(",") + ")"
            : "   AND cnt_ins_deel_key IS NOT NULL"
            );
  var err = Oracle.Execute(sql, true);
  if (err.friendlyMsg)
  {
    abort_with_warning(err.friendlyMsg);
  }

  // Toevoegen van de items die toegevoegd moeten worden
  for (i = 1; i <= cnt_obj; i++)
  {
    object_key = getFParamInt("k" + i, -2);
    // object_key is -2 voor verwijderde items, -1 voor nieuwe items en een key voor alle andere gevallen
    if (object_key == -1)
    { // Dan de INSERT
      // Omschrijving van het deel voor tracking ophalen.
      var deel_key = getFParamInt("kd" + i);
      var deel_oms = "";
      var srtdeel_key;
      var sql = "SELECT d.ins_deel_omschrijving"
              + "       || CASE WHEN s.ins_srtdeel_omschrijving IS NULL"
              + "               THEN ''"
              + "               ELSE ' (' || s.ins_srtdeel_omschrijving || ')'"
              + "          END omschrijving"
              + "     , d.ins_srtdeel_key"
              + "  FROM ins_deel d"
              + "     , ins_srtdeel s"
              + " WHERE d.ins_srtdeel_key = s.ins_srtdeel_key"
              + "   AND d.ins_deel_key = " + deel_key;
      var oRs = Oracle.Execute(sql);
      if (!oRs.eof)
        deel_oms = oRs("omschrijving").Value;
        srtdeel_key = oRs("ins_srtdeel_key").Value;
      oRs.Close();

      var fields = [ {dbs: "cnt_contract_object_key", typ: "key", seq: "cnt_s_cnt_contract_object_key"}
                   , {dbs: "cnt_contract_key", typ: "key", val: cnt_key}
                   , {dbs: "cnt_ins_srtdeel_key", typ: "key", val: srtdeel_key}
                   , {dbs: "cnt_ins_deel_key", typ: "key", val: deel_key}
                   ];
      var cntIns = buildInsert("cnt_contract_object", fields);
      cntIns.trackarray = L("lcl_inserted0").format(deel_oms);

      var err = Oracle.Execute(cntIns.sql, true);
      if (err.friendlyMsg)
      {
        abort_with_warning(err.friendlyMsg);
      }
      trackScope = trackScope.concat(cntIns.trackarray);
   }
  }
}

// Bijwerken objectsoort scope (INS)
if (cnt_srtcontract_type == 3)
{
  var srtobject_key;
  contract_srtobject_key_arr = [];
  var cnt_os = getFParamInt("oscnt");

  // Verwijderen van de items die niet geselecteerd waren
  // Geselecteerde items hoeven niet verwijderd te worden (NOT IN(...))
  for (i = 1; i <= cnt_os; i++)
  {
    srtobject_key = getFParamInt("sk" + i, -2);
    // object_key is -2 voor verwijderde items, -1 voor nieuwe items en een key voor alle andere gevallen
    if (srtobject_key > 0)
    {
      contract_srtobject_key_arr.push(srtobject_key);
    }
  }

  // Eerst de DELETE
  var sql = "SELECT co.cnt_contract_object_key"
          + "     , sd.ins_srtdeel_omschrijving"
          + "  FROM cnt_contract_object co"
          + "     , ins_srtdeel sd"
          + " WHERE co.cnt_ins_srtdeel_key = sd.ins_srtdeel_key"
          + "   AND co.cnt_contract_key = " + cnt_key
          + ( contract_srtobject_key_arr.length > 0
            ? "   AND co.cnt_contract_object_key NOT IN (" + contract_srtobject_key_arr.join(",") + ")"
            : "   AND co.cnt_ins_deel_key IS NULL"
            );
  var oRs = Oracle.Execute(sql);
  while (!oRs.eof)
  {
    trackScope.push(L("lcl_deleted0").format(oRs("ins_srtdeel_omschrijving").Value));
    oRs.MoveNext();
  }
  oRs.Close();
  var sql = "DELETE FROM cnt_contract_object"
          + " WHERE cnt_contract_key = " + cnt_key
          + ( contract_srtobject_key_arr.length > 0
            ? "   AND cnt_contract_object_key NOT IN (" + contract_srtobject_key_arr.join(",") + ")"
            : "   AND cnt_ins_deel_key IS NULL"
            );
  var err = Oracle.Execute(sql, true);
  if (err.friendlyMsg)
  {
    abort_with_warning(err.friendlyMsg);
  }

  // Toevoegen van de items die toegevoegd moeten worden
  for (i = 1; i <= cnt_os; i++)
  {
    srtobject_key = getFParamInt("sk" + i, -2);
    // object_key is -2 voor verwijderde items, -1 voor nieuwe items en een key voor alle andere gevallen
    if (srtobject_key == -1)
    { // Dan de INSERT
      // Omschrijving van objectsoort voor tracking ophalen.
      var srtdeel_key = getFParamInt("skd" + i);
      var srtdeel_oms = "";
      var sql = "SELECT ins_srtdeel_omschrijving"
              + "  FROM ins_srtdeel"
              + " WHERE ins_srtdeel_key = " + srtdeel_key;
      var oRs = Oracle.Execute(sql);
      if (!oRs.eof)
        srtdeel_oms = oRs("ins_srtdeel_omschrijving").Value;
      oRs.Close();

      var fields = [ {dbs: "cnt_contract_object_key", typ: "key", seq: "cnt_s_cnt_contract_object_key"}
                   , {dbs: "cnt_contract_key", typ: "key", val: cnt_key}
                   , {dbs: "cnt_ins_srtdeel_key", typ: "key", val: srtdeel_key}
                   ];
      var cntIns = buildInsert("cnt_contract_object", fields);
      cntIns.trackarray = L("lcl_inserted0").format(srtdeel_oms);

      var err = Oracle.Execute(cntIns.sql, true);
      if (err.friendlyMsg)
      {
        abort_with_warning(err.friendlyMsg);
      }
      trackScope = trackScope.concat(cntIns.trackarray);
    }
  }
}

// Bijwerken locatie/gebouw scope (ALG)
if (cnt_srtcontract_type == 3 || cnt_srtcontract_type == 5)
{
  var plaats_key;
  var cnt_lb = getFParamInt("loccnt"); // Aantal scope's voor locatie/gebouw

  // Verwijderen van de items die niet geselecteerd waren
  // Geselecteerde items hoeven niet verwijderd te worden (NOT IN(...))
  var contract_plaats_key_arr = [];
  for (i = 1; i <= cnt_lb; i++)
  {
    plaats_key = getFParamInt("ak" + i, -2);
    // plaats_key is -1 voor nieuwe items en een key voor aanwezige items
    if (plaats_key > 0)
    { // so a non-removed previously existing row
      contract_plaats_key_arr.push(plaats_key);
    }
  }

  // Eerst de DELETE
  var sql = "SELECT cp.cnt_contract_plaats_key"
          + "     , pa.alg_plaatsaanduiding"
          + "  FROM cnt_contract_plaats cp"
          + "     , alg_v_plaatsaanduiding pa"
          + " WHERE cp.cnt_alg_plaats_key = pa.alg_onroerendgoed_keys"
          + "   AND cp.cnt_alg_plaats_code = pa.alg_onroerendgoed_type"
          + "   AND cp.cnt_contract_key = " + cnt_key
          + ( contract_plaats_key_arr.length > 0 
            ? "   AND cp.cnt_contract_plaats_key NOT IN (" + contract_plaats_key_arr.join(",") + ")"
            : ""
            );
  var oRs = Oracle.Execute(sql);
  while (!oRs.eof)
  { // Verzamel tracking van alle te verwijderen plaatsen.
    trackScope.push(L("lcl_deleted0").format(oRs("alg_plaatsaanduiding").Value));
    oRs.MoveNext();
  }
  oRs.Close();
  var sql = "DELETE FROM cnt_contract_plaats"
          + " WHERE cnt_contract_key = " + cnt_key
          + ( contract_plaats_key_arr.length > 0 
            ? "   AND cnt_contract_plaats_key NOT IN (" + contract_plaats_key_arr.join(",") + ")"
            : "   AND cnt_contract_plaats_key IS NOT NULL"
            );
  var err = Oracle.Execute(sql, true);
  if (err.friendlyMsg)
  {
    abort_with_warning(err.friendlyMsg);
  }

  // Toevoegen van de items die toegevoegd moeten worden
  for (i = 1; i <= cnt_lb; i++)
  {
    plaats_key = getFParamInt("ak" + i, -2);
    // plaats_key is -2 voor verwijderde items, -1 voor nieuwe items en een key voor alle andere gevallen
    if (plaats_key > -2)
    { // Plaats ophalen voor tracking.
      var alg_keys = getFParamInt("akd" + i);
      var alg_code = getFParam("akt" + i);
      var alg_plaats = "";
      var sql = "SELECT alg_plaatsaanduiding"
              + "  FROM alg_v_plaatsaanduiding"
              + " WHERE alg_onroerendgoed_keys = " + alg_keys
              + "   AND alg_onroerendgoed_type = " + safe.quoted_sql(alg_code);
      var oRs = Oracle.Execute(sql);
      if (!oRs.eof)
        alg_plaats = oRs("alg_plaatsaanduiding").Value;
      oRs.Close();

      // cnt_contract_plaats_gewicht is van datatype NUMBER(11,2), dus twee decimalen.
      gewicht = Math.round(getFParamFloat("akn" + i) * 100) / 100; // 100 = Math.pow(10, 2) waarin 2 het aantal decimalen
      if (plaats_key == -1)
      { // Dan de INSERT
        var fields = [ { dbs: "cnt_contract_plaats_key", typ: "key", seq: "cnt_s_cnt_contract_plaats_key"}
                     , { dbs: "cnt_contract_key", typ: "key", val: cnt_key}
                     , { dbs: "cnt_alg_plaats_code", typ: "varchar", val: alg_code}
                     , { dbs: "cnt_alg_plaats_key", typ: "key", val: alg_keys}
                     ];
        var trackgewicht = "";
        if (!isNaN(gewicht))
        {
          fields.push({ dbs: "cnt_contract_plaats_gewicht", typ: "float", val: gewicht});
          trackgewicht = ", " + L("cnt_contract_plaats_gewicht") + ": " + gewicht;
        }
        var cntUpsert = buildInsert("cnt_contract_plaats", fields);
        cntUpsert.trackarray = L("lcl_inserted0").format(alg_plaats) + trackgewicht;
      }
      else if (!isNaN(plaats_key))
      { // Dan de UPDATE
        var fields = [{ dbs: "cnt_contract_plaats_gewicht", typ: "float", val: (!isNaN(gewicht) ? gewicht : null), track: L("cnt_contract_plaats_gewicht")}];
        var cntUpsert = buildTrackingUpdate("cnt_contract_plaats", "cnt_contract_plaats_key = "+ plaats_key, fields);
        if (cntUpsert.trackarray.length)
          cntUpsert.trackarray = L("lcl_updated") + " " + alg_plaats + ", " + cntUpsert.trackarray[0]
      }

      if (cntUpsert.trackarray.length)
      {
        var err = Oracle.Execute(cntUpsert.sql, true);
        if (err.friendlyMsg)
        {
          abort_with_warning(err.friendlyMsg);
        }
        trackScope = trackScope.concat(cntUpsert.trackarray);
      }
    }
  }

  if (S("cnt_scopeverdeling")==1) // Ze vullen bij gewicht de bedragen in. Optellen voor het totaal
  {
    var sql = "SELECT SUM(cnt_contract_plaats_gewicht) newsum"
            + "   FROM cnt_contract_plaats ccp"
            + "  WHERE ccp.cnt_contract_key = " + cnt_key;
    var oRs = Oracle.Execute(sql);
    var newsum = oRs("newsum").Value || 0;
    oRs.Close();
    var fields =  [{ dbs: "cnt_contract_kosten", typ: "float", val: newsum, track: L("lcl_cnt_contract_sum") }];
    var cntUpd = buildTrackingUpdate("cnt_contract", "cnt_contract_key = " + cnt_key, fields);
    Oracle.Execute(cntUpd.sql);
    trackScope = trackScope.concat(cntUpd.trackarray);
  }
}

// Tracking van scope opslaan.
if (trackScope.length)
{
  shared.trackaction("CNTUPD", cnt_key, L("lcl_cnt_is_cntscopeupd") + "\n" + trackScope.join("\n"));
}

var result = {success: true};
Response.Write(JSON.stringify(result));
Response.End;
%>
<% ASPPAGE_END(); %>
