<%@ LANGUAGE = JavaScript %>
<% /*
     $Revision$
     $Id$

     File:          opdr_close_save.asp
     Description:   Het echte sluiten van een opdracht, zonder interactie
     Parameters:
         opdr_key   Opdracht key van de opdracht die moet worden afgemeld
     Context:
     Note:          A Rechtstreeks vanuit opdr_close_confirm.asp
                    B in multi-mode wordt dit aangeroepen via $.post en doen we geen interactie
                              er wordt dan ook geen opmerking gevraagd
                    C Vanuit Pda/order.asp

*/
var JSON_Result = true;
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/json2.js" -->
<!-- #include file="../Shared/save2db.inc" -->
<!-- #include file="mld.inc" -->
<%

function mldClose(sluitmelding, ingesloten)
{
  if (sluitmelding == 1)
  {
    var mld_close = (Request.Form("mld_close").count == 1); // Die ook?
    var ismobile = getFParamInt("mobile", 0) == 1; // Meld ik de opdracht met mijn mobile af?

    if (ismobile)
      sluitmelding = 2; // // Via mobile afmelden nooit vragen maar gewoon melding afmelden (FSN#26329).

    if (ingesloten.length > 1) // Vraag is al geweest
    {
      if (mld_close)
        sluitmelding = 2; // yepe
      else
        sluitmelding = 0; // nope
    }
  }
  return sluitmelding;
}

function writeOpdrOpmToMld()
{ // Afhandelingtekst van de opdracht automatisch kopiëren naar de melding.
  var sql = "SELECT mld_melding_opmerking"
          + "  FROM mld_melding"
          + " WHERE mld_melding_key = " + mld_opdr.mld_key;
  var oRs = Oracle.Execute(sql);
  var new_opm = (oRs("mld_melding_opmerking").Value || "") + "\n" + L("lcl_mld_final_remark") + ":\n" + opdr_opm;
  var fields =  [ { dbs: "mld_melding_opmerking",  typ: "varchar", val: new_opm, track: L("lcl_mld_inf_Opmerking"), len: 4000 } ];
  var mldUpd = buildTrackingUpdate("mld_melding", " mld_melding_key = " + mld_opdr.mld_key, fields);
  oRs = Oracle.Execute(mldUpd.sql);
  if (mldUpd.trackarray.length)
    mld.trackmeldingupdate(mld_opdr.mld_key, L("lcl_mld_is_mldupd") + "\n" + mldUpd.trackarray.join("\n"));
}

var opdr_key_arr = getQParamIntArray("opdr_key");
var result = {};
var ingesloten = [];
var reqStatusEmptyMelding = [];
var reqStatusEmptyOpdr = [];

