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

     File:           opdr_reject_save.asp
     Description:    Wijs een opdracht opdracht af.
     Parameters:
         opdr_key_arr    Opdrachtkeys van de opdrachten die moeten worden afgewezen
     Context:
     Note:

*/
var JSON_Result = true;
var opdr_key_arr = getFParamIntArray("opdr_key");
if (opdr_key_arr.length)
    var LOCKED_USER_OK = { "xmlnode": "opdracht", "key": opdr_key_arr[0] };
%>

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

<%
protectRequest.validateToken();

function mldClose(sluitmelding, ingesloten)
{
  if (sluitmelding == 1)
  {
    var mld_close = (Request.Form("mld_close").count == 1); // Die ook?
    var ismobile = getFParamInt("ismobile", 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 opmerk = getFParam("opmerk", "");
var opdr_opm = "";
var result = {};
var toberejected = 0;
var ingesloten = [];
var reqStatusEmptyMelding = [];

if (opdr_key_arr.length == 1)
{

  // save mandatory characteristics before check on empty mandatory characteristics
  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_arr[0];

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

  // Wijzigingen flexkenmerken tracken.
  if (flextrack.length)
  {
    var this_opdr = mld.func_enabled_opdracht(opdr_key_arr[0]); // wat mag ik zoal op deze opdracht
    var mld_opdr = this_opdr.mld_opdr;
    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_arr[0], L("lcl_ord_is_ordupdtrack").format(formattedID) + "\n" + flextrack.join("\n"));
  }
}

for (var i = 0; i < opdr_key_arr.length; i++)
{
  var this_opdr = mld.func_enabled_opdracht(opdr_key_arr[i]);
  if (this_opdr.canReject)
  {
    ingesloten.push(opdr_key_arr[i]);
    toberejected++;
  }
  // Zijn bij de melding van deze opdracht alle verplichte kenmerken ingevuld?
  var sql = "SELECT mld_melding_key"
          + "  FROM mld_opdr o"
          + " WHERE o.mld_opdr_key = " + opdr_key_arr[i];
  var oRs = Oracle.Execute(sql);
  var mld_key = oRs("mld_melding_key").value;
  oRs.Close();
}

user.anything_todo_or_abort(toberejected > 0); // We klagen niet over enkele wel en enkele niet

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

      for (var i = 0; i < ingesloten.length; i++)
      {
        var mld_opdr = mld.mld_opdr_info(ingesloten[i]);
        refiatstatus = mld_opdr.opdr_status_refiat;
        currentstatus = mld_opdr.opdr_status;

        opdr_opm = opmerk;

        if (refiatstatus > 0)
        { // Eerst de afwijzing nog even tracken (Gebeurt normaal door het zetten van de status 2 (Afgekeurd/Niet akkoord).
          // Afkeuring vanuit status 10 (Ter goedkeuring): ORDGNO
          // Afkeuring vanuit status 3 (Ter fiattering): ORDFNO
          shared.trackaction(currentstatus == 10? "ORDGNO" : "ORDFNO", ingesloten[i]);
          // Eerst de oude kosten terugzetten plus de tracking hiervan.
          var fields = [ { dbs: "mld_opdr_uren",          typ: "float",   val: mld_opdr.hours_refiat,    track: L("lcl_mld_hours") },
                         { dbs: "mld_opdr_uurloon",       typ: "float",   val: mld_opdr.h_rate_refiat > 0? mld_opdr.h_rate_refiat : null,   track: L("lcl_hour_rate") + " " + L("lcl_valutasign") },
                         { dbs: "mld_opdr_materiaal",     typ: "float",   val: mld_opdr.m_cost_refiat,   track: L("lcl_mater_cost") + " " + L("lcl_valutasign") },
                         { dbs: "mld_opdr_kosten",        typ: "float",   val: mld_opdr.t_cost_refiat,   track: L("lcl_total_cost") + " " + L("lcl_valutasign") },
                         { dbs: "mld_opdr_approved",      typ: "float",   val: mld_opdr.approved_refiat > 0? mld_opdr.approved_refiat : null } // Approved bedrag niet tracken. Alleen het bedrag weer terugzetten.
                       ];
          var mldUpd = buildTrackingUpdate("mld_opdr", "mld_opdr_key = " + ingesloten[i], fields);

          var err = Oracle.Execute(mldUpd.sql, true);
          if (err.friendlyMsg)
            abort_with_warning(err.friendlyMsg);

          if (mldUpd.trackarray.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(ingesloten[i], L("lcl_ord_is_ordupdtrack").format(formattedID) + "\n" + mldUpd.trackarray.join("\n"));
          }

          // Na het afwijzen weer terug naar de oude status. Daarna pas de refiat velden op NULL zetten.
          // Dit terugzetten van de oude status wordt niet getrackt omdat het veld mld_statusopdr_key_refiat nog gevuld is.
          // Daar zorgt de database functie mld.setopdrachtstatus() voor.
          mld.setopdrachtstatus(ingesloten[i], refiatstatus);

          // Refiat opdracht kosten en refiat status weer op NULL zetten.
          sql = "UPDATE mld_opdr"
              + "   SET mld_opdr_uren_refiat = NULL"
              + "     , mld_opdr_uurloon_refiat = NULL"
              + "     , mld_opdr_materiaal_refiat = NULL"
              + "     , mld_opdr_kosten_refiat = NULL"
              + "     , mld_statusopdr_key_refiat = NULL"
              + "     , mld_opdr_approved_refiat = NULL"
              + " WHERE mld_opdr_key = " + ingesloten[i];
          Oracle.Execute(sql);

          // Voeg de opmerking toe aan de notities.
          if (opmerk != "")
          {
            sql = "INSERT INTO mld_opdr_note"
                + " (mld_opdr_key, prs_perslid_key, mld_opdr_note_omschrijving)"
                + " VALUES "
                + "(" + ingesloten[i]
                + "," + user_key
                + "," + safe.quoted_sql(opmerk)
                + ")";
            Oracle.Execute(sql);
          }
        }
        else
        { // Zetten van de status en afhandelen van de tracking van het afwijzen (reject).
          mld.setopdrachtstatus(ingesloten[i], 2); // Afgekeurd(2)
          // Nog de afmeld opmerking opslaan.
          sql = "UPDATE mld_opdr"
              + "   SET mld_opdr_opmerking_fiat = " + safe.quoted_sql(opmerk)
              + " WHERE mld_opdr_key = " + ingesloten[i]
          Oracle.Execute(sql);
        }
        // De status van de melding zou gewijzigd kunnen moeten worden hierdoor
        mld.updatemeldingstatus(mld_opdr.mld_key, 0);
        var sluitmelding = mldClose(mld_opdr.typeopdr_annuleermelding, ingesloten);
        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(); %>
