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

    File:           ins_inspect_save.asp
    Description:    Inspectiedata opslaan
    Parameters:     ins_keys of ins_key (geen verschil)

    Context:        Vanuit ins_inspect.asp of vanuit pda/ins_inspect.asp
    Note:           Parameter mobile doet niets met navigatie, sluiten enzo, die submit gewoon.
                    Resultaat van een submit is een json object

*/
var JSON_Result = true;
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/save2db.inc" -->
<!-- #include file="../Shared/json2.js" -->
<!-- #include file="../Shared/kenmerk_common.inc" -->
<!-- #include file="ins.inc" -->

<%
//var insp_actie = getFParamInt("inspectie_actie", 0); // Inspectie invoeren of uitstellen.

var ins_key_arr = getFParamIntArray("ins_keys");
var multi = ins_key_arr.length > 1;

var srtcont_key_arr = getFParamIntArray("srtcont_key_arr", []); // Inspectiesoorten
//var dlsrtcont_key_arr = getFParamIntArray("dlsrtcont_key_arr", []); // Inspecties

var savemode = getFParam("savemode");

var finish = getFParamInt("finish", 0) == 1; // Inspectie direct afronden.
// Als multi dan moet de ins_deel array even groot zijn als de srtcontrole array en deelsrtcontrole array.
user.auth_required_or_abort(!multi || (ins_key_arr.length == srtcont_key_arr.length));

var deelsrtcontrole_datum;
var plandatum;
var nextdate;

if (savemode == "P") // Inplannen (Plan).
  plandatum = getFParamDate("plandatum");
else if (savemode == "C") // Afmelden/Afronden (Close).
  deelsrtcontrole_datum = getFParamDate("deelsrtcontrole_datum", new Date);
else if (savemode == "E")
{ // Wijzigen (Edit).
  // Plandatum wordt bij opmaak velden (fields) wel uit frm gehaald i.p.v. val.

  if (multi)
    abort_with_warning(L("lcl_ins_allow_multi_edit"));
}

