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

     File:               ins_inspect_unstart.asp
     Description:        Terugzetten van de geaccordeerde inspecties.
     Parameters:
         ins_keys        Array van objecten waarvan inspecties moeten worden gestart.
         srtcont_keys    Array van deelsoort controles die moeten worden teruggezet.

     Context:            Inline actie mjb_search_list.asp.
                         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="../Shared/discxalg3d.inc" -->
<!-- #include file="../API2/api2.inc" -->
<!-- #include file="ins.inc" -->

<%
protectRequest.validateToken();
var mode = "show"; // mode must be defined because of use in model_mld_kenmerk.inc
var ins_key_arr = getFParamKeyArray("ins_keys");
var srtcont_key_arr = getFParamKeyArray("srtcont_key_arr", []);
var deelsrtcont_key_arr = getFParamIntArray("deelsrtcont_key_arr", []); // De eerste "-1" waarde moeten niet verwijderd worden uit de array, daarom getFParamIntArray i.p.v. getFParamKeyArray.

var multi = ins_key_arr.length > 1;
var groupby = getFParamInt("groupby", 9);
var aantaltaken = getFParamInt("aantaltaken", 0);

var inflatiepct = S("mjb_inflation");
var inflatiefactor = 1 + (inflatiepct / 100);
var mjb_start_year = S("mjb_start_year");
var mjb_freeze_year = Math.max(S("mjb_freeze_year"), new Date().getFullYear());

