<%@ LANGUAGE = JavaScript %>
<%  Server.ScriptTimeout=6000; %>
<% /*
     $Revision$
     $Id$

     File:               mjb_inspect_execute.asp
     Description:        Uitvoeren van de inspecties.
     Parameters:
         ins_keys        Array van objecten waarvan inspecties moeten worden uitgevoerd.
         srtcont_keys    Array van soort controles die moeten worden uitgevoerd.

     Context:            Inline actie ins_list.inc of actie ins_inspect_list
                         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/kenmerk_common.inc" -->
<!-- #include file="../API2/api2.inc" -->
<!-- #include file="../API2/model_issues.inc" -->
<!-- #include file="../INS/ins.inc" -->

<%
protectRequest.validateToken();
var mode = "show"; // mode must be defined because of use in model_mld_kenmerk.inc
var ins_key_arr = getFParamIntArray("ins_keys");
var srtcont_key_arr = getFParamIntArray("srtcont_keys", []);
var deelsrtcontrkey_arr = getFParamIntArray("deelsrtcontrkeys", []);
var ctrdisc_key_arr = getFParamIntArray("ctrdisc_keys", []);
var aantaltaken = getFParamInt("aantaltaken", 0);
var mld_key = getFParamInt("mld_key");
var stdmelding_key = getFParamInt("stdm");
var subject = getFParam("mjbsubject");
var description = getFParam("mlddesc");

var multi = ins_key_arr.length > 1;

if (mld_key > 0)
{ // Bepaal de stdmelding van de melding.
  var sql = "SELECT mld_stdmelding_key"
          + "  FROM mld_melding"
          + " WHERE mld_melding_key = " + mld_key;
  var oRs = Oracle.Execute(sql);
  var stdmelding_key = oRs("mld_stdmelding_key").Value;
  oRs.Close();
}

var ingesloten = [];
var ingeslotensc = [];
var ingeslotendsc = [];
var ingeslotenctrd = [];
var tobeexec = 0;
// Bepaal de objecten/delen in de selectie die
// ook echt gestart kunnen of mogen worden.
var ctrdisc_key = -1;
if (srtcont_key_arr.length > 0)
{
  for (var i = 0; i < ins_key_arr.length; i++)
  {
    var this_ins = ins.func_enabled_deel(ins_key_arr[i],
                                         {srtcont_key: srtcont_key_arr[i],
                                          deelsrtcont_key: deelsrtcontrkey_arr[i]
                                         });

    // Is de stdmelding van toepassing binnen de gedefinieerde types van het object?
    // Alleen dan mag ik de melding aanmaken die gekoppeld is aan een taak van het object.
    var sql = "SELECT si.ins_deel_key"
            + "     , si.mld_stdmelding_key"
            + "  FROM mld_v_mld_stdmelding_srtinst si"
            + " WHERE si.mld_stdmelding_key = " + stdmelding_key
            + "   AND si.ins_deel_key = " + ins_key_arr[i];
    var oRs = Oracle.Execute(sql);
    var canAddMelding = !oRs.eof;
    oRs.Close();

    // Controleren of de stdmelding actueel is en niet is verwijderd of vervallen.
    var sql = "SELECT mld_stdmelding_key"
            + "  FROM mld_stdmelding"
            + " WHERE mld_stdmelding_verwijder IS NULL"
            + "   AND (mld_stdmelding_vervaldatum IS NULL OR mld_stdmelding_vervaldatum > TRUNC(SYSDATE))"
            + "   AND mld_stdmelding_key = " + stdmelding_key;
    var oRs = Oracle.Execute(sql);
    var isCurrentMelding = !oRs.eof;
    oRs.Close();

    // Het laatste inspectierecord moet Gepland(0) of Verwerkt(6) (ins_deelsrtcontrole_status = -1) zijn, anders kan de inspectie niet gestart worden.
    if (this_ins.canInspExecute && canAddMelding && isCurrentMelding)
    { // Alle Arrays zijn even groot.
      ingesloten.push(ins_key_arr[i]);
      ingeslotensc.push(srtcont_key_arr[i]);
      ingeslotendsc.push(deelsrtcontrkey_arr[i]);
      ingeslotenctrd.push(ctrdisc_key_arr[i]);
      tobeexec++;
    }
  }
}
mld.dialectIsSet = true;
// Hier geen "user.anything_todo_or_abort(tobeexec > 0);". We geven altijd een melding terug hoeveel taken er zijn uitgevoerd.
lcl.set_dialect(ingeslotenctrd[0] , "CTR_DISCIPLINE_KEY");

var result = {key: "", success: true, multi: multi, execute: true };

if (tobeexec > 0)
{ // Er zijn taken die kunnen worden uitgevoerd.

  // Melding aanmaken voor het uitvoeren van de taak.
  // Eerst nog enkele gegevens bepalen.
  if (mld_key < 0)
  {
    // Kan ik de kostenplaats bepalen?
    sql = "SELECT COUNT(di.prs_kostenplaats_key) aantal"
        + "     , MAX(di.prs_kostenplaats_key) max_kp"
        + "  FROM ins_deelsrtcontrole idsc"
        + "     , ins_srtcontrole isc"
        + "     , ins_v_defined_inspect di"
        + " WHERE idsc.ins_srtcontrole_key = isc.ins_srtcontrole_key"
        + "   AND idsc.ins_scenario_key = isc.ins_scenario_key"
        + "   AND isc.ins_srtcontrole_key = di.ins_srtcontrole_key"
        + "   AND idsc.ins_deel_key = di.ins_deel_key"
        + "   AND idsc.ins_deelsrtcontrole_key IN (" + ingeslotendsc.join(",") + ")";
    oRs = Oracle.Execute(sql);
    var aantal = oRs("aantal").Value;
    var max_kp = oRs("max_kp").Value;
    oRs.Close();
    var prs_kostenplaats_key = -1;
    if (aantal == 1)
      prs_kostenplaats_key = max_kp;

    var stdm_info = mld.mld_stdmeldinginfo(stdmelding_key);

    var loc_key = -1;
    var bld_key = -1;
    var flr_key = -1;
    var room_key = -1;
    // Pak de eerste om de plaatsgegevens te bepalen. Dan zijn verplichte waarden in ieder geval gevuld.
    sql = "SELECT alg_locatie_key,"
        + "       alg_gebouw_key,"
        + "       alg_verdieping_key,"
        + "       alg_ruimte_key"
        + "  FROM ins_deel isd, alg_v_allonroerendgoed alg"
        + " WHERE ins_deel_key IN (" + ingesloten[0] + ")"
        + "   AND alg_onroerendgoed_keys = isd.ins_alg_ruimte_key"
        + "   AND isd.ins_alg_ruimte_type = 'R'";
    oRs = Oracle.Execute(sql);
    if (!oRs.eof)
    {
      loc_key = oRs("alg_locatie_key").Value;
      bld_key = oRs("alg_gebouw_key").Value;
      flr_key = oRs("alg_verdieping_key").Value;
      room_key = oRs("alg_ruimte_key").Value;
    }
    oRs.Close();

    if (prs_kostenplaats_key == -1 && bld_key > 0)
    {
      sql = "SELECT prs_kostenplaats_key"
          + "  FROM alg_gebouw"
          + " WHERE alg_gebouw_key = " + bld_key;
      oRs = Oracle.Execute(sql);
      if (!oRs.Eof)
        prs_kostenplaats_key = oRs("prs_kostenplaats_key").Value || -1;
      oRs.Close();
    }

    var issueobjects = [];
    for (var i = 0; i < ingesloten.length; i++)
    {
      issueobjects.push({ object: ingesloten[i], inspection: ingeslotendsc[i] });
    }

    var issues = new model_issues();
    var params = {};
    var jsondata = {issuetype: stdmelding_key,
                    issuedate: new Date(),
                    subject: subject,
                    description: description,
                    account: prs_kostenplaats_key,
                    contact: user_key,
                    location: loc_key,
                    building: bld_key,
                    floor: flr_key,
                    room: room_key,
                    priority: 3, // Default prioriteit 3.
                    origin: 10,
                    issueobjects: issueobjects
                   };

    var issues_array = issues.REST_POST(params, jsondata);
  }
  else
  {
    var sql_insert = "BEGIN ";
    for (var i = 0; i < ingesloten.length; i++)
    {
      sql_insert += "INSERT INTO mld_melding_object (mld_melding_key"
                  + "                              , ins_deel_key"
                  + "                              , ins_deelsrtcontrole_key)"
                  + "                        VALUES (" + mld_key
                  + "                              , " + ingesloten[i]
                  + "                              , " + ingeslotendsc[i] + ")"
                  + ";";
    }
    sql_insert += " END;"
    Oracle.Execute(sql_insert);
  }

  for (var i = 0; i < ingesloten.length; i++)
  { // Zetten van de status en afhandelen van de tracking van het uitvoeren.
    ins.setinspectstatus(ingeslotendsc[i], 3); // Ter uitvoering(3)
    result.key += (i > 0? "," : "") + ingeslotendsc[i];
  }
}

if (ingesloten.length < aantaltaken)
{ // Niet alle taken zijn uitgevoerd.
  result.message = ingesloten.length == 1? L("lcl_mjb_executeof_mes_1").format(aantaltaken) : L("lcl_mjb_executeof_mes_n").format(ingesloten.length, aantaltaken);
}
else
{ // Alle taken zijn uitgevoerd.
  result.toaster = L("lcl_mjb_executing_completed");
}

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