var warning = "";
var result = {};
var tobehandled = 0;
var ingesloten = [];
// Bepaal de objecten in de selectie die ook echt geinspecteerd kunnen of mogen worden.
for (var i = 0; i < ins_key_arr.length; i++)
{
  var dlsrtcont_key = -1;
  var sql = "SELECT *"
          + "  FROM (WITH defined_inspect AS (SELECT isc.ins_srtcontrole_key"
          + "                                      , isc.ins_srtcontrole_mode"
          + "                                      , isc.ins_srtcontrole_periode"
          + "                                      , isc.ins_srtcontrole_eenheid"
          + "                                      , id.ins_deel_key"
          + "                                   FROM ins_deel id"
          + "                                      , ins_srtdeel s"
          + "                                      , ins_srtcontrole isc"
          + "                                  WHERE s.ins_srtdeel_key = id.ins_srtdeel_key"
          + "                                    AND (isc.ins_srtcontrole_niveau = 'S'"
          + "                                     AND isc.ins_srtinstallatie_key = id.ins_srtdeel_key"
          + "                                      OR isc.ins_srtcontrole_niveau = 'G'"
          + "                                     AND isc.ins_srtinstallatie_key = s.ins_srtgroep_key"
          + "                                      OR isc.ins_srtcontrole_niveau = 'D'"
          + "                                     AND isc.ins_srtinstallatie_key = id.ins_discipline_key)"
          + "                                    AND id.ins_deel_key = " + ins_key_arr[i] + ")"
          + "        SELECT di.ins_srtcontrole_key"
          + "             , idsc.ins_deelsrtcontrole_key"
          + "             , idsc.ins_deelsrtcontrole_datum"
          + "             , COALESCE (xcp.ins_srtcontroledl_xcp_eenheid, di.ins_srtcontrole_eenheid) eenheid"
          + "             , di.ins_srtcontrole_mode"
          + "             , idsc.ins_deelsrtcontrole_status"
          + "          FROM defined_inspect di"
          + "             , ins_srtcontroledl_xcp xcp"
          + "             , ins_deelsrtcontrole idsc"
          + "         WHERE di.ins_srtcontrole_key = xcp.ins_srtcontrole_key(+)"
          + "           AND di.ins_deel_key = xcp.ins_deel_key(+)"
          + "           AND di.ins_srtcontrole_key = idsc.ins_srtcontrole_key(+)" // Er kan nog voor de eerste keer geinspecteerd moeten worden.
          + "           AND di.ins_deel_key = " + ins_key_arr[i]
          + "           AND idsc.ins_deel_key(+) = " + ins_key_arr[i]
          + "           AND COALESCE (xcp.ins_srtcontroledl_xcp_periode, di.ins_srtcontrole_periode) > 0"
          + "           AND di.ins_srtcontrole_key = " + srtcont_key_arr[i]
          + "           AND (xcp.ins_srtcontroledl_xcp_eind(+) IS NULL OR xcp.ins_srtcontroledl_xcp_eind(+) > TRUNC(SYSDATE, 'DD'))" + ")"
          + " ORDER BY ins_deelsrtcontrole_datum DESC";
  var oRs = Oracle.Execute(sql);
  // Waarden moeten aanwezig zijn. Mocht dat niet zo zijn dan is er iets fout.
  var ins_srtcontrole_mode = oRs("ins_srtcontrole_mode").Value;
  var ins_deelsrtcontrole_status = oRs("ins_deelsrtcontrole_status").Value != null? oRs("ins_deelsrtcontrole_status").Value : -1; // Als er nog geen inspectie is geweest is de status -1.
  var eenheid = oRs("eenheid").Value;
  var ins_deelsrtcontrole_datum = oRs("ins_deelsrtcontrole_datum").Value;
  var ins_deelsrtcontrole_key = oRs("ins_deelsrtcontrole_key").Value;

  // Inplannen (dlsrtcont_key = -1).
  // Het is de eerste inspectie of de laatste inspectie moet verwerkt(6) zijn, anders kan de inspectie niet ingepland worden.
  if (savemode == "P" && (ins_deelsrtcontrole_status != -1 && ins_deelsrtcontrole_status != 6)) // Inplannen.
  { // Het is niet de eerste inspectie of de laatste inspectie is niet verwerkt. Overslaan.
    oRs.Close();
    continue;
  }

  if (savemode == "C") // Afmelden/Afronden.
  { // Is er op de inspectiedatum of op het inspectieuur al geinspecteerd voor dit object en het objectsoort?
    // Voor niet multi is dit al gecontroleerd in ins_inspect.asp. Hier voor de veiligheid opnieuw controleren is niet verkeerd.
    var deelsrtcontrole_midnighttime = deelsrtcontrole_datum.midnight().getTime();
    var deelsrtcontrole_hourtime = deelsrtcontrole_datum; // deelsrtcontrole_datum moet niet worden aangepast door setMinutes(0,0,0).
    var deelsrtcontrole_hourtime = new Date(new Date(parseInt(deelsrtcontrole_hourtime.getTime())).setMinutes(0,0,0)).getTime();
    // Controle of er op de inspectiedatum of op het inspectieuur al inspecties zijn geweest
    // TODO: Wat te doen met extra inspecties. En per week/maand/jaar enz.
    if (ins_deelsrtcontrole_datum != null)
    {
      if ((eenheid > 0) && ins_srtcontrole_mode == 0 && // Geldt alleen voor momentmodus.
          (deelsrtcontrole_midnighttime == new Date(ins_deelsrtcontrole_datum).midnight().getTime()))
      { // Op dezelfde dag mag niet. Overslaan.
        oRs.Close();
        continue;
      }
      else if ((eenheid == 0) && ins_srtcontrole_mode == 0 && // Geldt alleen voor momentmodus.
               (deelsrtcontrole_hourtime == new Date(new Date(ins_deelsrtcontrole_datum).setMinutes(0,0,0)).getTime()))
      { // In dezelfde minuut (tijdstip) mag niet. Overslaan.
        oRs.Close();
        continue;
      }
      else if (new Date(deelsrtcontrole_datum.setSeconds(0, 0)).getTime() == new Date(new Date(ins_deelsrtcontrole_datum)).getTime() &&
               ins_srtcontrole_mode == 1)
      { // Een inspectie doen op dezelfde datumtijd (controledatum hetzelfde) mag niet omdat je daarna dan niet meer de volgende inspectie kunt doen.
        // De geplande _org tijd is dan hetzelfde als de laatste inspectie omdat de volgende inspectie dan niet opgeschoven is.
        // Inspecties op dezelfde datumtijd moeten dus afgevangen worden.
        // Dit kan alleen voorkomen in de interval mode.
        oRs.Close();
        continue;
      }
    }

    if (ins_deelsrtcontrole_status == 5)
    { // Laatste inspectie is niet verwerkt. Overslaan.
      oRs.Close();
      continue;
    }
    else if (ins_deelsrtcontrole_status >= 0 && ins_deelsrtcontrole_status != 6)
      dlsrtcont_key = ins_deelsrtcontrole_key;
  }

  if (savemode == "E") // Wijzigen.
  { // Het mag niet de eerste inspectie zijn en de laatste inspectie mag niet verwerkt zijn.
    if (ins_deelsrtcontrole_status == -1 || ins_deelsrtcontrole_status == 6)
    { // Eerste inspectoe of verwerkte inspectie kan niet gewijzigd worden. Overslaan.
      oRs.Close();
      continue;
    }
    else
      dlsrtcont_key = ins_deelsrtcontrole_key;
  }

  oRs.Close();

  var this_ins = ins.func_enabled_deel(ins_key_arr[i]);
  // Als ik mag inspecteren mag ik ook inplannen.
  if (this_ins.canInspect)
  {
    ingesloten.push({ins_key: ins_key_arr[i], srtcont_key: srtcont_key_arr[i], dlsrtcont_key: dlsrtcont_key,
                     inspectiemode: ins_srtcontrole_mode, inspectiestatus: ins_deelsrtcontrole_status});
    tobehandled++;
  }
}