var result = {key: "", success: true, multi: multi, start: true };
var ingesloten = [];
if (groupby < 9)
{
  var screenmode = getQParamInt("mode", 1); // Schermmode 1=Begroting (aankomende jaren) (=default), 2=Realisatie (huidige en lopende jaren, 3=Uitvoering (koppelen (uitvoerend) van taken aan een melding).
  var dist_key_arr = getFParamKeyArray("dist_key_arr", []); // District array
  var loc_key_arr = getFParamKeyArray("loc_key_arr", []); // Locatie array
  var bld_key_arr = getFParamKeyArray("bld_key_arr", []); // Gebouw array

  var disc_key_arr = getFParamKeyArray("disc_key_arr", []);
  var srtgroep_key_arr = getFParamKeyArray("srtgroep_key_arr", []);
  var srtdeel_key_arr = getFParamKeyArray("srtdeel_key_arr", []);
  var moredetail = getFParamInt("moredetail", 0);
  var srtgebouw_key_arr = getFParamKeyArray("srtgebouw_key_arr", []);
  var groep_str_arr = getFParamArray("groep_str_arr", []); // Groep
  var categorie_key_arr = getFParamKeyArray("categorie_key_arr", []); // Categorie
  var srtcontrole_key_arr = getFParamKeyArray("srtcontrole_key_arr", []); // Taak
  var frequentie_arr = getFParamIntArray("frequentie_arr", []); // Array met frequenties.
  var kp_key_arr = getFParamKeyArray("kp_key_arr", []); // Kostenplaats.
  var incbtw = false; // Voor het accorderen zijn de bedragen (freeze) zonder BTW nodig. Dus ALTIJD false meegeven;
  var showunfin = getFParamInt("showunfin", 0) == 1; // Alleen onvoltooide regels.
  var deel = getFParam("deel", ""); // Identieficatie

  // FORM score velden.
  var fitness_score1_from = getFParamInt("fitness_score1_from", -1);               // Conditie score van.
  var fitness_score1_through = getFParamInt("fitness_score1_through", -1);         // Conditie score t/m.
  var fitness_score1_from_neg = getFParamInt("fitness_score1_from_neg", -1);       // Negatieve afwijking conditie score van.
  var fitness_score1_through_neg = getFParamInt("fitness_score1_through_neg", -1); // Negatieve afwijking conditie score t/m.
  var fitness_score1_from_pos = getFParamInt("fitness_score1_from_pos", -1);       // Positieve afwijking conditie score van.
  var fitness_score1_through_pos = getFParamInt("fitness_score1_through_pos", -1); // Positieve afwijking conditie score t/m.
  var priority_score2_from = getFParamInt("priority_score2_from", -1);             // Prioriteitsscore van.
  var priority_score2_through = getFParamInt("priority_score2_through", -1);       // Prioriteitsscore t/m.

  // FORM status checkboxes.
  var mjbMoved  = getFParamInt("mjbMoved", 0) == 1; // Verschoven.
  var mjbFreezed = getFParamInt("mjbFreezed", 0) == 1; // In behandeling.
  var mjbXcped = getFParamInt("mjbXcped", 0) == 1; // Aangepast.

  // Start building the query to fetch all objects satisfying
  var mjbparams = { niveau: groupby,   // Het niveau (betekenis) van de keys (district(1), locatie(2), gebouw(3), discipline(4), groep(5), objectsoort(6), object(7))
                    keys: ins_key_arr,
                    scenario: 1,
                    fulldetails: true,
                    //actsit: actsit, // actsit alleen van invloed op scenario_key > 1.
                    mode: screenmode,
                    dist_key_arr: dist_key_arr,
                    loc_key_arr: loc_key_arr,
                    bld_key_arr: bld_key_arr,
                    disc_key_arr: disc_key_arr,
                    srtgroep_key_arr: srtgroep_key_arr,
                    srtdeel_key_arr: srtdeel_key_arr,
                    moredetail: moredetail,
                    srtgebouw_key_arr: srtgebouw_key_arr,
                    groep_str_arr: groep_str_arr,
                    categorie_key_arr: categorie_key_arr,
                    srtcontrole_key_arr: srtcontrole_key_arr,
                    frequentie_arr: frequentie_arr,
                    kp_key_arr: kp_key_arr,
                    incbtw: incbtw,
                    showunfin: showunfin,
                    inflatiefactor: inflatiefactor,
                    toyear: mjb_freeze_year,
                    groupby: 9, // Ik wil alle objecten opvragen.
                    deel: deel,
                    fitness_score1_from : fitness_score1_from,
                    fitness_score1_through : fitness_score1_through,
                    fitness_score1_from_neg : fitness_score1_from_neg,
                    fitness_score1_through_neg : fitness_score1_through_neg,
                    fitness_score1_from_pos : fitness_score1_from_pos,
                    fitness_score1_through_pos : fitness_score1_through_pos,
                    priority_score2_from : priority_score2_from,
                    priority_score2_through : priority_score2_through,
                    mjbMoved: mjbMoved,
                    mjbFreezed: mjbFreezed,
                    mjbXcped: mjbXcped,
                    jaren: [mjb_freeze_year],
                    unfreeze: true
                  };
  var mjblist_sql = ins.getmjblist_sql(mjbparams);
  // De mjblist_sql bevat nu alle objecten (ins_deel_key) van de aangevinkte regels uit het mjb overzicht en levert voor elk object de waarden voor de insert op.

  var oRs = Oracle.Execute(mjblist_sql);
  // Hier geen "user.anything_todo_or_abort(!oRs.eof);". We geven altijd een melding terug hoeveel taken er terug gezet zijn.
  while (!oRs.eof)
  {
    var ins_key = oRs("ins_deel_key").Value;
    var srtcont_key = oRs("ins_srtcontrole_key").Value;
    var ins_srtdeel_oms = oRs("ins_srtdeel_omschrijving").Value;
    var ins_srtcont_oms = oRs("ins_srtcontrole_omschrijving").Value;
    var ins_srtcont_info = oRs("ins_srtcontrole_info").Value;
    var nextdate = oRs("nextdate").Value != null? new Date(oRs("nextdate").Value) : null;
    var inspstatus = oRs("ins_deelsrtcontrole_status").Value;
    var kosten = oRs("freeze_bedrag").Value;
    var opm_has_higherprio = oRs("opm_has_higherprio").Value;
    ingesloten.push({ ins_key: ins_key,
                      srtcont_key: srtcont_key
                    });
    oRs.MoveNext();
  }
  oRs.Close();

  for (var i = 0; i < ingesloten.length; i++)
  {
    var sql = "SELECT idsc.ins_deelsrtcontrole_key"
            + "     , idsc.ins_deelsrtcontrole_plandatum"
            + "     , xcp.ctr_discipline_key"
            + "  FROM ins_deelsrtcontrole idsc"
            + "     , ins_v_defined_inspect_xcp xcp"
            + " WHERE xcp.ins_deel_key = idsc.ins_deel_key"
            + "   AND xcp.ins_srtcontrole_key = idsc.ins_srtcontrole_key"
            + "   AND xcp.ins_scenario_key = idsc.ins_scenario_key"
            + "   AND idsc.ins_deel_key = " + ingesloten[i].ins_key
            + "   AND idsc.ins_srtcontrole_key = " + ingesloten[i].srtcont_key
            + "   AND idsc.ins_scenario_key = 1"
            + "   AND idsc.ins_deelsrtcontrole_status = 2";
    var oRs_idsc = Oracle.Execute(sql);

    ingesloten[i].dlsrtcont_key = oRs_idsc("ins_deelsrtcontrole_key").Value;
    ingesloten[i].hasPlandatum = (oRs_idsc("ins_deelsrtcontrole_plandatum").Value != null);
    oRs_idsc.Close();
  }
}
else
{
  var tobestart = 0;
  // Bepaal de taken in de selectie waarvan het accorderen ook echt ongedaan gemaakt 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: deelsrtcont_key_arr[i]
                                           });

      // Het laatste inspectierecord moet Gepland(0) of Verwerkt(6) (ins_deelsrtcontrole_status = -1) zijn, anders kan de inspectie niet gestart worden.
      if (this_ins.canInspUnFreeze)
      { // Accorderen kan ongedaan gemaakt worden.
        var sql = "SELECT ins_deelsrtcontrole_plandatum"
                + "  FROM ins_deelsrtcontrole"
                + " WHERE ins_deelsrtcontrole_key = " + deelsrtcont_key_arr[i];
        var oRs = Oracle.Execute(sql);

        ingesloten.push({ ins_key: ins_key_arr[i],
                          srtcont_key: srtcont_key_arr[i],
                          dlsrtcont_key: deelsrtcont_key_arr[i],
                          hasPlandatum: (oRs("ins_deelsrtcontrole_plandatum").Value != null)
                        });
        oRs.Close();
        tobestart++;
      }
    }
  }
  lcl.set_dialect(ctrdisc_key, "CTR_DISCIPLINE_KEY");
  // Hier geen "user.anything_todo_or_abort(tobestart > 0);". We geven altijd een melding terug hoeveel taken er terug gezet zijn.
}

