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

    File:           mld_reject_save.asp
    Description:    save_script van mld_reject.asp
    Parameters:     mld_key


    Context:
    Note:

*/
%>
<%
var JSON_Result = true;
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/save2db.inc" -->
<!-- #include file="../Shared/kenmerk_common.inc" -->
<!-- #include file="../mld/mld.inc" -->
<!-- #include file="../ins/ins.inc" -->
<%
protectRequest.validateToken();
var mld_key_arr = getQParamIntArray("mld_key");
var opmerk = getFParam("opmerk", "");

var result = {};
var toberejected = 0;
var ingesloten = [];  // mld_key.
var reqStatusEmptyMelding = [];

if (mld_key_arr.length == 1)
{
    // save mandatory characteristics before check on empty mandatory characteristics
    var currentKenmerkenSQL = "SELECT vk.mld_kenmerk_key"
                            + "     , mld_kenmerkmelding_waarde"
                            + "     , vk.mld_kenmerk_toonbaar"
                            + "     , vk.fac_functie_key"
                            + "  FROM mld_kenmerkmelding km"
                            + "     , mld_kenmerk vk"
                            + "     , mld_melding m"
                            + "     , mld_stdmelding s"
                            + "     , mld_discipline d"
                            + " WHERE km.mld_kenmerk_key = vk.mld_kenmerk_key"
                            + "   AND km.mld_kenmerkmelding_verwijder IS NULL"
                            + "   AND km.mld_melding_key = m.mld_melding_key"
                            + "   AND m.mld_melding_key = " + mld_key_arr[0]
                            + "   AND s.mld_stdmelding_key = m.mld_stdmelding_key"
                            + "   AND s.mld_ins_discipline_key = d.ins_discipline_key"
                            + "   AND ((vk.mld_stdmelding_key IS NULL AND vk.mld_kenmerk_niveau = 'A')"
                            + "     OR (vk.mld_stdmelding_key = s.mld_stdmelding_key     AND vk.mld_kenmerk_niveau = 'S')"
                            + "     OR (vk.mld_stdmelding_key = s.mld_ins_discipline_key AND vk.mld_kenmerk_niveau = 'D')"
                            + "     OR (vk.mld_stdmelding_key = d.ins_srtdiscipline_key  AND vk.mld_kenmerk_niveau = 'T'))";

    var allKenmerkenSQL = "SELECT COALESCE (" + lcl.xsql("k.mld_kenmerk_omschrijving", "k.mld_kenmerk_key")
                        + "              ,  " + lcl.xsql("t.mld_srtkenmerk_omschrijving", "t.mld_srtkenmerk_key") + ") kenmerk_omschrijving"
                        + "     , t.mld_srtkenmerk_kenmerktype kenmerk_kenmerktype"
                        + "     , t.mld_srtkenmerk_systeem     kenmerk_systeem"
                        + "     , k.mld_kenmerk_toonbaar       kenmerk_readonly"
                        + "     , k.mld_kenmerk_uniek          kenmerk_uniek"
                        + "     , fac_kenmerkdomein_key"
                        + "  FROM mld_kenmerk k"
                        + "     , mld_srtkenmerk t"
                        + " WHERE k.mld_srtkenmerk_key = t.mld_srtkenmerk_key"
                        + "   AND k.mld_kenmerk_key = "; /* wordt in saveFlexkenmerken uitgebreid */

    var kenmerkParams = {
        kenmerkTable: "mld_kenmerkmelding",
        kenmerkParentKey : "mld_melding_key",
        kenmerkWaarde: "mld_kenmerkmelding_waarde",
        kenmerkKey: "mld_kenmerk_key",
        kenmerkToonbaar: "mld_kenmerk_toonbaar",
        currentKenmerkenSQL: currentKenmerkenSQL,
        allKenmerkenSQL: allKenmerkenSQL,
        requestQF: Request.Form,
        isNew: false,
        flexPath: "MLD/M",
        tracking: true,
        module: "MLD"
    }

    if (hasFParam("nameprefix"))
    {
        kenmerkParams.nameprefix = getFParamSafe("nameprefix", "");
        kenmerkParams.extraserie = true;
    }

    var flextrack = saveFlexKenmerken(mld_key_arr[0], kenmerkParams);

    // Wijzigingen flexkenmerken tracken.
    if (flextrack.length)
    {
        var mld_info = mld.mld_melding_info(mld_key_arr[0]);
        var stdm_info = mld.mld_stdmeldinginfo(mld_info.stdm_key);
        var formattedID = stdm_info.ins_srtdiscipline_prefix+mld_key_arr[0] + " ("+ stdm_info.discipline_omschrijving + "/"+ stdm_info.stdmelding_omschrijving +")";
        mld.trackmeldingupdate(mld_key_arr[0], L("lcl_mld_is_mldupdtrack").format(formattedID) + "\n" + flextrack.join("\n"));
    }
}
// Bepaal de meldingen in de selectie die
// ook echt afgewezen kunnen of mogen worden.
for (var i = 0; i < mld_key_arr.length; i++)
{
    var this_mld = mld.func_enabled_melding(mld_key_arr[i]); // Wat heb ik zoal aan rechten op deze specifieke melding
    var mld_info = mld.mld_melding_info(mld_key_arr[i]);
    lcl.set_dialect(mld_info.srtdisc_key, "MLD_SRTDISCIPLINE_KEY");
    if (this_mld.canReject && !mld_info.parent_key) // Geen child melding
    {
        ingesloten.push({ mld_key: mld_key_arr[i] });
        toberejected++;
    }
    // Zijn er nog kenmerken die nu wel verplicht zijn?
    var afwezig = mld.hasRequiredStatusEmptyMelding(mld_key_arr[i], 1); // Melding status "Afgemeld(5)"
    if (afwezig.kenm_ontbreekt.length || afwezig.obj_ontbreekt)
    {
        var mldnr = mld.mld_prefix(mld_key_arr[i]) + mld_key_arr[i];
        if (afwezig.kenm_ontbreekt.length)
            reqStatusEmptyMelding.push(L("lcl_mld_req_status_empty").format(afwezig.kenm_ontbreekt.join(", "), mldnr));
        if (afwezig.obj_ontbreekt)
            reqStatusEmptyMelding.push(L("lcl_mld_req_obj").format(mldnr));
    }
}