user.anything_todo_or_abort(tobehandled > 0); // We klagen niet over enkele wel en enkele niet

function saveFlexKenmerkenInspection(pdlsrtcont_key, pinsPresent)
{
  // HIER WORDEN DE SAVEFLEXKENMERKEN GEREGELD
  currentKenmerkenSQL = " SELECT kd.ins_kenmerk_key"
                      + "      , kd.ins_kmdeelsrtcontr_waarde"
                      + "   FROM ins_kmdeelsrtcontr kd"
                      + "      , ins_kenmerk k"
                      + "  WHERE kd.ins_kenmerk_key = k.ins_kenmerk_key"
                      + "    AND kd.ins_kmdeelsrtcontr_verwijder IS NULL"
                      + "    AND kd.ins_deelsrtcontrole_key = " + pdlsrtcont_key;

  var ftrack = saveFlexKenmerken( pdlsrtcont_key
                                , { kenmerkTable: "ins_kmdeelsrtcontr"
                                  , kenmerkParentKey : "ins_deelsrtcontrole_key"
                                  , kenmerkWaarde: "ins_kmdeelsrtcontr_waarde"
                                  , kenmerkKey: "ins_kenmerk_key"
                                  , currentKenmerkenSQL: currentKenmerkenSQL
                                  , requestQF: Request.Form
                                  , isNew: !pinsPresent
                                  , flexPath: "INS/I"
                                  , module: "INS"
                                  }
                                );
  return ftrack;
}


