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

     File:          opdr_cancel_confirm.asp.asp
     Description:   Annuleer een specifieke opdracht.
     Parameters:
         opdr_key   Opdracht key van de opdracht die moet worden geannuleerd
     Context:
     Note:          A Rechtstreeks vanuit overzicht opdrachten
                    B Rechtstreeks vanuit showmode opdracht

*/ %>

<%
var JSON_Result = true;
var opdr_key = getQParamInt("opdr_key", -1);
var LOCKED_USER_OK = { "xmlnode": "opdracht", "key": opdr_key };
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/save2db.inc" -->
<!-- #include file="../Shared/kenmerk_common.inc" -->
<!-- #include file="mld.inc" -->
<%
protectRequest.validateToken();
user.auth_required_or_abort(opdr_key > 0); // Hebben we een opdracht key gekregen?

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

// Controleren of ik deze opdracht mag annuleren
var this_opdr = mld.func_enabled_opdracht(opdr_key); // wat mag ik zoal op deze opdracht

// Kenmerken die verplicht zijn bij Afwijzen worden in het popup scherm getoond en moeten verplicht ingevuld worden. Dat hoef ik hier niet meer te testen.
user.auth_required_or_abort(this_opdr.canCancel, L("lcl_shared_no_auth")); // Mag ik deze opdracht annuleren

var result = { opdr_key: opdr_key, message: "", success: false};
var reqStatusEmptyMelding = [];

var mld_opdr = this_opdr.mld_opdr;
lcl.set_dialect(mld_opdr.opdr_type, "MLD_TYPEOPDR_KEY");

if (this_opdr.canOpmChange)
{
  var opdr_opm = getFParam("opdr_opm", "");
  var fields = [ { dbs: "mld_opdr_opmerking",     typ: "varchar", val: opdr_opm,     track: L("lcl_mld_inf_Opmerking") } ];
  var mldUpd = buildTrackingUpdate("mld_opdr", "mld_opdr_key = " + opdr_key, fields);
  Oracle.Execute(mldUpd.sql); // mldUpd && mldUpd.trackarray.length
}

var currentKenmerkenSQL = "SELECT k.mld_kenmerk_key"
                        + "     , mld_kenmerkopdr_waarde"
                        + "     , k.mld_kenmerk_toonbaar"
                        + "     , k.fac_functie_key"
                        + "  FROM mld_kenmerkopdr ko"
                        + "     , mld_kenmerk k"
                        + " WHERE k.mld_kenmerk_key = ko.mld_kenmerk_key"
                        + "   AND mld_kenmerkopdr_verwijder IS NULL"
                        + "   AND mld_opdr_key = " + opdr_key;

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(opdr_key, { kenmerkTable: "mld_kenmerkopdr",
                                  kenmerkParentKey : "mld_opdr_key",
                                  kenmerkWaarde: "mld_kenmerkopdr_waarde",
                                  kenmerkKey: "mld_kenmerk_key",
                                  kenmerkToonbaar: "mld_kenmerk_toonbaar",
                                  nameprefix: getFParam("nameprefix", ""),
                                  extraserie: hasFParam("nameprefix"),
                                  currentKenmerkenSQL: currentKenmerkenSQL,
                                  allKenmerkenSQL: allKenmerkenSQL,
                                  requestQF: Request.Form,
                                  isNew: false,
                                  flexPath: "MLD/O",
                                  tracking: true,
                                  module: "MLD"
                                }
                     );

// Wijzigingen opmerking en flexkenmerken tracken.
if (flextrack.length)
{
  var ins_srtdiscipline_prefix = mld.mld_prefix(mld_opdr.mld_key);
  var formattedID = ins_srtdiscipline_prefix + mld_opdr.mld_key + "/" + mld_opdr.volgnr;
  mld.trackopdrachtupdate(opdr_key, L("lcl_ord_is_ordupdtrack").format(formattedID) + "\n" + mldUpd.trackarray.concat(flextrack).join("\n"));
}

// Zetten van de status en afhandelen van de tracking van het annuleren (cancel).
mld.setopdrachtstatus(opdr_key, 1, mld_opdr.uitvoerende_key); // Verworpen
mld.updatemeldingstatus(mld_opdr.mld_key, 0);
var sluitmelding = mld_opdr.typeopdr_annuleermelding;
result.mld_key = mld_opdr.mld_key;
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, 2, 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, 1); // Melding status "Afgewezen(1)"
    if (reqStatusEmptyMelding.length == 0) // Alle verplichte kenmerken en/of verplicht object 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
      {
        writeOpdrOpmToMld();
        // Handle workflow actions for completion:
        mld.nextworkflowstep(mld_opdr.mld_key, 1);  // 1 = completed
        mld.setmeldingstatus(mld_opdr.mld_key, 5);
        result.canCloseMld = false; // want hij is net afgemeld.
      }
      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));
%><% ASPPAGE_END(); %>