// De laatst gebruikte set_dialect uit de for-lus geldt nu voor de onderstaande code.
user.anything_todo_or_abort(!reqStatusEmptyMelding.length, reqStatusEmptyMelding.join("<br />"));
user.anything_todo_or_abort(toberejected > 0); // We klagen niet over enkele wel en enkele niet

for (var i = 0; i < ingesloten.length; i++)
{
  var mld_melding = mld.mld_melding_info(ingesloten[i].mld_key);

  ingesloten[i].ins_key_arr = [];
  ingesloten[i].srtcont_key_arr = [];
  ingesloten[i].controlemode_arr = [];
  var sql = "SELECT dsc.ins_deel_key"
          + "     , dsc.ins_srtcontrole_key"
          + "     , cdp.ctr_disc_params_controle_type"
          + "     , mo.ins_deelsrtcontrole_key"
          + "  FROM ins_deelsrtcontrole dsc"
          + "     , ins_srtcontrole isc"
          + "     , ctr_disc_params cdp"
          + "     , mld_melding_object mo"
          + " WHERE dsc.ins_srtcontrole_key = isc.ins_srtcontrole_key"
          + "   AND isc.ctr_discipline_key = cdp.ctr_ins_discipline_key"
          + "   AND mo.ins_deelsrtcontrole_key = dsc.ins_deelsrtcontrole_key"
          + "   AND mo.mld_melding_key = " + ingesloten[i].mld_key;
  var oRs = Oracle.Execute(sql);
  while (!oRs.eof)
  {
    // De controle moet aanwezig zijn. Maar een inspectie kan ook verwijderd zijn!
    var this_ins = ins.func_enabled_deel(oRs("ins_deel_key").Value,
                                         {srtcont_key: oRs("ins_srtcontrole_key").Value,
                                          deelsrtcont_key: oRs("ins_deelsrtcontrole_key").Value,
                                          scen_key: 1
                                         });
    if (this_ins.canInspFinishMjb)
    {
      ingesloten[i].ins_key_arr.push(oRs("ins_deel_key").Value);
      ingesloten[i].srtcont_key_arr.push(oRs("ins_srtcontrole_key").Value);
      ingesloten[i].controlemode_arr.push(oRs("ctr_disc_params_controle_type").Value);
    }
    oRs.MoveNext();
  }
  oRs.Close();
}