if (opdr_key_arr.length == 1)
{
  var this_opdr = mld.func_enabled_opdracht(opdr_key_arr[0]); // wat mag ik zoal op deze opdracht
  var mld_opdr = mld.mld_opdr_info(opdr_key_arr[0]);
  var kosten_verplicht_afm = mld_opdr.typeopdr_matchtype != 4 && (mld_opdr.typeopdr_kosten_verplicht & 2 || (mld_opdr.typeopdr_kosten_verplicht == 0 && mld_opdr.opdrkosten_verplicht & 2));
  var opdr_kosten = mld_opdr.t_cost;

  // Zijn bij deze opdracht alle verplichte kenmerken ingevuld?
  reqStatusEmptyOpdr = mld.getReqStatusEmptyOpdr(reqStatusEmptyOpdr, opdr_key_arr[0], 6); // Opdracht status "Technisch Voltooid(6)"

  user.auth_required_or_abort(!(kosten_verplicht_afm && opdr_kosten == 0) && this_opdr.canClose && !reqStatusEmptyOpdr.length, L("lcl_mld_opdr_kosten_verpl_afm")); // Dan zijn we vlug klaar.

  var sql = "SELECT o.mld_melding_key"
          + "     , o.mld_opdr_einddatum"
          + "     , mto.mld_typeopdr_sluitmelding"
          + "  FROM mld_opdr o"
          + "     , mld_typeopdr mto"
          + " WHERE o.mld_typeopdr_key = mto.mld_typeopdr_key"
          + "   AND o.mld_opdr_key = " + opdr_key_arr[0];
  var oRs = Oracle.Execute(sql);
  var mld_key = oRs("mld_melding_key").value;
  var mld_opdr_einddatum = oRs("mld_opdr_einddatum").value;
  var typeopdr_sluitmelding = oRs("mld_typeopdr_sluitmelding").value;
  oRs.Close();

  // Hoeveel opdrachten staan er open bij deze melding.
  var sql = "SELECT COUNT(mld_opdr_key) nrOpen"
          + "  FROM mld_opdr o"
          + " WHERE o.mld_melding_key = " + mld_key
          + "   AND o.mld_statusopdr_key NOT IN (1, 6, 7, 9)";
  var oRs = Oracle.Execute(sql);
  var nrOpen = oRs("nrOpen").Value;
  oRs.Close();

  ingesloten.push(opdr_key_arr[0]);
  var sluitmelding = mldClose(typeopdr_sluitmelding, ingesloten);

  if (nrOpen == 1 && sluitmelding)
  {
    // Zijn bij de melding van deze opdracht alle verplichte kenmerken ingevuld?
    // Alleen te controleren als melding na afsluiten van de opdracht ook gesloten wordt.
    var this_mld = mld.func_enabled_melding(mld_key);  // Wat heb ik zoal aan rechten op deze specifieke melding.
    if (this_mld.canClose)
      reqStatusEmptyMelding = mld.getReqStatusEmptyMelding(reqStatusEmptyMelding, mld_key, 5); // Melding status "Afgemeld(5)"
  }
  user.anything_todo_or_abort(!reqStatusEmptyMelding.length, reqStatusEmptyMelding.join("<br />"));
  // Als Setting S("mld_ord_afmeld_future") niet is gezet: Opdrachten waarvan de einddatum in de toekomst ligt mogen niet worden afgemeld.
  user.auth_required_or_abort((S("mld_ord_afmeld_future") == 1 || (mld_opdr_einddatum < new Date())) && this_opdr.canClose, L("lcl_mld_einddatum_to_late_opdr"));
}
else
{
  // Bepaal de opdrachten in de selectie die
  // ook echt afgemeld kunnen of mogen worden.
  for (var i = 0; i < opdr_key_arr.length; i++)
  {
    var this_opdr = mld.func_enabled_opdracht(opdr_key_arr[i]); // wat mag ik zoal op deze opdracht
    var mld_opdr = mld.mld_opdr_info(opdr_key_arr[i]);
    var sql = "SELECT mld_opdr_einddatum"
            + "  FROM mld_opdr o"
            + " WHERE o.mld_opdr_key = " + opdr_key_arr[i];
    var oRs = Oracle.Execute(sql);

    var kosten_verplicht_afm = mld_opdr.typeopdr_matchtype != 4 && (mld_opdr.typeopdr_kosten_verplicht & 2 || (mld_opdr.typeopdr_kosten_verplicht == 0 && mld_opdr.opdrkosten_verplicht & 2));
    var opdr_kosten = mld_opdr.t_cost;

    // Zijn bij deze opdracht alle verplichte kenmerken ingevuld?
    reqStatusEmptyOpdr = mld.getReqStatusEmptyOpdr(reqStatusEmptyOpdr, opdr_key_arr[i], 6); // Opdracht status "Technisch Voltooid(6)"

    // Als Setting S("mld_ord_afmeld_future") niet is gezet (0): Opdrachten waarvan de einddatum in de toekomst ligt mogen niet worden afgemeld.
    if ((S("mld_ord_afmeld_future") == 1 || (oRs("mld_opdr_einddatum").Value < new Date())) &&
        this_opdr.canClose &&
        !(kosten_verplicht_afm && opdr_kosten == 0) &&
        !reqStatusEmptyOpdr.length)
    {
      ingesloten.push(opdr_key_arr[i]);
    }
    oRs.Close();
    // Mbv mld_close en mld_typeopdr_sluitmelding weet ik of de melding ook moet worden gesloten na de laatste opdracht,
    // maar op dit punt is nog niet met zekerheid vast te stellen of dit ook de laatste opdracht is.
    // Het heeft dus geen zin om hier te controleren of alle verplichte kenmerken bij de melding zijn ingevuld.
  }
}
user.anything_todo_or_abort(ingesloten.length > 0); // We klagen niet over enkele wel en enkele niet
var result = { opdr_key: ingesloten.join(","), message: "", success: false, canCloseMld: false };

