<%@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;

%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/json2.js" -->
<!-- #include file="../Shared/save2db.inc" -->
<!-- #include file="mld.inc" -->

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

var mld_key_arr = getQParamIntArray("mld_key");

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 result = {};
var tobeclosed = 0;
var ingesloten = [];
var canCloseOpdr = [];
var reqStatusEmptyMelding = [];
var futureOpdr = false;
// 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) // Als je mag accepteren mag je ook rejecten
  {
    // Zijn er nog kenmerken die nu wel verplicht zijn?
    var kvsAfwezig = mld.hasRequiredStatusEmptyMelding(mld_key_arr[i], 5); // Melding status "Afgemeld(5)"
    if (kvsAfwezig.length)
    {
        var mldnr = mld.mld_prefix(mld_key_arr[i]) + mld_key_arr[i];
        reqStatusEmptyMelding.push(L("lcl_mld_req_status_empty").format(kvsAfwezig.join(", "), mldnr) );
    }
    // 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.
      if (!this_opdr.canClose || (S("mld_ord_afmeld_future") != 1 && (oRs("mld_opdr_einddatum").value > 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 && (oRs("mld_opdr_einddatum").value > 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();
    }
    // 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 };

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);
    oRs = 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);
  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);
  }

  // Handle workflow actions for completion:
  mld.nextworkflowstep(ingesloten[i], 1);  // 1 = completed
}

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)
  }
}

result.success = true;

Response.Write(JSON.stringify(result));
Response.End;
%>