for (var i = 0; i < ingesloten.length; i++)
{ // Indien er een plandatum is gezet dan de status naar ingepland(0) zetten, anders het inspectie record verwijderen.
  if (ingesloten[i].hasPlandatum)
  { // Zetten van de status en afhandelen van de tracking (en notificatie) van het starten.
    ins.setinspectstatus(ingesloten[i].dlsrtcont_key, 0); // Ingepland(0)

    // Maak de freeze velden freezecost en freezedate weer leeg.
    var sql = "UPDATE ins_deelsrtcontrole"
            + "   SET ins_deelsrtcontrole_freezecost = NULL"
            + "     , ins_deelsrtcontrole_freezedate = NULL"
            + " WHERE ins_deelsrtcontrole_key = " + ingesloten[i].dlsrtcont_key;
    Oracle.Execute(sql);

    // Tracking van het ongedaan maken van de accordering.
    ins.trackinspectupdate(ingesloten[i].dlsrtcont_key, L("lcl_mjb_start_reversed"));
  }
  else
  { // Inspectie (ins_deelsrtcontrole) record verwijdern.
    var sql = "DELETE FROM ins_deelsrtcontrole"
            + " WHERE ins_deelsrtcontrole_key = " +  ingesloten[i].dlsrtcont_key;
    Oracle.Execute(sql);

    // Tracking is niet meer terug te herleiden naar de verwijderde inspectie.
    // Daarom de tracking van het accorderen verwijderen.
    var sql = "DELETE FROM fac_tracking"
            + " WHERE fac_srtnotificatie_key = (SELECT fac_srtnotificatie_key FROM fac_srtnotificatie WHERE fac_srtnotificatie_code = 'INSCBE')"
            + "   AND fac_tracking_refkey = " +  ingesloten[i].dlsrtcont_key;
    Oracle.Execute(sql);
  }
  result.key += (i > 0? "," : "") + ingesloten[i].dlsrtcont_key;
}

if (ingesloten.length < aantaltaken)
{ // Niet alle taken zijn terug gezet.
  result.message = ingesloten.length == 1? L("lcl_mjb_unfreeze_mes_1").format(aantaltaken) : L("lcl_mjb_unfreeze_mes_n").format(ingesloten.length, aantaltaken);
}
else
{ // Alle taken zijn terug gezet.
  result.toaster = L("lcl_mjb_start_reversed");
}
Response.Write(JSON.stringify(result));
%>
<% ASPPAGE_END(); %>
