<%@ LANGUAGE = JavaScript %>
<% /*
     $Revision$
     $Id$

     File:               ins_inspect_start.asp
     Description:        Starten van de inspecties.
     Parameters:
         ins_keys        Array van objecten waarvan inspecties moeten worden gestart.
         srtcont_keys    Array van soort controles die moeten worden gestart.

     Context:            Inline actie ins_list.inc of actie ins_inspect_list
     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" -->

<%
protectRequest.validateToken();
var ins_key_arr = getFParamIntArray("ins_keys");
var srtcont_key_arr = getFParamIntArray("srtcont_key_arr", []);
var multi = ins_key_arr.length > 1;
var mobile = Request.Form("sel_controlemode").count > 0; // Bij mobile is een methode meegegeven (wel of niet ingevuld).

var tobestart = 0;
var ingesloten = [];
var dlsrtcont_key = -1;
// Bepaal de objecten/delen in de selectie die
// ook echt gestart kunnen of mogen worden.
for (var i = 0; i < ins_key_arr.length; i++)
{
  var sql = "SELECT idsc.ins_deelsrtcontrole_key"
          + "     , idsc.ins_deelsrtcontrole_status"
          + "  FROM ins_srtcontrole isc"
          + "     , ins_deelsrtcontrole idsc"
          + " WHERE isc.ins_srtcontrole_key = idsc.ins_srtcontrole_key(+)" // Er kan nog voor de eerste keer geinspecteerd moeten worden.
          + "   AND idsc.ins_deel_key(+) = " + ins_key_arr[i]
          + "   AND isc.ins_srtcontrole_key = " + srtcont_key_arr[i]
          + " 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_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 ins_deelsrtcontrole_key = oRs("ins_deelsrtcontrole_key").Value;

  // Het laatste inspectierecord moet ingepland of verwerkt(6) zijn, anders kan de inspectie niet gestart worden.
  if (ins_deelsrtcontrole_status > 0 && ins_deelsrtcontrole_status != 6)
  { // Laatste inspectie is niet ingepland of verwerkt. Overslaan.
    oRs.Close();
    continue;
  }
  else if (ins_deelsrtcontrole_status != -1 && ins_deelsrtcontrole_status != 6)
    dlsrtcont_key = ins_deelsrtcontrole_key;

  var this_ins = ins.func_enabled_deel(ins_key_arr[i]);
  // Als ik mag inspecteren mag ik ook starten.
  if (this_ins.canInspect)
  { // Alle Arrays zijn even groot.
    ingesloten.push({ins_key: ins_key_arr[i], srtcont_key: srtcont_key_arr[i], dlsrtcont_key: dlsrtcont_key,
                     inspectiestatus: ins_deelsrtcontrole_status});
    tobestart++;
  }
}
user.anything_todo_or_abort(tobestart > 0); // We klagen niet over enkele wel en enkele niet

var result = {success: true, multi: multi, start: true };

for (var i = 0; i < ingesloten.length; i++)
{ // Zetten van de status en afhandelen van de tracking van het starten.
  if (ingesloten[i].dlsrtcont_key < 0)
  { // Er is nog geen inspectie (ins_deelsrtcontrole) record aangemaakt. Eerst maar eens aanmaken.
    // Als er al een inspectie is geweest kan er een volgende inspectiedatum berekend worden.
    var nextdate = null;
    if (ingesloten[i].inspectiestatus > -1)
    { // 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. Dit wordt de eerste inspectie.
    //     Volgende inspectiedatum kun je niet berekenen en is dus onbekend (leeg)

    // Plandatum blijft 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: "prs_perslid_key",               typ: "key",      val: user_key },
                   { dbs: "ins_deelsrtcontrole_datum_org", typ: "datetime", val: (nextdate? nextdate : null) }
                 ];

    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;
    }
  }
  else if (mobile) // Bij mobile ook methode, opmerking en flexkenmerken opslaan want die kunnen aangepast zijn.
  { // Er is al een inspectie (ins_deelsrtcontrole) record aanwezig. De plandatum en orgdatum blijven onverandert.
    var fields =  [ { 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 },
                    { 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;
    }

    // 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 = " + ingesloten[i].dlsrtcont_key;

    var flextrack = saveFlexKenmerken( ingesloten[i].dlsrtcont_key
                                     , { kenmerkTable: "ins_kmdeelsrtcontr"
                                       , kenmerkParentKey : "ins_deelsrtcontrole_key"
                                       , kenmerkWaarde: "ins_kmdeelsrtcontr_waarde"
                                       , kenmerkKey: "ins_kenmerk_key"
                                       , currentKenmerkenSQL: currentKenmerkenSQL
                                       , requestQF: Request.Form
                                       , isNew: false
                                       , flexPath: "INS/I"
                                       , module: "INS"
                                       }
                                     );

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

  // Nu nog de status zetten, tracking genereren en notificaties sturen.
  ins.setinspectstatus(ingesloten[i].dlsrtcont_key, 2); // In behandeling(2)
  result.key += (i > 0? "," : "") + ingesloten[i].dlsrtcont_key;
}

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