<%@language = "javascript" %>
<%  Server.ScriptTimeout=6000; %>
<% /*
     $Revision$
     $Id$

     File:               mjb_commit_scen.asp
     Description:        Doorvoeren van een scenario
     Parameters:
         scen_key        Scenario key.
     Context:
     Note:

*/ %>

<%
var JSON_Result = true;
%>

<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../shared/save2db.inc" -->
<!-- #include file="../ins/ins.inc" -->

<%
protectRequest.validateToken();
var scen_key =  getFParamInt("scenario", -1);
var mjb_freeze_year = Math.max(S("mjb_freeze_year"), new Date().getFullYear());

var sql = "SELECT ins_scenario_omschrijving"
        + " FROM ins_scenario"
        + " WHERE ins_scenario_key = " + scen_key;
var oRs = Oracle.Execute(sql)
var scen_name = oRs("ins_scenario_omschrijving").Value;
oRs.Close();


var sql = "SELECT xcp.ins_deel_key"
        + "     , xcp.ins_srtcontrole_key"
        + "  FROM ins_v_defined_inspect_xcp xcp"
        + " WHERE xcp.ins_scenario_key = " + scen_key
        + " ORDER BY xcp.ins_deel_key, xcp.ins_srtcontrole_key";
oRs = Oracle.Execute(sql);

var tobecomitted = 0;
var ingesloten = [];
var autchecked = false;
while (!oRs.eof)
{
  var ins_key = oRs("ins_deel_key").Value;
  var srtcont_key = oRs("ins_srtcontrole_key").Value;
  // Rechten 1 keer bepalen of ik mag doorvoeren.
  if (!autchecked)
  {
    var this_ins = ins.func_enabled_deel(ins_key, {srtcont_key: srtcont_key});
    autchecked = true;
  }
  if (this_ins.canAddToScen) // Mag ik de AS xcp waarde wijzigen?
  {
    ingesloten.push({ins_key: ins_key, srtcont_key: srtcont_key});
    tobecomitted++;
  }
  oRs.MoveNext();
}
oRs.Close()

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

Oracle.Transaction();