if (savemode == "P")
{ // Inplannen inspectie.
  var result = { success: true, plandatum: plandatum, savemode: savemode };

  for (var i = 0; i < ingesloten.length; i++)
  { // Zetten van de status en afhandelen van de tracking van het starten.

    // Is er een inspectie (ins_deelsrtcontrole) record aanwezig (ins_deelsrtcontrole_key is NULL).
    var insPresent = ingesloten[i].dlsrtcont_key > 0;

    // Eerst maar eens aanmaken een inspectie record aanmaken.
    // Zijn er inspecties geweest voor dit object of is er een plandatum voor dit object ingevuld zodat we de volgende inspectiedatum kunnen berekenen?
    var sql = "SELECT ins_deelsrtcontrole_datum"
            + "  FROM ins_deelsrtcontrole idsc"
            + " WHERE idsc.ins_srtcontrole_key = " + ingesloten[i].srtcont_key
            + "   AND idsc.ins_deel_key = " + ingesloten[i].ins_key;
    var oRs = Oracle.Execute(sql);
    var nextdate = null;
    if (!oRs.eof)
    { // Bereken de volgende inspectiedatum.
      sql = "SELECT ins.nextcyclusdate (" + ingesloten[i].ins_key + ", " + ingesloten[i].srtcont_key + ", 1) nextdate FROM DUAL"
      oRs = Oracle.Execute(sql);
      nextdate = new Date(oRs("nextdate").Value);
    }
    //else Er zijn nog geen inspecties geweest voor dit object en er is nog geen plandatum voor dit object ingevuld.
    //     Volgende inspectiedatum kun je niet berekenen en is dus onbekend (leeg)

    var fields = [{dbs: "ins_deelsrtcontrole_key",       typ: "key",      seq: "ins_s_ins_deelsrtcontrole_key"},
                  {dbs: "ins_deel_key",                  typ: "key",      val: ingesloten[i].ins_key},
                  {dbs: "ins_srtcontrole_key",           typ: "key",      val: ingesloten[i].srtcont_key},
                  {dbs: "ins_deelsrtcontrole_opmerking", typ: "varchar",  frm: "opmerk",                   track: L("lcl_remark"),       len: 2000 },
                  {dbs: "prs_perslid_key",               typ: "key",      val: user_key},
                  {dbs: "ins_deelsrtcontrole_plandatum", typ: "datetime", val: plandatum},
                  {dbs: "ins_deelsrtcontrole_datum_org", typ: "datetime", val: nextdate}
                 ];

    var insIns = buildInsert("ins_deelsrtcontrole", fields);
    ingesloten[i].dlsrtcont_key = insIns.sequences["ins_deelsrtcontrole_key"];
    var err = Oracle.Execute(insIns.sql, true);

    if (err.friendlyMsg)
    {
      result.warning = err.friendlyMsg;
      result.success = false;
    }

    // Nu nog de status zetten, tracking genereren en notificaties sturen.
    ins.setinspectstatus(ingesloten[i].dlsrtcont_key, 0); // Gepland(0).
  }
}
else if (savemode == "C")
{ // Afmelden inspectie.
  var result = { success: true, deelsrtcontrole_datum: deelsrtcontrole_datum, savemode: savemode };

  for (var i = 0; i < ingesloten.length; i++)
  {
    // Nieuwe inspectie; de ins_deelsrtcontrole_key is NULL of als deze een waarde heeft dan is de status 0 of 2.
    var isNew = ingesloten[i].dlsrtcont_key < 0 || ingesloten[i].inspectiestatus < 5;
    // Is er een inspectie (ins_deelsrtcontrole) record aanwezig (ins_deelsrtcontrole_key is NULL).
    var insPresent = ingesloten[i].dlsrtcont_key > 0;

    if (isNew) // Nieuwe inspectie.
    { // Bepaal de eerste niet successvolle controle methode. Is deze er niet dan kies maar de eerste successvolle controlemode.
      sql = "SELECT ins_controlemode_key"
          + "     , 1"
          + "  FROM ins_controlemode"
          + " WHERE ins_controlemode_success = 0"
          + " UNION "
          + "SELECT ins_controlemode_key"
          + "     , 2"
          + "  FROM ins_controlemode"
          + " WHERE ins_controlemode_success = 1"
          + " ORDER BY 2, 1";
      oRs = Oracle.Execute(sql);
      var controlemode = oRs("ins_controlemode_key").Value;
      oRs.Close();

      // Bepaal eenheid van de soort controle.
      sql = "SELECT COALESCE((SELECT xcp.ins_srtcontroledl_xcp_eenheid"
          + "                   FROM ins_srtcontroledl_xcp xcp"
          + "                  WHERE ins_deel_key = " + ingesloten[i].ins_key
          + "                    AND ins_srtcontrole_key = " + ingesloten[i].srtcont_key
          + "                    AND (xcp.ins_srtcontroledl_xcp_eind IS NULL OR xcp.ins_srtcontroledl_xcp_eind > TRUNC(SYSDATE, 'DD'))" + ")"
          + "              , (SELECT isc.ins_srtcontrole_eenheid"
          + "                   FROM ins_srtcontrole isc"
          + "                  WHERE ins_srtcontrole_key = " + ingesloten[i].srtcont_key + ")) eenheid"
          + "  FROM DUAL";
      oRs = Oracle.Execute(sql);
      var eenheid = oRs("eenheid").Value;
      oRs.Close();

      // Zijn er inspecties geweest voor dit object of is er een plandatum voor dit object ingevuld zodat we de volgende inspectiedatum kunnen berekenen?
      sql = "SELECT ins_deelsrtcontrole_datum"
          + "  FROM ins_deelsrtcontrole idsc"
          + " WHERE idsc.ins_srtcontrole_key = " + ingesloten[i].srtcont_key
          + "   AND idsc.ins_deel_key = " + ingesloten[i].ins_key;
      oRs = Oracle.Execute(sql);
      if (oRs.eof)
      { // Er zijn nog geen inspecties geweest voor dit object en er is nog geen plandatum voor dit object ingevuld.
        // Volgende inspectiedatum kun je niet berekenen
        // De eerstvolgende inspectiedatum gelijk aan de controledatum stellen.
        nextdate = new Date(deelsrtcontrole_datum);
        oRs.Close();
      }
      else
      { // Bereken de volgende inspectiedatum.
        sql = "SELECT ins.nextcyclusdate (" + ingesloten[i].ins_key + ", " + ingesloten[i].srtcont_key + ", 1) nextdate FROM DUAL"
        oRs = Oracle.Execute(sql);
        nextdate = new Date(oRs("nextdate").Value);
        oRs.Close();
      }

      var respijt = false;
      if (insPresent)
      {
        // Is er een plandatum? Dan is dit de volgende inspectiedatum.
        sql = "SELECT ins_deelsrtcontrole_plandatum"
            + "  FROM ins_deelsrtcontrole idsc"
            + " WHERE idsc.ins_deelsrtcontrole_status <= 5"
            + "   AND idsc.ins_deelsrtcontrole_key = " + ingesloten[i].dlsrtcont_key
            + "   AND idsc.ins_srtcontrole_key = " + ingesloten[i].srtcont_key
            + "   AND idsc.ins_deel_key = " + ingesloten[i].ins_key
        oRs = Oracle.Execute(sql);

        if (!oRs.eof)
        {
          // De plandatum is de volgende inspectiedatum
          plandatum = new Date(oRs("ins_deelsrtcontrole_plandatum").Value);
          // Alleen als de plandatum na de volgende inspectiedatum valt is er sprake van respijt.
          respijt = plandatum > nextdate;
        }
        oRs.Close();
      }

      // Truncate datums op de dag of het uur afhankelijk van de eenheid.
      if (eenheid == 0)
      {
        var nextdate_trunc = new Date(new Date(nextdate).setMinutes(0, 0, 0));
        var deelsrtcontrole_datum_trunc = new Date(new Date(deelsrtcontrole_datum).setMinutes(0, 0, 0));
        if (respijt)
          plandatum = new Date(plandatum.setMinutes(0, 0, 0));
      }
      else
      {
        var nextdate_trunc = new Date(nextdate.midnight());
        var deelsrtcontrole_datum_trunc = new Date(deelsrtcontrole_datum.midnight());
        if (respijt)
          plandatum = new Date(plandatum.midnight());
      }

      var fields =  [ { dbs: "ins_deelsrtcontrole_opmerking", typ: "varchar",  frm: "opmerk",                  track: L("lcl_remark"),       len: 2000 },
                      { dbs: "prs_perslid_key",               typ: "key",      val: user_key,                  track: L("lcl_name"),         foreign: "prs_perslid" },
                      { dbs: "ins_deelsrtcontrole_datum",     typ: "datetime", val: deelsrtcontrole_datum,     track: L("lcl_ins_controle_datum") } // De controledatum met tijd opslaan.
                    ];
      if (!insPresent)
      { // Er is nog inspectie record aangemaakt. De volgende velden dienen dan nog ingevuld te worden.
        fields.push({ dbs: "ins_deel_key",                  typ: "key",      val: ingesloten[i].ins_key });
        fields.push({ dbs: "ins_srtcontrole_key",           typ: "key",      val: ingesloten[i].srtcont_key });
        fields.push({ dbs: "ins_deelsrtcontrole_datum_org", typ: "datetime", val: nextdate }); // De orginele controledatum met tijd opslaan.
        fields.push({ dbs: "ins_deelsrtcontrole_key",       typ: "key",      seq: "ins_s_ins_deelsrtcontrole_key" });
      }

      // Afhankelijk van de modus de inspectie(s) opslaan.
      if (ingesloten[i].inspectiemode == 0)
      { // Moment modus
        // De laatste datum die opgeslagen wordt is uiterlijk de opgegeven controledatum
        // De trunc waarde van de controle datum gebruiken.
        var firstone = true;
        while ((respijt && plandatum <= deelsrtcontrole_datum_trunc) || (!respijt && nextdate_trunc <= deelsrtcontrole_datum_trunc))
        {
          if (nextdate_trunc < deelsrtcontrole_datum_trunc)
            // Inspectie datum ligt voor de laatste inspectiedatum. Dan moet die inspectie niet successvol zijn, anders geeft dit problemen.
            fields.push({ dbs: "ins_controlemode_key",          typ: "key",      val: controlemode,       track: L("lcl_ins_controle_mode"), foreign: "ins_controlemode" } ); // Controlemode die niet succesvol is
          else
            fields.push({ dbs: "ins_controlemode_key",          typ: "key",      frm: "sel_controlemode", track: L("lcl_ins_controle_mode"), foreign: "ins_controlemode" } ); // De inspectiedatum is vandaag of ligt in de toekomst en is dus op tijd.


          if (insPresent && firstone) // Alleen voor de alle eerste inspectie kan een inspectie record aanwezig zijn.
          { // Er is al een inspectie record (ins_deelsrtcontrole) aangemaakt. De status is Gepland(0) of In behandeling(2).
            // Plandatum kan gevuld blijven met de huidige waarde.
            var insUpd = buildTrackingUpdate("ins_deelsrtcontrole", " ins_deelsrtcontrole_key = " + ingesloten[i].dlsrtcont_key, fields);
            var err = Oracle.Execute(insUpd.sql, true);
            firstone = false;
          }
          else
          { // Er is nog geen inspectie record aangemaakt.
            var insIns = buildInsert("ins_deelsrtcontrole", fields);
            ingesloten[i].dlsrtcont_key = insIns.sequences["ins_deelsrtcontrole_key"];
            var err = Oracle.Execute(insIns.sql, true);
          }
          result.deelsrtcontrole_key = ingesloten[i].dlsrtcont_key;

          if (err.friendlyMsg)
          {
            result.warning = err.friendlyMsg;
            result.success = false;
            break;
          }

          // Nu nog de status zetten, tracking genereren en notificaties sturen.
          ins.setinspectstatus(ingesloten[i].dlsrtcont_key, (finish? 6: 5)); // Afgemeld(5), History/Verwerkt(6).

          respijt = false;
          plandatum = null;

          // Bereken de volgende inspectiedatum.
          // De functie ins.nextcyclusdate levert de volgende inspectie datum met tijd op onafhankelijk van de eenheid.
          sql = "SELECT ins.nextcyclusdate (" + ingesloten[i].ins_key + ", " + ingesloten[i].srtcont_key + ", 1) nextdate FROM DUAL"
          var oRs = Oracle.Execute(sql);
          nextdate = new Date(oRs("nextdate").Value);
          oRs.Close();

          if (eenheid == 0)
            nextdate_trunc = new Date(new Date(nextdate).setMinutes(0, 0, 0));
          else
            nextdate_trunc = new Date(nextdate.midnight());
        }
      }
      else
      { // Interval modus
        fields.push({ dbs: "ins_controlemode_key",          typ: "key",      frm: "sel_controlemode",        track: L("lcl_ins_controle_mode"), foreign: "ins_controlemode" });

        if (insPresent)
        { // Er is al een inspectie record (ins_deelsrtcontrole) aangemaakt. De status is Gepland(0) of In behandeling(2)
          // Plandatum kan gevuld blijven met de huidige waarde.
          //fields.push({ dbs: "ins_deelsrtcontrole_plandatum", typ: "datetime", val: null }); // De plandatum leegmaken.
          var insUpd = buildTrackingUpdate("ins_deelsrtcontrole", " ins_deelsrtcontrole_key = " + ingesloten[i].dlsrtcont_key, fields);
          var err = Oracle.Execute(insUpd.sql, true);
        }
        else
        { // Er is nog geen inspectie record aangemaakt.
          var insIns = buildInsert("ins_deelsrtcontrole", fields);
          ingesloten[i].dlsrtcont_key = insIns.sequences["ins_deelsrtcontrole_key"];
          var err = Oracle.Execute(insIns.sql, true);
        }
        result.deelsrtcontrole_key = ingesloten[i].dlsrtcont_key;

        if (err.friendlyMsg)
        {
          result.warning = err.friendlyMsg;
          result.success = false;
          break;
        }

        // Nu nog de status zetten, tracking genereren en notificaties sturen.
        ins.setinspectstatus(ingesloten[i].dlsrtcont_key, (finish? 6: 5)); // Afgemeld(5), History/Verwerkt(6).

        respijt = false;
        plandatum = null;
      }
    }
    else
    { // uitgevoerde inspectie.
      // Datum kan niet meer aangepast worden.
      var fields =  [ { dbs: "ins_deel_key",                  typ: "key",      val: ingesloten[i].ins_key },
                      { dbs: "ins_srtcontrole_key",           typ: "key",      val: ingesloten[i].srtcont_key },
                      { dbs: "ins_controlemode_key",          typ: "key",      frm: "sel_controlemode",        track: L("lcl_ins_controle_mode"), foreign: "ins_controlemode" },
                      { dbs: "prs_perslid_key",               typ: "key",      val: user_key }
                    ];

      if (!multi) // Bij multi de opmerking niet opslaan. De opmerking kon ook niet ingevuld worden.
        fields.push({ dbs: "ins_deelsrtcontrole_opmerking", typ: "varchar",  frm: "opmerk",                  track: L("lcl_remark"),       len: 2000 });

      var insUpd = buildTrackingUpdate("ins_deelsrtcontrole", " ins_deelsrtcontrole_key = " + ingesloten[i].dlsrtcont_key, fields);
      var err = Oracle.Execute(insUpd.sql, true);

      if (err.friendlyMsg)
      {
        result.warning = err.friendlyMsg;
        result.success = false;
      }
    }

    if (!multi && insPresent)
      var flextrack = saveFlexKenmerkenInspection(ingesloten[0].dlsrtcont_key, insPresent);

    if (insPresent && (insUpd.trackarray.length || flextrack.length))
      ins.trackinspectupdate(ingesloten[i].dlsrtcont_key, L("lcl_ins_controle_is_upd") + "\n" + insUpd.trackarray.concat(flextrack).join("\n"));
  }
}
else if (savemode == "E")
{ // Wijzigen inspectie (Edit). Update van de gegevens (plandatum, opmerking en flexkenmerken).
  var result = { success: true, plandatum: plandatum,  deelsrtcontrole_key: ingesloten[0].dlsrtcont_key, savemode: savemode };

  var fields = [ { dbs: "ins_deelsrtcontrole_plandatum", typ: "datetime", frm: "plandatum", track: L("lcl_opdr_plandate") },
                 { dbs: "ins_deelsrtcontrole_opmerking", typ: "varchar",  frm: "opmerk",    track: L("lcl_remark"),       len: 2000 }
               ];

  var insUpd = buildTrackingUpdate("ins_deelsrtcontrole", " ins_deelsrtcontrole_key = " + ingesloten[0].dlsrtcont_key, fields);
  var err = Oracle.Execute(insUpd.sql, true);

  if (err.friendlyMsg)
  {
    result.warning = err.friendlyMsg;
    result.success = false;
  }

  var flextrack = saveFlexKenmerkenInspection(ingesloten[0].dlsrtcont_key, insPresent);

  if (insUpd.trackarray.length || flextrack.length)
    ins.trackinspectupdate(ingesloten[0].dlsrtcont_key, L("lcl_ins_controle_is_upd") + "\n" + insUpd.trackarray.concat(flextrack).join("\n"));
}

Response.Write(JSON.stringify(result));
Response.End();
%>