var reject_arr = [];
var notaccepted = 0;
for (var i = 0; i < ingesloten.length; i++)
{
  mld.nextworkflowstep(ingesloten[i].mld_key, 0);  // 0 = rejected
  // voorheen werd de opemerking ge-append aan een bestaande opmerking.
  // Nu wordt de opmerking vervangen door de nieuwe opmerking.
  var fields = [ { dbs: "mld_melding_opmerking", typ: "varchar", val: opmerk, track: L("lcl_mld_inf_Opmerking"), len: 4000 },
                 { dbs: "mld_melding_conceptstatus", typ: "number", val: 0 }   // voor als dit een afwijzing is van een conceptmelding
               ];

  var mldUpd = buildTrackingUpdate("mld_melding", " mld_melding_key = " + ingesloten[i].mld_key, fields);
  oRs = Oracle.Execute(mldUpd.sql);
  if (mldUpd.trackarray.length)
      mld.trackmeldingupdate(ingesloten[i].mld_key, L("lcl_mld_is_mldupd") + "\n" + mldUpd.trackarray.join("\n"));

  // Zetten van de status op afgewezen en afhandelen van de tracking.
  mld.setmeldingstatus(ingesloten[i].mld_key, 1); // afgewezen

  // Gequeuede berichten/notificaties en portalberichten van de instemmer verwijderen.
  var clrsql = "BEGIN fac.clrnotifications ('MLD2CO', " + ingesloten[i].mld_key + "); END;";
  Oracle.Execute(clrsql);

  // check (zat er al in)
  // TODO: Het afwijzen gaat niet altijd goed. Wat is de reden daartoe? Status wordt in enkele gevallen niet op 1 gezet door  mld.setmeldingstatus?
  sql = "SELECT ''"
      + " FROM mld_melding"
      + " WHERE mld_melding_key = " + ingesloten[i].mld_key
      + "   AND mld_melding_status = 1";
  oRs = Oracle.Execute(sql);
  if (oRs.eof)
  {
      notaccepted++;
  }

  var ctr_close = getFParam("ctr_close", "off") == "on";
  if (ctr_close)
  {
    for (var t = 0; t < ingesloten[i].ins_key_arr.length; t++)
    {
      var reject_mld = { mld_key: ingesloten[i].mld_key};
      reject_mld.inspect = { savemode: "C"
                           , ins_keys: ingesloten[i].ins_key_arr[t]
                           , srtcont_key_arr: ingesloten[i].srtcont_key_arr[t]
                           , finish: 1
                           , deelsrtcontrole_datum: (new Date()).getTime()
                           , sel_controlemode: getFParamInt("sel_controlemode" + ingesloten[i].controlemode_arr[t])
                           };
      reject_arr.push(reject_mld);
    }
  }
}
var warning = (notaccepted == ingesloten.length ? L("lcl_mld_reject_failed") : "");

var result = { success: true, warning: warning, mld_key: mld_key_arr, reject_arr: reject_arr };
Response.Write(JSON.stringify(result));
%><% ASPPAGE_END(); %>