for (var i = 0; i < ingesloten.length; i++)
{ // Toevoegen van de taak voor het object aan het (nieuwe) scenario.
  var dlsrtcont_key = -1;
  var dlsrtcont_status;
  var dsc_plandatum_string = L("lcl_empty");
  // Laatste inspectie record (Active Situatie (AS)) ophalen.
  sql = "SELECT idsc.ins_deelsrtcontrole_key"
      + "     , idsc.ins_deelsrtcontrole_status"
      + "     , idsc.ins_deelsrtcontrole_plandatum"
      + "     , EXTRACT (YEAR FROM idsc.ins_deelsrtcontrole_freezedate) freezejaar"
      + "  FROM ins_deelsrtcontrole idsc"
      + " WHERE idsc.ins_deel_key = " + ingesloten[i].ins_key
      + "   AND idsc.ins_srtcontrole_key = " + ingesloten[i].srtcont_key
      + "   AND idsc.ins_scenario_key = 1"
      + " ORDER BY idsc.ins_deelsrtcontrole_key DESC";
  var oRs = Oracle.Execute(sql);
  if (!oRs.eof)
  {
    dlsrtcont_key = oRs("ins_deelsrtcontrole_key").Value;
    dlsrtcont_status = oRs("ins_deelsrtcontrole_status").Value;
    dsc_plandatum_string = oRs("ins_deelsrtcontrole_plandatum").Value != null? toDateTimeString(new Date(oRs("ins_deelsrtcontrole_plandatum").Value)) : L("lcl_empty");
    dsc_freezejaar = oRs("freezejaar").Value;
  }
  oRs.Close();

  // Waarden van het scenario ophalen.
  var sql = "SELECT xcp.ins_srtcontroledl_xcp_key"
          + "     , isc.ins_srtcontrole_mode"
          + "     , xcp.ins_srtcontroledl_xcp_periode"
          + "     , xcp.prs_kostenplaats_key"
          + "     , xcp.ins_srtcontroledl_xcp_eenheid"
          + "     , xcp.ins_srtcontroledl_xcp_bits"
          + "     , xcp.ins_srtcontroledl_xcp_uren"
          + "     , xcp.ins_srtcontroledl_xcp_materia"
          + "     , xcp.ins_srtcontroledl_xcp_kosten"
          + "     , xcp.ins_srtcontroledl_xcp_kosten2"
          + "     , xcp.ins_srtcontroledl_xcp_kosten3"
          + "     , xcp.ins_srtcontroledl_xcp_perc"
          + "     , xcp.ins_srtcontroledl_xcp_groep"
          + "     , xcp.ins_srtcontroledl_xcp_startdat"
          + "     , xcp.ins_srtcontroledl_xcp_eind"
          + "     , xcp.ins_srtcontroledl_xcp_opmerk"
          + "     , xcp.ins_srtcontroledl_xcp_aantal"
          + "     , xcp.ins_srtcontroledl_xcp_aanteh"
          + "     , xcp.ins_scenario_key"
          + "     , isc.ins_srtcontrole_opmerking"
          + "  FROM ins_srtcontroledl_xcp xcp"
          + "     , ins_srtcontrole isc"
          + " WHERE xcp.ins_deel_key = " + ingesloten[i].ins_key
          + "   AND xcp.ins_srtcontrole_key = " + ingesloten[i].srtcont_key
          + "   AND xcp.ins_srtcontrole_key = isc.ins_srtcontrole_key"
          + "   AND xcp.ins_scenario_key = " + scen_key;
  var oRs = Oracle.Execute(sql);

  var xcp_key = oRs("ins_srtcontroledl_xcp_key").Value;
  var mode = oRs("ins_srtcontrole_mode").Value;
  var periode = oRs("ins_srtcontroledl_xcp_periode").Value;
  var kp_key = oRs("prs_kostenplaats_key").Value || -1;
  var eenheid = oRs("ins_srtcontroledl_xcp_eenheid").Value;
  var bits = oRs("ins_srtcontroledl_xcp_bits").Value;
  var uren = oRs("ins_srtcontroledl_xcp_uren").Value;
  var materiaal = oRs("ins_srtcontroledl_xcp_materia").Value;
  var kosten1 = oRs("ins_srtcontroledl_xcp_kosten").Value;
  var kosten2 = oRs("ins_srtcontroledl_xcp_kosten2").Value;
  var kosten3 = oRs("ins_srtcontroledl_xcp_kosten3").Value;
  var perc = oRs("ins_srtcontroledl_xcp_perc").Value;
  var groep = oRs("ins_srtcontroledl_xcp_groep").Value;
  var vervaldatum = oRs("ins_srtcontroledl_xcp_eind").Value != null? new Date(oRs("ins_srtcontroledl_xcp_eind").Value) : null;
  var opmerk = oRs("ins_srtcontroledl_xcp_opmerk").Value;
  var startdatum = oRs("ins_srtcontroledl_xcp_startdat").Value != null? new Date(oRs("ins_srtcontroledl_xcp_startdat").Value) : null;
  var aantal = oRs("ins_srtcontroledl_xcp_aantal").Value;
  var aanteh = oRs("ins_srtcontroledl_xcp_aanteh").Value;
  oRs.Close();

  // Xcp scenario -> Active Situatie (AS).
  var params = { xcp_key: xcp_key,
                 periode: periode,
                 eenheid: eenheid,
                 kp_key: kp_key,
                 bits: bits,
                 uren: uren,
                 materiaal: materiaal,
                 kosten1: kosten1,
                 kosten2: kosten2,
                 kosten3: kosten3,
                 perc: perc,
                 groep: groep,
                 vervaldatum: vervaldatum,
                 opmerk: opmerk,
                 startdatum: startdatum,
                 aantal: aantal,
                 aanteh: aanteh,
                 isScenario: false,
                 scen_key: scen_key,
                 commit: true,
                 scen_name: scen_name
               };
  var result = ins.saveXcp(ingesloten[i].ins_key, ingesloten[i].srtcont_key, params);

  // Plandatum scenario -> Active Situatie (AS).
  // Plandatum scenario ophalen.
  sql = "SELECT idsc.ins_deelsrtcontrole_plandatum"
      + "  FROM ins_deelsrtcontrole idsc"
      + " WHERE idsc.ins_deel_key = " + ingesloten[i].ins_key
      + "   AND idsc.ins_srtcontrole_key = " + ingesloten[i].srtcont_key
      + "   AND idsc.ins_scenario_key = " + scen_key;
  var oRs = Oracle.Execute(sql);
  // Het kan zijn dat er voor het scenario geen ins_deelsrtcontrole record is (Niet verschoven t.o.v. het orgineel).
  var plandatum = !oRs.eof && oRs("ins_deelsrtcontrole_plandatum").Value != null? new Date(oRs("ins_deelsrtcontrole_plandatum").Value) : null;
  oRs.Close();

  // Is er in de Active Situatie (AS) een lopende instpectie.
  // In mjob komen geen Gereedgemeld/Afgerond(5) inspecties voor. Alleen status 0, 2 en 6.
  if (dlsrtcont_key > 0 && dlsrtcont_status == 0)
  { // Er is een lopende inspectie in de Active Situatie (AS).
    if (plandatum)
    {
      if (dsc_plandatum_string != toDateTimeString(plandatum))
      {
          var fields =  [ { dbs: "prs_perslid_key",                typ: "key",      val: user_key },
                          { dbs: "ins_deelsrtcontrole_plandatum",  typ: "datetime", val: plandatum }
                        ];
          var insUpd = buildTrackingUpdate("ins_deelsrtcontrole", " ins_deelsrtcontrole_key = " + dlsrtcont_key, fields);
          var err = Oracle.Execute(insUpd.sql, true);
          ins.trackinspectupdate(dlsrtcont_key, L("lcl_mjb_adjustby_scen").format(scen_name) + "\n" + L("lcl_opdr_plandate") + " " + dsc_plandatum_string + " -> " + toDateTimeString(plandatum));
      }
    }
    else if (dlsrtcont_status == 0)
    { // Er was een inspectie ingepland voor de Active Situatie (AS). Het inspectierecord verwijderen omdat de plandatum van het scenario leeg is;
      Oracle.Execute("DELETE FROM ins_deelsrtcontrole WHERE ins_deelsrtcontrole_key = " + dlsrtcont_key);
    }
  }
  else
  { // Er is in de Active Situatie (AS) geen lopende inspectie.
    // of er is een geaccordeerde inspectie voor het freeze jaar.
    //
    // Alleen een ins_deelsrtcontrole opslaan als:
    // 1) de inspectie/taak is verschoven/verplaatsen (een plandatum ingevuld)
    // 2) er geen ingeplande/gestarte inspectie is in de Active Situatie (AS).
    if (plandatum && !((dlsrtcont_status == 2 || dlsrtcont_status == 3) && dsc_freezejaar == mjb_freeze_year))
    {
      var nextdate = ins.func_get_nextdate(ingesloten[i].ins_key, ingesloten[i].srtcont_key, 1);
      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_deelsrtcontrole_status",     typ: "key",      val: 0 },
                      { 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}
                    ];
      ins.testInspectInsert(ingesloten[i].ins_key, ingesloten[i].srtcont_key, 1);
      var insIns = buildInsert("ins_deelsrtcontrole", fields);
      dlsrtcont_key = insIns.sequences["ins_deelsrtcontrole_key"];
      var err = Oracle.Execute(insIns.sql, true);
    }
  }

  // Het inspectierecord (ins_deelsrtcontrole) verwijderen.
  Oracle.Execute("DELETE FROM ins_deelsrtcontrole"
               + " WHERE ins_deel_key = " + ingesloten[i].ins_key
               + "   AND ins_srtcontrole_key = " + ingesloten[i].srtcont_key
               + "   AND ins_scenario_key = " + scen_key);

  if ((i % 100) == 99) // Modulus. Bij elke 100 committen.
  {
    Oracle.Commit();
    Oracle.Transaction();
  }
}
// Nu nog het scenario verwijderen.
// Een scenario gooit via de cascade zijn ins_deelsrtcontrole en ins_srtcontroledl_xcp records mee weg. Maar die zijn al verwijderd.
Oracle.Execute("DELETE FROM ins_scenario WHERE ins_scenario_key = " + scen_key);

Oracle.Commit();

result.deleted = true; // Scenario tabje sluiten na het verwijderen van het scenario
result.message = L("lcl_mjb_scenario_deleted"); // Alert i.p.v. toaster want het kan heel lang duren. Dan blijft de melding i.i.g. zichtbaar.

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