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

     File:          mld_close_save.asp
     Description:   Het echte afmelden van een melding. zonder interactie
     Parameters:    mld_key    Meldingnummer array (keys)
     Context:       A Vanuit mld_close_confirm.asp
                    B Vanuit PDA/melding.asp
*/
var JSON_Result = true;

var mld_key_arr = getQParamIntArray("mld_key");
if (mld_key_arr.length)
    var LOCKED_USER_OK = { "xmlnode": "melding", "key": mld_key_arr[0] };
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/save2db.inc" -->
<!-- #include file="mld_flexkenmerk.inc" -->
<!-- #include file="mld.inc" -->

<%
// LET OP: Het eerste stuk komt (nog) letterlijk ook zo terug bij mld_close_confirm.asp

var verynew = getQParamInt("verynew", 0) == 1;
var submitting = getQParamInt("submit", 0) == 1;
var lastopdr = (getQParamInt("lastopdr", 0) == 1)
var TransitParam = buildTransitParam(["mld_key", "verynew", "lastopdr"]);

var opmerk = getFParam("opmerk", "");
var noti_caller = getFParam("noti_caller", (hasFParam("has_noti_caller")
                                             ? "off" // Ik was er wel, maar uitgevinkt
                                             : S("mld_close_noti_default_off") == 1 ? "off" : "on")) == "on";
var assume_ok = getFParam("assume_ok", "off") == "on";
var notifyExt = getFParam("notifyExt", "off") == "on";
var opdr_close = getFParam("opdr_close", (hasFParam("has_opdr_close")
                                             ? "off" // Ik was er wel, maar uitgevinkt
                                             : S("mld_close_opdr_default") == 1 ? "on" : "off")) == "on";
var result = {};
var tobeclosed = 0;
var ingesloten = [];
var canCloseOpdr = [];
var reqStatusEmptyMelding = [];
var futureOpdr = false;

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 flextrack =
      saveFlexKenmerken(mld_key_arr[0], { 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"
                                  }
                       );

  // 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 afgemeld 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], { verynew: verynew });
  if (this_mld.canClose || (opdr_close && this_mld.canCloseWithOrder)) // Afmelden meldingen zonder en met zijn verplichte opdracht(en) afmelden.
  {
    // Zijn er nog kenmerken of objecten die nu wel verplicht zijn?
    reqStatusEmptyMelding = mld.getReqStatusEmptyMelding(reqStatusEmptyMelding, mld_key_arr[i], 5); // Melding status "Afgemeld(5)".

    // Zijn er nog lopende opdrachten?
    var canCloseOpdrOfMld = [];
    var sql = "SELECT o.mld_opdr_key"
            + "  FROM mld_opdr o"
            + " WHERE o.mld_melding_key IN (" + mld_key_arr[i] + ")"
            + "   AND o.mld_statusopdr_key NOT IN (1, 6, 7, 9)"
    var oRsOM = Oracle.Execute(sql);
    var noOpdrCloseAtAll = false;
    futureOpdr = false;
    while (!oRsOM.eof)
    { // Voor elke opdracht van een melding controleren of deze afgemeld mag worden
      var this_opdr = mld.func_enabled_opdracht(oRsOM("mld_opdr_key").value);
      sql = "SELECT mld_opdr_einddatum"
          + " FROM mld_opdr o"
          + " WHERE o.mld_opdr_key = " + oRsOM("mld_opdr_key").value;
      var oRs = Oracle.Execute(sql);

      // Als Setting S("mld_ord_afmeld_future") niet is gezet (0): Opdrachten waarvan de einddatum in de toekomst ligt mogen niet worden afgemeld.
      var mld_opdr_einddatum = oRs("mld_opdr_einddatum").Value;
      if (!this_opdr.canClose || (S("mld_ord_afmeld_future") != 1 && (mld_opdr_einddatum && mld_opdr_einddatum > new Date())))
      { // Geen autorisatie om alle opdrachten van een melding af te melden of opdrachten in de toekomst met setting S("mld_ord_afmeld_future") niet gezet-->dan geen enkele van die melding
        noOpdrCloseAtAll = true;
        if (S("mld_ord_afmeld_future") != 1 && (mld_opdr_einddatum && mld_opdr_einddatum > new Date()))
          futureOpdr = true; // Indien opdrachten in de toekomst en setting S("mld_ord_afmeld_future") niet gezet (0) dan mag je de melding niet afmelden
      }
      canCloseOpdrOfMld.push(oRsOM("mld_opdr_key").value);
      oRsOM.MoveNext();
    }
    oRsOM.Close();
    // Geen autorisatie om alle opdrachten van een melding af te melden of opdrachten in de toekomst met setting S("mld_ord_afmeld_future") niet gezet (0)
    // --> dan geen enkele van die melding
    if (!noOpdrCloseAtAll)
    {
      for (var j = 0; j < canCloseOpdrOfMld.length; j++)
      {
        canCloseOpdr.push(canCloseOpdrOfMld[j]);
      }
    }

    if (!futureOpdr)
    { // Indien opdrachten in de toekomst en setting S("mld_ord_afmeld_future") niet gezet (0) dan mag je de melding niet afmelden
      ingesloten.push(mld_key_arr[i]);
      tobeclosed++;
    }
  }
}
user.anything_todo_or_abort(!reqStatusEmptyMelding.length, reqStatusEmptyMelding.join("<br />"));
user.auth_required_or_abort(!(mld_key_arr.length == 1 && futureOpdr), L("lcl_mld_einddatum_to_late_mld")); // Bij enkele melding met toekomstige opdrachten een aparte melding geven
user.anything_todo_or_abort(tobeclosed > 0); // We klagen niet over enkele wel en enkele niet