for (var i = 0; i < ingesloten.length; i++)
{
  var mld_opdr = mld.mld_opdr_info(ingesloten[i]);
  lcl.set_dialect(mld_opdr.opdr_type, "MLD_TYPEOPDR_KEY");

  var this_opdr = mld.func_enabled_opdracht(ingesloten[i]); // wat mag ik zoal op deze opdracht
  if (this_opdr.canOpmChange)
  {
    var opdr_opm = getFParam("opdr_opm", "");
    result.opdr_opm = opdr_opm;
    if (ingesloten.length > 1) // Bulk
    {
      var sql = "SELECT mld_opdr_opmerking"
              + "  FROM mld_opdr o"
              + " WHERE o.mld_opdr_key = " + ingesloten[i];
      oRs = Oracle.Execute(sql);
      var opm = (oRs("mld_opdr_opmerking").Value? oRs("mld_opdr_opmerking").Value + "\n":"") + opdr_opm;
      oRs.Close();
    }
    else
      var opm = opdr_opm;
    var fields = [ { dbs: "mld_opdr_opmerking",     typ: "varchar", val: opm,     track: L("lcl_mld_inf_Opmerking") } ];
    var mldUpd = buildTrackingUpdate("mld_opdr", "mld_opdr_key = " + ingesloten[i], fields);
  }

  var afmelddatum = getFParamDate("date_from");
  var orgdate = getFParamDate("orgdate");
  var formattedID = "";
  if ((mldUpd && mldUpd.trackarray.length) ||
      ((mld_opdr.typeopdr_afmeldmarge > 0 && ingesloten.length == 1) && (afmelddatum.getTime() != orgdate.getTime())))
  {
    var ins_srtdiscipline_prefix = mld.mld_prefix(mld_opdr.mld_key);
    formattedID = ins_srtdiscipline_prefix + mld_opdr.mld_key + "/" + mld_opdr.volgnr;
  }

  if (mldUpd && mldUpd.trackarray.length)
  {
    Oracle.Execute(mldUpd.sql);
    mld.trackopdrachtupdate(ingesloten[i], L("lcl_ord_is_ordupdtrack").format(formattedID) + "\n" + mldUpd.trackarray.join("\n"));
  }

  // Zetten van de status en afhandelen van de tracking van het afmelden (close).
  mld.setopdrachtstatus(ingesloten[i], 6); // Technisch voltooid (TV) (Afgemeld)
  if (mld_opdr.typeopdr_afmeldmarge > 0 && ingesloten.length == 1) // Datum is niet wijzigbaar bij bulk acties
  {
    if (afmelddatum.getTime() != orgdate.getTime())
    { // Antidateren voor SLA rapportages.
      var sql = "BEGIN fac.backtrackaction('ORDAFM', " + ingesloten[i] + ", " + user_key + ", " + afmelddatum.toSQL(true) +"); END;"
      Oracle.Execute(sql);
      // Wel even tracken
      mld.trackopdrachtupdate(ingesloten[i], L("lcl_ord_is_ordupdtrack").format(formattedID) + "\n" + L("lcl_opdr_closeafwijk") + L("lcl_trackto") + toDateTimeString(afmelddatum));
    }
  }

  var sluitmelding = mldClose(mld_opdr.typeopdr_sluitmelding, ingesloten);
  result.mld_key = mld_opdr.mld_key;

  mld.updatemeldingstatus(mld_opdr.mld_key, 0);

  if (sluitmelding > 0 && mld_opdr.typeopdr_isofferte == 0) // misschien melding nu ook? Bij offertes melding nooit automatisch afmelden of de vraag weergeven
  { // Zijn er niet-afgemelde opdrachten bij dezelfde melding?
    sql = "SELECT COUNT(*) aantal"
        + "  FROM mld_opdr o1"
        + " WHERE o1.mld_melding_key = " + mld_opdr.mld_key
        + "   AND o1.mld_statusopdr_key NOT IN (1, 6, 7, 9)";
    oRs = Oracle.Execute(sql);
    var nn = oRs("aantal").Value;
    oRs.Close();
    if (nn == 0) // Het was de laatste opdracht van de melding die nog niet afgemeld is
    {
      reqStatusEmptyMelding = mld.getReqStatusEmptyMelding(reqStatusEmptyMelding, mld_opdr.mld_key, 5); // Melding status "Afgemeld(5)"
      if (reqStatusEmptyMelding.length == 0) // Alle verplichte kenmerkeb zijn ingevuld
      {
        // Mag ik dan ook de melding afmelden?
        var this_mld = mld.func_enabled_melding(mld_opdr.mld_key);
        result.canCloseMld = this_mld.canClose; // ondervangt ook de situatie dat hij al is afgemeld.
        if (result.canCloseMld && (sluitmelding == 2)) // Autoclose mld
        {
          mld.setmeldingstatus(mld_opdr.mld_key, 5);
          // Handle workflow actions for completion:
          mld.nextworkflowstep(mld_opdr.mld_key, 1);  // 1 = completed
          result.canCloseMld = false; // want hij is net afgemeld.
          writeOpdrOpmToMld();
        }
        else if (!result.canCloseMld && S("mld_add_mldopmerk_on_opdrclose") == 1 && opdr_opm != "")
        { // Afhandelingtekst van de opdracht automatisch kopiëren naar de melding.
          writeOpdrOpmToMld();
        }
      }
      // else: Als result.canCloseMld == true dan is sluitmelding == 1 en dan wordt alsnog de vraag gesteld of melding ook moet worden gesloten via callback functie
    }
  }
}
result.success = true;

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