var result = { key: ingesloten.join(","), message: "", success: false };

if (Request.Form("opdr_close").count == 1)
{ // Ook de opdrachten
  for (opdr_i in canCloseOpdr)
  {
      mld.setopdrachtstatus(canCloseOpdr[opdr_i], 6); // Technisch voltooid (TV) (Afgemeld)
  }
}

for (var i = 0; i < ingesloten.length; i++)
{
  // Ingevulde text toevoegen aan opmerking van de melding
  if (opmerk != "")
  {
    var extra = lastopdr? L("lcl_mld_final_remark") + ":\n" : "";
    sql = "SELECT mld_melding_opmerking"
        + "  FROM mld_melding"
        + " WHERE mld_melding_key = " + ingesloten[i];
    oRs = Oracle.Execute(sql);
    var new_opm = (oRs("mld_melding_opmerking").value||"") + "\n" + extra + opmerk;

    var fields =  [ { dbs: "mld_melding_opmerking",  typ: "varchar", val: new_opm, track: L("lcl_mld_inf_Opmerking"), len: 4000 } ];

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

  mld.setmeldingstatus(ingesloten[i], 5, noti_caller);
  if (verynew && S("mld_suppress_directklaar_notification") == 1)
  { // Geen notificaties bij Direct Klaar indien setting S("mld_suppress_directklaar_notification") is gezet
    sql = "BEGIN fac.clrnotifications ('MLDNEW', " + ingesloten[i] + "); "
        + "      fac.clrnotifications ('MLDAFM', " + ingesloten[i] + "); "
        + "END;";
    Oracle.Execute(sql);
  }

  if (notifyExt || assume_ok)
    var mld_info = mld.mld_melding_info(ingesloten[i]);

  if (notifyExt)
  {
    if (mld_info.canholdthirdparty && mld_info.email_ext)
    {
      var sender = getNotiSenderEmail(ingesloten[i]);

      var omssql = "SELECT fac_srtnotificatie_oms"
                 + "     , fac_srtnotificatie_mode"
                 + "  FROM fac_srtnotificatie"
                 + " WHERE fac_srtnotificatie_code = 'MLDAFM'";
      var oRs = Oracle.Execute(omssql);
      var oms = L(oRs("fac_srtnotificatie_oms").Value, { autolcl: true });
      var noti_mode = 2 + (oRs("fac_srtnotificatie_mode").Value & 16);
      oRs.Close();

      Oracle.Execute("BEGIN fac.putnotificationsrtprio"
                    + "( NULL"
                    + ", NULL"
                    + ", 'MLDAFM'"
                    + ", " + ingesloten[i]
                    + ", mld.mldsprintf(" + safe.quoted_sql(oms) + ", " + ingesloten[i] + ")"
                    + ", " + noti_mode
                    + ", " + safe.quoted_sql(mld_info.email_ext)
                    + ", NULL"
                    + ", NULL"
                    + ", 2"
                    + ", " + safe.quoted_sql(sender)
                    + "); END;");
    }
  }
  // Handle workflow actions for completion:
  mld.nextworkflowstep(ingesloten[i], 1);  // 1 = completed

  if (assume_ok)
  {
    var mldActiecode = mld_info.actiecode; // Huidige actiecode.
    mldActiecode |= 256; // attentieFE (256) toevoegen.
    var sql = "UPDATE mld_melding"
            + "   SET mld_melding_actiecode = " + mldActiecode // Attentie FE/Melder.
            + " WHERE mld_melding_key = " + ingesloten[i];
    Oracle.Execute(sql);
  }
}

result.success = true;
if (ingesloten.length === 1) {
  result.toaster = L("lcl_mld_closed").format(ingesloten[0]);
} else if (ingesloten.length > 1) {
  result.toaster = L("lcl_mld_closed_m").format(ingesloten.length);
}

function getNotiSenderEmail(mldkey)
{ // Deze functie volgt dezelfde logica als fac.notifytracking wat betreft het ophalen van het afzend emailadres
    var sql = "SELECT COALESCE (d.ins_discipline_email,"
            + "                 l1.alg_locatie_email,"
            + "                 l2.alg_locatie_email)"
            + "           sender"
            + "  FROM mld_melding         m,"
            + "       mld_stdmelding      stdm,"
            + "       ins_tab_discipline  d,"
            + "       mld_adres           ma,"
            + "       alg_locatie         l1,"
            + "       alg_locatie         l2"
            + " WHERE stdm.mld_stdmelding_key = m.mld_stdmelding_key"
            + "   AND d.ins_discipline_key    = stdm.mld_ins_discipline_key"
            + "   AND m.mld_adres_key         = ma.mld_adres_key(+)"
            + "   AND ma.alg_locatie_key      = l1.alg_locatie_key(+)"
            + "   AND m.mld_alg_locatie_key   = l2.alg_locatie_key(+)"
            + "   AND m.mld_melding_key       = " + mldkey;
    var oRs = Oracle.Execute(sql);
    var sender = oRs("sender").Value;
    oRs.Close();
    return sender;
}

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